@discordeno/rest 19.0.0-next.1bbee2f → 19.0.0-next.1c8442e

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/manager.js CHANGED
@@ -1,2 +1,1139 @@
1
- import{InteractionResponseTypes as e}from"@discordeno/types";import{camelize as t,delay as a,getBotIdFromToken as s,urlToBase64 as i}from"@discordeno/utils";import{createInvalidRequestBucket as n}from"./invalidBucket.js";import{Queue as o}from"./queue.js";export function createRestManager(r){if(!r.token)throw Error("You must provide a valid token.");let l={token:r.token,applicationId:r.applicationId?BigInt(r.applicationId):s(r.token),version:r.version??10,baseUrl:r.baseUrl??"https://discord.com/api",maxRetryCount:1/0,globallyRateLimited:!1,processingRateLimitedPaths:!1,queues:new Map,rateLimitedPaths:new Map,invalidBucket:n({}),routes:{webhooks:{id:e=>`/webhooks/${e}`,message:(e,t,a,s)=>{let i=`/webhooks/${e}/${t}/messages/${a}?`;return s&&s.threadId&&(i+=`thread_id=${s.threadId}`),i},original:(e,t,a)=>{let s=`/webhooks/${e}/${t}/messages/@original?`;return a&&a.threadId&&(s+=`thread_id=${a.threadId}`),s},webhook:(e,t,a)=>{let s=`/webhooks/${e}/${t}?`;return a&&(a?.wait!==void 0&&(s+=`wait=${a.wait.toString()}`),a.threadId&&(s+=`thread_id=${a.threadId}`)),s}},sessionInfo:()=>l.routes.gatewayBot(),channels:{dm:()=>"/users/@me/channels",webhooks:e=>`/channels/${e}/webhooks`,channel:e=>`/channels/${e}`,follow:e=>`/channels/${e}/followers`,forum:e=>`/channels/${e}/threads?has_message=true`,invites:e=>`/channels/${e}/invites`,message:(e,t)=>`/channels/${e}/messages/${t}`,messages:(e,t)=>{let a=`/channels/${e}/messages?`;return a},overwrite:(e,t)=>`/channels/${e}/permissions/${t}`,crosspost:(e,t)=>`/channels/${e}/messages/${t}/crosspost`,stages:()=>"/stage-instances",stage:e=>`/stage-instances/${e}`,threads:{message:(e,t)=>`/channels/${e}/messages/${t}/threads`,all:e=>`/channels/${e}/threads`,active:e=>`/guilds/${e}/threads/active`,members:e=>`/channels/${e}/thread-members`,me:e=>`/channels/${e}/thread-members/@me`,user:(e,t)=>`/channels/${e}/thread-members/${t}`,archived:e=>`/channels/${e}/threads/archived`,public:(e,t)=>{let a=`/channels/${e}/threads/archived/public?`;return t&&(t.before&&(a+=`before=${new Date(t.before).toISOString()}`),t.limit&&(a+=`&limit=${t.limit}`)),a},private:(e,t)=>{let a=`/channels/${e}/threads/archived/private?`;return t&&(t.before&&(a+=`before=${new Date(t.before).toISOString()}`),t.limit&&(a+=`&limit=${t.limit}`)),a},joined:(e,t)=>{let a=`/channels/${e}/users/@me/threads/archived/private?`;return t&&(t.before&&(a+=`before=${new Date(t.before).toISOString()}`),t.limit&&(a+=`&limit=${t.limit}`)),a}},typing:e=>`/channels/${e}/typing`},guilds:{automod:{rule:(e,t)=>`/guilds/${e}/auto-moderation/rules/${t}`,rules:e=>`/guilds/${e}/auto-moderation/rules`},channels:e=>`/guilds/${e}/channels`,emoji:(e,t)=>`/guilds/${e}/emojis/${t}`,emojis:e=>`/guilds/${e}/emojis`,events:{events:(e,t)=>{let a=`/guilds/${e}/scheduled-events?`;return void 0!==t&&(a+=`with_user_count=${t.toString()}`),a},event:(e,t,a)=>{let s=`/guilds/${e}/scheduled-events/${t}`;return void 0!==a&&(s+=`with_user_count=${a.toString()}`),s},users:(e,t,a)=>{let s=`/guilds/${e}/scheduled-events/${t}/users?`;return a&&(void 0!==a.limit&&(s+=`limit=${a.limit}`),void 0!==a.withMember&&(s+=`&with_member=${a.withMember.toString()}`),void 0!==a.after&&(s+=`&after=${a.after}`),void 0!==a.before&&(s+=`&before=${a.before}`)),s}},integration:(e,t)=>`/guilds/${e}/integrations/${t}`,integrations:e=>`/guilds/${e}/integrations?include_applications=true`,invite(e,t){let a=`/invites/${e}?`;return t&&(void 0!==t.withCounts&&(a+=`with_counts=${t.withCounts.toString()}`),void 0!==t.withExpiration&&(a+=`&with_expiration=${t.withExpiration.toString()}`),t.scheduledEventId&&(a+=`&guild_scheduled_event_id=${t.scheduledEventId}`)),a},invites:e=>`/guilds/${e}/invites`,members:{ban:(e,t)=>`/guilds/${e}/bans/${t}`,bot:e=>`/guilds/${e}/members/@me`,member:(e,t)=>`/guilds/${e}/members/${t}`,members:(e,t)=>{let a=`/guilds/${e}/members?`;return void 0!==t&&(t.limit&&(a+=`limit=${t.limit}`),t.after&&(a+=`&after=${t.after}`)),a},search:(e,t,a)=>{let s=`/guilds/${e}/members/search?query=${encodeURIComponent(t)}`;return a&&void 0!==a.limit&&(s+=`&limit=${a.limit}`),s},prune:(e,t)=>{let a=`/guilds/${e}/prune?`;return t&&(t.days&&(a+=`days=${t.days}`),Array.isArray(t.includeRoles)?a+=`&include_roles=${t.includeRoles.join(",")}`:t.includeRoles&&(a+=`&include_roles=${t.includeRoles}`)),a}},templates:{code:e=>`/guilds/templates/${e}`,guild:(e,t)=>`/guilds/${e}/templates/${t}`,all:e=>`/guilds/${e}/templates`},webhooks:e=>`/guilds/${e}/webhooks`},interactions:{commands:{commands:e=>`/applications/${e}/commands`,guilds:{all:(e,t)=>`/applications/${e}/guilds/${t}/commands`,one(e,t,a,s){let i=`/applications/${e}/guilds/${t}/commands/${a}?`;return void 0!==s&&(i+=`with_localizations=${s.toString()}`),i}},permissions:(e,t)=>`/applications/${e}/guilds/${t}/commands/permissions`,permission:(e,t,a)=>`/applications/${e}/guilds/${t}/commands/${a}/permissions`,command:(e,t,a)=>{let s=`/applications/${e}/commands/${t}?`;return void 0!==a&&(s+=`withLocalizations=${a.toString()}`),s}},responses:{callback:(e,t)=>`/interactions/${e}/${t}/callback`,original:(e,t)=>`/webhooks/${e}/${t}/messages/@original`,message:(e,t,a)=>`/webhooks/${e}/${t}/messages/${a}`}},user:e=>`/users/${e}`,userBot:()=>"/users/@me",oauth2Application:()=>"oauth2/applications/@me",gatewayBot:()=>"/gateway/bot",nitroStickerPacks:()=>"/sticker-packs"},checkRateLimits(e){let t=l.rateLimitedPaths.get(e),a=l.rateLimitedPaths.get("global"),s=Date.now();return t&&s<t.resetTimestamp?t.resetTimestamp-s:!!a&&s<a.resetTimestamp&&a.resetTimestamp-s},createRequest(e){let t={"user-agent":"DiscordBot (https://github.com/discordeno/discordeno, v19.0.0-alpha.1)"};if(e.unauthorized||(t.authorization=`Bot ${l.token}`),e.headers)for(let a in e.headers)t[a.toLowerCase()]=e.headers[a];return"GET"===e.method&&(e.body=void 0),e.body?.reason&&(t["X-Audit-Log-Reason"]=encodeURIComponent(e.body.reason),e.body.reason=void 0),e.body&&!["GET","DELETE"].includes(e.method)&&(t["Content-Type"]="application/json"),{headers:t,body:e.body?.file??JSON.stringify(e.body),method:e.method}},processRateLimitedPaths(){let e=Date.now();for(let[t,a]of l.rateLimitedPaths.entries())a.resetTimestamp>e||(l.rateLimitedPaths.delete(t),"global"!==t||(l.globallyRateLimited=!1));0===l.rateLimitedPaths.size?l.processingRateLimitedPaths=!1:(l.processingRateLimitedPaths=!0,setTimeout(()=>{l.processRateLimitedPaths()},1e3))},processHeaders(e,t){let a=!1,s=t.get("x-ratelimit-remaining"),i=t.get("x-ratelimit-reset-after"),n=Date.now()+1e3*Number(i),o=t.get("x-ratelimit-global"),r=t.get("x-ratelimit-bucket")??void 0,c=t.get("x-ratelimit-limit");if(l.queues.get(e)?.handleCompletedRequest({remaining:s?Number(s):void 0,interval:i?1e3*Number(i):void 0,max:c?Number(c):void 0}),"0"===s&&(a=!0,l.rateLimitedPaths.set(e,{url:e,resetTimestamp:n,bucketId:r}),r&&l.rateLimitedPaths.set(r,{url:e,resetTimestamp:n,bucketId:r})),o){let d=t.get("retry-after"),u=Date.now()+1e3*Number(d);l.globallyRateLimited=!0,a=!0,setTimeout(()=>{l.globallyRateLimited=!1},u),l.rateLimitedPaths.set("global",{url:"global",resetTimestamp:u,bucketId:r}),r&&l.rateLimitedPaths.set(r,{url:"global",resetTimestamp:u,bucketId:r})}return a&&!l.processingRateLimitedPaths&&l.processRateLimitedPaths(),a?r:void 0},async sendRequest(e){let t=await fetch(e.url,l.createRequest({method:e.method,url:e.url,body:e.body,...e.options})),s=l.processHeaders(l.simplifyUrl(e.url,e.method),t.headers);if(s&&(e.bucketId=s),(t.status<200||t.status>=400)&&429===t.status){if(e.retryCount++>=l.maxRetryCount)return e.reject?.({ok:!1,status:t.status,error:"The options was rate limited and it maxed out the retries limit."});l.invalidBucket.handleCompletedRequest(t.status,"shared"===t.headers.get("X-RateLimit-Scope"));let i=t.headers.get("x-ratelimit-reset-after");return i&&await a(1e3*Number(i)),await e.retryRequest?.(e)}e.resolve(await t.json())},simplifyUrl(e,t){let a=e.replace(/\/([a-z-]+)\/(?:[0-9]{17,19})/g,function(e,t){return["channels","guilds"].includes(t)?e:`/${t}/x`}).replace(/\/reactions\/[^/]+/g,"/reactions/x");return a.includes("/reactions")&&(a=a.substring(0,a.indexOf("/reactions")+10)),"DELETE"===t&&a.endsWith("/messages/x")&&(a=t+a),a},processRequest(e){let t=e.url.substring(e.url.indexOf("api/")),a=t.split("/");a.shift(),a[0]?.startsWith("v")&&a.shift(),e.url=`${l.baseUrl}/v${l.version}/${a.join("/")}`;let s=l.simplifyUrl(e.url,e.method),i=l.queues.get(s);if(void 0!==i)i.makeRequest(e);else{let n=new o(l,{url:s});n.makeRequest(e),l.queues.set(s,n)}},makeRequest:async(e,t,a,s)=>await new Promise((i,n)=>{l.processRequest({url:t,method:e,body:a,retryCount:0,retryRequest:async function(e){await l.sendRequest(e)},resolve:i,reject:n,options:s})}),get:async e=>t(await l.makeRequest("GET",e)),post:async(e,a)=>t(await l.makeRequest("POST",e,a)),delete:async(e,a)=>t(await l.makeRequest("DELETE",e,a)),patch:async(e,a)=>t(await l.makeRequest("PATCH",e,a)),put:async(e,a,s)=>t(await l.makeRequest("PUT",e,a,s)),channels:{messages:{delete:async(e,t,a)=>await l.deleteMessage(e,t,a),edit:async(e,t,a)=>await l.editMessage(e,t,a),send:async(e,t)=>await l.sendMessage(e,t),publish:async(e,t)=>await l.publishMessage(e,t)},get:async e=>await l.getChannel(e),create:async(e,t)=>await l.createChannel(e,t),delete:async(e,t)=>await l.deleteChannel(e,t),edit:async(e,t)=>await l.editChannel(e,t),follow:async(e,t)=>await l.followAnnouncement(e,t),forums:{post:async(e,t)=>await l.createForumThread(e,t)},permissions:{edit:async(e,t)=>await l.editChannelPermissionOverrides(e,t),delete:async(e,t)=>await l.deleteChannelPermissionOverride(e,t)},positions:async(e,t)=>await l.editChannelPositions(e,t),invites:async e=>await l.getChannelInvites(e),stages:{create:async e=>await l.createStageInstance(e),delete:async(e,t)=>await l.deleteStageInstance(e,t),edit:async(e,t)=>await l.editStageInstance(e,t),get:async e=>await l.getStageInstance(e)},threads:{create:{with:{message:async(e,t,a)=>await l.startThreadWithMessage(e,t,a)},without:{message:async(e,t)=>await l.startThreadWithoutMessage(e,t)}},get:{active:async e=>await l.getActiveThreads(e),archived:{private:async(e,t)=>await l.getPrivateArchivedThreads(e,t),joined:async(e,t)=>await l.getPrivateJoinedArchivedThreads(e,t),public:async(e,t)=>await l.getPublicArchivedThreads(e,t)},member:async(e,t)=>await l.getThreadMember(e,t),members:async e=>await l.getThreadMembers(e)},join:async e=>await l.joinThread(e),leave:async e=>await l.leaveThread(e),kick:async(e,t)=>await l.removeThreadMember(e,t)},typing:async e=>await l.triggerTypingIndicator(e)},emojis:{create:async(e,t)=>await l.createEmoji(e,t),delete:async(e,t,a)=>await l.deleteEmoji(e,t,a),edit:async(e,t,a)=>await l.editEmoji(e,t,a),get:async(e,t)=>await l.getEmoji(e,t)},guilds:{automod:{create:async(e,t)=>await l.createAutomodRule(e,t),delete:async(e,t)=>await l.deleteAutomodRule(e,t),edit:async(e,t,a)=>await l.editAutomodRule(e,t,a),get:{rule:async(e,t)=>await l.getAutomodRule(e,t),rules:async e=>await l.getAutomodRules(e)}},channels:async e=>await l.getChannels(e),emojis:async e=>await l.getEmojis(e),events:{create:async(e,t)=>await l.createScheduledEvent(e,t),delete:async(e,t)=>await l.deleteScheduledEvent(e,t),edit:async(e,t,a)=>await l.editScheduledEvent(e,t,a),get:{event:async(e,t,a)=>await l.getScheduledEvent(e,t,a),events:async(e,t)=>await l.getScheduledEvents(e,t),users:async(e,t,a)=>await l.getScheduledEventUsers(e,t,a)}},integrations:{get:async e=>await l.getIntegrations(e),delete:async(e,t)=>await l.deleteIntegration(e,t)},invites:{create:async(e,t)=>await l.createInvite(e,t),delete:async(e,t)=>await l.deleteInvite(e,t),get:async(e,t)=>await l.getInvite(e,t),list:async e=>await l.getInvites(e)},templates:{create:async(e,t)=>await l.createGuildTemplate(e,t),delete:async(e,t)=>await l.deleteGuildTemplate(e,t),edit:async(e,t,a)=>await l.editGuildTemplate(e,t,a),get:async e=>await l.getGuildTemplate(e),list:async e=>await l.getGuildTemplates(e),sync:async e=>await l.syncGuildTemplate(e)},members:{ban:async(e,t,a)=>await l.banMember(e,t,a),edit:async(e,t,a)=>await l.editMember(e,t,a),editSelf:async(e,t)=>await l.editBotMember(e,t),get:async(e,t)=>await l.getMember(e,t),dm:async e=>await l.getDmChannel(e),kick:async(e,t,a)=>await l.kickMember(e,t,a),list:async(e,t)=>await l.getMembers(e,t),prune:async(e,t)=>await l.pruneMembers(e,t),search:async(e,t,a)=>await l.searchMembers(e,t,a),unban:async(e,t)=>await l.unbanMember(e,t)},interactions:{commands:{create:{global:async e=>await l.createGlobalApplicationCommand(e),guild:async(e,t)=>await l.createGuildApplicationCommand(e,t)},delete:{global:async e=>await l.deleteGlobalApplicationCommand(e),guild:async(e,t)=>await l.deleteGuildApplicationCommand(e,t)},edit:{global:async(e,t)=>await l.editGlobalApplicationCommand(e,t),guild:async(e,t,a)=>await l.editGuildApplicationCommand(e,t,a),permissions:async(e,t,a,s)=>await l.editApplicationCommandPermissions(e,t,a,s)},get:{global:{all:async()=>await l.getGlobalApplicationCommands(),one:async e=>await l.getGlobalApplicationCommand(e)},guilds:{all:async e=>await l.getGuildApplicationCommands(e),one:async(e,t)=>await l.getGuildApplicationCommand(e,t)},permission:async(e,t)=>await l.getApplicationCommandPermission(e,t),permissions:async e=>await l.getApplicationCommandPermissions(e)},replace:{global:async e=>await l.upsertGlobalApplicationCommands(e),guild:async(e,t)=>await l.upsertGuildApplicationCommands(e,t)}},responses:{create:{followup:async(e,t)=>await l.sendFollowupMessage(e,t),original:async(e,t,a)=>await l.sendInteractionResponse(e,t,a)},delete:{followup:async(e,t)=>await l.deleteFollowupMessage(e,t),original:async e=>await l.deleteOriginalInteractionResponse(e)},edit:{followup:async(e,t,a)=>await l.editFollowupMessage(e,t,a),original:async(e,t)=>await l.editOriginalInteractionResponse(e,t)},get:{followup:async(e,t)=>await l.getFollowupMessage(e,t),original:async e=>await l.getOriginalInteractionResponse(e)}}}},users:{channel:async e=>await l.getDmChannel(e)},webhooks:{create:async(e,t)=>await l.createWebhook(e,t),delete:{with:{id:async(e,t)=>await l.deleteWebhook(e,t),token:async(e,t)=>await l.deleteWebhookWithToken(e,t)}},edit:{with:{id:async(e,t)=>await l.editWebhook(e,t),token:async(e,t,a)=>await l.editWebhookWithToken(e,t,a)}},execute:async(e,t,a)=>await l.executeWebhook(e,t,a),get:{channel:async e=>await l.getChannelWebhooks(e),guild:async e=>await l.getGuildWebhooks(e),message:async(e,t,a,s)=>await l.getWebhookMessage(e,t,a,s),with:{id:async e=>await l.getWebhook(e),token:async(e,t)=>await l.getWebhookWithToken(e,t)}},messages:{delete:async(e,t,a,s)=>await l.deleteWebhookMessage(e,t,a,s),edit:Object.assign(async(e,t,a,s)=>await l.editWebhookMessage(e,t,a,s),{original:async(e,t,a)=>await l.editOriginalWebhookMessage(e,t,a)})}},addThreadMember:async(e,t)=>await l.put(l.routes.channels.threads.user(e,t)),createAutomodRule:async(e,t)=>await l.post(l.routes.guilds.automod.rules(e),t),createChannel:async(e,t)=>await l.post(l.routes.guilds.channels(e),t),createEmoji:async(e,t)=>await l.post(l.routes.guilds.emojis(e),t),createGlobalApplicationCommand:async e=>await l.post(l.routes.interactions.commands.commands(l.applicationId),e),createGuildApplicationCommand:async(e,t)=>await l.post(l.routes.interactions.commands.guilds.all(l.applicationId,t),e),createGuildTemplate:async(e,t)=>await l.post(l.routes.guilds.templates.all(e),t),createForumThread:async(e,t)=>await l.post(l.routes.channels.forum(e),t),createInvite:async(e,t={})=>await l.post(l.routes.channels.invites(e),t),createScheduledEvent:async(e,t)=>await l.post(l.routes.guilds.events.events(e),t),createStageInstance:async e=>await l.post(l.routes.channels.stages(),e),createWebhook:async(e,t)=>await l.post(l.routes.channels.webhooks(e),{name:t.name,avatar:t.avatar?await i(t.avatar):void 0,reason:t.reason}),deleteAutomodRule:async(e,t,a)=>await l.delete(l.routes.guilds.automod.rule(e,t),{reason:a}),deleteChannel:async(e,t)=>await l.delete(l.routes.channels.channel(e),{reason:t}),deleteChannelPermissionOverride:async(e,t,a)=>await l.delete(l.routes.channels.overwrite(e,t),a?{reason:a}:void 0),deleteEmoji:async(e,t,a)=>await l.delete(l.routes.guilds.emoji(e,t),{reason:a}),deleteFollowupMessage:async(e,t)=>await l.delete(l.routes.interactions.responses.message(l.applicationId,e,t)),deleteGlobalApplicationCommand:async e=>await l.delete(l.routes.interactions.commands.command(l.applicationId,e)),deleteGuildApplicationCommand:async(e,t)=>await l.delete(l.routes.interactions.commands.guilds.one(l.applicationId,t,e)),deleteGuildTemplate:async(e,t)=>await l.delete(l.routes.guilds.templates.guild(e,t)),deleteIntegration:async(e,t)=>await l.delete(l.routes.guilds.integration(e,t)),deleteInvite:async(e,t)=>await l.delete(l.routes.guilds.invite(e),t?{reason:t}:void 0),deleteMessage:async(e,t,a)=>await l.delete(l.routes.channels.message(e,t),{reason:a}),deleteOriginalInteractionResponse:async e=>await l.delete(l.routes.interactions.responses.original(l.applicationId,e)),deleteScheduledEvent:async(e,t)=>await l.delete(l.routes.guilds.events.event(e,t)),deleteStageInstance:async(e,t)=>await l.delete(l.routes.channels.stage(e),t?{reason:t}:void 0),deleteWebhook:async(e,t)=>await l.delete(l.routes.webhooks.id(e),{reason:t}),deleteWebhookMessage:async(e,t,a,s)=>await l.delete(l.routes.webhooks.message(e,t,a,s)),deleteWebhookWithToken:async(e,t)=>await l.delete(l.routes.webhooks.webhook(e,t)),editApplicationCommandPermissions:async(e,t,a,s)=>await l.put(l.routes.interactions.commands.permission(l.applicationId,e,t),{permissions:s},{headers:{authorization:`Bearer ${a}`}}),editAutomodRule:async(e,t,a)=>await l.patch(l.routes.guilds.automod.rule(e,t),a),async editBotProfile(e){let t=e?.botAvatarURL?await i(e?.botAvatarURL):e?.botAvatarURL;return await l.patch(l.routes.userBot(),{username:e.username?.trim(),avatar:t})},editChannel:async(e,t)=>await l.patch(l.routes.channels.channel(e),t),editChannelPermissionOverrides:async(e,t)=>await l.put(l.routes.channels.overwrite(e,t.id),t),editChannelPositions:async(e,t)=>await l.patch(l.routes.guilds.channels(e),t),editEmoji:async(e,t,a)=>await l.patch(l.routes.guilds.emoji(e,t),a),editFollowupMessage:async(e,t,a)=>await l.patch(l.routes.interactions.responses.message(l.applicationId,e,t),a),editGlobalApplicationCommand:async(e,t)=>await l.patch(l.routes.interactions.commands.command(l.applicationId,e),t),editGuildApplicationCommand:async(e,t,a)=>await l.patch(l.routes.interactions.commands.guilds.one(l.applicationId,t,e),a),editGuildTemplate:async(e,t,a)=>await l.patch(l.routes.guilds.templates.guild(e,t),a),editMessage:async(e,t,a)=>await l.patch(l.routes.channels.message(e,t),a),editOriginalInteractionResponse:async(e,t)=>await l.patch(l.routes.interactions.responses.original(l.applicationId,e),t),editOriginalWebhookMessage:async(t,a,s)=>await l.patch(l.routes.webhooks.original(t,a,s),{type:e.UpdateMessage,data:s}),editScheduledEvent:async(e,t,a)=>await l.patch(l.routes.guilds.events.event(e,t),a),editStageInstance:async(e,t)=>await l.patch(l.routes.channels.stage(e),{topic:t.topic}),editWebhook:async(e,t)=>await l.patch(l.routes.webhooks.id(e),t),editWebhookMessage:async(t,a,s,i)=>await l.patch(l.routes.webhooks.message(t,a,s,i),{type:e.UpdateMessage,data:i}),editWebhookWithToken:async(e,t,a)=>await l.patch(l.routes.webhooks.webhook(e,t),a),executeWebhook:async(e,t,a)=>await l.post(l.routes.webhooks.webhook(e,t,a),a),followAnnouncement:async(e,t)=>await l.post(l.routes.channels.follow(e),{webhook_channel_id:t}),getActiveThreads:async e=>await l.get(l.routes.channels.threads.active(e)),getApplicationCommandPermission:async(e,t)=>await l.get(l.routes.interactions.commands.permission(l.applicationId,e,t)),getApplicationCommandPermissions:async e=>await l.get(l.routes.interactions.commands.permissions(l.applicationId,e)),getApplicationInfo:async()=>await l.get(l.routes.oauth2Application()),getAutomodRule:async(e,t)=>await l.get(l.routes.guilds.automod.rule(e,t)),getAutomodRules:async e=>await l.get(l.routes.guilds.automod.rules(e)),getChannel:async e=>await l.get(l.routes.channels.channel(e)),getChannelInvites:async e=>await l.get(l.routes.channels.invites(e)),getChannels:async e=>await l.get(l.routes.guilds.channels(e)),getChannelWebhooks:async e=>await l.get(l.routes.channels.webhooks(e)),getDmChannel:async e=>await l.post(l.routes.channels.dm(),{recipient_id:e.toString()}),getEmoji:async(e,t)=>await l.get(l.routes.guilds.emoji(e,t)),getEmojis:async e=>await l.get(l.routes.guilds.emojis(e)),getFollowupMessage:async(e,t)=>await l.get(l.routes.interactions.responses.message(l.applicationId,e,t)),getGatewayBot:async()=>await l.get(l.routes.gatewayBot()),getGlobalApplicationCommand:async e=>await l.get(l.routes.interactions.commands.command(l.applicationId,e)),getGlobalApplicationCommands:async()=>await l.get(l.routes.interactions.commands.commands(l.applicationId)),getGuildApplicationCommand:async(e,t)=>await l.get(l.routes.interactions.commands.guilds.one(l.applicationId,t,e)),getGuildApplicationCommands:async e=>await l.get(l.routes.interactions.commands.guilds.all(l.applicationId,e)),getGuildTemplate:async e=>await l.get(l.routes.guilds.templates.code(e)),getGuildTemplates:async e=>await l.get(l.routes.guilds.templates.all(e)),getGuildWebhooks:async e=>await l.get(l.routes.guilds.webhooks(e)),getIntegrations:async e=>await l.get(l.routes.guilds.integrations(e)),getInvite:async(e,t)=>await l.get(l.routes.guilds.invite(e,t)),getInvites:async e=>await l.get(l.routes.guilds.invites(e)),getNitroStickerPacks:async()=>await l.get(l.routes.nitroStickerPacks()),getOriginalInteractionResponse:async e=>await l.get(l.routes.interactions.responses.original(l.applicationId,e)),getPrivateArchivedThreads:async(e,t)=>await l.get(l.routes.channels.threads.private(e,t)),getPrivateJoinedArchivedThreads:async(e,t)=>await l.get(l.routes.channels.threads.joined(e,t)),getPublicArchivedThreads:async(e,t)=>await l.get(l.routes.channels.threads.public(e,t)),getScheduledEvent:async(e,t,a)=>await l.get(l.routes.guilds.events.event(e,t,a?.withUserCount)),getScheduledEvents:async(e,t)=>await l.get(l.routes.guilds.events.events(e,t?.withUserCount)),getScheduledEventUsers:async(e,t,a)=>await l.get(l.routes.guilds.events.users(e,t,a)),getSessionInfo:async()=>await l.getGatewayBot(),getStageInstance:async e=>await l.get(l.routes.channels.stage(e)),getThreadMember:async(e,t)=>await l.get(l.routes.channels.threads.user(e,t)),getThreadMembers:async e=>await l.get(l.routes.channels.threads.members(e)),getUser:async e=>await l.get(l.routes.user(e)),getWebhook:async e=>await l.get(l.routes.webhooks.id(e)),getWebhookMessage:async(e,t,a,s)=>await l.get(l.routes.webhooks.message(e,t,a,s)),getWebhookWithToken:async(e,t)=>await l.get(l.routes.webhooks.webhook(e,t)),joinThread:async e=>await l.put(l.routes.channels.threads.me(e)),leaveThread:async e=>await l.delete(l.routes.channels.threads.me(e)),publishMessage:async(e,t)=>await l.post(l.routes.channels.crosspost(e,t)),removeThreadMember:async(e,t)=>await l.delete(l.routes.channels.threads.user(e,t)),sendFollowupMessage:async(e,t)=>await new Promise((a,s)=>{l.sendRequest({url:l.routes.webhooks.webhook(l.applicationId,e),method:"POST",body:l.createRequest({method:"POST",body:{...t},headers:{Authorization:""}}),retryCount:0,retryRequest:async function(e){await l.sendRequest(e)},resolve:a,reject:s})}),sendInteractionResponse:async(e,t,a)=>await new Promise((s,i)=>{l.sendRequest({url:l.routes.interactions.responses.callback(e,t),method:"POST",body:l.createRequest({method:"POST",body:{...a},headers:{Authorization:""}}),retryCount:0,retryRequest:async function(e){await l.sendRequest(e)},resolve:s,reject:i})}),sendMessage:async(e,t)=>await l.post(l.routes.channels.messages(e),t),startThreadWithMessage:async(e,t,a)=>await l.post(l.routes.channels.threads.message(e,t),a),startThreadWithoutMessage:async(e,t)=>await l.post(l.routes.channels.threads.all(e),t),syncGuildTemplate:async e=>await l.put(l.routes.guilds.templates.all(e)),banMember:async(e,t,a)=>await l.put(l.routes.guilds.members.ban(e,t),a),editBotMember:async(e,t)=>await l.patch(l.routes.guilds.members.bot(e),t),editMember:async(e,t,a)=>await l.patch(l.routes.guilds.members.member(e,t),a),getMember:async(e,t)=>await l.get(l.routes.guilds.members.member(e,t)),getMembers:async(e,t)=>await l.get(l.routes.guilds.members.members(e,t)),kickMember:async(e,t,a)=>await l.delete(l.routes.guilds.members.member(e,t),{reason:a}),pruneMembers:async(e,t)=>await l.post(l.routes.guilds.members.prune(e),t),searchMembers:async(e,t,a)=>await l.get(l.routes.guilds.members.search(e,t,a)),unbanMember:async(e,t)=>await l.delete(l.routes.guilds.members.ban(e,t)),triggerTypingIndicator:async e=>await l.post(l.routes.channels.typing(e)),upsertGlobalApplicationCommands:async e=>await l.put(l.routes.interactions.commands.commands(l.applicationId),e),upsertGuildApplicationCommands:async(e,t)=>await l.put(l.routes.interactions.commands.guilds.all(l.applicationId,e),t)};return l}
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcyB9IGZyb20gJ0BkaXNjb3JkZW5vL3R5cGVzJ1xuaW1wb3J0IHsgY2FtZWxpemUsIGRlbGF5LCBnZXRCb3RJZEZyb21Ub2tlbiwgdXJsVG9CYXNlNjQgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcblxuaW1wb3J0IHsgY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4vcXVldWUuanMnXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnMsXG4gIEJpZ1N0cmluZyxcbiAgQ2FtZWxpemUsXG4gIENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgQ3JlYXRlQXV0b01vZGVyYXRpb25SdWxlT3B0aW9ucyxcbiAgQ3JlYXRlQ2hhbm5lbEludml0ZSxcbiAgQ3JlYXRlRm9ydW1Qb3N0V2l0aE1lc3NhZ2UsXG4gIENyZWF0ZUd1aWxkQ2hhbm5lbCxcbiAgQ3JlYXRlR3VpbGRFbW9qaSxcbiAgQ3JlYXRlTWVzc2FnZU9wdGlvbnMsXG4gIENyZWF0ZVNjaGVkdWxlZEV2ZW50LFxuICBDcmVhdGVTdGFnZUluc3RhbmNlLFxuICBEZWxldGVXZWJob29rTWVzc2FnZU9wdGlvbnMsXG4gIERpc2NvcmRBY3RpdmVUaHJlYWRzLFxuICBEaXNjb3JkQXBwbGljYXRpb24sXG4gIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQsXG4gIERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyxcbiAgRGlzY29yZEFyY2hpdmVkVGhyZWFkcyxcbiAgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZSxcbiAgRGlzY29yZENoYW5uZWwsXG4gIERpc2NvcmRDcmVhdGVXZWJob29rLFxuICBEaXNjb3JkRW1vamksXG4gIERpc2NvcmRGb2xsb3dBbm5vdW5jZW1lbnRDaGFubmVsLFxuICBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgRGlzY29yZEludGVncmF0aW9uLFxuICBEaXNjb3JkSW52aXRlLFxuICBEaXNjb3JkSW52aXRlTWV0YWRhdGEsXG4gIERpc2NvcmRMaXN0QWN0aXZlVGhyZWFkcyxcbiAgRGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHMsXG4gIERpc2NvcmRNZW1iZXIsXG4gIERpc2NvcmRNZW1iZXJXaXRoVXNlcixcbiAgRGlzY29yZE1lc3NhZ2UsXG4gIERpc2NvcmRTY2hlZHVsZWRFdmVudCxcbiAgRGlzY29yZFN0YWdlSW5zdGFuY2UsXG4gIERpc2NvcmRTdGlja2VyUGFjayxcbiAgRGlzY29yZFRlbXBsYXRlLFxuICBEaXNjb3JkVGhyZWFkTWVtYmVyLFxuICBEaXNjb3JkVXNlcixcbiAgRGlzY29yZFdlYmhvb2ssXG4gIEVkaXRBdXRvTW9kZXJhdGlvblJ1bGVPcHRpb25zLFxuICBFZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXNPcHRpb25zLFxuICBFZGl0TWVzc2FnZSxcbiAgRWRpdFNjaGVkdWxlZEV2ZW50LFxuICBFZGl0U3RhZ2VJbnN0YW5jZU9wdGlvbnMsXG4gIEV4ZWN1dGVXZWJob29rLFxuICBHZXRHdWlsZFBydW5lQ291bnRRdWVyeSxcbiAgR2V0SW52aXRlLFxuICBHZXRNZXNzYWdlc09wdGlvbnMsXG4gIEdldFNjaGVkdWxlZEV2ZW50cyxcbiAgR2V0U2NoZWR1bGVkRXZlbnRVc2VycyxcbiAgR2V0V2ViaG9va01lc3NhZ2VPcHRpb25zLFxuICBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSxcbiAgSW50ZXJhY3Rpb25SZXNwb25zZSxcbiAgTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgTGlzdEd1aWxkTWVtYmVycyxcbiAgTW9kaWZ5Q2hhbm5lbCxcbiAgTW9kaWZ5R3VpbGRDaGFubmVsUG9zaXRpb25zLFxuICBNb2RpZnlHdWlsZEVtb2ppLFxuICBNb2RpZnlXZWJob29rLFxuICBTZWFyY2hNZW1iZXJzLFxuICBTdGFydFRocmVhZFdpdGhNZXNzYWdlLFxuICBTdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlLFxuICBXaXRoUmVhc29uLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB0eXBlIHsgSW52YWxpZFJlcXVlc3RCdWNrZXQgfSBmcm9tICcuL2ludmFsaWRCdWNrZXQuanMnXG5cbi8vIFRPRE86IG1ha2UgZHluYW1pYyBiYXNlZCBvbiBwYWNrYWdlLmpzb24gZmlsZVxuY29uc3QgdmVyc2lvbiA9ICcxOS4wLjAtYWxwaGEuMSdcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3RNYW5hZ2VyKG9wdGlvbnM6IENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucyk6IFJlc3RNYW5hZ2VyIHtcbiAgLy8gRmFsc3kgdG9rZW4gc3RyaW5nIGNoZWNrXG4gIGlmICghb3B0aW9ucy50b2tlbikgdGhyb3cgbmV3IEVycm9yKCdZb3UgbXVzdCBwcm92aWRlIGEgdmFsaWQgdG9rZW4uJylcblxuICBjb25zdCByZXN0OiBSZXN0TWFuYWdlciA9IHtcbiAgICB0b2tlbjogb3B0aW9ucy50b2tlbixcbiAgICBhcHBsaWNhdGlvbklkOiBvcHRpb25zLmFwcGxpY2F0aW9uSWQgPyBCaWdJbnQob3B0aW9ucy5hcHBsaWNhdGlvbklkKSA6IGdldEJvdElkRnJvbVRva2VuKG9wdGlvbnMudG9rZW4pLFxuICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyAxMCxcbiAgICBiYXNlVXJsOiBvcHRpb25zLmJhc2VVcmwgPz8gJ2h0dHBzOi8vZGlzY29yZC5jb20vYXBpJyxcbiAgICBtYXhSZXRyeUNvdW50OiBJbmZpbml0eSxcbiAgICBnbG9iYWxseVJhdGVMaW1pdGVkOiBmYWxzZSxcbiAgICBwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRoczogZmFsc2UsXG4gICAgcXVldWVzOiBuZXcgTWFwKCksXG4gICAgcmF0ZUxpbWl0ZWRQYXRoczogbmV3IE1hcCgpLFxuICAgIGludmFsaWRCdWNrZXQ6IGNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0KHt9KSxcblxuICAgIHJvdXRlczoge1xuICAgICAgd2ViaG9va3M6IHtcbiAgICAgICAgaWQ6ICh3ZWJob29rSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke3dlYmhvb2tJZH1gXG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2U6ICh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC93ZWJob29rcy8ke3dlYmhvb2tJZH0vJHt0b2tlbn0vbWVzc2FnZXMvJHttZXNzYWdlSWR9P2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy50aHJlYWRJZCkgdXJsICs9IGB0aHJlYWRfaWQ9JHtvcHRpb25zLnRocmVhZElkfWBcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICAgIG9yaWdpbmFsOiAod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgIGxldCB1cmwgPSBgL3dlYmhvb2tzLyR7d2ViaG9va0lkfS8ke3Rva2VufS9tZXNzYWdlcy9Ab3JpZ2luYWw/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRocmVhZElkKSB1cmwgKz0gYHRocmVhZF9pZD0ke29wdGlvbnMudGhyZWFkSWR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgd2ViaG9vazogKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC93ZWJob29rcy8ke3dlYmhvb2tJZH0vJHt0b2tlbn0/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy53YWl0ICE9PSB1bmRlZmluZWQpIHVybCArPSBgd2FpdD0ke29wdGlvbnMud2FpdC50b1N0cmluZygpfWBcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRocmVhZElkKSB1cmwgKz0gYHRocmVhZF9pZD0ke29wdGlvbnMudGhyZWFkSWR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8vIE1pc2NlbGxhbmVvdXMgRW5kcG9pbnRzXG4gICAgICBzZXNzaW9uSW5mbzogKCkgPT4gcmVzdC5yb3V0ZXMuZ2F0ZXdheUJvdCgpLFxuXG4gICAgICAvLyBDaGFubmVsIEVuZHBvaW50c1xuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgZG06ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gJy91c2Vycy9AbWUvY2hhbm5lbHMnXG4gICAgICAgIH0sXG4gICAgICAgIHdlYmhvb2tzOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3dlYmhvb2tzYFxuICAgICAgICB9LFxuXG4gICAgICAgIGNoYW5uZWw6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9sbG93OiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L2ZvbGxvd2Vyc2BcbiAgICAgICAgfSxcblxuICAgICAgICBmb3J1bTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzP2hhc19tZXNzYWdlPXRydWVgXG4gICAgICAgIH0sXG5cbiAgICAgICAgaW52aXRlczogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9pbnZpdGVzYFxuICAgICAgICB9LFxuXG4gICAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgbWVzc2FnZXM6IChjaGFubmVsSWQsIG9wdGlvbnM/OiBHZXRNZXNzYWdlc09wdGlvbnMpID0+IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcz9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gaWYgKGlzR2V0TWVzc2FnZXNBZnRlcihvcHRpb25zKSAmJiBvcHRpb25zLmFmdGVyKSB7XG4gICAgICAgICAgICAvLyAgIHVybCArPSBgYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGlmIChpc0dldE1lc3NhZ2VzQmVmb3JlKG9wdGlvbnMpICYmIG9wdGlvbnMuYmVmb3JlKSB7XG4gICAgICAgICAgICAvLyAgIHVybCArPSBgJmJlZm9yZT0ke29wdGlvbnMuYmVmb3JlfWBcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGlmIChpc0dldE1lc3NhZ2VzQXJvdW5kKG9wdGlvbnMpICYmIG9wdGlvbnMuYXJvdW5kKSB7XG4gICAgICAgICAgICAvLyAgIHVybCArPSBgJmFyb3VuZD0ke29wdGlvbnMuYXJvdW5kfWBcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIC8vIGlmIChpc0dldE1lc3NhZ2VzTGltaXQob3B0aW9ucykgJiYgb3B0aW9ucy5saW1pdCkge1xuICAgICAgICAgICAgLy8gICB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcblxuICAgICAgICBvdmVyd3JpdGU6IChjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3Blcm1pc3Npb25zLyR7b3ZlcndyaXRlSWR9YFxuICAgICAgICB9LFxuXG4gICAgICAgIGNyb3NzcG9zdDogKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9jcm9zc3Bvc3RgXG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RhZ2VzOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICcvc3RhZ2UtaW5zdGFuY2VzJ1xuICAgICAgICB9LFxuXG4gICAgICAgIHN0YWdlOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvc3RhZ2UtaW5zdGFuY2VzLyR7Y2hhbm5lbElkfWBcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBUaHJlYWQgRW5kcG9pbnRzXG4gICAgICAgIHRocmVhZHM6IHtcbiAgICAgICAgICBtZXNzYWdlOiAoY2hhbm5lbElkLCBtZXNzYWdlSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0vdGhyZWFkc2BcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsbDogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhY3RpdmU6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS90aHJlYWRzL2FjdGl2ZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbWJlcnM6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWQtbWVtYmVyc2BcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkLW1lbWJlcnMvQG1lYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlcjogKGNoYW5uZWxJZCwgdXNlcklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkLW1lbWJlcnMvJHt1c2VySWR9YFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXJjaGl2ZWQ6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzL2FyY2hpdmVkYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHVibGljOiAoY2hhbm5lbElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcy9hcmNoaXZlZC9wdWJsaWM/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gYGJlZm9yZT0ke25ldyBEYXRlKG9wdGlvbnMuYmVmb3JlKS50b0lTT1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcml2YXRlOiAoY2hhbm5lbElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcy9hcmNoaXZlZC9wcml2YXRlP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGBiZWZvcmU9JHtuZXcgRGF0ZShvcHRpb25zLmJlZm9yZSkudG9JU09TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgam9pbmVkOiAoY2hhbm5lbElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdXNlcnMvQG1lL3RocmVhZHMvYXJjaGl2ZWQvcHJpdmF0ZT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgICAgIHVybCArPSBgYmVmb3JlPSR7bmV3IERhdGUob3B0aW9ucy5iZWZvcmUpLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQpIHVybCArPSBgJmxpbWl0PSR7b3B0aW9ucy5saW1pdH1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIHR5cGluZzogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90eXBpbmdgXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvLyBHdWlsZCBFbmRwb2ludHNcbiAgICAgIGd1aWxkczoge1xuICAgICAgICBhdXRvbW9kOiB7XG4gICAgICAgICAgcnVsZTogKGd1aWxkSWQsIHJ1bGVJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYXV0by1tb2RlcmF0aW9uL3J1bGVzLyR7cnVsZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJ1bGVzOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYXV0by1tb2RlcmF0aW9uL3J1bGVzYFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGNoYW5uZWxzOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2NoYW5uZWxzYFxuICAgICAgICB9LFxuICAgICAgICBlbW9qaTogKGd1aWxkSWQsIGVtb2ppSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9lbW9qaXMvJHtlbW9qaUlkfWBcbiAgICAgICAgfSxcbiAgICAgICAgZW1vamlzOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2Vtb2ppc2BcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRzOiB7XG4gICAgICAgICAgZXZlbnRzOiAoZ3VpbGRJZCwgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L3NjaGVkdWxlZC1ldmVudHM/YFxuXG4gICAgICAgICAgICBpZiAod2l0aFVzZXJDb3VudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVybCArPSBgd2l0aF91c2VyX2NvdW50PSR7d2l0aFVzZXJDb3VudC50b1N0cmluZygpfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGV2ZW50OiAoZ3VpbGRJZCwgZXZlbnRJZCwgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L3NjaGVkdWxlZC1ldmVudHMvJHtldmVudElkfWBcblxuICAgICAgICAgICAgaWYgKHdpdGhVc2VyQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfdXNlcl9jb3VudD0ke3dpdGhVc2VyQ291bnQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZXJzOiAoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucz86IEdldFNjaGVkdWxlZEV2ZW50VXNlcnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L3NjaGVkdWxlZC1ldmVudHMvJHtldmVudElkfS91c2Vycz9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQgIT09IHVuZGVmaW5lZCkgdXJsICs9IGBsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy53aXRoTWVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgICAgdXJsICs9IGAmd2l0aF9tZW1iZXI9JHtvcHRpb25zLndpdGhNZW1iZXIudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hZnRlciAhPT0gdW5kZWZpbmVkKSB1cmwgKz0gYCZhZnRlcj0ke29wdGlvbnMuYWZ0ZXJ9YFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSAhPT0gdW5kZWZpbmVkKSB1cmwgKz0gYCZiZWZvcmU9JHtvcHRpb25zLmJlZm9yZX1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBpbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKSB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW50ZWdyYXRpb25zLyR7aW50ZWdyYXRpb25JZH1gXG4gICAgICAgIH0sXG4gICAgICAgIGludGVncmF0aW9uczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9pbnRlZ3JhdGlvbnM/aW5jbHVkZV9hcHBsaWNhdGlvbnM9dHJ1ZWBcbiAgICAgICAgfSxcbiAgICAgICAgaW52aXRlKGludml0ZUNvZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgICBsZXQgdXJsID0gYC9pbnZpdGVzLyR7aW52aXRlQ29kZX0/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLndpdGhDb3VudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgd2l0aF9jb3VudHM9JHtvcHRpb25zLndpdGhDb3VudHMudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy53aXRoRXhwaXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgdXJsICs9IGAmd2l0aF9leHBpcmF0aW9uPSR7b3B0aW9ucy53aXRoRXhwaXJhdGlvbi50b1N0cmluZygpfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnNjaGVkdWxlZEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICB1cmwgKz0gYCZndWlsZF9zY2hlZHVsZWRfZXZlbnRfaWQ9JHtvcHRpb25zLnNjaGVkdWxlZEV2ZW50SWR9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgaW52aXRlczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9pbnZpdGVzYFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgYmFuOiAoZ3VpbGRJZCwgdXNlcklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9iYW5zLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvdDogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L21lbWJlcnMvQG1lYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVtYmVyOiAoZ3VpbGRJZCwgdXNlcklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbWJlcnM6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYGxpbWl0PSR7b3B0aW9ucy5saW1pdH1gXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIpIHVybCArPSBgJmFmdGVyPSR7b3B0aW9ucy5hZnRlcn1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlYXJjaDogKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzL3NlYXJjaD9xdWVyeT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCAhPT0gdW5kZWZpbmVkKSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcnVuZTogKGd1aWxkSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9L3BydW5lP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kYXlzKSB1cmwgKz0gYGRheXM9JHtvcHRpb25zLmRheXN9YFxuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmluY2x1ZGVSb2xlcykpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgICAgdXJsICs9IGAmaW5jbHVkZV9yb2xlcz0ke29wdGlvbnMuaW5jbHVkZVJvbGVzLmpvaW4oJywnKX1gXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlUm9sZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgICAgdXJsICs9IGAmaW5jbHVkZV9yb2xlcz0ke29wdGlvbnMuaW5jbHVkZVJvbGVzfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgY29kZTogKGNvZGUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy90ZW1wbGF0ZXMvJHtjb2RlfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGd1aWxkOiAoZ3VpbGRJZCwgY29kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdGVtcGxhdGVzLyR7Y29kZX1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGw6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS90ZW1wbGF0ZXNgXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd2ViaG9va3M6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vd2ViaG9va3NgXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnRlcmFjdGlvbiBFbmRwb2ludHNcbiAgICAgIGludGVyYWN0aW9uczoge1xuICAgICAgICBjb21tYW5kczoge1xuICAgICAgICAgIC8vIEFwcGxpY2F0aW9uIEVuZHBvaW50c1xuICAgICAgICAgIGNvbW1hbmRzOiAoYXBwbGljYXRpb25JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vY29tbWFuZHNgXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGd1aWxkczoge1xuICAgICAgICAgICAgYWxsKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHNgXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvbmUoYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkLCB3aXRoTG9jYWxpemF0aW9ucykge1xuICAgICAgICAgICAgICBsZXQgdXJsID0gYC9hcHBsaWNhdGlvbnMvJHthcHBsaWNhdGlvbklkfS9ndWlsZHMvJHtndWlsZElkfS9jb21tYW5kcy8ke2NvbW1hbmRJZH0/YFxuXG4gICAgICAgICAgICAgIGlmICh3aXRoTG9jYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGB3aXRoX2xvY2FsaXphdGlvbnM9JHt3aXRoTG9jYWxpemF0aW9ucy50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwZXJtaXNzaW9uczogKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzL3Blcm1pc3Npb25zYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGVybWlzc2lvbjogKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9L3Blcm1pc3Npb25zYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogKGFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCwgd2l0aExvY2FsaXphdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfT9gXG5cbiAgICAgICAgICAgIGlmICh3aXRoTG9jYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVybCArPSBgd2l0aExvY2FsaXphdGlvbnM9JHt3aXRoTG9jYWxpemF0aW9ucy50b1N0cmluZygpfWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgLy8gSW50ZXJhY3Rpb24gRW5kcG9pbnRzXG4gICAgICAgICAgY2FsbGJhY2s6IChpbnRlcmFjdGlvbklkLCB0b2tlbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvaW50ZXJhY3Rpb25zLyR7aW50ZXJhY3Rpb25JZH0vJHt0b2tlbn0vY2FsbGJhY2tgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbDogKGludGVyYWN0aW9uSWQsIHRva2VuKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke2ludGVyYWN0aW9uSWR9LyR7dG9rZW59L21lc3NhZ2VzL0BvcmlnaW5hbGBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2U6IChhcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke2FwcGxpY2F0aW9uSWR9LyR7dG9rZW59L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gVXNlciBlbmRwb2ludHNcbiAgICAgIHVzZXIodXNlcklkKSB7XG4gICAgICAgIHJldHVybiBgL3VzZXJzLyR7dXNlcklkfWBcbiAgICAgIH0sXG5cbiAgICAgIHVzZXJCb3QoKSB7XG4gICAgICAgIHJldHVybiAnL3VzZXJzL0BtZSdcbiAgICAgIH0sXG5cbiAgICAgIG9hdXRoMkFwcGxpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ29hdXRoMi9hcHBsaWNhdGlvbnMvQG1lJ1xuICAgICAgfSxcblxuICAgICAgZ2F0ZXdheUJvdCgpIHtcbiAgICAgICAgcmV0dXJuICcvZ2F0ZXdheS9ib3QnXG4gICAgICB9LFxuXG4gICAgICBuaXRyb1N0aWNrZXJQYWNrcygpIHtcbiAgICAgICAgcmV0dXJuICcvc3RpY2tlci1wYWNrcydcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIGNoZWNrUmF0ZUxpbWl0cyh1cmwpIHtcbiAgICAgIGNvbnN0IHJhdGVsaW1pdGVkID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCh1cmwpXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKVxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBpZiAocmF0ZWxpbWl0ZWQgJiYgbm93IDwgcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIGlmIChnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWwucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGNyZWF0ZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3VzZXItYWdlbnQnOiBgRGlzY29yZEJvdCAoaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmRlbm8vZGlzY29yZGVubywgdiR7dmVyc2lvbn0pYCxcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnVuYXV0aG9yaXplZCkgaGVhZGVycy5hdXRob3JpemF0aW9uID0gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICAvLyBTT01FVElNRVMgU1BFQ0lBTCBIRUFERVJTIChFLkcuIENVU1RPTSBBVVRIT1JJWkFUSU9OKSBORUVEIFRPIEJFIFVTRURcbiAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSBvcHRpb25zLmhlYWRlcnNba2V5XVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdFVCBNRVRIT0RTIFNIT1VMRCBOT1QgSEFWRSBBIEJPRFlcbiAgICAgIGlmIChvcHRpb25zLm1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIC8vIElGIEEgUkVBU09OIElTIFBST1ZJREVEIEVOQ09ERSBJVCBJTiBIRUFERVJTXG4gICAgICBpZiAob3B0aW9ucy5ib2R5Py5yZWFzb24pIHtcbiAgICAgICAgaGVhZGVyc1snWC1BdWRpdC1Mb2ctUmVhc29uJ10gPSBlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5ib2R5LnJlYXNvbiBhcyBzdHJpbmcpXG4gICAgICAgIG9wdGlvbnMuYm9keS5yZWFzb24gPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuYm9keSAmJiAhWydHRVQnLCAnREVMRVRFJ10uaW5jbHVkZXMob3B0aW9ucy5tZXRob2QpKSB7XG4gICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIGJvZHk6IChvcHRpb25zLmJvZHk/LmZpbGUgPz8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5ib2R5KSkgYXMgRm9ybURhdGEgfCBzdHJpbmcsXG4gICAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICB9XG4gICAgfSxcblxuICAgIHByb2Nlc3NSYXRlTGltaXRlZFBhdGhzKCkge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZW50cmllcygpKSB7XG4gICAgICAgIC8vICAgcmVzdC5kZWJ1ZyhcbiAgICAgICAgLy8gYFtSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgZm9yIG9mIGxvb3AuICR7XG4gICAgICAgIC8vICAgdmFsdWUucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgICAgLy8gfWBcbiAgICAgICAgLy8gICApXG4gICAgICAgIC8vIElmIHRoZSB0aW1lIGhhcyBub3QgcmVhY2hlZCBjYW5jZWxcbiAgICAgICAgaWYgKHZhbHVlLnJlc2V0VGltZXN0YW1wID4gbm93KSBjb250aW51ZVxuXG4gICAgICAgIC8vIFJhdGUgbGltaXQgaXMgb3ZlciwgZGVsZXRlIHRoZSByYXRlIGxpbWl0ZXJcbiAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLmRlbGV0ZShrZXkpXG4gICAgICAgIC8vIElmIGl0IHdhcyBnbG9iYWwsIGFsc28gbWFyayB0aGUgZ2xvYmFsIHZhbHVlIGFzIGZhbHNlXG4gICAgICAgIGlmIChrZXkgPT09ICdnbG9iYWwnKSByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBBTEwgUEFUSFMgQVJFIENMRUFSRUQgQ0FOIENBTkNFTCBPVVQhXG4gICAgICBpZiAocmVzdC5yYXRlTGltaXRlZFBhdGhzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyA9IGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzID0gdHJ1ZVxuICAgICAgICAvLyBSRUNIRUNLIElOIDEgU0VDT05EXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHJlc3QuZGVidWcoJ1tSRVNUIC0gcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHNdIFJ1bm5pbmcgc2V0VGltZW91dC4nKVxuICAgICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgICB9LCAxMDAwKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiogUHJvY2Vzc2VzIHRoZSByYXRlIGxpbWl0IGhlYWRlcnMgYW5kIGRldGVybWluZXMgaWYgaXQgbmVlZHMgdG8gYmUgcmF0ZSBsaW1pdGVkIGFuZCByZXR1cm5zIHRoZSBidWNrZXQgaWQgaWYgYXZhaWxhYmxlICovXG4gICAgcHJvY2Vzc0hlYWRlcnModXJsLCBoZWFkZXJzKSB7XG4gICAgICBsZXQgcmF0ZUxpbWl0ZWQgPSBmYWxzZVxuXG4gICAgICAvLyBHRVQgQUxMIE5FQ0VTU0FSWSBIRUFERVJTXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJylcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXIgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVzZXQtYWZ0ZXInKVxuICAgICAgY29uc3QgcmVzZXQgPSBEYXRlLm5vdygpICsgTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMFxuICAgICAgY29uc3QgZ2xvYmFsID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LWdsb2JhbCcpXG4gICAgICAvLyB1bmRlZmluZWQgb3ZlcnJpZGUgbnVsbCBuZWVkZWQgZm9yIHR5cGluZ3NcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LWJ1Y2tldCcpID8/IHVuZGVmaW5lZFxuICAgICAgY29uc3QgbGltaXQgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtbGltaXQnKVxuXG4gICAgICByZXN0LnF1ZXVlcy5nZXQodXJsKT8uaGFuZGxlQ29tcGxldGVkUmVxdWVzdCh7XG4gICAgICAgIHJlbWFpbmluZzogcmVtYWluaW5nID8gTnVtYmVyKHJlbWFpbmluZykgOiB1bmRlZmluZWQsXG4gICAgICAgIGludGVydmFsOiByZXRyeUFmdGVyID8gTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMCA6IHVuZGVmaW5lZCxcbiAgICAgICAgbWF4OiBsaW1pdCA/IE51bWJlcihsaW1pdCkgOiB1bmRlZmluZWQsXG4gICAgICB9KVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgUkFURSBMSU1JVCwgTUFSSyBJVCBBUyBSQVRFIExJTUlURURcbiAgICAgIGlmIChyZW1haW5pbmcgPT09ICcwJykge1xuICAgICAgICByYXRlTGltaXRlZCA9IHRydWVcblxuICAgICAgICAvLyBTQVZFIFRIRSBVUkwgQVMgTElNSVRFRCwgSU1QT1JUQU5UIEZPUiBORVcgUkVRVUVTVFMgQlkgVVNFUiBXSVRIT1VUIEJVQ0tFVFxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KHVybCwge1xuICAgICAgICAgIHVybCxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogcmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU0FWRSBUSEUgQlVDS0VUIEFTIExJTUlURUQgU0lOQ0UgRElGRkVSRU5UIFVSTFMgTUFZIFNIQVJFIEEgQlVDS0VUXG4gICAgICAgIGlmIChidWNrZXRJZCkge1xuICAgICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoYnVja2V0SWQsIHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSUYgVEhFUkUgSVMgTk8gUkVNQUlOSU5HIEdMT0JBTCBMSU1JVCwgTUFSSyBJVCBSQVRFIExJTUlURUQgR0xPQkFMTFlcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KCdyZXRyeS1hZnRlcicpXG4gICAgICAgIGNvbnN0IGdsb2JhbFJlc2V0ID0gRGF0ZS5ub3coKSArIE51bWJlcihyZXRyeUFmdGVyKSAqIDEwMDBcbiAgICAgICAgLy8gICByZXN0LmRlYnVnKFxuICAgICAgICAvLyBgW1JFU1QgPSBHbG9iYWxseSBSYXRlIExpbWl0ZWRdIFVSTDogJHt1cmx9IHwgR2xvYmFsIFJlc3Q6ICR7Z2xvYmFsUmVzZXR9YFxuICAgICAgICAvLyAgIClcbiAgICAgICAgcmVzdC5nbG9iYWxseVJhdGVMaW1pdGVkID0gdHJ1ZVxuICAgICAgICByYXRlTGltaXRlZCA9IHRydWVcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSBmYWxzZVxuICAgICAgICB9LCBnbG9iYWxSZXNldClcblxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KCdnbG9iYWwnLCB7XG4gICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICByZXNldFRpbWVzdGFtcDogZ2xvYmFsUmVzZXQsXG4gICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChidWNrZXRJZCwge1xuICAgICAgICAgICAgdXJsOiAnZ2xvYmFsJyxcbiAgICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICAgIGJ1Y2tldElkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhdGVMaW1pdGVkICYmICFyZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzKSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJhdGVMaW1pdGVkID8gYnVja2V0SWQgOiB1bmRlZmluZWRcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZFJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgLy8gY29uc29sZS5sb2coJ3NlbmRpbmcgcmVxdWVzdCcsIG9wdGlvbnMudXJsLCByZXN0LmNyZWF0ZVJlcXVlc3QoeyBtZXRob2Q6IG9wdGlvbnMubWV0aG9kLCB1cmw6IG9wdGlvbnMudXJsLCBib2R5OiBvcHRpb25zLmJvZHkgfSkpXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICBvcHRpb25zLnVybCxcbiAgICAgICAgcmVzdC5jcmVhdGVSZXF1ZXN0KHsgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCwgdXJsOiBvcHRpb25zLnVybCwgYm9keTogb3B0aW9ucy5ib2R5LCAuLi5vcHRpb25zLm9wdGlvbnMgfSksXG4gICAgICApXG5cbiAgICAgIC8vIFNldCB0aGUgYnVja2V0IGlkIGlmIGl0IHdhcyBhdmFpbGFibGUgb24gdGhlIGhlYWRlcnNcbiAgICAgIGNvbnN0IGJ1Y2tldElkID0gcmVzdC5wcm9jZXNzSGVhZGVycyhyZXN0LnNpbXBsaWZ5VXJsKG9wdGlvbnMudXJsLCBvcHRpb25zLm1ldGhvZCksIHJlc3BvbnNlLmhlYWRlcnMpXG4gICAgICBpZiAoYnVja2V0SWQpIG9wdGlvbnMuYnVja2V0SWQgPSBidWNrZXRJZFxuXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgLy8gSWYgTk9UIHJhdGUgbGltaXRlZCByZW1vdmUgZnJvbSBxdWV1ZVxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgICAvLyBUb28gbWFueSBhdHRlbXB0cywgZ2V0IHJpZCBvZiByZXF1ZXN0IGZyb20gcXVldWUuXG4gICAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCsrID49IHJlc3QubWF4UmV0cnlDb3VudCkge1xuICAgICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICAgIC8vIFJlbW92ZSBpdGVtIGZyb20gcXVldWUgdG8gcHJldmVudCByZXRyeVxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmVqZWN0Py4oe1xuICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgICBlcnJvcjogJ1RoZSBvcHRpb25zIHdhcyByYXRlIGxpbWl0ZWQgYW5kIGl0IG1heGVkIG91dCB0aGUgcmV0cmllcyBsaW1pdC4nLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSYXRlIGxpbWl0ZWQsIGFkZCBiYWNrIHRvIHF1ZXVlXG4gICAgICAgICAgcmVzdC5pbnZhbGlkQnVja2V0LmhhbmRsZUNvbXBsZXRlZFJlcXVlc3QocmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtU2NvcGUnKSA9PT0gJ3NoYXJlZCcpXG5cbiAgICAgICAgICBjb25zdCByZXNldEFmdGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlc2V0LWFmdGVyJylcbiAgICAgICAgICBpZiAocmVzZXRBZnRlcikgYXdhaXQgZGVsYXkoTnVtYmVyKHJlc2V0QWZ0ZXIpICogMTAwMClcblxuICAgICAgICAgIHJldHVybiBhd2FpdCBvcHRpb25zLnJldHJ5UmVxdWVzdD8uKG9wdGlvbnMpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb3B0aW9ucy5yZXNvbHZlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSlcbiAgICB9LFxuXG4gICAgLy8gQ3JlZGl0czogZ2l0aHViLmNvbS9hYmFsYWJhaGFoYS9lcmlzIGxpYi9yZXN0L1JlcXVlc3RIYW5kbGVyLmpzI0wzOTdcbiAgICAvLyBNb2RpZmllZCBmb3Igb3VyIHVzZS1jYXNlXG4gICAgc2ltcGxpZnlVcmwodXJsLCBtZXRob2QpIHtcbiAgICAgIGxldCByb3V0ZSA9IHVybFxuICAgICAgICAucmVwbGFjZSgvXFwvKFthLXotXSspXFwvKD86WzAtOV17MTcsMTl9KS9nLCBmdW5jdGlvbiAobWF0Y2gsIHA6IHN0cmluZykge1xuICAgICAgICAgIHJldHVybiBbJ2NoYW5uZWxzJywgJ2d1aWxkcyddLmluY2x1ZGVzKHApID8gbWF0Y2ggOiBgLyR7cH0veGBcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGxhY2UoL1xcL3JlYWN0aW9uc1xcL1teL10rL2csICcvcmVhY3Rpb25zL3gnKVxuXG4gICAgICAvLyBHRU5FUkFMIC9yZWFjdGlvbnMgYW5kIC9yZWFjdGlvbnMvZW1vamkvQG1lIHNoYXJlIHRoZSBidWNrZXRzXG4gICAgICBpZiAocm91dGUuaW5jbHVkZXMoJy9yZWFjdGlvbnMnKSkge1xuICAgICAgICByb3V0ZSA9IHJvdXRlLnN1YnN0cmluZygwLCByb3V0ZS5pbmRleE9mKCcvcmVhY3Rpb25zJykgKyAnL3JlYWN0aW9ucycubGVuZ3RoKVxuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgTWVzc2FnZSBlbmRwb2ludCBoYXMgaXRzIG93biByYXRlIGxpbWl0XG4gICAgICBpZiAobWV0aG9kID09PSAnREVMRVRFJyAmJiByb3V0ZS5lbmRzV2l0aCgnL21lc3NhZ2VzL3gnKSkge1xuICAgICAgICByb3V0ZSA9IG1ldGhvZCArIHJvdXRlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3V0ZVxuICAgIH0sXG5cbiAgICBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHJvdXRlID0gcmVxdWVzdC51cmwuc3Vic3RyaW5nKHJlcXVlc3QudXJsLmluZGV4T2YoJ2FwaS8nKSlcbiAgICAgIGNvbnN0IHBhcnRzID0gcm91dGUuc3BsaXQoJy8nKVxuICAgICAgLy8gUmVtb3ZlIHRoZSBhcGkvXG4gICAgICBwYXJ0cy5zaGlmdCgpXG4gICAgICAvLyBSZW1vdmVzIHRoZSAvdiMvXG4gICAgICBpZiAocGFydHNbMF0/LnN0YXJ0c1dpdGgoJ3YnKSkgcGFydHMuc2hpZnQoKVxuICAgICAgLy8gU2V0IHRoZSBmdWxsIHVybCB0byBkaXNjb3JkIGFwaSBpbiBjYXNlIGl0IHdhcyByZWNpZXZlZCBpbiBhIHByb3h5IHJlc3RcbiAgICAgIHJlcXVlc3QudXJsID0gYCR7cmVzdC5iYXNlVXJsfS92JHtyZXN0LnZlcnNpb259LyR7cGFydHMuam9pbignLycpfWBcblxuICAgICAgY29uc3QgdXJsID0gcmVzdC5zaW1wbGlmeVVybChyZXF1ZXN0LnVybCwgcmVxdWVzdC5tZXRob2QpXG4gICAgICBjb25zdCBxdWV1ZSA9IHJlc3QucXVldWVzLmdldCh1cmwpXG5cbiAgICAgIGlmIChxdWV1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDUkVBVEVTIEEgTkVXIFFVRVVFXG4gICAgICAgIGNvbnN0IGJ1Y2tldFF1ZXVlID0gbmV3IFF1ZXVlKHJlc3QsIHsgdXJsIH0pXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KHVybCwgYnVja2V0UXVldWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXN0LnByb2Nlc3NSZXF1ZXN0KHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIGJvZHksXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjaGFuZ2UgdG8gcmVwcm9jZXNzIHF1ZXVlIGl0ZW1cbiAgICAgICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXQ8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZykge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0dFVCcsIHVybCkpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIHBvc3Q8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+Pih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQT1NUJywgdXJsLCBib2R5KSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlKHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ0RFTEVURScsIHVybCwgYm9keSkpXG4gICAgfSxcblxuICAgIGFzeW5jIHBhdGNoPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUEFUQ0gnLCB1cmwsIGJvZHkpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwdXQ8VCA9IHZvaWQ+KHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdQVVQnLCB1cmwsIGJvZHksIG9wdGlvbnMpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBjaGFubmVsczoge1xuICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgYXN5bmMgZGVsZXRlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24/KSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhc29uKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBlZGl0KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgc2VuZChjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zZW5kTWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcHVibGlzaChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1Ymxpc2hNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZ2V0KGlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldENoYW5uZWwoaWQpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVDaGFubmVsKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBkZWxldGUoaWQsIHJlYXNvbikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVDaGFubmVsKGlkLCByZWFzb24pXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBlZGl0KGlkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRDaGFubmVsKGlkLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZm9sbG93KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmZvbGxvd0Fubm91bmNlbWVudChzb3VyY2VDaGFubmVsSWQsIHRhcmdldENoYW5uZWxJZClcbiAgICAgIH0sXG5cbiAgICAgIGZvcnVtczoge1xuICAgICAgICBhc3luYyBwb3N0KGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUZvcnVtVGhyZWFkKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGFzeW5jIGVkaXQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoY2hhbm5lbElkLCBpZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBpZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIHBvc2l0aW9ucyhndWlsZElkLCBjaGFubmVsUG9zaXRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRDaGFubmVsUG9zaXRpb25zKGd1aWxkSWQsIGNoYW5uZWxQb3NpdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBpbnZpdGVzKGlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldENoYW5uZWxJbnZpdGVzKGlkKVxuICAgICAgfSxcblxuICAgICAgc3RhZ2VzOiB7XG4gICAgICAgIGFzeW5jIGNyZWF0ZShvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlU3RhZ2VJbnN0YW5jZShvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRlbGV0ZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZVN0YWdlSW5zdGFuY2UoY2hhbm5lbElkLCByZWFzb24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZWRpdChjaGFubmVsSWQsIGRhdGEpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIGRhdGEpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZ2V0KGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFN0YWdlSW5zdGFuY2UoY2hhbm5lbElkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgdGhyZWFkczoge1xuICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICBhc3luYyBtZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgd2l0aG91dDoge1xuICAgICAgICAgICAgYXN5bmMgbWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgYXN5bmMgYWN0aXZlKGd1aWxkSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEFjdGl2ZVRocmVhZHMoZ3VpbGRJZClcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXJjaGl2ZWQ6IHtcbiAgICAgICAgICAgIGFzeW5jIHByaXZhdGUoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIHB1YmxpYyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIG1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0VGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBtZW1iZXJzKGNoYW5uZWxJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0VGhyZWFkTWVtYmVycyhjaGFubmVsSWQpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBqb2luKGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmpvaW5UaHJlYWQoY2hhbm5lbElkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGxlYXZlKGNoYW5uZWxJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmxlYXZlVGhyZWFkKGNoYW5uZWxJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBraWNrKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucmVtb3ZlVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgdHlwaW5nKGlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LnRyaWdnZXJUeXBpbmdJbmRpY2F0b3IoaWQpXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBlbW9qaXM6IHtcbiAgICAgIGFzeW5jIGNyZWF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUVtb2ppKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBkZWxldGUoZ3VpbGRJZCwgaWQsIHJlYXNvbikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVFbW9qaShndWlsZElkLCBpZCwgcmVhc29uKVxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZWRpdChndWlsZElkLCBpZCwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0RW1vamkoZ3VpbGRJZCwgaWQsIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBnZXQoZ3VpbGRJZCwgZW1vamlJZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKVxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgZ3VpbGRzOiB7XG4gICAgICBhdXRvbW9kOiB7XG4gICAgICAgIGFzeW5jIGNyZWF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoZ3VpbGRJZCwgZXZlbnRJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIGV2ZW50SWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZWRpdChndWlsZElkLCBydWxlSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0QXV0b21vZFJ1bGUoZ3VpbGRJZCwgcnVsZUlkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGdldDoge1xuICAgICAgICAgIGFzeW5jIHJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEF1dG9tb2RSdWxlcyhndWlsZElkKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICBhc3luYyBjaGFubmVscyhpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRDaGFubmVscyhpZClcbiAgICAgIH0sXG5cbiAgICAgIGFzeW5jIGVtb2ppcyhpZCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRFbW9qaXMoaWQpXG4gICAgICB9LFxuXG4gICAgICBldmVudHM6IHtcbiAgICAgICAgYXN5bmMgY3JlYXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5jcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRlbGV0ZShndWlsZElkLCBldmVudElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZClcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBlZGl0KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQ6IHtcbiAgICAgICAgICBhc3luYyBldmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBldmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0U2NoZWR1bGVkRXZlbnRzKGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFNjaGVkdWxlZEV2ZW50VXNlcnMoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgaW50ZWdyYXRpb25zOiB7XG4gICAgICAgIGFzeW5jIGdldChndWlsZElkKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0SW50ZWdyYXRpb25zKGd1aWxkSWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgZGVsZXRlKGd1aWxkSWQsIGludGVncmF0aW9uSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVJbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgaW52aXRlczoge1xuICAgICAgICBhc3luYyBjcmVhdGUoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlSW52aXRlKGNoYW5uZWxJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBkZWxldGUoaW52aXRlQ29kZSwgcmVhc29uKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlSW52aXRlKGludml0ZUNvZGUsIHJlYXNvbilcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBnZXQoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGxpc3QoZ3VpbGRJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEludml0ZXMoZ3VpbGRJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICBhc3luYyBjcmVhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZGVsZXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZUd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBlZGl0KGd1aWxkSWQsIHRlbXBsYXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZ2V0KHRlbXBsYXRlQ29kZSkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBsaXN0KGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHdWlsZFRlbXBsYXRlcyhndWlsZElkKVxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzeW5jKGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zeW5jR3VpbGRUZW1wbGF0ZShndWlsZElkKVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgbWVtYmVyczoge1xuICAgICAgICBhc3luYyBiYW4oZ3VpbGRJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZWRpdChndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0TWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBlZGl0U2VsZihndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdEJvdE1lbWJlcihndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGdldChndWlsZElkLCB1c2VySWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGRtKHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldERtQ2hhbm5lbCh1c2VySWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMga2ljayhndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgbGlzdChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHBydW5lKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5wcnVuZU1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICBhc3luYyBzZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zZWFyY2hNZW1iZXJzKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIHVuYmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnVuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZClcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGludGVyYWN0aW9uczoge1xuICAgICAgICBjb21tYW5kczoge1xuICAgICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgICAgYXN5bmMgZ2xvYmFsKGNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBndWlsZChjb21tYW5kLCBndWlsZElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmQsIGd1aWxkSWQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgIGFzeW5jIGdsb2JhbChjb21tYW5kSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZClcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIGd1aWxkKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgICBhc3luYyBnbG9iYWwoY29tbWFuZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgZ3VpbGQoY29tbWFuZElkLCBndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIGd1aWxkSWQsIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBwZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZ2V0OiB7XG4gICAgICAgICAgICBnbG9iYWw6IHtcbiAgICAgICAgICAgICAgYXN5bmMgYWxsKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoKVxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIGFzeW5jIG9uZShjb21tYW5kSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ3VpbGRzOiB7XG4gICAgICAgICAgICAgIGFzeW5jIGFsbChndWlsZElkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpXG4gICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgYXN5bmMgb25lKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIHBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24oZ3VpbGRJZCwgY29tbWFuZElkKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgcGVybWlzc2lvbnMoZ3VpbGRJZCkge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgcmVwbGFjZToge1xuICAgICAgICAgICAgYXN5bmMgZ2xvYmFsKGNvbW1hbmRzKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LnVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoY29tbWFuZHMpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBndWlsZChndWlsZElkLCBjb21tYW5kcykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC51cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgY29tbWFuZHMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgICBhc3luYyBmb2xsb3d1cCh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5zZW5kRm9sbG93dXBNZXNzYWdlKHRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgYXN5bmMgb3JpZ2luYWwoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3Quc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgIGFzeW5jIGZvbGxvd3VwKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBvcmlnaW5hbCh0b2tlbikge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBlZGl0OiB7XG4gICAgICAgICAgICBhc3luYyBmb2xsb3d1cCh0b2tlbiwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucylcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFzeW5jIG9yaWdpbmFsKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIG9wdGlvbnMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBnZXQ6IHtcbiAgICAgICAgICAgIGFzeW5jIGZvbGxvd3VwKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBhc3luYyBvcmlnaW5hbCh0b2tlbikge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICB1c2Vyczoge1xuICAgICAgYXN5bmMgY2hhbm5lbCh1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0RG1DaGFubmVsKHVzZXJJZClcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHdlYmhvb2tzOiB7XG4gICAgICBhc3luYyBjcmVhdGUoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zKVxuICAgICAgfSxcblxuICAgICAgZGVsZXRlOiB7XG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBhc3luYyBpZChpZCwgcmVhc29uKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGVXZWJob29rKGlkLCByZWFzb24pXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHRva2VuKGlkLCB0b2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlV2ViaG9va1dpdGhUb2tlbihpZCwgdG9rZW4pXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIGVkaXQ6IHtcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIGFzeW5jIGlkKHdlYmhvb2tJZCwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZWRpdFdlYmhvb2sod2ViaG9va0lkLCBvcHRpb25zKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyB0b2tlbihpZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRXZWJob29rV2l0aFRva2VuKGlkLCB0b2tlbiwgb3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgYXN5bmMgZXhlY3V0ZSh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN0LmV4ZWN1dGVXZWJob29rKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpXG4gICAgICB9LFxuXG4gICAgICBnZXQ6IHtcbiAgICAgICAgYXN5bmMgY2hhbm5lbChjaGFubmVsSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRDaGFubmVsV2ViaG9va3MoY2hhbm5lbElkKVxuICAgICAgICB9LFxuXG4gICAgICAgIGFzeW5jIGd1aWxkKGd1aWxkSWQpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHdWlsZFdlYmhvb2tzKGd1aWxkSWQpXG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgbWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgIH0sXG5cbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIGFzeW5jIGlkKHdlYmhvb2tJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0V2ViaG9vayh3ZWJob29rSWQpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGFzeW5jIHRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbilcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgYXN5bmMgZGVsZXRlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZVdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucylcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBqcyBoYWNrIG1ha2luZyBpdCBwb3NzaWJsZSB0byBkbyB3ZWJob29rcy5tZXNzYWdlcy5lZGl0KCkgYXMgd2VsbCBhcyB3ZWJob29rcy5tZXNzYWdlcy5lZGl0Lm9yaWdpbmFsKClcbiAgICAgICAgZWRpdDogT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAvLyBUaGUgYmFzZSBmdW5jdGlvbiBmb3Igd2ViaG9va3MubWVzc2FnZXMuZWRpdCgpXG4gICAgICAgICAgKGFzeW5jICh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN0LmVkaXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpXG4gICAgICAgICAgfSkgYXMgV2ViaG9va01lc3NhZ2VFZGl0b3IsXG4gICAgICAgICAgLy8gVGhlIHByb3BlcnRpZXMgdGhhdCB3ZWJob29rcy5tZXNzYWdlcy5lZGl0Lnh4eCB3aWxsIGhhdmUgYXJlIGxpc3RlZCBpbiB0aGlzIG9iamVjdFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9yaWdpbmFsOiBhc3luYyAod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVzdC5lZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIFdlYmhvb2tNZXNzYWdlRWRpdG9yLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQXV0b21vZFJ1bGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPihyZXN0LnJvdXRlcy5ndWlsZHMuYXV0b21vZC5ydWxlcyhndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlQ2hhbm5lbChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUVtb2ppKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSwgY29tbWFuZClcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuZ3VpbGRzLmFsbChyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpLCBjb21tYW5kKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRm9ydW1UaHJlYWQoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5mb3J1bShjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVJbnZpdGUoY2hhbm5lbElkLCBvcHRpb25zID0ge30pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEludml0ZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRTY2hlZHVsZWRFdmVudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudHMoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVN0YWdlSW5zdGFuY2Uob3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2VzKCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZVdlYmhvb2soY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpLCB7XG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgYXZhdGFyOiBvcHRpb25zLmF2YXRhciA/IGF3YWl0IHVybFRvQmFzZTY0KG9wdGlvbnMuYXZhdGFyKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVhc29uOiBvcHRpb25zLnJlYXNvbixcbiAgICAgIH0gYXMgRGlzY29yZENyZWF0ZVdlYmhvb2spXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmF1dG9tb2QucnVsZShndWlsZElkLCBydWxlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsKGNoYW5uZWxJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChjaGFubmVsSWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUNoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGUoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMub3ZlcndyaXRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVFbW9qaShndWlsZElkLCBpZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVHdWlsZFRlbXBsYXRlKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy50ZW1wbGF0ZXMuZ3VpbGQoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnRlZ3JhdGlvbihndWlsZElkLCBpbnRlZ3JhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlSW52aXRlKGludml0ZUNvZGUsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGUoaW52aXRlQ29kZSksIHJlYXNvbiA/IHsgcmVhc29uIH0gOiB1bmRlZmluZWQpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHJlYXNvbiA/IHsgcmVhc29uIH0gOiB1bmRlZmluZWQpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2sod2ViaG9va0lkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICB7XG4gICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFByb2ZpbGUob3B0aW9ucykge1xuICAgICAgY29uc3QgYXZhdGFyID0gb3B0aW9ucz8uYm90QXZhdGFyVVJMID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucz8uYm90QXZhdGFyVVJMKSA6IG9wdGlvbnM/LmJvdEF2YXRhclVSTFxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlckJvdCgpLCB7XG4gICAgICAgIHVzZXJuYW1lOiBvcHRpb25zLnVzZXJuYW1lPy50cmltKCksXG4gICAgICAgIGF2YXRhcixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG9wdGlvbnMuaWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBvc2l0aW9ucyhndWlsZElkLCBjaGFubmVsUG9zaXRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIGNoYW5uZWxQb3NpdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRFbW9qaShndWlsZElkLCBpZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVW5saWtlIGBlZGl0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgICAqXG4gICAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2VkaXQtZm9sbG93dXAtbWVzc2FnZX1cbiAgICAgKi9cbiAgICBhc3luYyBlZGl0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4oXG4gICAgICAgIHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIClcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkVGVtcGxhdGUoZ3VpbGRJZDogQmlnU3RyaW5nLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRUZW1wbGF0ZSk6IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm9yaWdpbmFsKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mub3JpZ2luYWwod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucyksIHtcbiAgICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLlVwZGF0ZU1lc3NhZ2UsXG4gICAgICAgIGRhdGE6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIGRhdGEpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpLCB7IHRvcGljOiBkYXRhLnRvcGljIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rKHdlYmhvb2tJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIHtcbiAgICAgICAgdHlwZTogSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzLlVwZGF0ZU1lc3NhZ2UsXG4gICAgICAgIGRhdGE6IG9wdGlvbnMsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2ViaG9va1dpdGhUb2tlbih3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhlY3V0ZVdlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9sbG93QW5ub3VuY2VtZW50KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRGb2xsb3dlZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvbGxvdyhzb3VyY2VDaGFubmVsSWQpLCB7XG4gICAgICAgIHdlYmhvb2tfY2hhbm5lbF9pZDogdGFyZ2V0Q2hhbm5lbElkLFxuICAgICAgfSBhcyBEaXNjb3JkRm9sbG93QW5ub3VuY2VtZW50Q2hhbm5lbClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QWN0aXZlVGhyZWFkcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBY3RpdmVUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFjdGl2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbihndWlsZElkLCBjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbihyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMkFwcGxpY2F0aW9uKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsSW52aXRlcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuaW52aXRlcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVscyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZENoYW5uZWxbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmNoYW5uZWxzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRDaGFubmVsV2ViaG9va3MoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RG1DaGFubmVsKHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZG0oKSwge1xuICAgICAgICByZWNpcGllbnRfaWQ6IHVzZXJJZC50b1N0cmluZygpLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0RW1vamkoZ3VpbGRJZCwgZW1vamlJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmVtb2ppKGd1aWxkSWQsIGVtb2ppSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRFbW9qaVtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamlzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R2F0ZXdheUJvdCgpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR2V0R2F0ZXdheUJvdD4ocmVzdC5yb3V0ZXMuZ2F0ZXdheUJvdCgpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmQocmVzdC5hcHBsaWNhdGlvbklkLCBjb21tYW5kSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnRlZ3JhdGlvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnRlZ3JhdGlvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXROaXRyb1N0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMubml0cm9TdGlja2VyUGFja3MoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHJpdmF0ZShjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRMaXN0QXJjaGl2ZWRUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmpvaW5lZChjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHVibGljKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucz8ud2l0aFVzZXJDb3VudCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFNjaGVkdWxlZEV2ZW50cyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudFVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxBcnJheTx7IHVzZXI6IERpc2NvcmRVc2VyOyBtZW1iZXI/OiBEaXNjb3JkTWVtYmVyIH0+PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLnVzZXJzKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTZXNzaW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldEdhdGV3YXlCb3QoKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGFnZUluc3RhbmNlPihyZXN0LnJvdXRlcy5jaGFubmVscy5zdGFnZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXJzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZW1iZXJzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFVzZXIoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlcihpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2sod2ViaG9va0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tNZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pKVxuICAgIH0sXG5cbiAgICBhc3luYyBqb2luVGhyZWFkKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWUoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlVGhyZWFkTWVtYmVyKGNoYW5uZWxJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy51c2VyKGNoYW5uZWxJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmVzdC5zZW5kUmVxdWVzdCh7XG4gICAgICAgICAgdXJsOiByZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4pLFxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IHJlc3QuY3JlYXRlUmVxdWVzdCh7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGJvZHk6IHsgLi4ub3B0aW9ucyB9LFxuICAgICAgICAgICAgLy8gcmVtb3ZlIGF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAgICAgICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246ICcnIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjaGFuZ2UgdG8gcmVwcm9jZXNzIHF1ZXVlIGl0ZW1cbiAgICAgICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZEludGVyYWN0aW9uUmVzcG9uc2UoaW50ZXJhY3Rpb25JZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc3Quc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHVybDogcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5jYWxsYmFjayhpbnRlcmFjdGlvbklkLCB0b2tlbiksXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogcmVzdC5jcmVhdGVSZXF1ZXN0KHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgYm9keTogeyAuLi5vcHRpb25zIH0sXG4gICAgICAgICAgICAvLyByZW1vdmUgYXV0aG9yaXphdGlvbiBoZWFkZXJcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogJycgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByZXRyeUNvdW50OiAwLFxuICAgICAgICAgIHJldHJ5UmVxdWVzdDogYXN5bmMgZnVuY3Rpb24gKG9wdGlvbnM6IFNlbmRSZXF1ZXN0T3B0aW9ucykge1xuICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIGNoYW5nZSB0byByZXByb2Nlc3MgcXVldWUgaXRlbVxuICAgICAgICAgICAgYXdhaXQgcmVzdC5zZW5kUmVxdWVzdChvcHRpb25zKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3QsXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kTWVzc2FnZShjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2VzKGNoYW5uZWxJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIHN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFsbChjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzeW5jR3VpbGRUZW1wbGF0ZShndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PHZvaWQ+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Qm90TWVtYmVyKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZW1iZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJvdChndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE1lbWJlcihndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZW1iZXJXaXRoVXNlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVyKGd1aWxkSWQsIHVzZXJJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldE1lbWJlcihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXJzKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLm1lbWJlcnMubWVtYmVycyhndWlsZElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMga2lja01lbWJlcihndWlsZElkLCB1c2VySWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCB7XG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHBydW5lTWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PHsgcHJ1bmVkOiBudW1iZXIgfCBudWxsIH0+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnBydW5lKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzZWFyY2hNZW1iZXJzKGd1aWxkSWQsIHF1ZXJ5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLnNlYXJjaChndWlsZElkLCBxdWVyeSwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIHVuYmFuTWVtYmVyKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyB0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy50eXBpbmcoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhjb21tYW5kcykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIGNvbW1hbmRzKVxuICAgIH0sXG5cbiAgICBhc3luYyB1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgY29tbWFuZHMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIGNvbW1hbmRzKVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gcmVzdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVJlc3RNYW5hZ2VyT3B0aW9ucyB7XG4gIC8qKiBUaGUgYm90IHRva2VuIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBtYWtlIHJlcXVlc3RzLiAqL1xuICB0b2tlbjogc3RyaW5nXG4gIC8qKlxuICAgKiBGb3Igb2xkIGJvdHMgdGhhdCBoYXZlIGEgZGlmZmVyZW50IGJvdCBpZCBhbmQgYXBwbGljYXRpb24gaWQuXG4gICAqIEBkZWZhdWx0IGJvdCBpZCBmcm9tIHRva2VuXG4gICAqL1xuICBhcHBsaWNhdGlvbklkPzogQmlnU3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgYmFzZSB1cmwgdG8gY29ubmVjdCB0by4gSWYgeW91IGNyZWF0ZSBhIHByb3h5IHJlc3QsIHRoYXQgdXJsIHdvdWxkIGdvIGhlcmUuXG4gICAqIElUIFNIT1VMRCBOT1QgRU5EIFdJVEggQSAvXG4gICAqIEBkZWZhdWx0IGh0dHBzOi8vZGlzY29yZC5jb20vYXBpXG4gICAqL1xuICBiYXNlVXJsPzogc3RyaW5nXG4gIC8qKlxuICAgKiBUaGUgYXBpIHZlcnNpb25zIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1ha2UgcmVxdWVzdHMuXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB2ZXJzaW9uPzogQXBpVmVyc2lvbnNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXN0TWFuYWdlciB7XG4gIC8qKiBUaGUgYm90IHRva2VuIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBtYWtlIHJlcXVlc3RzLiAqL1xuICB0b2tlbjogc3RyaW5nXG4gIC8qKiBUaGUgYXBwbGljYXRpb24gaWQuIE5vcm1hbGx5IHRoaXMgaXMgbm90IHJlcXVpcmVkIGZvciByZWNlbnQgYm90cyBidXQgb2xkIGJvdCdzIGFwcGxpY2F0aW9uIGlkIGlzIHNvbWV0aW1lcyBkaWZmZXJlbnQgZnJvbSB0aGUgYm90IGlkIHNvIGl0IGlzIHJlcXVpcmVkIGZvciB0aG9zZSBib3RzLiAqL1xuICBhcHBsaWNhdGlvbklkOiBiaWdpbnRcbiAgLyoqIFRoZSBhcGkgdmVyc2lvbiB0byB1c2Ugd2hlbiBtYWtpbmcgcmVxdWVzdHMuIE9ubHkgdGhlIGxhdGVzdCBzdXBwb3J0ZWQgdmVyc2lvbiB3aWxsIGJlIHRlc3RlZC4gKi9cbiAgdmVyc2lvbjogQXBpVmVyc2lvbnNcbiAgLyoqXG4gICAqIFRoZSBiYXNlIHVybCB0byBjb25uZWN0IHRvLiBJZiB5b3UgY3JlYXRlIGEgcHJveHkgcmVzdCwgdGhhdCB1cmwgd291bGQgZ28gaGVyZS5cbiAgICogSVQgU0hPVUxEIE5PVCBFTkQgV0lUSCBBIC9cbiAgICogQGRlZmF1bHQgaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGlcbiAgICovXG4gIGJhc2VVcmw6IHN0cmluZ1xuICAvKiogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWVzIGEgcmVxdWVzdCBzaG91bGQgYmUgcmV0cmllZC4gRGVmYXVsdHMgdG8gSW5maW5pdHkgKi9cbiAgbWF4UmV0cnlDb3VudDogbnVtYmVyXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgbWFuYWdlciBpcyByYXRlIGxpbWl0ZWQgZ2xvYmFsbHkgYWNyb3NzIGFsbCByZXF1ZXN0cy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIGdsb2JhbGx5UmF0ZUxpbWl0ZWQ6IGJvb2xlYW5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZSByYXRlIGxpbWl0ZWQgcGF0aHMgYXJlIGJlaW5nIHByb2Nlc3NlZCB0byBhbGxvdyByZXF1ZXN0cyB0byBiZSBtYWRlIG9uY2UgdGltZSBpcyB1cC4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzOiBib29sZWFuXG4gIC8qKiBUaGUgcXVldWVzIHRoYXQgaG9sZCBhbGwgdGhlIHJlcXVlc3RzIHRvIGJlIHByb2Nlc3NlZC4gKi9cbiAgcXVldWVzOiBNYXA8c3RyaW5nLCBRdWV1ZT5cbiAgLyoqIFRoZSBwYXRocyB0aGF0IGFyZSBjdXJyZW50bHkgcmF0ZSBsaW1pdGVkLiAqL1xuICByYXRlTGltaXRlZFBhdGhzOiBNYXA8c3RyaW5nLCBSZXN0UmF0ZUxpbWl0ZWRQYXRoPlxuICAvKiogVGhlIGJ1Y2tldCBmb3IgaGFuZGxpbmcgYW55IGludmFsaWQgcmVxdWVzdHMuICAqL1xuICBpbnZhbGlkQnVja2V0OiBJbnZhbGlkUmVxdWVzdEJ1Y2tldFxuICAvKiogVGhlIHJvdXRlcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgbWFuYWdlci4gKi9cbiAgcm91dGVzOiB7XG4gICAgLyoqIFJvdXRlIHRvIGdldCBhIGJvdHMgc2Vzc2lvbiBpbmZvLiAqL1xuICAgIHNlc3Npb25JbmZvOiAoKSA9PiBzdHJpbmdcbiAgICAvKiogQSBzcGVjaWZpYyB1c2VyIHJvdXRlLiAqL1xuICAgIHVzZXI6IChpZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAvKiogQ3VycmVudCBib3QgdXNlciByb3V0ZS4gKi9cbiAgICB1c2VyQm90OiAoKSA9PiBzdHJpbmdcbiAgICAvLyBPQXV0aDJcbiAgICBvYXV0aDJBcHBsaWNhdGlvbjogKCkgPT4gc3RyaW5nXG4gICAgLy8gR2F0ZXdheSBCb3RcbiAgICBnYXRld2F5Qm90OiAoKSA9PiBzdHJpbmdcbiAgICAvLyBOaXRybyBTdGlja2VyIFBhY2tzXG4gICAgbml0cm9TdGlja2VyUGFja3M6ICgpID0+IHN0cmluZ1xuICAgIC8qKiBSb3V0ZXMgZm9yIHdlYmhvb2sgcmVsYXRlZCByb3V0ZXMuICovXG4gICAgd2ViaG9va3M6IHtcbiAgICAgIC8qKiBSb3V0ZSBmb3IgbWFuYWdpbmcgdGhlIG9yaWdpbmFsIG1lc3NhZ2Ugc2VudCBieSBhIHdlYmhvb2suICovXG4gICAgICBvcmlnaW5hbDogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zPzogeyB0aHJlYWRJZD86IEJpZ1N0cmluZyB9KSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3Igd2ViaG9vayB3aXRoIGEgaWQuICovXG4gICAgICBpZDogKHdlYmhvb2tJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSB3ZWJob29rIHdpdGggYSB0b2tlbi4gKi9cbiAgICAgIHdlYmhvb2s6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9ucz86IHsgd2FpdD86IGJvb2xlYW47IHRocmVhZElkPzogQmlnU3RyaW5nIH0pID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIG1lc3NhZ2UgdGhhdCB3YXMgc2VudCB0aHJvdWdoIGEgd2ViaG9vay4gKi9cbiAgICAgIG1lc3NhZ2U6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiB7IHRocmVhZElkPzogQmlnU3RyaW5nIH0pID0+IHN0cmluZ1xuICAgIH1cbiAgICAvKiogUm91dGVzIGZvciBjaGFubmVsIHJlbGF0ZWQgZW5kcG9pbnRzLiAqL1xuICAgIGNoYW5uZWxzOiB7XG4gICAgICAvKiogUm91dGUgZm9yIG5vbi1zcGVjaWZpYyBkbSBjaGFubmVsLiAqL1xuICAgICAgZG06ICgpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBub24tc3BlY2lmaWMgd2ViaG9vayBpbiBhIGNoYW5uZWwuICovXG4gICAgICB3ZWJob29rczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgYSBzcGVjaWZpYyBjaGFubmVsLiAqL1xuICAgICAgY2hhbm5lbDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgZm9sbG93aW5nIGEgc3BlY2lmaWMgY2hhbm5lbC4gKi9cbiAgICAgIGZvbGxvdzogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgbWFuYWdpbmcgYSBmb3J1bSB3aXRoIGEgbWVzc2FnZS4gKi9cbiAgICAgIGZvcnVtOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIGNoYW5uZWwncyBpbnZpdGVzLiAqL1xuICAgICAgaW52aXRlczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgYSBzcGVjaWZpYyBtZXNzYWdlICovXG4gICAgICBtZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIGlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgbWVzc2FnZXMuICovXG4gICAgICBtZXNzYWdlczogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogR2V0TWVzc2FnZXNPcHRpb25zKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBvdmVyd3JpdGUuICovXG4gICAgICBvdmVyd3JpdGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3ZlcndyaXRlSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGNyb3NzcG9zdGluZyBhIHNwZWNpZmljIG1lc3NhZ2UuICovXG4gICAgICBjcm9zc3Bvc3Q6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgc3RhZ2VzICovXG4gICAgICBzdGFnZXM6ICgpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIHN0YWdlICovXG4gICAgICBzdGFnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZXMgZm9yIGhhbmRsaW5nIHRocmVhZCByZWxhdGVkIHRvIGEgY2hhbm5lbC4gKi9cbiAgICAgIHRocmVhZHM6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciB0aHJlYWQgYSBzcGVjaWZpYyBtZXNzYWdlLiAqL1xuICAgICAgICBtZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciB0aHJlYWQgd2l0aG91dCBhIG1lc3NhZ2UuICovXG4gICAgICAgIGFsbDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBhY3RpdmUgdGhyZWFkcy4gKi9cbiAgICAgICAgYWN0aXZlOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBtZW1iZXJzIGluIGEgdGhyZWFkLiAqL1xuICAgICAgICBtZW1iZXJzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIHRoZSBib3QgbWVtYmVyIGluIGEgdGhyZWFkLiAqL1xuICAgICAgICBtZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIG1lbWJlciBpbiBhIHRocmVhZC4gKi9cbiAgICAgICAgdXNlcjogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYXJjaGl2ZWQgdGhyZWFkcy4gKi9cbiAgICAgICAgYXJjaGl2ZWQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgcHVibGljYWxseSBhcmNoaXZlZCB0aHJlYWRzLiAqL1xuICAgICAgICBwdWJsaWM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcy4gKi9cbiAgICAgICAgcHJpdmF0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgcHJpdmF0ZSBhcmNoaXZlZCB0aHJlYWRzIHRoYXQgdGhlIGJvdCBoYXMgam9pbmVkLiAqL1xuICAgICAgICBqb2luZWQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IExpc3RBcmNoaXZlZFRocmVhZHMpID0+IHN0cmluZ1xuICAgICAgfVxuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyB0eXBpbmcgaW5kaWNhdG9ycyBpbiBhIGPCq2hhbm5lbC4gKi9cbiAgICAgIHR5cGluZzogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICB9XG4gICAgLyoqIFJvdXRlcyBmb3IgZ3VpbGQgcmVsYXRlZCBlbmRwb2ludHMuICovXG4gICAgZ3VpbGRzOiB7XG4gICAgICAvKiogUm91dGVzIGZvciBhIGd1aWxkcyBhdXRvbW9kZXJhdGlvbi4gKi9cbiAgICAgIGF1dG9tb2Q6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIGd1aWxkJ3MgYXV0b21vZGVyYXRpb24uICovXG4gICAgICAgIHJ1bGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBhIHNwZWNpZmljIGF1dG9tb2RlcmF0aW9uIHJ1bGUgZ3VpbGQncyAqL1xuICAgICAgICBydWxlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBydWxlSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgICAvKiogUm91dGVzIGZvciBoYW5kbGluZyBhIGd1aWxkJ3Mgc2NoZWR1bGVkIGV2ZW50cy4gKi9cbiAgICAgIGV2ZW50czoge1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBzY2hlZHVsZWQgZXZlbnQuICovXG4gICAgICAgIGV2ZW50czogKGd1aWxkSWQ6IEJpZ1N0cmluZywgd2l0aFVzZXJDb3VudD86IGJvb2xlYW4pID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgc2NoZWR1bGVkIGV2ZW50LiAqL1xuICAgICAgICBldmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCB3aXRoVXNlckNvdW50PzogYm9vbGVhbikgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzY2hlZHVsZWQgZXZlbnQgdXNlcnMuICovXG4gICAgICAgIHVzZXJzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudFVzZXJzKSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGNoYW5uZWxzIGluIGEgZ3VpbGQgKi9cbiAgICAgIGNoYW5uZWxzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBlbW9qaS4gKi9cbiAgICAgIGVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGVtb2ppcy4gKi9cbiAgICAgIGVtb2ppczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgaW50ZWdyYXRpb24uICovXG4gICAgICBpbnRlZ3JhdGlvbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgaW50ZWdyYXRpb25JZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGludGVncmF0aW9ucy4gKi9cbiAgICAgIGludGVncmF0aW9uczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZ3VpbGQgaW52aXRlLiAqL1xuICAgICAgaW52aXRlOiAoaW52aXRlQ29kZTogc3RyaW5nLCBvcHRpb25zPzogR2V0SW52aXRlKSA9PiBzdHJpbmdcbiAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbm9uLXNwZWNpZmljIGludml0ZXMgaW4gYSBndWlsZC4gKi9cbiAgICAgIGludml0ZXM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyBub24tc3BlY2lmaWMgd2ViaG9va3MgaW4gYSBndWlsZCAqL1xuICAgICAgd2ViaG9va3M6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgLyoqIFJvdXRlcyBmb3IgaGFuZGxpbmcgYSBndWlsZCdzIG1lbWJlcnMuICovXG4gICAgICBtZW1iZXJzOiB7XG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBndWlsZCBtZW1iZXIncyBiYW4uICovXG4gICAgICAgIGJhbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgdGhlIGJvdCBndWlsZCBtZW1iZXIuICovXG4gICAgICAgIGJvdDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZpYyBndWlsZCBtZW1iZXIuICovXG4gICAgICAgIG1lbWJlcjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBndWlsZCBtZW1iZXJzLiAqL1xuICAgICAgICBtZW1iZXJzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEd1aWxkTWVtYmVycykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgbWVtYmVyIHNlYXJjaGluZyBpbiBhIGd1aWxkLiAqL1xuICAgICAgICBzZWFyY2g6IChndWlsZElkOiBCaWdTdHJpbmcsIHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxpbWl0PzogbnVtYmVyIH0pID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIHBydW5pbmcgZ3VpbGQgbWVtYmVycy4gKi9cbiAgICAgICAgcHJ1bmU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRHdWlsZFBydW5lQ291bnRRdWVyeSkgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgICAvKiogUm91dGVzIGZvciBoYW5kbGluZyBhIGd1aWxkJ3MgdGVtcGxhdGVzLiAqL1xuICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBzcGVjaWZjIGd1aWxkJ3MgdGVtcGxhdGVzIHdpdGggYSBjb2RlIG9ubHkuICovXG4gICAgICAgIGNvZGU6IChjb2RlOiBzdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgc3BlY2lmaWMgZ3VpbGQncyB0ZW1wbGF0ZSB3aXRoIGEgZ3VpbGQgaWQgYW5kIGNvZGUuICovXG4gICAgICAgIGd1aWxkOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjb2RlOiBzdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIG5vbi1zcGVjaWZpYyBndWlsZCdzIHRlbXBsYXRlcy4gKi9cbiAgICAgICAgYWxsOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIFJvdXRlcyBmb3IgaW50ZXJhY3Rpb24gcmVsYXRlZCBlbmRwb2ludHMuICovXG4gICAgaW50ZXJhY3Rpb25zOiB7XG4gICAgICAvKiogUm91dGVzIGZvciBpbnRlcmFjdGlvbiBjb21tYW5kIHJlbGF0ZWQgZW5kcG9pbnRzLiAqL1xuICAgICAgY29tbWFuZHM6IHtcbiAgICAgICAgLyoqIFJvdXRlIGZvciBub24tc3BlY2lmaWMgY29tbWFuZHMuICovXG4gICAgICAgIGNvbW1hbmRzOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBndWlsZCByZWxhdGVkIGNvbW1hbmRzLiAqL1xuICAgICAgICBndWlsZHM6IHtcbiAgICAgICAgICAvKiogUm91dGUgZm9yIG5vbi1zcGVjaWZpYyBndWlsZCBjb21tYW5kcy4gKi9cbiAgICAgICAgICBhbGw6IChhcHBsaWNhdGlvbklkOiBCaWdTdHJpbmcsIGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gc3RyaW5nXG4gICAgICAgICAgLyoqIFJvdXRlIGZvciBhIHNwZWNpZmljIGd1aWxkIGNvbW1hbmQuICovXG4gICAgICAgICAgb25lOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcsIGNvbW1hbmRJZDogQmlnU3RyaW5nLCB3aXRoTG9jYWxpemF0aW9ucz86IGJvb2xlYW4pID0+IHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIC8qKiBSb3V0ZSBmb3Igbm9uLXNwZWNpZmljIGNvbW1hbmQgcGVybWlzc2lvbnMuICovXG4gICAgICAgIHBlcm1pc3Npb25zOiAoYXBwbGljYXRpb25JZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGEgc3BlY2lmaWMgY29tbWFuZCdzIHBlcm1pc3Npb24uICovXG4gICAgICAgIHBlcm1pc3Npb246IChhcHBsaWNhdGlvbklkOiBCaWdTdHJpbmcsIGd1aWxkSWQ6IEJpZ1N0cmluZywgY29tbWFuZElkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgICAvKiogUm91dGUgZm9yIGEgc3BlY2lmaWMgY29tbWFuZC4gKi9cbiAgICAgICAgY29tbWFuZDogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZywgY29tbWFuZElkOiBCaWdTdHJpbmcsIHdpdGhMb2NhbGl6YXRpb25zPzogYm9vbGVhbikgPT4gc3RyaW5nXG4gICAgICB9XG4gICAgICAvKiogUm91dGVzIGZvciBpbnRlcmFjdGlvbiByZXNwb25zZSByZWxhdGVkIGVuZHBvaW50cy4gKi9cbiAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAvKiogUm91dGUgZm9yIGhhbmRsaW5nIGEgY2FsbGJhY2sgcmVzcG9uc2Ugd2l0aCBpZCBhbmQgdG9rZW4uICovXG4gICAgICAgIGNhbGxiYWNrOiAoaW50ZXJhY3Rpb25JZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBzdHJpbmdcbiAgICAgICAgLyoqIFJvdXRlIGZvciBoYW5kbGluZyB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgdXNpbmcgaWQgYW5kIHRva2VuLiAqL1xuICAgICAgICBvcmlnaW5hbDogKGludGVyYWN0aW9uSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gc3RyaW5nXG4gICAgICAgIC8qKiBSb3V0ZSBmb3IgaGFuZGxpbmcgYSBmb2xsb3d1cCBtZXNzYWdlIGZyb20gYSBpbnRlcmFjdGlvbiByZXNwb25zZS4gKi9cbiAgICAgICAgbWVzc2FnZTogKGFwcGxpY2F0aW9uSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IHN0cmluZ1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKiogQ2hlY2sgdGhlIHJhdGUgbGltaXRzIGZvciBhIHVybCBvciBhIGJ1Y2tldC4gKi9cbiAgY2hlY2tSYXRlTGltaXRzOiAodXJsOiBzdHJpbmcpID0+IG51bWJlciB8IGZhbHNlXG4gIC8qKiBDcmVhdGVzIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGhlYWRlcnMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHNlbmQgYSByZXF1ZXN0LiBXaWxsIGhhbmRsZSBkaWZmZXJlbnQgdHlwZXMgb2YgbWV0aG9kcyBhbmQgZXZlcnl0aGluZyBuZWNlc3NhcnkgZm9yIGRpc2NvcmQuICovXG4gIGNyZWF0ZVJlcXVlc3Q6IChvcHRpb25zOiBDcmVhdGVSZXF1ZXN0Qm9keU9wdGlvbnMpID0+IFJlcXVlc3RCb2R5XG4gIC8qKiBUaGlzIHdpbGwgY3JlYXRlIGEgaW5maW5pdGUgbG9vcCBydW5uaW5nIGluIDEgc2Vjb25kcyB1c2luZyB0YWlsIHJlY3Vyc2lvbiB0byBrZWVwIHJhdGUgbGltaXRzIGNsZWFuLiBXaGVuIGEgcmF0ZSBsaW1pdCByZXNldHMsIHRoaXMgd2lsbCByZW1vdmUgaXQgc28gdGhlIHF1ZXVlIGNhbiBwcm9jZWVkLiAqL1xuICBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoczogKCkgPT4gdm9pZFxuICAvKiogUHJvY2Vzc2VzIHRoZSByYXRlIGxpbWl0IGhlYWRlcnMgYW5kIGRldGVybWluZXMgaWYgaXQgbmVlZHMgdG8gYmUgcmF0ZSBsaW1pdGVkIGFuZCByZXR1cm5zIHRoZSBidWNrZXQgaWQgaWYgYXZhaWxhYmxlICovXG4gIHByb2Nlc3NIZWFkZXJzOiAodXJsOiBzdHJpbmcsIGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZyB8IHVuZGVmaW5lZFxuICAvKiogU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBhcGkuICovXG4gIHNlbmRSZXF1ZXN0OiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBTcGxpdCBhIHVybCB0byBzZXBhcmF0ZSByYXRlIGxpbWl0IGJ1Y2tldHMgYmFzZWQgb24gbWFqb3IvbWlub3IgcGFyYW1ldGVycy4gKi9cbiAgc2ltcGxpZnlVcmw6ICh1cmw6IHN0cmluZywgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kcykgPT4gc3RyaW5nXG4gIC8qKiBNYWtlIGEgcmVxdWVzdCB0byBiZSBzZW50IHRvIHRoZSBhcGkuICovXG4gIG1ha2VSZXF1ZXN0OiA8VCA9IHVua25vd24+KG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8VD5cbiAgLyoqIFRha2VzIGEgcmVxdWVzdCBhbmQgcHJvY2Vzc2VzIGl0IGludG8gYSBxdWV1ZS4gKi9cbiAgcHJvY2Vzc1JlcXVlc3Q6IChyZXF1ZXN0OiBTZW5kUmVxdWVzdE9wdGlvbnMpID0+IHZvaWRcbiAgLyoqIE1ha2UgYSBnZXQgcmVxdWVzdCB0byB0aGUgYXBpICovXG4gIGdldDogPFQgPSB2b2lkPih1cmw6IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxUPj5cbiAgLyoqIE1ha2UgYSBwb3N0IHJlcXVlc3QgdG8gdGhlIGFwaS4gKi9cbiAgcG9zdDogPFQgPSB2b2lkPih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8Q2FtZWxpemU8VD4+XG4gIC8qKiBNYWtlIGEgcHV0IHJlcXVlc3QgdG8gdGhlIGFwaS4gKi9cbiAgcHV0OiA8VCA9IHZvaWQ+KHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Piwgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8Q2FtZWxpemU8VD4+XG4gIC8qKiBNYWtlIGEgZGVsZXRlIHJlcXVlc3QgdG8gdGhlIGFwaS4gKi9cbiAgZGVsZXRlOiAodXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBNYWtlIGEgcGF0Y2ggcmVxdWVzdCB0byB0aGUgYXBpLiAqL1xuICBwYXRjaDogPFQgPSB2b2lkPih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8Q2FtZWxpemU8VD4+XG4gIC8qKiBIZWxwZXIgbWV0aG9kcyByZWxhdGVkIHRvIGNoYW5uZWxzICovXG4gIGNoYW5uZWxzOiB7XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBtZXNzYWdlcyBpbiBhIGNoYW5uZWwgKi9cbiAgICBtZXNzYWdlczoge1xuICAgICAgLyoqXG4gICAgICAgKiBTZW5kcyBhIG1lc3NhZ2UgdG8gYSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gc2VuZCB0aGUgbWVzc2FnZSBpbi5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkTWVzc2FnZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoYXQgdGhlIGJvdCB1c2VyIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyB0byBiZSBzZW50IGluLlxuICAgICAgICpcbiAgICAgICAqIElmIHNlbmRpbmcgYSBtZXNzYWdlIHRvIGEgZ3VpbGQgY2hhbm5lbDpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBTRU5EX01FU1NBR0VTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIElmIHNlbmRpbmcgYSBUVFMgbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBTRU5EX1RUU19NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBzZW5kaW5nIGEgbWVzc2FnZSBhcyBhIHJlcGx5IHRvIGFub3RoZXIgbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICAgICAqIC0gVGhlIG1lc3NhZ2UgYmVpbmcgcmVwbGllZCB0byBjYW5ub3QgYmUgYSBzeXN0ZW0gbWVzc2FnZS5cbiAgICAgICAqXG4gICAgICAgKiDimqDvuI8gVGhlIG1heGltdW0gc2l6ZSBvZiBhIHJlcXVlc3QgKGFjY291bnRpbmcgZm9yIGFueSBhdHRhY2htZW50cyBhbmQgbWVzc2FnZSBjb250ZW50KSBmb3IgYm90IHVzZXJzIGlzIF84IE1pQl8uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjY3JlYXRlLW1lc3NhZ2V9XG4gICAgICAgKi9cbiAgICAgIHNlbmQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlTWVzc2FnZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhIG1lc3NhZ2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBlZGl0IHRoZSBtZXNzYWdlIGluLlxuICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRHMgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIElmIGVkaXRpbmcgYW5vdGhlciB1c2VyJ3MgbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKiAtIE9ubHkgdGhlIHtAbGluayBFZGl0TWVzc2FnZS5mbGFncyB8IGZsYWdzfSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIgY2FuIGJlIGVkaXRlZC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNlZGl0LW1lc3NhZ2V9XG4gICAgICAgKi9cbiAgICAgIGVkaXQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEVkaXRNZXNzYWdlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgIC8qKlxuICAgICAgICogQ3Jvc3MtcG9zdHMgYSBtZXNzYWdlIHBvc3RlZCBpbiBhbiBhbm5vdW5jZW1lbnQgY2hhbm5lbCB0byBzdWJzY3JpYmVkIGNoYW5uZWxzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGFubm91bmNlbWVudCBjaGFubmVsLlxuICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBjcm9zcy1wb3N0LlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyb3NzLXBvc3RlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBub3QgY3Jvc3MtcG9zdGluZyBvd24gbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGV2ZW50IGluIHRoZSBndWlsZHMgdGhlIHN1YnNjcmliZWQgY2hhbm5lbHMgYXJlIGluLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2Nyb3NzcG9zdC1tZXNzYWdlfVxuICAgICAgICovXG4gICAgICBwdWJsaXNoOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIG1lc3NhZ2UgZnJvbSBhIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBkZWxldGUgdGhlIG1lc3NhZ2UgZnJvbS5cbiAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlIGZyb20gdGhlIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIElmIG5vdCBkZWxldGluZyBvd24gbWVzc2FnZTpcbiAgICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlLW1lc3NhZ2V9XG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjaGFubmVsIGJ5IGl0cyBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgdGhlIGNoYW5uZWwgaXMgYSB0aHJlYWQsIGEge0BsaW5rIFRocmVhZE1lbWJlcn0gb2JqZWN0IGlzIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNnZXQtY2hhbm5lbH1cbiAgICAgKi9cbiAgICBnZXQ6IChpZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsPj5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2hhbm5lbCB3aXRoaW4gYSBndWlsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIGNoYW5uZWwgd2l0aGluLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgY2hhbm5lbC5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZENoYW5uZWx9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIElmIHNldHRpbmcgcGVybWlzc2lvbiBvdmVyd3JpdGVzLCBvbmx5IHRoZSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBjYW4gYmUgYWxsb3dlZCBvciBkZW5pZWQuXG4gICAgICpcbiAgICAgKiBTZXR0aW5nIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uIGlzIG9ubHkgcG9zc2libGUgZm9yIGd1aWxkIGFkbWluaXN0cmF0b3JzLlxuICAgICAqXG4gICAgICogRmlyZXMgYSBfQ2hhbm5lbCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjY3JlYXRlLWd1aWxkLWNoYW5uZWx9XG4gICAgICovXG4gICAgY3JlYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVHdWlsZENoYW5uZWwpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYSBjaGFubmVsIGZyb20gd2l0aGluIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGRlbGV0ZS5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZGVsZXRlZCB7QGxpbmsgQ2hhbm5lbH0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEZvciBjb21tdW5pdHkgZ3VpbGRzLCB0aGUgX1J1bGVzXywgX0d1aWRlbGluZXNfIGFuZCBfQ29tbXVuaXR5IFVwZGF0ZV8gY2hhbm5lbHMgY2Fubm90IGJlIGRlbGV0ZWQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgY2hhbm5lbCBpcyBhIHRocmVhZDpcbiAgICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiAtIEZpcmVzIGEgX1RocmVhZCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBPdGhlcndpc2U6XG4gICAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIC0g4pqg77iPIERlbGV0aW5nIGEgY2F0ZWdvcnkgY2hhbm5lbCBkb2VzIG5vdCBkZWxldGUgaXRzIGNoaWxkIGNoYW5uZWxzLlxuICAgICAqICAgSW5zdGVhZCwgdGhleSB3aWxsIGhhdmUgdGhlaXIgYHBhcmVudF9pZGAgcHJvcGVydHkgcmVtb3ZlZCwgYW5kIGEgYENoYW5uZWwgVXBkYXRlYCBnYXRld2F5IGV2ZW50IHdpbGwgZmlyZSBmb3IgZWFjaCBvZiB0aGVtLlxuICAgICAqXG4gICAgICogLSBGaXJlcyBhIF9DaGFubmVsIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2RlbGV0ZWNsb3NlLWNoYW5uZWx9XG4gICAgICovXG4gICAgZGVsZXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIC8qKlxuICAgICAqIEVkaXRzIGEgY2hhbm5lbCdzIHNldHRpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBlZGl0LlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjaGFubmVsLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgZWRpdGluZyBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkdyb3VwRG19OlxuICAgICAqIC0gRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBJZiBlZGl0aW5nIGEgdGhyZWFkIGNoYW5uZWw6XG4gICAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9USFJFQURTYCBwZXJtaXNzaW9uIF9fdW5sZXNzX18gaWYgc2V0dGluZyB0aGUgYGFyY2hpdmVkYCBwcm9wZXJ0eSB0byBgZmFsc2VgIHdoZW4gdGhlIGBsb2NrZWRgIHByb3BlcnR5IGlzIGFsc28gYGZhbHNlYCwgaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbiBpcyByZXF1aXJlZC5cbiAgICAgKlxuICAgICAqIC0gRmlyZXMgYSBfVGhyZWFkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIElmIGVkaXRpbmcgYSBndWlsZCBjaGFubmVsOlxuICAgICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiAtIElmIG1vZGlmeWluZyBwZXJtaXNzaW9uIG92ZXJyaWRlczpcbiAgICAgKiAgIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiAgIC0gT25seSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBvciBwYXJlbnQgY2hhbm5lbCBjYW4gYmUgYWxsb3dlZC9kZW5pZWQgX191bmxlc3NfXyB0aGUgYm90IHVzZXIgaGFzIGEgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiBvdmVycmlkZSBpbiB0aGUgY2hhbm5lbC5cbiAgICAgKlxuICAgICAqIC0gSWYgbW9kaWZ5aW5nIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRDYXRlZ29yeX06XG4gICAgICogICAgIC0gRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQgZm9yIGVhY2ggY2hpbGQgY2hhbm5lbCBpbXBhY3RlZCBpbiB0aGlzIGNoYW5nZS5cbiAgICAgKiAtIE90aGVyd2lzZTpcbiAgICAgKiAgICAgLSBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKi9cbiAgICBlZGl0OiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeUNoYW5uZWwpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgIC8qKlxuICAgICAqIEZvbGxvd3MgYW4gYW5ub3VuY2VtZW50IGNoYW5uZWwsIGFsbG93aW5nIG1lc3NhZ2VzIHBvc3RlZCB3aXRoaW4gaXQgdG8gYmUgY3Jvc3MtcG9zdGVkIGludG8gdGhlIHRhcmdldCBjaGFubmVsLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNvdXJjZUNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgYW5ub3VuY2VtZW50IGNoYW5uZWwgdG8gZm9sbG93LlxuICAgICAqIEBwYXJhbSB0YXJnZXRDaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRhcmdldCBjaGFubmVsIC0gdGhlIGNoYW5uZWwgdG8gY3Jvc3MtcG9zdCB0by5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEZvbGxvd2VkQ2hhbm5lbH0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uIGluIHRoZSBfX3RhcmdldCBjaGFubmVsX18uXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNmb2xsb3ctYW5ub3VuY2VtZW50LWNoYW5uZWx9XG4gICAgICovXG4gICAgZm9sbG93OiAoc291cmNlQ2hhbm5lbElkOiBCaWdTdHJpbmcsIHRhcmdldENoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRGb2xsb3dlZENoYW5uZWw+PlxuICAgIC8qKiBGb3J1bSByZWxhdGVkIGhlbHBlcnMgaW4gYSBjaGFubmVsICovXG4gICAgZm9ydW1zOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZXMgYSBuZXcgdGhyZWFkIGluIGEgZm9ydW0gY2hhbm5lbCwgYW5kIHNlbmRzIGEgbWVzc2FnZSB3aXRoaW4gdGhlIGNyZWF0ZWQgdGhyZWFkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGZvcnVtIGNoYW5uZWwgdG8gY3JlYXRlIHRoZSB0aHJlYWQgd2l0aGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0aHJlYWQuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9IHdpdGggYSBuZXN0ZWQge0BsaW5rIE1lc3NhZ2V9IG9iamVjdC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBDUkVBVEVfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfVGhyZWFkIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3N0YXJ0LXRocmVhZC1pbi1mb3J1bS1jaGFubmVsfVxuICAgICAgICpcbiAgICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgICAqL1xuICAgICAgcG9zdDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVGb3J1bVBvc3RXaXRoTWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gICAgfVxuICAgIC8qKiBQZXJtaXNzaW9uIHJlbGF0ZWQgaGVscGVycyBpbiBhIGNoYW5uZWwgKi9cbiAgICBwZXJtaXNzaW9uczoge1xuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyB0aGUgcGVybWlzc2lvbiBvdmVycmlkZXMgZm9yIGEgdXNlciBvciByb2xlIGluIGEgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGVkaXQgdGhlIHBlcm1pc3Npb24gb3ZlcnJpZGVzIG9mLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGVybWlzc2lvbiBvdmVycmlkZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogT25seSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBvciBwYXJlbnQgY2hhbm5lbCBjYW4gYmUgYWxsb3dlZC9kZW5pZWQgX191bmxlc3NfXyB0aGUgYm90IHVzZXIgaGFzIGEgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiBvdmVycmlkZSBpbiB0aGUgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNlZGl0LWNoYW5uZWwtcGVybWlzc2lvbnN9XG4gICAgICAgKi9cbiAgICAgIGVkaXQ6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogRWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBEZWxldGVzIGEgcGVybWlzc2lvbiBvdmVycmlkZSBmb3IgYSB1c2VyIG9yIHJvbGUgaW4gYSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZGVsZXRlIHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlIG9mLlxuICAgICAgICogQHBhcmFtIG92ZXJ3cml0ZUlkIC0gVGhlIElEIG9mIHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlIHRvIGRlbGV0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlLWNoYW5uZWwtcGVybWlzc2lvbn1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG92ZXJ3cml0ZUlkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIH1cbiAgICB0aHJlYWRzOiB7XG4gICAgICBnZXQ6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIGFjdGl2ZSB0aHJlYWRzIGZvciBhIGd1aWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSB0aHJlYWRzIG9mLlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEFjdGl2ZVRocmVhZHN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXR1cm5zIGJvdGggcHVibGljIGFuZCBwcml2YXRlIHRocmVhZHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBpZGAgcHJvcGVydHkgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2xpc3QtYWN0aXZlLWd1aWxkLXRocmVhZHN9XG4gICAgICAgICAqL1xuICAgICAgICBhY3RpdmU6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFjdGl2ZVRocmVhZHM+PlxuICAgICAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGdldHRpbmcgYXJjaGl2ZWQgdGhyZWFkcy4gKi9cbiAgICAgICAgYXJjaGl2ZWQ6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IgYSBjaGFubmVsLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlIGFyY2hpdmVkIHRocmVhZHMgZm9yLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aHJlYWRzLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9USFJFQURTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogUmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVGhyZWFkcyBhcmUgb3JkZXJlZCBieSB0aGUgYGFyY2hpdmVfdGltZXN0YW1wYCBwcm9wZXJ0eSBpbmNsdWRlZCBpbiB0aGUgbWV0YWRhdGEgb2YgdGhlIG9iamVjdCBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC1wcml2YXRlLWFyY2hpdmVkLXRocmVhZHN9XG4gICAgICAgICAgICovXG4gICAgICAgICAgcHJpdmF0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHByaXZhdGUgYXJjaGl2ZWQgdGhyZWFkcyB0aGUgYm90IGlzIGEgbWVtYmVyIG9mIGZvciBhIGNoYW5uZWwuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldCB0aGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IuXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRBcmNoaXZlZFRocmVhZHN9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYFJFQURfTUVTU0FHRV9ISVNUT1JZYCBwZXJtaXNzaW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogUmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVGhyZWFkcyBhcmUgb3JkZXJlZCBieSB0aGUgYGlkYCBwcm9wZXJ0eSBpbiBkZXNjZW5kaW5nIG9yZGVyLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC1qb2luZWQtcHJpdmF0ZS1hcmNoaXZlZC10aHJlYWRzfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGpvaW5lZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHB1YmxpYyBhcmNoaXZlZCB0aHJlYWRzIGZvciBhIGNoYW5uZWwuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGdldCB0aGUgYXJjaGl2ZWQgdGhyZWFkcyBmb3IuXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFyY2hpdmVkVGhyZWFkc30uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFRleHR9LCByZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHVibGljVGhyZWFkfS5cbiAgICAgICAgICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZE5ld3N9LCByZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c1RocmVhZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgYXJjaGl2ZV90aW1lc3RhbXBgIHByb3BlcnR5IGluY2x1ZGVkIGluIHRoZSBtZXRhZGF0YSBvZiB0aGUgb2JqZWN0IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNsaXN0LXB1YmxpYy1hcmNoaXZlZC10aHJlYWRzfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHB1YmxpYzogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHRocmVhZCBtZW1iZXIgYnkgdGhlaXIgdXNlciBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGdldCB0aGUgdGhyZWFkIG1lbWJlciBvZi5cbiAgICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSB0aHJlYWQgbWVtYmVyIHRvIGdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRUaHJlYWRNZW1iZXJ9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNnZXQtdGhyZWFkLW1lbWJlcn1cbiAgICAgICAgICovXG4gICAgICAgIG1lbWJlcjogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGhyZWFkTWVtYmVyPj5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgdGhyZWFkIG1lbWJlcnMgZm9yIGEgdGhyZWFkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gZ2V0IHRoZSB0aHJlYWQgbWVtYmVycyBvZi5cbiAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkVGhyZWFkTWVtYmVyfSBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBSZXF1aXJlcyB0aGUgYXBwbGljYXRpb24gdG8gaGF2ZSB0aGUgYEdVSUxEX01FTUJFUlNgIHByaXZpbGVnZWQgaW50ZW50IGVuYWJsZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3QtdGhyZWFkLW1lbWJlcnN9XG4gICAgICAgICAqL1xuICAgICAgICBtZW1iZXJzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRocmVhZE1lbWJlcltdPj5cbiAgICAgIH1cbiAgICAgIC8qKlxuICAgICAgICogQWRkcyB0aGUgYm90IHVzZXIgdG8gYSB0aHJlYWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIGFkZCB0aGUgYm90IHVzZXIgdG8uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX1RocmVhZCBNZW1iZXJzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNqb2luLXRocmVhZH1cbiAgICAgICAqL1xuICAgICAgam9pbjogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZXMgdGhlIGJvdCB1c2VyIGZyb20gYSB0aHJlYWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIHJlbW92ZSB0aGUgYm90IHVzZXIgZnJvbS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIHRocmVhZCBub3QgYmUgYXJjaGl2ZWQuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfVGhyZWFkIE1lbWJlcnMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xlYXZlLXRocmVhZH1cbiAgICAgICAqL1xuICAgICAgbGVhdmU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmVzIGEgbWVtYmVyIGZyb20gYSB0aHJlYWQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgdGhyZWFkIHRvIHJlbW92ZSB0aGUgdGhyZWFkIG1lbWJlciBvZi5cbiAgICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgdGhyZWFkIG1lbWJlciB0byByZW1vdmUuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIElmIHRoZSB0aHJlYWQgaXMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHJpdmF0ZVRocmVhZH0sIHJlcXVpcmVzIHRvIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0aHJlYWQuXG4gICAgICAgKiBPdGhlcndpc2UsIHJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogUmVxdWlyZXMgdGhlIHRocmVhZCBub3QgYmUgYXJjaGl2ZWQuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfVGhyZWFkIE1lbWJlcnMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3JlbW92ZS10aHJlYWQtbWVtYmVyfVxuICAgICAgICovXG4gICAgICBraWNrOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGNyZWF0aW5nIGEgdGhyZWFkLiAqL1xuICAgICAgY3JlYXRlOiB7XG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBDcmVhdGVzIGEgdGhyZWFkLCB1c2luZyBhbiBleGlzdGluZyBtZXNzYWdlIGFzIGl0cyBwb2ludCBvZiBvcmlnaW4uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdGhyZWFkLlxuICAgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gdXNlIGFzIHRoZSB0aHJlYWQncyBwb2ludCBvZiBvcmlnaW4uXG4gICAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgdGhyZWFkLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBDaGFubmVsIHwgVGhyZWFkfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogSWYgY2FsbGVkIG9uIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRUZXh0fSwgY3JlYXRlcyBhIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRQdWJsaWNUaHJlYWR9LlxuICAgICAgICAgICAqIElmIGNhbGxlZCBvbiBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c30sIGNyZWF0ZXMgYSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c1RocmVhZH0uXG4gICAgICAgICAgICogRG9lcyBub3Qgd29yayBvbiBjaGFubmVscyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRGb3J1bX0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBUaGUgSUQgb2YgdGhlIGNyZWF0ZWQgdGhyZWFkIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIElEIG9mIHRoZSBzb3VyY2UgbWVzc2FnZS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX1RocmVhZCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNzdGFydC10aHJlYWQtZnJvbS1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFN0YXJ0VGhyZWFkV2l0aE1lc3NhZ2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgICAgICB9XG4gICAgICAgIHdpdGhvdXQ6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBDcmVhdGVzIGEgdGhyZWFkIHdpdGhvdXQgdXNpbmcgYSBtZXNzYWdlIGFzIHRoZSB0aHJlYWQncyBwb2ludCBvZiBvcmlnaW4uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdGhyZWFkLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRocmVhZC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZENoYW5uZWwgfCBUaHJlYWR9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBDcmVhdGluZyBhIHByaXZhdGUgdGhyZWFkIHJlcXVpcmVzIHRoZSBzZXJ2ZXIgdG8gYmUgYm9vc3RlZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX1RocmVhZCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNzdGFydC10aHJlYWQtd2l0aG91dC1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogU3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRWRpdHMgdGhlIHBvc2l0aW9ucyBvZiBhIHNldCBvZiBjaGFubmVscyBpbiBhIGd1aWxkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGluIHdoaWNoIHRvIGVkaXQgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY2hhbm5lbHMuXG4gICAgICogQHBhcmFtIGNoYW5uZWxQb3NpdGlvbnMgLSBBIHNldCBvZiBvYmplY3RzIGRlZmluaW5nIHRoZSB1cGRhdGVkIHBvc2l0aW9ucyBvZiB0aGUgY2hhbm5lbHMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQgZm9yIGV2ZXJ5IGNoYW5uZWwgaW1wYWN0ZWQgaW4gdGhpcyBjaGFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLWNoYW5uZWwtcG9zaXRpb25zfVxuICAgICAqL1xuICAgIHBvc2l0aW9uczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY2hhbm5lbFBvc2l0aW9uczogTW9kaWZ5R3VpbGRDaGFubmVsUG9zaXRpb25zW10pID0+IFByb21pc2U8dm9pZD5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGludml0ZXMgZm9yIGEgY2hhbm5lbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBpbnZpdGVzIG9mLlxuICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZEludml0ZU1ldGFkYXRhfSBvYmplY3RzIGFzc29ydGVkIGJ5IGludml0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIE9ubHkgdXNhYmxlIGZvciBndWlsZCBjaGFubmVscy5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2dldC1jaGFubmVsLWludml0ZXN9XG4gICAgICovXG4gICAgaW52aXRlczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPj5cbiAgICAvKiogU3RhZ2UgcmVsYXRlZCBoZWxwZXJzIGZvciBhIGNoYW5uZWwuICovXG4gICAgc3RhZ2VzOiB7XG4gICAgICAvKipcbiAgICAgICAqIENyZWF0ZXMgYSBzdGFnZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzdGFnZSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3RhZ2UgaW5zdGFuY2UuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZFN0YWdlSW5zdGFuY2V9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBhIG1vZGVyYXRvciBvZiB0aGUgc3RhZ2UgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2NyZWF0ZS1zdGFnZS1pbnN0YW5jZX1cbiAgICAgICAqL1xuICAgICAgY3JlYXRlOiAob3B0aW9uczogQ3JlYXRlU3RhZ2VJbnN0YW5jZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgdGhlIHN0YWdlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHN0YWdlIGNoYW5uZWwsIGlmIG9uZSBleGlzdHMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgc3RhZ2UgY2hhbm5lbCB0aGUgc3RhZ2UgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBhIG1vZGVyYXRvciBvZiB0aGUgc3RhZ2UgY2hhbm5lbC5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2RlbGV0ZS1zdGFnZS1pbnN0YW5jZX1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhIHN0YWdlIGluc3RhbmNlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB1cGRhdGVkIHtAbGluayBEaXNjb3JkU3RhZ2VJbnN0YW5jZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIGEgbW9kZXJhdG9yIG9mIHRoZSBzdGFnZSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX1N0YWdlIEluc3RhbmNlIFVwZGF0ZV8gZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI21vZGlmeS1zdGFnZS1pbnN0YW5jZX1cbiAgICAgICAqL1xuICAgICAgZWRpdDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBkYXRhOiBFZGl0U3RhZ2VJbnN0YW5jZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0YWdlSW5zdGFuY2U+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBzdGFnZSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBzdGFnZSBjaGFubmVsLCBpZiBvbmUgZXhpc3RzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkU3RhZ2VJbnN0YW5jZX0uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2dldC1zdGFnZS1pbnN0YW5jZX1cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFN0YWdlSW5zdGFuY2U+PlxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBhIHR5cGluZyBpbmRpY2F0b3IgZm9yIHRoZSBib3QgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgaW4gd2hpY2ggdG8gdHJpZ2dlciB0aGUgdHlwaW5nIGluZGljYXRvci5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogR2VuZXJhbGx5LCBib3RzIHNob3VsZCBfbm90XyB1c2UgdGhpcyByb3V0ZS5cbiAgICAgKlxuICAgICAqIEZpcmVzIGEgX1R5cGluZyBTdGFydF8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3RyaWdnZXItdHlwaW5nLWluZGljYXRvcn1cbiAgICAgKi9cbiAgICB0eXBpbmc6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICB9XG4gIC8qKiBFbW9qaSByZWxhdGVkIGhlbHBlciBtZXRob2RzLiAqL1xuICBlbW9qaXM6IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGVtb2ppIGluIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBlbW9qaS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIGVtb2ppLlxuICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkRW1vaml9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgICAqXG4gICAgICogRW1vamlzIGhhdmUgYSBtYXhpbXVtIGZpbGUgc2l6ZSBvZiAyNTYga2lsb2JpdHMuIEF0dGVtcHRpbmcgdG8gdXBsb2FkIGEgbGFyZ2VyIGVtb2ppIHdpbGwgY2F1c2UgdGhlIHJvdXRlIHRvIHJldHVybiA0MDAgQmFkIFJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9HdWlsZCBFbW9qaXMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2NyZWF0ZS1ndWlsZC1lbW9qaX1cbiAgICAgKi9cbiAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUd1aWxkRW1vamkpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppPj5cbiAgICAvKipcbiAgICAgKiBEZWxldGVzIGFuIGVtb2ppIGZyb20gYSBndWlsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBmcm9tIHdoaWNoIHRvIGRlbGV0ZSB0aGUgZW1vamkuXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSBlbW9qaSB0byBkZWxldGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIF9HdWlsZCBFbW9qaXMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2RlbGV0ZS1ndWlsZC1lbW9qaX1cbiAgICAgKi9cbiAgICBkZWxldGU6IChndWlsZElkOiBCaWdTdHJpbmcsIGlkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIC8qKlxuICAgICAqIEVkaXRzIGFuIGVtb2ppLlxuICAgICAqXG4gICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIGluIHdoaWNoIHRvIGVkaXQgdGhlIGVtb2ppLlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgZW1vamkgdG8gZWRpdC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgZW1vamkuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIHVwZGF0ZWQge0BsaW5rIERpc2NvcmRFbW9qaX0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAgICpcbiAgICAgKiBGaXJlcyBhIGBHdWlsZCBFbW9qaXMgVXBkYXRlYCBnYXRld2F5IGV2ZW50LlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI21vZGlmeS1ndWlsZC1lbW9qaX1cbiAgICAgKi9cbiAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZEVtb2ppKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaT4+XG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBlbW9qaSBieSBpdHMgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBnZXQgdGhlIGVtb2ppLlxuICAgICAqIEBwYXJhbSBlbW9qaUlkIC0gVGhlIElEIG9mIHRoZSBlbW9qaSB0byBnZXQuXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRFbW9qaX0uXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjZ2V0LWd1aWxkLWVtb2ppfVxuICAgICAqL1xuICAgIGdldDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZW1vamlJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaT4+XG4gIH1cbiAgLyoqIEd1aWxkIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMgKi9cbiAgZ3VpbGRzOiB7XG4gICAgYXV0b21vZDoge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGVzIGFuIGF1dG9tb2QgcnVsZSBpbiBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIHJ1bGUgaW4uXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHJ1bGUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGFuIF9BdXRvIE1vZGVyYXRpb24gUnVsZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2F1dG8tbW9kZXJhdGlvbiNjcmVhdGUtYXV0by1tb2RlcmF0aW9uLXJ1bGV9XG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlQXV0b01vZGVyYXRpb25SdWxlT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlPj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIHNjaGVkdWxlZCBldmVudCBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAgICAgKiBAcGFyYW0gZXZlbnRJZCAtIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50IHRvIGRlbGV0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNkZWxldGUtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICovXG4gICAgICBkZWxldGU6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhbiBhdXRvbW9kIHJ1bGUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHJ1bGUgaW4uXG4gICAgICAgKiBAcGFyYW0gcnVsZUlkIC0gVGhlIElEIG9mIHRoZSBydWxlIHRvIGVkaXQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgcnVsZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhbiBfQXV0byBNb2RlcmF0aW9uIFJ1bGUgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jbW9kaWZ5LWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgICAgICovXG4gICAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBydWxlSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogUGFydGlhbDxFZGl0QXV0b01vZGVyYXRpb25SdWxlT3B0aW9ucz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4+XG4gICAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGdldHRpbmcgYXV0b21vZGVyYXRpb24gZGF0YSBpbiBhIGd1aWxkLiAqL1xuICAgICAgZ2V0OiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGFuIGF1dG9tb2QgcnVsZSBieSBpdHMgSUQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHJ1bGUgb2YuXG4gICAgICAgICAqIEBwYXJhbSBydWxlSWQgLSBUaGUgSUQgb2YgdGhlIHJ1bGUgdG8gZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZX0uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvYXV0by1tb2RlcmF0aW9uI2dldC1hdXRvLW1vZGVyYXRpb24tcnVsZX1cbiAgICAgICAgICovXG4gICAgICAgIHJ1bGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHJ1bGVJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+PlxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBhdXRvbW9kIHJ1bGVzIGZvciBhIGd1aWxkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBydWxlcyBmcm9tLlxuICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgcnVsZSBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jbGlzdC1hdXRvLW1vZGVyYXRpb24tcnVsZXMtZm9yLWd1aWxkfVxuICAgICAgICAgKi9cbiAgICAgICAgcnVsZXM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZVtdPj5cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3IgYSBndWlsZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGNoYW5uZWxzIG9mLlxuICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY2hhbm5lbCBJRC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXhjbHVkZXMgdGhyZWFkcy5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtY2hhbm5lbHN9XG4gICAgICovXG4gICAgY2hhbm5lbHM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWxbXT4+XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbGlzdCBvZiBlbW9qaXMgZm9yIGEgZ3VpbGQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgd2hpY2ggdG8gZ2V0IHRoZSBlbW9qaXMgb2YuXG4gICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkRW1vaml9IG9iamVjdHMgYXNzb3J0ZWQgYnkgZW1vamkgSUQuXG4gICAgICpcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjbGlzdC1ndWlsZC1lbW9qaXN9XG4gICAgICovXG4gICAgZW1vamlzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaVtdPj5cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGEgZ3VpbGQncyBzY2hlZHVsZWQgZXZlbnRzLiAqL1xuICAgIGV2ZW50czoge1xuICAgICAgLyoqXG4gICAgICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIGV2ZW50IGluIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgc2NoZWR1bGVkIGV2ZW50IGluLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FVkVOVFNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQSBndWlsZCBjYW4gb25seSBoYXZlIGEgbWF4aW11bSBvZiAxMDAgZXZlbnRzIHdpdGggYSBzdGF0dXMgb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLkFjdGl2ZX0gb3Ige0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLlNjaGVkdWxlZH0gKGluY2x1c2l2ZSkuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgU2NoZWR1bGVkIEV2ZW50IENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2NyZWF0ZS1ndWlsZC1zY2hlZHVsZWQtZXZlbnR9XG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlU2NoZWR1bGVkRXZlbnQpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50Pj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhIHNjaGVkdWxlZCBldmVudCBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAgICAgKiBAcGFyYW0gZXZlbnRJZCAtIFRoZSBJRCBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50IHRvIGRlbGV0ZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNkZWxldGUtZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICovXG4gICAgICBkZWxldGU6IChndWlsZElkOiBCaWdTdHJpbmcsIGV2ZW50SWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhIHNjaGVkdWxlZCBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgc2NoZWR1bGVkIGV2ZW50IGluLlxuICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBlZGl0LlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FVkVOVFNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogVG8gc3RhcnQgb3IgZW5kIGFuIGV2ZW50LCBtb2RpZnkgdGhlIGV2ZW50J3MgYHN0YXR1c2AgcHJvcGVydHkuXG4gICAgICAgKlxuICAgICAgICogVGhlIGBlbnRpdHlfbWV0YWRhdGFgIHByb3BlcnR5IGlzIGRpc2NhcmRlZCBmb3IgZXZlbnRzIHdob3NlIGBlbnRpdHlfdHlwZWAgaXMgbm90IHtAbGluayBTY2hlZHVsZWRFdmVudEVudGl0eVR5cGUuRXh0ZXJuYWx9LlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNtb2RpZnktZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgICAgICovXG4gICAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFBhcnRpYWw8RWRpdFNjaGVkdWxlZEV2ZW50PikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuXG4gICAgICBnZXQ6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSBzY2hlZHVsZWQgZXZlbnQgYnkgaXRzIElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzY2hlZHVsZWQgZXZlbnQgZnJvbS5cbiAgICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBnZXQuXG4gICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2dldC1ndWlsZC1zY2hlZHVsZWQtZXZlbnR9XG4gICAgICAgICAqL1xuICAgICAgICBldmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogeyB3aXRoVXNlckNvdW50PzogYm9vbGVhbiB9KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudD4+XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHNjaGVkdWxlZCBldmVudHMgZm9yIGEgZ3VpbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHNjaGVkdWxlZCBldmVudHMgZnJvbS5cbiAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnRzLlxuICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50fSBvYmplY3RzIGFzc29ydGVkIGJ5IGV2ZW50IElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2xpc3Qtc2NoZWR1bGVkLWV2ZW50cy1mb3ItZ3VpbGR9XG4gICAgICAgICAqL1xuICAgICAgICBldmVudHM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+PlxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBzdWJzY3JpYmVycyB0byBhIHNjaGVkdWxlZCBldmVudCBmcm9tIGEgZ3VpbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHN1YnNjcmliZXJzIHRvIHRoZSBzY2hlZHVsZWQgZXZlbnQgZnJvbS5cbiAgICAgICAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBnZXQgdGhlIHN1YnNjcmliZXJzIG9mLlxuICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIHN1YnNjcmliZXJzLlxuICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFVzZXJ9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBVc2VycyBhcmUgb3JkZXJlZCBieSB0aGVpciBJRHMgaW4gX2FzY2VuZGluZ18gb3JkZXIuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZ2V0LWd1aWxkLXNjaGVkdWxlZC1ldmVudC11c2Vyc31cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJzOiAoXG4gICAgICAgICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgICAgICAgIGV2ZW50SWQ6IEJpZ1N0cmluZyxcbiAgICAgICAgICBvcHRpb25zPzogR2V0U2NoZWR1bGVkRXZlbnRVc2VycyxcbiAgICAgICAgKSA9PiBQcm9taXNlPFxuICAgICAgICAgIEFycmF5PHtcbiAgICAgICAgICAgIHVzZXI6IENhbWVsaXplPERpc2NvcmRVc2VyPlxuICAgICAgICAgICAgbWVtYmVyPzogQ2FtZWxpemU8RGlzY29yZE1lbWJlcj5cbiAgICAgICAgICB9PlxuICAgICAgICA+XG4gICAgICB9XG4gICAgfVxuICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gYSBndWlsZCdzIGludGVncmF0aW9ucy4gKi9cbiAgICBpbnRlZ3JhdGlvbnM6IHtcbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnRlZ3JhdGlvbnMgYXR0YWNoZWQgdG8gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIGludGVncmF0aW9ucyBmcm9tLlxuICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBJbnRlZ3JhdGlvbn0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnRlZ3JhdGlvbiBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1pbnRlZ3JhdGlvbnN9XG4gICAgICAgKi9cbiAgICAgIGdldDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW50ZWdyYXRpb25bXT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYW4gaW50ZWdyYXRpb24gYXR0YWNoZWQgdG8gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBkZWxldGUgdGhlIGludGVncmF0aW9uLlxuICAgICAgICogQHBhcmFtIGludGVncmF0aW9uSWQgLSBUaGUgSUQgb2YgdGhlIGludGVncmF0aW9uIHRvIGRlbGV0ZSBmcm9tIHRoZSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRGVsZXRlcyBhbGwgd2ViaG9va3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnRlZ3JhdGlvbiwgYW5kIGtpY2tzIHRoZSBhc3NvY2lhdGVkIGJvdCBpZiB0aGVyZSBpcyBvbmUuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgSW50ZWdyYXRpb25zIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqIEZpcmVzIGEgX0ludGVncmF0aW9uIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZGVsZXRlLWd1aWxkLWludGVncmF0aW9ufVxuICAgICAgICovXG4gICAgICBkZWxldGU6IChndWlsZElkOiBCaWdTdHJpbmcsIGludGVncmF0aW9uSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgIH1cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGEgZ3VpbGQncyBpbnZpdGVzLiAqL1xuICAgIGludml0ZXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsIGluIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBjcmVhdGUgdGhlIGludml0ZSB0by5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgaW52aXRlLlxuICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRJbnZpdGV9LlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYENSRUFURV9JTlNUQU5UX0lOVklURWAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhbiBfSW52aXRlIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAcHJpdmF0ZVJlbWFya3NcbiAgICAgICAqIFRoZSByZXF1ZXN0IGJvZHkgaXMgbm90IG9wdGlvbmFsLCBhbmQgYW4gZW1wdHkgSlNPTiBvYmplY3QgbXVzdCBiZSBzZW50IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgZmllbGRzIGFyZSBiZWluZyB0cmFuc21pdHRlZC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNjcmVhdGUtY2hhbm5lbC1pbnZpdGV9XG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogQ3JlYXRlQ2hhbm5lbEludml0ZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlPj5cbiAgICAgIC8qKlxuICAgICAgICogRGVsZXRlcyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBpbnZpdGVDb2RlIC0gVGhlIGludml0ZSBjb2RlIG9mIHRoZSBpbnZpdGUgdG8gZGVsZXRlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9DSEFOTkVMU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhbiBfSW52aXRlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGUtY2hhbm5lbC1pbnZpdGV9XG4gICAgICAgKi9cbiAgICAgIGRlbGV0ZTogKGludml0ZUNvZGU6IHN0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgYW4gaW52aXRlIHRvIGEgY2hhbm5lbCBieSBpdHMgaW52aXRlIGNvZGUuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGludml0ZUNvZGUgLSBUaGUgaW52aXRlIGNvZGUgb2YgdGhlIGludml0ZSB0byBnZXQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIGludml0ZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkSW52aXRlTWV0YWRhdGF9LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9pbnZpdGUjZ2V0LWludml0ZX1cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoaW52aXRlQ29kZTogc3RyaW5nLCBvcHRpb25zPzogR2V0SW52aXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YT4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgaW52aXRlcyBmb3IgYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBpbnZpdGVzIGZyb20uXG4gICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRJbnZpdGVNZXRhZGF0YX0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnZpdGUgY29kZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2ludml0ZSNnZXQtaW52aXRlc31cbiAgICAgICAqL1xuICAgICAgbGlzdDogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkSW52aXRlTWV0YWRhdGFbXT4+XG4gICAgfVxuICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gYSBndWlsZCdzIHRlbXBsYXRlcy4gKi9cbiAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgIC8qKlxuICAgICAgICogQ3JlYXRlcyBhIHRlbXBsYXRlIGZyb20gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSB0ZW1wbGF0ZSBmcm9tLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjY3JlYXRlLWd1aWxkLXRlbXBsYXRlfVxuICAgICAgICovXG4gICAgICBjcmVhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZVRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSB0ZW1wbGF0ZSBmcm9tIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgdGVtcGxhdGUgZnJvbS5cbiAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUNvZGUgLSBUaGUgY29kZSBvZiB0aGUgdGVtcGxhdGUgdG8gZGVsZXRlLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2RlbGV0ZS1ndWlsZC10ZW1wbGF0ZX1cbiAgICAgICAqL1xuICAgICAgZGVsZXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB0ZW1wbGF0ZUNvZGU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyBhIHRlbXBsYXRlJ3Mgc2V0dGluZ3MuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgYSB0ZW1wbGF0ZSBvZi5cbiAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZUNvZGUgLSBUaGUgY29kZSBvZiB0aGUgdGVtcGxhdGUgdG8gZWRpdC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIFRlbXBsYXRlfS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNtb2RpZnktZ3VpbGQtdGVtcGxhdGV9XG4gICAgICAgKi9cbiAgICAgIGVkaXQ6IChndWlsZElkOiBCaWdTdHJpbmcsIHRlbXBsYXRlQ29kZTogc3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZFRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgYSB0ZW1wbGF0ZSBieSBpdHMgY29kZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGdldC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNnZXQtZ3VpbGQtdGVtcGxhdGV9XG4gICAgICAgKi9cbiAgICAgIGdldDogKHRlbXBsYXRlQ29kZTogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIGZvciBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIGZvci5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgVGVtcGxhdGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdGVtcGxhdGUgY29kZS5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2dldC1ndWlsZC10ZW1wbGF0ZXN9XG4gICAgICAgKi9cbiAgICAgIGxpc3Q6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBTeW5jaHJvbmlzZXMgYSB0ZW1wbGF0ZSB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHN5bmNocm9uaXNlIGEgdGVtcGxhdGUgb2YuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBUZW1wbGF0ZX0uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlc31cbiAgICAgICAqL1xuICAgICAgc3luYzogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGVtcGxhdGU+PlxuICAgIH1cblxuICAgIC8qIEd1aWxkIE1lbWJlcnMgcmVsYXRlZCBoZWxwZXIgbWV0aG9kcy4gKi9cbiAgICBtZW1iZXJzOiB7XG4gICAgICAvKipcbiAgICAgICAqIEJhbnMgYSB1c2VyIGZyb20gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gYmFuIHRoZSB1c2VyIGZyb20uXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGJhbiBmcm9tIHRoZSBndWlsZC5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgYmFuLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYEJBTl9NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICAgICAgICpcbiAgICAgICAqIEZpcmVzIGEgX0d1aWxkIEJhbiBBZGRfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2NyZWF0ZS1ndWlsZC1iYW59XG4gICAgICAgKi9cbiAgICAgIGJhbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBDcmVhdGVHdWlsZEJhbikgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgLyoqXG4gICAgICAgKiBFZGl0cyB0aGUgbmlja25hbWUgb2YgdGhlIGJvdCB1c2VyLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBuaWNrbmFtZSBvZiB0aGUgYm90IHVzZXIgaW4uXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbmlja25hbWUuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkTWVtYmVyfVxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNtb2RpZnktY3VycmVudC1tZW1iZXJ9XG4gICAgICAgKi9cbiAgICAgIGVkaXRTZWxmOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBFZGl0Qm90TWVtYmVyT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyPj5cbiAgICAgIC8qKlxuICAgICAgICogRWRpdHMgYSBtZW1iZXIncyBwcm9wZXJ0aWVzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBtZW1iZXIgb2YuXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIG1lbWJlciB0byBlZGl0LlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHVzZXIuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmVxdWlyZXMgdmFyaW91cyBwZXJtaXNzaW9ucyBkZXBlbmRpbmcgb24gd2hhdCBpcyBlZGl0ZWQgYWJvdXQgdGhlIG1lbWJlci5cbiAgICAgICAqIFRvIGZpbmQgb3V0IHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIHRvIGVuYWN0IGEgY2hhbmdlLCByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgZW5kcG9pbnQncyB7QGxpbmsgTW9kaWZ5R3VpbGRNZW1iZXIgfCBwYXJhbWV0ZXJzfS5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNtb2RpZnktZ3VpbGQtbWVtYmVyfVxuICAgICAgICovXG4gICAgICBlZGl0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTW9kaWZ5R3VpbGRNZW1iZXIpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcj4+XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgb3IgY3JlYXRlcyBhIERNIGNoYW5uZWwgd2l0aCBhIHVzZXIuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byBjcmVhdGUgdGhlIERNIGNoYW5uZWwgd2l0aC5cbiAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBDaGFubmVsfS5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvdXNlciNjcmVhdGUtZG19XG4gICAgICAgKi9cbiAgICAgIGRtOiAodXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBtZW1iZXIgb2JqZWN0IGJ5IHVzZXIgSUQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbWVtYmVyIG9iamVjdCBmb3IuXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGdldCB0aGUgbWVtYmVyIG9iamVjdCBmb3IuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZE1lbWJlcldpdGhVc2VyfS5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZ2V0LWd1aWxkLW1lbWJlcn1cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1lbWJlcnMgZm9yIGEgZ3VpbGQuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvci5cbiAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbWVtYmVycy5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZE1lbWJlcldpdGhVc2VyfSBvYmplY3RzIGFzc29ydGVkIGJ5IHVzZXIgSUQuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgR1VJTERfTUVNQkVSU2AgaW50ZW50LlxuICAgICAgICpcbiAgICAgICAqIOKaoO+4jyBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZW5kcG9pbnQgd2l0aCB2ZXJ5IGxhcmdlIGJvdHMuIEluc3RlYWQsIG9wdCB0byB1c2UgYGZldGNoTWVtYmVycygpYDpcbiAgICAgICAqIFJFU1QgY29tbXVuaWNhdGlvbiBvbmx5IHBlcm1pdHMgNTAgcmVxdWVzdHMgdG8gYmUgbWFkZSBwZXIgc2Vjb25kLCB3aGlsZSBnYXRld2F5cyBhbGxvdyBmb3IgdXAgdG8gMTIwIHJlcXVlc3RzXG4gICAgICAgKiBwZXIgbWludXRlIHBlciBzaGFyZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9yYXRlLWxpbWl0cyNyYXRlLWxpbWl0c30uXG4gICAgICAgKlxuICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2xpc3QtZ3VpbGQtbWVtYmVyc31cbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3JlcXVlc3QtZ3VpbGQtbWVtYmVyc31cbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9yYXRlLWxpbWl0cyNyYXRlLWxpbWl0c31cbiAgICAgICAqL1xuICAgICAgbGlzdDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTGlzdEd1aWxkTWVtYmVycykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG4gICAgICAvKipcbiAgICAgICAqIEtpY2tzIGEgbWVtYmVyIGZyb20gYSBndWlsZC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8ga2ljayB0aGUgbWVtYmVyIGZyb20uXG4gICAgICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIG1lbWJlciB0byBraWNrIGZyb20gdGhlIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYEtJQ0tfTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgUmVtb3ZlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNyZW1vdmUtZ3VpbGQtbWVtYmVyfVxuICAgICAgICovXG4gICAgICBraWNrOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAvKipcbiAgICAgICAqIEluaXRpYXRlcyB0aGUgcHJvY2VzcyBvZiBwcnVuaW5nIGluYWN0aXZlIG1lbWJlcnMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHBydW5lIHRoZSBtZW1iZXJzIG9mLlxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHBydW5pbmcgb2YgbWVtYmVycy5cbiAgICAgICAqIEByZXR1cm5zIEEgbnVtYmVyIGluZGljYXRpbmcgaG93IG1hbnkgbWVtYmVycyB3ZXJlIHBydW5lZC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUmVxdWlyZXMgdGhlIGBLSUNLX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICog4p2XIFJlcXVlc3RzIHRvIHRoaXMgZW5kcG9pbnQgd2lsbCB0aW1lIG91dCBmb3IgbGFyZ2UgZ3VpbGRzLiBUbyBwcmV2ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmcsIHNldCB0aGUge0BsaW5rIEJlZ2luR3VpbGRQcnVuZS5jb21wdXRlUHJ1bmVDb3VudH0gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyIHRvIGBmYWxzZWAuIFRoaXMgd2lsbCBiZWdpbiB0aGUgcHJvY2VzcyBvZiBwcnVuaW5nLCBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuIGB1bmRlZmluZWRgLCByYXRoZXIgdGhhbiB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIHRoZSBhY3R1YWwgY291bnQgb2YgbWVtYmVycyB0aGF0IGhhdmUgYmVlbiBraWNrZWQuXG4gICAgICAgKlxuICAgICAgICog4pqg77iPIEJ5IGRlZmF1bHQsIHRoaXMgcHJvY2VzcyB3aWxsIG5vdCByZW1vdmUgbWVtYmVycyB3aXRoIGEgcm9sZS4gVG8gaW5jbHVkZSB0aGUgbWVtYmVycyB3aG8gaGF2ZSBhIF9wYXJ0aWN1bGFyIHN1YnNldCBvZiByb2xlc18sIHNwZWNpZnkgdGhlIHJvbGUocykgaW4gdGhlIHtAbGluayBCZWdpbkd1aWxkUHJ1bmUuaW5jbHVkZVJvbGVzIHwgaW5jbHVkZVJvbGVzfSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIuXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFJlbW92ZV8gZ2F0ZXdheSBldmVudCBmb3IgZXZlcnkgbWVtYmVyIGtpY2tlZC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjYmVnaW4tZ3VpbGQtcHJ1bmV9XG4gICAgICAgKi9cbiAgICAgIHBydW5lOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBCZWdpbkd1aWxkUHJ1bmUpID0+IFByb21pc2U8eyBwcnVuZWQ6IG51bWJlciB8IG51bGwgfT5cbiAgICAgIC8qKlxuICAgICAgICogR2V0cyB0aGUgbGlzdCBvZiBtZW1iZXJzIHdob3NlIHVzZXJuYW1lcyBvciBuaWNrbmFtZXMgc3RhcnQgd2l0aCBhIHByb3ZpZGVkIHN0cmluZy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gc2VhcmNoIGluLlxuICAgICAgICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHN0cmluZyB0byBtYXRjaCB1c2VybmFtZXMgb3Igbmlja25hbWVzIGFnYWluc3QuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBzZWFyY2hpbmcgdGhyb3VnaCB0aGUgbWVtYmVycy5cbiAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZE1lbWJlcn0gb2JqZWN0cyBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNzZWFyY2gtZ3VpbGQtbWVtYmVyc31cbiAgICAgICAqL1xuICAgICAgc2VhcmNoOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogT21pdDxTZWFyY2hNZW1iZXJzLCAncXVlcnknPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG4gICAgICAvKipcbiAgICAgICAqIFVuYmFucyBhIHVzZXIgZnJvbSBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byB1bmJhbiB0aGUgdXNlciBpbi5cbiAgICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gdW5iYW4uXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFJlcXVpcmVzIHRoZSBgQkFOX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gICAgICAgKlxuICAgICAgICogRmlyZXMgYSBfR3VpbGQgQmFuIFJlbW92ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjcmVtb3ZlLWd1aWxkLWJhbn1cbiAgICAgICAqL1xuICAgICAgdW5iYW46IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgfVxuICAgIC8qKiBJbnRlcmFjdGlvbiByZWxhdGVkIGhlbHBlciBtZXRob2RzLiAqL1xuICAgIGludGVyYWN0aW9uczoge1xuICAgICAgLyoqIENvbW1hbmQgcmVsYXRlZCBoZWxwZXIgbWV0aG9kcy4gKi9cbiAgICAgIGNvbW1hbmRzOiB7XG4gICAgICAgIC8qKiBNZXRob2RzIGZvciBjcmVhdGluZyBhIGNvbW1hbmQuICovXG4gICAgICAgIGNyZWF0ZToge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIENyZWF0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCBhY2Nlc3NpYmxlIGdsb2JhbGx5OyBhY3Jvc3MgZGlmZmVyZW50IGd1aWxkcyBhbmQgY2hhbm5lbHMuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGNyZWF0ZS5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICog4pqg77iPIENyZWF0aW5nIGEgY29tbWFuZCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYW4gZXhpc3RpbmcgY29tbWFuZCBmb3IgeW91ciBhcHBsaWNhdGlvbiB3aWxsIG92ZXJ3cml0ZSB0aGUgb2xkIGNvbW1hbmQuXG4gICAgICAgICAgICog4pqg77iPIEdsb2JhbCBjb21tYW5kcyBvbmNlIGNyZWF0ZWQgYXJlIGNhY2hlZCBmb3IgcGVyaW9kcyBvZiBfX2FuIGhvdXJfXywgc28gY2hhbmdlcyBtYWRlIHRvIGV4aXN0aW5nIGNvbW1hbmRzIHdpbGwgdGFrZSBhbiBob3VyIHRvIHN1cmZhY2UuXG4gICAgICAgICAgICog4pqg77iPIFlvdSBjYW4gb25seSBjcmVhdGUgdXAgdG8gMjAwIF9uZXdfIGNvbW1hbmRzIGRhaWx5LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2NyZWF0ZS1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnbG9iYWw6IChjb21tYW5kOiBDcmVhdGVBcHBsaWNhdGlvbkNvbW1hbmQpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogQ3JlYXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIG9ubHkgYWNjZXNzaWJsZSBpbiBhIHNwZWNpZmljIGd1aWxkLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBjcmVhdGUuXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBmb3IuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIOKaoO+4jyBDcmVhdGluZyBhIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIGNvbW1hbmQgZm9yIHlvdXIgYXBwbGljYXRpb24gd2lsbCBvdmVyd3JpdGUgdGhlIG9sZCBjb21tYW5kLlxuICAgICAgICAgICAqIOKaoO+4jyBZb3UgY2FuIG9ubHkgY3JlYXRlIHVwIHRvIDIwMCBfbmV3XyBjb21tYW5kcyBkYWlseS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNjcmVhdGUtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBndWlsZDogKGNvbW1hbmQ6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCwgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICB9XG4gICAgICAgIC8qKiBNZXRob2RzIGZvciBkZWxldGluZyBhIGNvbW1hbmQuICovXG4gICAgICAgIGRlbGV0ZToge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIERlbGV0ZXMgYW4gYXBwbGljYXRpb24gY29tbWFuZCByZWdpc3RlcmVkIGdsb2JhbGx5LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBkZWxldGUuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZGVsZXRlLWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGdsb2JhbDogKGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRGVsZXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIHJlZ2lzdGVyZWQgaW4gYSBndWlsZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBkZWxldGUgdGhlIGNvbW1hbmQgZnJvbS5cbiAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGRlbGV0ZSBmcm9tIHRoZSBndWlsZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNkZWxldGUtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBndWlsZDogKGNvbW1hbmRJZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgfVxuICAgICAgICAvKiogTWV0aG9kcyBmb3IgZWRpdGluZyBhIGNvbW1hbmQuICovXG4gICAgICAgIGVkaXQ6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBFZGl0cyBhIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBlZGl0LlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBnbG9iYWw6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEVkaXRzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgcmVnaXN0ZXJlZCBpbiBhIGd1aWxkLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBjb21tYW5kIGlzIHJlZ2lzdGVyZWQgaW4uXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBlZGl0LlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGd1aWxkOiAoY29tbWFuZElkOiBCaWdTdHJpbmcsIGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEVkaXRzIHRoZSBwZXJtaXNzaW9ucyBmb3IgYSBndWlsZCBhcHBsaWNhdGlvbiBjb21tYW5kLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBjb21tYW5kIGlzIHJlZ2lzdGVyZWQgaW4uXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBlZGl0IHRoZSBwZXJtaXNzaW9ucyBvZi5cbiAgICAgICAgICAgKiBAcGFyYW0gYmVhcmVyVG9rZW4gLSBUaGUgYmVhcmVyIHRva2VuIHRvIHVzZSB0byBtYWtlIHRoZSByZXF1ZXN0LlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kIHBlcm1pc3Npb25zLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb259LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBUaGUgYmVhcmVyIHRva2VuIHJlcXVpcmVzIHRoZSBgYXBwbGljYXRpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zLnVwZGF0ZWAgc2NvcGUgdG8gYmUgZW5hYmxlZCwgYW5kIHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBndWlsZCB3aG9zZSBJRCBoYXMgYmVlbiBwcm92aWRlZCBpbiB0aGUgcGFyYW1ldGVycy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNlZGl0LWFwcGxpY2F0aW9uLWNvbW1hbmQtcGVybWlzc2lvbnN9XG4gICAgICAgICAgICovXG4gICAgICAgICAgcGVybWlzc2lvbnM6IChcbiAgICAgICAgICAgIGd1aWxkSWQ6IEJpZ1N0cmluZyxcbiAgICAgICAgICAgIGNvbW1hbmRJZDogQmlnU3RyaW5nLFxuICAgICAgICAgICAgYmVhcmVyVG9rZW46IHN0cmluZyxcbiAgICAgICAgICAgIG9wdGlvbnM6IEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zW10sXG4gICAgICAgICAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIE1ldGhvZHMgZm9yIGdldHRpbmcgYSBjb21tYW5kLiAqL1xuICAgICAgICBnZXQ6IHtcbiAgICAgICAgICBnbG9iYWw6IHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogR2V0cyBhIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kIGJ5IGl0cyBJRC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGdldC5cbiAgICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG9uZTogKGNvbW1hbmRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHlvdXIgYm90J3MgZ2xvYmFsIGFwcGxpY2F0aW9uIGNvbW1hbmRzLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZHN9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGFsbDogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+PlxuICAgICAgICAgIH1cbiAgICAgICAgICBndWlsZHM6IHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogR2V0cyBhIGd1aWxkIGFwcGxpY2F0aW9uIGNvbW1hbmQgYnkgaXRzIElELlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBnZXQuXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG9uZTogKGNvbW1hbmRJZDogQmlnU3RyaW5nLCBndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4+XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYXBwbGljYXRpb24gY29tbWFuZHMgcmVnaXN0ZXJlZCBieSB5b3VyIGJvdCBpbiBhIGd1aWxkLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZHMgYXJlIHJlZ2lzdGVyZWQgaW4uXG4gICAgICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmRzc31cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgYWxsOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEdldHMgdGhlIHBlcm1pc3Npb25zIG9mIGEgZ3VpbGQgYXBwbGljYXRpb24gY29tbWFuZC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZ2V0IHRoZSBwZXJtaXNzaW9ucyBvZi5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbn0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWFwcGxpY2F0aW9uLWNvbW1hbmQtcGVybWlzc2lvbnN9XG4gICAgICAgICAgICovXG4gICAgICAgICAgcGVybWlzc2lvbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY29tbWFuZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIHRoZSBwZXJtaXNzaW9ucyBvZiBhbGwgYXBwbGljYXRpb24gY29tbWFuZHMgcmVnaXN0ZXJlZCBpbiBhIGd1aWxkIGJ5IHRoZSBJRCBvZiB0aGUgZ3VpbGQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBwZXJtaXNzaW9ucyBvYmplY3RzIG9mLlxuICAgICAgICAgICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbn0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIHBlcm1pc3Npb25zOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdPj5cbiAgICAgICAgfVxuICAgICAgICAvKiogTWV0aG9kcyBmb3IgcmVwbGFjaW5nIGV4aXN0aW5nIGNvbW1hbmRzIGluIGJ1bGsuICovXG4gICAgICAgIHJlcGxhY2U6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZS1yZWdpc3RlcnMgdGhlIGxpc3Qgb2YgZ2xvYmFsIGFwcGxpY2F0aW9uIGNvbW1hbmRzLCBvdmVyd3JpdGluZyB0aGUgcHJldmlvdXMgY29tbWFuZHMgY29tcGxldGVseS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIHVzZSB0byBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIGxpc3QuXG4gICAgICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY29tbWFuZCBJRC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICog4p2XIENvbW1hbmRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBgY29tbWFuZHNgIGFycmF5IHdpbGwgYmUgX19kZWxldGVkX18uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiDimqDvuI8gQ29tbWFuZHMgdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdCB3aWxsIGNvdW50IHRvd2FyZHMgdGhlIGRhaWx5IGxpbWl0IG9mIF8yMDBfIG5ldyBjb21tYW5kcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNidWxrLW92ZXJ3cml0ZS1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZHN9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZ2xvYmFsOiAoY29tbWFuZHM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZFtdKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogUmUtcmVnaXN0ZXJzIHRoZSBsaXN0IG9mIGFwcGxpY2F0aW9uIGNvbW1hbmRzIHJlZ2lzdGVyZWQgaW4gYSBndWlsZCwgb3ZlcndyaXRpbmcgdGhlIHByZXZpb3VzIGNvbW1hbmRzIGNvbXBsZXRlbHkuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgd2hvc2UgbGlzdCBvZiBjb21tYW5kcyB0byBvdmVyd3JpdGUuXG4gICAgICAgICAgICogQHBhcmFtIGNvbW1hbmRzIC0gVGhlIGxpc3Qgb2YgY29tbWFuZHMgdG8gdXNlIHRvIG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgbGlzdC5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiDinZcgQ29tbWFuZHMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGBjb21tYW5kc2AgYXJyYXkgd2lsbCBiZSBfX2RlbGV0ZWRfXy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIOKaoO+4jyBDb21tYW5kcyB0aGF0IGRvIG5vdCBhbHJlYWR5IGV4aXN0IHdpbGwgY291bnQgdG93YXJkcyB0aGUgZGFpbHkgbGltaXQgb2YgXzIwMF8gbmV3IGNvbW1hbmRzLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2J1bGstb3ZlcndyaXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmRzfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGd1aWxkOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjb21tYW5kczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kW10pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyoqIFJlc3BvbnNlIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgLyoqIEhlbHBlciBtZXRob2RzIHJlbGF0ZWQgdG8gY3JlYXRpbmcgYSByZXNwb25zZS4gKi9cbiAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogU2VuZHMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiDimqDvuI8gSW50ZXJhY3Rpb24gdG9rZW5zIGFyZSBvbmx5IHZhbGlkIGZvciBfMTUgbWludXRlc18uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBCeSBkZWZhdWx0LCBtZW50aW9ucyBhcmUgc3VwcHJlc3NlZC4gVG8gZW5hYmxlIG1lbnRpb25zLCBwYXNzIGEgbWVudGlvbiBvYmplY3Qgd2l0aCB0aGUgY2FsbGJhY2sgZGF0YS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIFVubGlrZSBgc2VuZE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICAgICAgICAgKiAtIE5lZWRpbmcgdG8gYmUgYWJsZSB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFubmVsIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4uIChgUkVBRF9NRVNTQUdFU2AgcGVybWlzc2lvbi4pXG4gICAgICAgICAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBldmVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjY3JlYXRlLWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZm9sbG93dXA6ICh0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvblJlc3BvbnNlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBTZW5kcyBhIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIGludGVyYWN0aW9uSWQgLSBUaGUgSUQgb2YgdGhlIGludGVyYWN0aW9uIHRvIHJlc3BvbmQgdG8uXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIOKaoO+4jyBJbnRlcmFjdGlvbiB0b2tlbnMgYXJlIG9ubHkgdmFsaWQgZm9yIF8xNSBtaW51dGVzXy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEJ5IGRlZmF1bHQsIG1lbnRpb25zIGFyZSBzdXBwcmVzc2VkLiBUbyBlbmFibGUgbWVudGlvbnMsIHBhc3MgYSBtZW50aW9uIG9iamVjdCB3aXRoIHRoZSBjYWxsYmFjayBkYXRhLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogVW5saWtlIGBzZW5kTWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0OlxuICAgICAgICAgICAqIC0gTmVlZGluZyB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbi4gKGBSRUFEX01FU1NBR0VTYCBwZXJtaXNzaW9uLilcbiAgICAgICAgICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGV2ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNjcmVhdGUtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgb3JpZ2luYWw6IChpbnRlcmFjdGlvbklkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgfVxuICAgICAgICAvKiogSGVscGVyIG1ldGhvZHMgcmVsYXRlZCB0byBkZWxldGluZyBhIHJlc3BvbnNlLiAqL1xuICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBEZWxldGVzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBkZWxldGUuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgICAqIFVubGlrZSBgZGVsZXRlTWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGV2ZW50LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNkZWxldGUtZm9sbG93dXAtbWVzc2FnZX1cbiAgICAgICAgICAgKi9cbiAgICAgICAgICBmb2xsb3d1cDogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogRGVsZXRlcyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBVbmxpa2UgYGRlbGV0ZU1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dCBuZWVkaW5nIHRvIHNlZSB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBldmVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZGVsZXRlLW9yaWdpbmFsLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG9yaWdpbmFsOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgICB9XG4gICAgICAgIC8qKiBIZWxwZXIgbWV0aG9kcyByZWxhdGVkIHRvIGVkaXRpbmcgYSByZXNwb25zZS4gKi9cbiAgICAgICAgZWRpdDoge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIEVkaXRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBlZGl0LlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICAgKiBVbmxpa2UgYGVkaXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgVXBkYXRlXyBldmVudC5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZWRpdC1mb2xsb3d1cC1tZXNzYWdlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGZvbGxvd3VwOiAodG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uQ2FsbGJhY2tEYXRhKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBFZGl0cyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVW5saWtlIGBlZGl0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogRG9lcyBub3Qgc3VwcG9ydCBlcGhlbWVyYWwgZm9sbG93LXVwIG1lc3NhZ2VzIGR1ZSB0byB0aGVzZSBiZWluZyBzdGF0ZWxlc3MuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZXZlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2VkaXQtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgb3JpZ2luYWw6ICh0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4gfCB1bmRlZmluZWQ+XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEhlbHBlciBtZXRob2RzIHJlbGF0ZWQgdG8gZ2V0dGluZyBhIHJlc3BvbnNlLiAqL1xuICAgICAgICBnZXQ6IHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBHZXRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24gYnkgdGhlIElEIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0LlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVW5saWtlIGBnZXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAgICAgICAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgICAgICAgICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZ2V0LWZvbGxvd3VwLW1lc3NhZ2V9XG4gICAgICAgICAgICovXG4gICAgICAgICAgZm9sbG93dXA6ICh0b2tlbjogc3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogR2V0cyB0aGUgaW5pdGlhbCBtZXNzYWdlIHJlc3BvbnNlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBNZXNzYWdlfS5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAgICogVW5saWtlIGBnZXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAgICAgICAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgICAgICAgICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZ2V0LW9yaWdpbmFsLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgICAgICAgICAqL1xuICAgICAgICAgIG9yaWdpbmFsOiAodG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqIFdlYmhvb2sgcmVsYXRlZCBoZWxwZXIgbWV0aG9kcy4gKi9cbiAgd2ViaG9va3M6IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgd2ViaG9vay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gY3JlYXRlIHRoZSB3ZWJob29rIGluLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2ViaG9vay5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgKlxuICAgICAqIOKaoO+4jyBUaGUgd2ViaG9vayBuYW1lIG11c3Qgbm90IGNvbnRhaW4gdGhlIHN0cmluZyAnY2x5ZGUnIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAgICAgKlxuICAgICAqIEZpcmVzIGEgX1dlYmhvb2tzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2NyZWF0ZS13ZWJob29rfVxuICAgICAqL1xuICAgIGNyZWF0ZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgICAvKiogTWV0aG9kcyB0byBkZWxldGUgYSB3ZWJob29rLiAqL1xuICAgIGRlbGV0ZToge1xuICAgICAgd2l0aDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogRGVsZXRlcyBhIHdlYmhvb2suXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBkZWxldGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rfVxuICAgICAgICAgKi9cbiAgICAgICAgaWQ6IChpZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgYSB3ZWJob29rIG1lc3NhZ2UgdXNpbmcgdGhlIHdlYmhvb2sgdG9rZW4sIHRoZXJlYnkgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBhdXRoZW50aWNhdGlvbiArIHBlcm1pc3Npb25zLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGJlbG9uZ2luZyB0by5cbiAgICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZGVsZXRlIHRoZSB3ZWJob29rLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZGVsZXRlLXdlYmhvb2std2l0aC10b2tlbn1cbiAgICAgICAgICovXG4gICAgICAgIHRva2VuOiAoaWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAgICAgfVxuICAgIH1cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGVkaXRpbmcgYSB3ZWJob29rLiAqL1xuICAgIGVkaXQ6IHtcbiAgICAgIHdpdGg6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVkaXRzIGEgd2ViaG9vay5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2VkaXQtd2ViaG9va31cbiAgICAgICAgICovXG4gICAgICAgIGlkOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IE1vZGlmeVdlYmhvb2spID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAgICAgICAvKipcbiAgICAgICAgICogRWRpdHMgYSB3ZWJob29rIHVzaW5nIHRoZSB3ZWJob29rIHRva2VuLCB0aGVyZWJ5IGJ5cGFzc2luZyB0aGUgbmVlZCBmb3IgYXV0aGVudGljYXRpb24gKyBwZXJtaXNzaW9ucy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0LlxuICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSB3ZWJob29rLlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI21vZGlmeS13ZWJob29rLXdpdGgtdG9rZW59XG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbjogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBPbWl0PE1vZGlmeVdlYmhvb2ssICdjaGFubmVsSWQnPikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIGEgd2ViaG9vaywgY2F1c2luZyBhIG1lc3NhZ2UgdG8gYmUgcG9zdGVkIGluIHRoZSBjaGFubmVsIGNvbmZpZ3VyZWQgZm9yIHRoZSB3ZWJob29rLlxuICAgICAqXG4gICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBleGVjdXRlLlxuICAgICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGV4ZWN1dGUgdGhlIHdlYmhvb2suXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgd2ViaG9vay5cbiAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LCBvciBgdW5kZWZpbmVkYCBpZiB0aGUge0BsaW5rIEV4ZWN1dGVXZWJob29rLndhaXQgfCB3YWl0fSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIgaXMgc2V0IHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHRoZSB3ZWJob29rIGNoYW5uZWwgaXMgYSBmb3J1bSBjaGFubmVsLCB5b3UgbXVzdCBwcm92aWRlIGEgdmFsdWUgZm9yIGVpdGhlciBgdGhyZWFkSWRgIG9yIGB0aHJlYWROYW1lYC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2V4ZWN1dGUtd2ViaG9va31cbiAgICAgKi9cbiAgICBleGVjdXRlOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEV4ZWN1dGVXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPiB8IHVuZGVmaW5lZD5cbiAgICAvKiogTWV0aG9kcyByZWxhdGVkIHRvIGdldHRpbmcgd2ViaG9va3MuICovXG4gICAgZ2V0OiB7XG4gICAgICAvKipcbiAgICAgICAqIEdldHMgYSBsaXN0IG9mIHdlYmhvb2tzIGZvciBhIGNoYW5uZWwuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB3aGljaCB0byBnZXQgdGhlIHdlYmhvb2tzIG9mLlxuICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30gb2JqZWN0cyBhc3NvcnRlZCBieSB3ZWJob29rIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtY2hhbm5lbC13ZWJob29rc31cbiAgICAgICAqL1xuICAgICAgY2hhbm5lbDogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHdlYmhvb2tzIGZvciBhIGd1aWxkLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGxpc3Qgb2Ygd2ViaG9va3MgZm9yLlxuICAgICAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30gb2JqZWN0cyBhc3NvcnRlZCBieSB3ZWJob29rIElELlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICAgICAqXG4gICAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtZ3VpbGQtd2ViaG9va3N9XG4gICAgICAgKi9cbiAgICAgIGd1aWxkOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rW10+PlxuICAgICAgLyoqXG4gICAgICAgKiBHZXRzIGEgd2ViaG9vayBtZXNzYWdlIGJ5IGl0cyBJRC5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldCBhIG1lc3NhZ2Ugb2YuXG4gICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBnZXQgd2ViaG9vayBtZXNzYWdlcy5cbiAgICAgICAqIEBwYXJhbSBtZXNzYWdlSWQgLSB0aGUgSUQgb2YgdGhlIHdlYmhvb2sgbWVzc2FnZSB0byBnZXQuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rLW1lc3NhZ2V9XG4gICAgICAgKi9cbiAgICAgIG1lc3NhZ2U6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRXZWJob29rTWVzc2FnZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAgICAgd2l0aDoge1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBhIHdlYmhvb2sgYnkgaXRzIElELlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJlbWFya3NcbiAgICAgICAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rfVxuICAgICAgICAgKi9cbiAgICAgICAgaWQ6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgd2ViaG9vayB1c2luZyB0aGUgd2ViaG9vayB0b2tlbiwgdGhlcmVieSBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIGF1dGhlbnRpY2F0aW9uICsgcGVybWlzc2lvbnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBnZXQgdGhlIHdlYmhvb2suXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkV2ViaG9va30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC13ZWJob29rLXdpdGgtdG9rZW59XG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbjogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqIE1ldGhvZHMgcmVsYXRlZCB0byBtZXNzYWdlIHNlbnQgYnkgYSB3ZWJob29rLiAqL1xuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAvKipcbiAgICAgICAqIERlbGV0ZXMgYSB3ZWJob29rIG1lc3NhZ2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBkZWxldGUgdGhlIG1lc3NhZ2UgYmVsb25naW5nIHRvLlxuICAgICAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gbWFuYWdlIHRoZSB3ZWJob29rLlxuICAgICAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byBkZWxldGUuXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZGVsZXRpb24gb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgICAgICpcbiAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rfVxuICAgICAgICovXG4gICAgICBkZWxldGU6ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBEZWxldGVXZWJob29rTWVzc2FnZU9wdGlvbnMpID0+IFByb21pc2U8dm9pZD5cbiAgICAgIC8qKiBNZXRob2RzIHJlbGF0ZWQgdG8gZWRpdGluZyBtZXNzYWdlcyBzZW50IGJ5IGEgd2ViaG9vay4gKi9cbiAgICAgIGVkaXQ6IFdlYmhvb2tNZXNzYWdlRWRpdG9yXG4gICAgfVxuICB9XG4gIC8qKiBVc2VyIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMuICovXG4gIHVzZXJzOiB7XG4gICAgLyoqXG4gICAgICogR2V0cyBvciBjcmVhdGVzIGEgRE0gY2hhbm5lbCB3aXRoIGEgdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gY3JlYXRlIHRoZSBETSBjaGFubmVsIHdpdGguXG4gICAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy91c2VyI2NyZWF0ZS1kbX1cbiAgICAgKi9cbiAgICBjaGFubmVsOiAodXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICB9XG4gIC8qKlxuICAgKiBBZGRzIGEgbWVtYmVyIHRvIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gYWRkIHRoZSBtZW1iZXIgdG8uXG4gICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgbWVtYmVyIHRvIGFkZCB0byB0aGUgdGhyZWFkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYWJpbGl0eSB0byBzZW5kIG1lc3NhZ2VzIGluIHRoZSB0aHJlYWQuXG4gICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgTWVtYmVycyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2FkZC10aHJlYWQtbWVtYmVyfVxuICAgKi9cbiAgYWRkVGhyZWFkTWVtYmVyOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGF1dG9tb2QgcnVsZSBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gY3JlYXRlIHRoZSBydWxlIGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHJ1bGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9BdXRvIE1vZGVyYXRpb24gUnVsZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jY3JlYXRlLWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgKi9cbiAgY3JlYXRlQXV0b21vZFJ1bGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2hhbm5lbCB3aXRoaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgY2hhbm5lbCB3aXRoaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgY2hhbm5lbC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIHNldHRpbmcgcGVybWlzc2lvbiBvdmVyd3JpdGVzLCBvbmx5IHRoZSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBjYW4gYmUgYWxsb3dlZCBvciBkZW5pZWQuXG4gICAqXG4gICAqIFNldHRpbmcgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24gaXMgb25seSBwb3NzaWJsZSBmb3IgZ3VpbGQgYWRtaW5pc3RyYXRvcnMuXG4gICAqXG4gICAqIEZpcmVzIGEgX0NoYW5uZWwgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjY3JlYXRlLWd1aWxkLWNoYW5uZWx9XG4gICAqL1xuICBjcmVhdGVDaGFubmVsOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVHdWlsZENoYW5uZWwpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBlbW9qaSBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBlbW9qaS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBlbW9qaS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRFbW9qaX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VNT0pJU19BTkRfU1RJQ0tFUlNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEVtb2ppcyBoYXZlIGEgbWF4aW11bSBmaWxlIHNpemUgb2YgMjU2IGtpbG9iaXRzLiBBdHRlbXB0aW5nIHRvIHVwbG9hZCBhIGxhcmdlciBlbW9qaSB3aWxsIGNhdXNlIHRoZSByb3V0ZSB0byByZXR1cm4gNDAwIEJhZCBSZXF1ZXN0LlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBFbW9qaXMgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjY3JlYXRlLWd1aWxkLWVtb2ppfVxuICAgKi9cbiAgY3JlYXRlRW1vamk6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUd1aWxkRW1vamkpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEVtb2ppPj5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGhyZWFkIGluIGEgZm9ydW0gY2hhbm5lbCwgYW5kIHNlbmRzIGEgbWVzc2FnZSB3aXRoaW4gdGhlIGNyZWF0ZWQgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBmb3J1bSBjaGFubmVsIHRvIGNyZWF0ZSB0aGUgdGhyZWFkIHdpdGhpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0aHJlYWQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0gd2l0aCBhIG5lc3RlZCB7QGxpbmsgTWVzc2FnZX0gb2JqZWN0LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYENSRUFURV9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfVGhyZWFkIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3N0YXJ0LXRocmVhZC1pbi1mb3J1bS1jaGFubmVsfVxuICAgKlxuICAgKiBAZXhwZXJpbWVudGFsXG4gICAqL1xuICBjcmVhdGVGb3J1bVRocmVhZDogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVGb3J1bVBvc3RXaXRoTWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgYWNjZXNzaWJsZSBnbG9iYWxseTsgYWNyb3NzIGRpZmZlcmVudCBndWlsZHMgYW5kIGNoYW5uZWxzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGNyZWF0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKaoO+4jyBDcmVhdGluZyBhIGNvbW1hbmQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGFuIGV4aXN0aW5nIGNvbW1hbmQgZm9yIHlvdXIgYXBwbGljYXRpb24gd2lsbCBvdmVyd3JpdGUgdGhlIG9sZCBjb21tYW5kLlxuICAgKiDimqDvuI8gR2xvYmFsIGNvbW1hbmRzIG9uY2UgY3JlYXRlZCBhcmUgY2FjaGVkIGZvciBwZXJpb2RzIG9mIF9fYW4gaG91cl9fLCBzbyBjaGFuZ2VzIG1hZGUgdG8gZXhpc3RpbmcgY29tbWFuZHMgd2lsbCB0YWtlIGFuIGhvdXIgdG8gc3VyZmFjZS5cbiAgICog4pqg77iPIFlvdSBjYW4gb25seSBjcmVhdGUgdXAgdG8gMjAwIF9uZXdfIGNvbW1hbmRzIGRhaWx5LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjY3JlYXRlLWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kOiAoY29tbWFuZDogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIG9ubHkgYWNjZXNzaWJsZSBpbiBhIHNwZWNpZmljIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgY29tbWFuZCBmb3IuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiDimqDvuI8gQ3JlYXRpbmcgYSBjb21tYW5kIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBjb21tYW5kIGZvciB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgb3ZlcndyaXRlIHRoZSBvbGQgY29tbWFuZC5cbiAgICog4pqg77iPIFlvdSBjYW4gb25seSBjcmVhdGUgdXAgdG8gMjAwIF9uZXdfIGNvbW1hbmRzIGRhaWx5LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjY3JlYXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAqL1xuICBjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZDogKGNvbW1hbmQ6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCwgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRlbXBsYXRlIGZyb20gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGNyZWF0ZSB0aGUgdGVtcGxhdGUgZnJvbS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIFRlbXBsYXRlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2NyZWF0ZS1ndWlsZC10ZW1wbGF0ZX1cbiAgICovXG4gIGNyZWF0ZUd1aWxkVGVtcGxhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IENyZWF0ZVRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGludml0ZSB0byBhIGNoYW5uZWwgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBjcmVhdGUgdGhlIGludml0ZSB0by5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBpbnZpdGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkSW52aXRlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBDUkVBVEVfSU5TVEFOVF9JTlZJVEVgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9JbnZpdGUgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAcHJpdmF0ZVJlbWFya3NcbiAgICogVGhlIHJlcXVlc3QgYm9keSBpcyBub3Qgb3B0aW9uYWwsIGFuZCBhbiBlbXB0eSBKU09OIG9iamVjdCBtdXN0IGJlIHNlbnQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBmaWVsZHMgYXJlIGJlaW5nIHRyYW5zbWl0dGVkLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNjcmVhdGUtY2hhbm5lbC1pbnZpdGV9XG4gICAqL1xuICBjcmVhdGVJbnZpdGU6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IENyZWF0ZUNoYW5uZWxJbnZpdGUpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludml0ZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc2NoZWR1bGVkIGV2ZW50IGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBjcmVhdGUgdGhlIHNjaGVkdWxlZCBldmVudCBpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBTY2hlZHVsZWRFdmVudH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogQSBndWlsZCBjYW4gb25seSBoYXZlIGEgbWF4aW11bSBvZiAxMDAgZXZlbnRzIHdpdGggYSBzdGF0dXMgb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLkFjdGl2ZX0gb3Ige0BsaW5rIFNjaGVkdWxlZEV2ZW50U3RhdHVzLlNjaGVkdWxlZH0gKGluY2x1c2l2ZSkuXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjY3JlYXRlLWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICovXG4gIGNyZWF0ZVNjaGVkdWxlZEV2ZW50OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVTY2hlZHVsZWRFdmVudCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YWdlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHN0YWdlIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgc3RhZ2UgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBjcmVhdGVkIHtAbGluayBEaXNjb3JkU3RhZ2VJbnN0YW5jZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSB1c2VyIHRvIGJlIGEgbW9kZXJhdG9yIG9mIHRoZSBzdGFnZSBjaGFubmVsLlxuICAgKlxuICAgKiBGaXJlcyBhIF9TdGFnZSBJbnN0YW5jZSBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9zdGFnZS1pbnN0YW5jZSNjcmVhdGUtc3RhZ2UtaW5zdGFuY2V9XG4gICAqL1xuICBjcmVhdGVTdGFnZUluc3RhbmNlOiAob3B0aW9uczogQ3JlYXRlU3RhZ2VJbnN0YW5jZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgd2ViaG9vay5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBjcmVhdGUgdGhlIHdlYmhvb2sgaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2ViaG9vay5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRXZWJob29rfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIOKaoO+4jyBUaGUgd2ViaG9vayBuYW1lIG11c3Qgbm90IGNvbnRhaW4gdGhlIHN0cmluZyAnY2x5ZGUnIChjYXNlLWluc2Vuc2l0aXZlKS5cbiAgICpcbiAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNjcmVhdGUtd2ViaG9va31cbiAgICovXG4gIGNyZWF0ZVdlYmhvb2s6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlV2ViaG9vaykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkV2ViaG9vaz4+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGF1dG9tb2QgcnVsZS5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgcnVsZSBmcm9tLlxuICAgKiBAcGFyYW0gcnVsZUlkIC0gVGhlIElEIG9mIHRoZSBhdXRvbW9kIHJ1bGUgdG8gZGVsZXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYW4gX0F1dG8gTW9kZXJhdGlvbiBSdWxlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2F1dG8tbW9kZXJhdGlvbiNkZWxldGUtYXV0by1tb2RlcmF0aW9uLXJ1bGV9XG4gICAqL1xuICBkZWxldGVBdXRvbW9kUnVsZTogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcnVsZUlkOiBCaWdTdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIGNoYW5uZWwgZnJvbSB3aXRoaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBkZWxldGUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBkZWxldGVkIHtAbGluayBDaGFubmVsfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRm9yIGNvbW11bml0eSBndWlsZHMsIHRoZSBfUnVsZXNfLCBfR3VpZGVsaW5lc18gYW5kIF9Db21tdW5pdHkgVXBkYXRlXyBjaGFubmVscyBjYW5ub3QgYmUgZGVsZXRlZC5cbiAgICpcbiAgICogSWYgdGhlIGNoYW5uZWwgaXMgYSB0aHJlYWQ6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogLSBGaXJlcyBhIF9UaHJlYWQgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBPdGhlcndpc2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIC0g4pqg77iPIERlbGV0aW5nIGEgY2F0ZWdvcnkgY2hhbm5lbCBkb2VzIG5vdCBkZWxldGUgaXRzIGNoaWxkIGNoYW5uZWxzLlxuICAgKiAgIEluc3RlYWQsIHRoZXkgd2lsbCBoYXZlIHRoZWlyIGBwYXJlbnRfaWRgIHByb3BlcnR5IHJlbW92ZWQsIGFuZCBhIGBDaGFubmVsIFVwZGF0ZWAgZ2F0ZXdheSBldmVudCB3aWxsIGZpcmUgZm9yIGVhY2ggb2YgdGhlbS5cbiAgICpcbiAgICogLSBGaXJlcyBhIF9DaGFubmVsIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZGVsZXRlY2xvc2UtY2hhbm5lbH1cbiAgICovXG4gIGRlbGV0ZUNoYW5uZWw6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcGVybWlzc2lvbiBvdmVycmlkZSBmb3IgYSB1c2VyIG9yIHJvbGUgaW4gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGRlbGV0ZSB0aGUgcGVybWlzc2lvbiBvdmVycmlkZSBvZi5cbiAgICogQHBhcmFtIG92ZXJ3cml0ZUlkIC0gVGhlIElEIG9mIHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGUtY2hhbm5lbC1wZXJtaXNzaW9ufVxuICAgKi9cbiAgZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvdmVyd3JpdGVJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gZW1vamkgZnJvbSBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgZnJvbSB3aGljaCB0byBkZWxldGUgdGhlIGVtb2ppLlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIGVtb2ppIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRU1PSklTX0FORF9TVElDS0VSU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgRW1vamlzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2Vtb2ppI2RlbGV0ZS1ndWlsZC1lbW9qaX1cbiAgICovXG4gIGRlbGV0ZUVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBmb2xsb3ctdXAgbWVzc2FnZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIGludGVyYWN0aW9uIHRva2VuIHRvIHVzZSwgcHJvdmlkZWQgaW4gdGhlIG9yaWdpbmFsIGludGVyYWN0aW9uLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBkZWxldGVNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNkZWxldGUtZm9sbG93dXAtbWVzc2FnZX1cbiAgICovXG4gIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZTogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGFwcGxpY2F0aW9uIGNvbW1hbmQgcmVnaXN0ZXJlZCBnbG9iYWxseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBkZWxldGUuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNkZWxldGUtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmR9XG4gICAqL1xuICBkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhbiBhcHBsaWNhdGlvbiBjb21tYW5kIHJlZ2lzdGVyZWQgaW4gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgY29tbWFuZCBmcm9tLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGRlbGV0ZSBmcm9tIHRoZSBndWlsZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2RlbGV0ZS1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZGVsZXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgdGVtcGxhdGUgZnJvbSBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZGVsZXRlIHRoZSB0ZW1wbGF0ZSBmcm9tLlxuICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXRlbXBsYXRlI2RlbGV0ZS1ndWlsZC10ZW1wbGF0ZX1cbiAgICovXG4gIGRlbGV0ZUd1aWxkVGVtcGxhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHRlbXBsYXRlQ29kZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGludGVncmF0aW9uIGF0dGFjaGVkIHRvIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBmcm9tIHdoaWNoIHRvIGRlbGV0ZSB0aGUgaW50ZWdyYXRpb24uXG4gICAqIEBwYXJhbSBpbnRlZ3JhdGlvbklkIC0gVGhlIElEIG9mIHRoZSBpbnRlZ3JhdGlvbiB0byBkZWxldGUgZnJvbSB0aGUgZ3VpbGQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0dVSUxEYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBEZWxldGVzIGFsbCB3ZWJob29rcyBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVncmF0aW9uLCBhbmQga2lja3MgdGhlIGFzc29jaWF0ZWQgYm90IGlmIHRoZXJlIGlzIG9uZS5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgSW50ZWdyYXRpb25zIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICogRmlyZXMgYSBfSW50ZWdyYXRpb24gRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjZGVsZXRlLWd1aWxkLWludGVncmF0aW9ufVxuICAgKi9cbiAgZGVsZXRlSW50ZWdyYXRpb246IChndWlsZElkOiBCaWdTdHJpbmcsIGludGVncmF0aW9uSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gaW52aXRlQ29kZSAtIFRoZSBpbnZpdGUgY29kZSBvZiB0aGUgaW52aXRlIHRvIGRlbGV0ZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9JbnZpdGUgRGVsZXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNkZWxldGUtY2hhbm5lbC1pbnZpdGV9XG4gICAqL1xuICBkZWxldGVJbnZpdGU6IChpbnZpdGVDb2RlOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIG1lc3NhZ2UgZnJvbSBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGZyb20uXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZGVsZXRlIGZyb20gdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIG5vdCBkZWxldGluZyBvd24gbWVzc2FnZTpcbiAgICogLSBSZXF1aXJlcyB0aGUgYE1BTkFHRV9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2RlbGV0ZS1tZXNzYWdlfVxuICAgKi9cbiAgZGVsZXRlTWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBkZWxldGVNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgRGVsZXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNkZWxldGUtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAqL1xuICBkZWxldGVPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2U6ICh0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgc2NoZWR1bGVkIGV2ZW50IGZyb20gYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGRlbGV0ZSB0aGUgc2NoZWR1bGVkIGV2ZW50IGZyb20uXG4gICAqIEBwYXJhbSBldmVudElkIC0gVGhlIElEIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnQgdG8gZGVsZXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FVkVOVFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX0d1aWxkIFNjaGVkdWxlZCBFdmVudCBEZWxldGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZGVsZXRlLWd1aWxkLXNjaGVkdWxlZC1ldmVudH1cbiAgICovXG4gIGRlbGV0ZVNjaGVkdWxlZEV2ZW50OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHN0YWdlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHN0YWdlIGNoYW5uZWwsIGlmIG9uZSBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIHVzZXIgdG8gYmUgYSBtb2RlcmF0b3Igb2YgdGhlIHN0YWdlIGNoYW5uZWwuXG4gICAqXG4gICAqIEZpcmVzIGEgX1N0YWdlIEluc3RhbmNlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2RlbGV0ZS1zdGFnZS1pbnN0YW5jZX1cbiAgICovXG4gIGRlbGV0ZVN0YWdlSW5zdGFuY2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgcmVhc29uPzogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBEZWxldGVzIGEgd2ViaG9vay5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBkZWxldGUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2RlbGV0ZS13ZWJob29rfVxuICAgKi9cbiAgZGVsZXRlV2ViaG9vazogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSB3ZWJob29rIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGJlbG9uZ2luZyB0by5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gbWFuYWdlIHRoZSB3ZWJob29rLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGRlbGV0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZGVsZXRlLXdlYmhvb2t9XG4gICAqL1xuICBkZWxldGVXZWJob29rTWVzc2FnZTogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IERlbGV0ZVdlYmhvb2tNZXNzYWdlT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRGVsZXRlcyBhIHdlYmhvb2sgbWVzc2FnZSB1c2luZyB0aGUgd2ViaG9vayB0b2tlbiwgdGhlcmVieSBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIGF1dGhlbnRpY2F0aW9uICsgcGVybWlzc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGJlbG9uZ2luZyB0by5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZGVsZXRlIHRoZSB3ZWJob29rLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIERlbGV0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZGVsZXRlLXdlYmhvb2std2l0aC10b2tlbn1cbiAgICovXG4gIGRlbGV0ZVdlYmhvb2tXaXRoVG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIHBlcm1pc3Npb25zIGZvciBhIGd1aWxkIGFwcGxpY2F0aW9uIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGVkaXQgdGhlIHBlcm1pc3Npb25zIG9mLlxuICAgKiBAcGFyYW0gYmVhcmVyVG9rZW4gLSBUaGUgYmVhcmVyIHRva2VuIHRvIHVzZSB0byBtYWtlIHRoZSByZXF1ZXN0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgY29tbWFuZCBwZXJtaXNzaW9ucy5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbn0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoZSBiZWFyZXIgdG9rZW4gcmVxdWlyZXMgdGhlIGBhcHBsaWNhdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbnMudXBkYXRlYCBzY29wZSB0byBiZSBlbmFibGVkLCBhbmQgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIGd1aWxkIHdob3NlIElEIGhhcyBiZWVuIHByb3ZpZGVkIGluIHRoZSBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgKi9cbiAgZWRpdEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zOiAoXG4gICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgIGNvbW1hbmRJZDogQmlnU3RyaW5nLFxuICAgIGJlYXJlclRva2VuOiBzdHJpbmcsXG4gICAgb3B0aW9uczogQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXSxcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucz4+XG4gIC8qKlxuICAgKiBFZGl0cyBhbiBhdXRvbW9kIHJ1bGUuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBlZGl0IHRoZSBydWxlIGluLlxuICAgKiBAcGFyYW0gcnVsZUlkIC0gVGhlIElEIG9mIHRoZSBydWxlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBydWxlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGFuIF9BdXRvIE1vZGVyYXRpb24gUnVsZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jbW9kaWZ5LWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgKi9cbiAgZWRpdEF1dG9tb2RSdWxlOiAoXG4gICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgIHJ1bGVJZDogQmlnU3RyaW5nLFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8RWRpdEF1dG9Nb2RlcmF0aW9uUnVsZU9wdGlvbnM+LFxuICApID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEF1dG9Nb2RlcmF0aW9uUnVsZT4+XG4gIC8qKlxuICAgKiBNb2RpZmllcyB0aGUgYm90J3MgdXNlcm5hbWUgb3IgYXZhdGFyLlxuICAgKiBOT1RFOiB1c2VybmFtZTogaWYgY2hhbmdlZCBtYXkgY2F1c2UgdGhlIGJvdCdzIGRpc2NyaW1pbmF0b3IgdG8gYmUgcmFuZG9taXplZC5cbiAgICovXG4gIGVkaXRCb3RQcm9maWxlOiAob3B0aW9uczogeyB1c2VybmFtZT86IHN0cmluZzsgYm90QXZhdGFyVVJMPzogc3RyaW5nIHwgbnVsbCB9KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRVc2VyPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgY2hhbm5lbCdzIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBjaGFubmVsIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjaGFubmVsLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkQ2hhbm5lbH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIGVkaXRpbmcgYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5Hcm91cERtfTpcbiAgICogLSBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogSWYgZWRpdGluZyBhIHRocmVhZCBjaGFubmVsOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1RIUkVBRFNgIHBlcm1pc3Npb24gX191bmxlc3NfXyBpZiBzZXR0aW5nIHRoZSBgYXJjaGl2ZWRgIHByb3BlcnR5IHRvIGBmYWxzZWAgd2hlbiB0aGUgYGxvY2tlZGAgcHJvcGVydHkgaXMgYWxzbyBgZmFsc2VgLCBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIGBTRU5EX01FU1NBR0VTYCBwZXJtaXNzaW9uIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiAtIEZpcmVzIGEgX1RocmVhZCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIElmIGVkaXRpbmcgYSBndWlsZCBjaGFubmVsOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiAtIElmIG1vZGlmeWluZyBwZXJtaXNzaW9uIG92ZXJyaWRlczpcbiAgICogICAtIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1JPTEVTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiAgIC0gT25seSBwZXJtaXNzaW9ucyB0aGUgYm90IHVzZXIgaGFzIGluIHRoZSBndWlsZCBvciBwYXJlbnQgY2hhbm5lbCBjYW4gYmUgYWxsb3dlZC9kZW5pZWQgX191bmxlc3NfXyB0aGUgYm90IHVzZXIgaGFzIGEgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiBvdmVycmlkZSBpbiB0aGUgY2hhbm5lbC5cbiAgICpcbiAgICogLSBJZiBtb2RpZnlpbmcgYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZENhdGVnb3J5fTpcbiAgICogICAgIC0gRmlyZXMgYSBfQ2hhbm5lbCBVcGRhdGVfIGdhdGV3YXkgZXZlbnQgZm9yIGVhY2ggY2hpbGQgY2hhbm5lbCBpbXBhY3RlZCBpbiB0aGlzIGNoYW5nZS5cbiAgICogLSBPdGhlcndpc2U6XG4gICAqICAgICAtIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKi9cbiAgZWRpdENoYW5uZWw6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTW9kaWZ5Q2hhbm5lbCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgcGVybWlzc2lvbiBvdmVycmlkZXMgZm9yIGEgdXNlciBvciByb2xlIGluIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBlZGl0IHRoZSBwZXJtaXNzaW9uIG92ZXJyaWRlcyBvZi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGVybWlzc2lvbiBvdmVycmlkZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIE9ubHkgcGVybWlzc2lvbnMgdGhlIGJvdCB1c2VyIGhhcyBpbiB0aGUgZ3VpbGQgb3IgcGFyZW50IGNoYW5uZWwgY2FuIGJlIGFsbG93ZWQvZGVuaWVkIF9fdW5sZXNzX18gdGhlIGJvdCB1c2VyIGhhcyBhIGBNQU5BR0VfUk9MRVNgIHBlcm1pc3Npb24gb3ZlcnJpZGUgaW4gdGhlIGNoYW5uZWwuXG4gICAqXG4gICAqIEZpcmVzIGEgX0NoYW5uZWwgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNlZGl0LWNoYW5uZWwtcGVybWlzc2lvbnN9XG4gICAqL1xuICBlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogRWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzT3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIHBvc2l0aW9ucyBvZiBhIHNldCBvZiBjaGFubmVscyBpbiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgaW4gd2hpY2ggdG8gZWRpdCB0aGUgcG9zaXRpb25zIG9mIHRoZSBjaGFubmVscy5cbiAgICogQHBhcmFtIGNoYW5uZWxQb3NpdGlvbnMgLSBBIHNldCBvZiBvYmplY3RzIGRlZmluaW5nIHRoZSB1cGRhdGVkIHBvc2l0aW9ucyBvZiB0aGUgY2hhbm5lbHMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0NIQU5ORUxTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIF9DaGFubmVsIFVwZGF0ZV8gZ2F0ZXdheSBldmVudCBmb3IgZXZlcnkgY2hhbm5lbCBpbXBhY3RlZCBpbiB0aGlzIGNoYW5nZS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI21vZGlmeS1ndWlsZC1jaGFubmVsLXBvc2l0aW9uc31cbiAgICovXG4gIGVkaXRDaGFubmVsUG9zaXRpb25zOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjaGFubmVsUG9zaXRpb25zOiBNb2RpZnlHdWlsZENoYW5uZWxQb3NpdGlvbnNbXSkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogRWRpdHMgYW4gZW1vamkuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBpbiB3aGljaCB0byBlZGl0IHRoZSBlbW9qaS5cbiAgICogQHBhcmFtIGlkIC0gVGhlIElEIG9mIHRoZSBlbW9qaSB0byBlZGl0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgZW1vamkuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSB1cGRhdGVkIHtAbGluayBEaXNjb3JkRW1vaml9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9FTU9KSVNfQU5EX1NUSUNLRVJTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBGaXJlcyBhIGBHdWlsZCBFbW9qaXMgVXBkYXRlYCBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjbW9kaWZ5LWd1aWxkLWVtb2ppfVxuICAgKi9cbiAgZWRpdEVtb2ppOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBpZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZEVtb2ppKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRFbW9qaT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBVbmxpa2UgYGVkaXRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQgbmVlZGluZyB0byBzZWUgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgaW4uXG4gICAqXG4gICAqIERvZXMgbm90IHN1cHBvcnQgZXBoZW1lcmFsIGZvbGxvdy11cCBtZXNzYWdlcyBkdWUgdG8gdGhlc2UgYmVpbmcgc3RhdGVsZXNzLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjZWRpdC1mb2xsb3d1cC1tZXNzYWdlfVxuICAgKi9cbiAgZWRpdEZvbGxvd3VwTWVzc2FnZTogKHRva2VuOiBzdHJpbmcsIG1lc3NhZ2VJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1nbG9iYWwtYXBwbGljYXRpb24tY29tbWFuZH1cbiAgICovXG4gIGVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogRWRpdHMgYW4gYXBwbGljYXRpb24gY29tbWFuZCByZWdpc3RlcmVkIGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZWRpdC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kOiAoXG4gICAgY29tbWFuZElkOiBCaWdTdHJpbmcsXG4gICAgZ3VpbGRJZDogQmlnU3RyaW5nLFxuICAgIG9wdGlvbnM6IENyZWF0ZUFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogRWRpdHMgYSB0ZW1wbGF0ZSdzIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCBhIHRlbXBsYXRlIG9mLlxuICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgVGVtcGxhdGV9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjbW9kaWZ5LWd1aWxkLXRlbXBsYXRlfVxuICAgKi9cbiAgZWRpdEd1aWxkVGVtcGxhdGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHRlbXBsYXRlQ29kZTogc3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZFRlbXBsYXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZWRpdCB0aGUgbWVzc2FnZSBpbi5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRHMgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiBlZGl0aW5nIGFub3RoZXIgdXNlcidzIG1lc3NhZ2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqIC0gT25seSB0aGUge0BsaW5rIEVkaXRNZXNzYWdlLmZsYWdzIHwgZmxhZ3N9IHByb3BlcnR5IG9mIHRoZSB7QGxpbmsgb3B0aW9uc30gb2JqZWN0IHBhcmFtZXRlciBjYW4gYmUgZWRpdGVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZWRpdC1tZXNzYWdlfVxuICAgKi9cbiAgZWRpdE1lc3NhZ2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEVkaXRNZXNzYWdlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEVkaXRzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHJlc3BvbnNlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVW5saWtlIGBlZGl0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0IG5lZWRpbmcgdG8gc2VlIHRoZSBjaGFubmVsIHRoZSBtZXNzYWdlIGlzIGluLlxuICAgKlxuICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2VkaXQtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAqL1xuICBlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlOiAodG9rZW46IHN0cmluZywgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+IHwgdW5kZWZpbmVkPlxuICAvKipcbiAgICogRWRpdHMgdGhlIG9yaWdpbmFsIHdlYmhvb2sgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0IHRoZSBvcmlnaW5hbCBtZXNzYWdlIG9mLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZWRpdC13ZWJob29rLW1lc3NhZ2V9XG4gICAqL1xuICBlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZTogKFxuICAgIHdlYmhvb2tJZDogQmlnU3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgb3B0aW9uczogSW50ZXJhY3Rpb25DYWxsYmFja0RhdGEgJiB7IHRocmVhZElkPzogQmlnU3RyaW5nIH0sXG4gICkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIHNjaGVkdWxlZCBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIHNjaGVkdWxlZCBldmVudCBpbi5cbiAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBlZGl0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBTY2hlZHVsZWRFdmVudH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX0VWRU5UU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogVG8gc3RhcnQgb3IgZW5kIGFuIGV2ZW50LCBtb2RpZnkgdGhlIGV2ZW50J3MgYHN0YXR1c2AgcHJvcGVydHkuXG4gICAqXG4gICAqIFRoZSBgZW50aXR5X21ldGFkYXRhYCBwcm9wZXJ0eSBpcyBkaXNjYXJkZWQgZm9yIGV2ZW50cyB3aG9zZSBgZW50aXR5X3R5cGVgIGlzIG5vdCB7QGxpbmsgU2NoZWR1bGVkRXZlbnRFbnRpdHlUeXBlLkV4dGVybmFsfS5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgU2NoZWR1bGVkIEV2ZW50IFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkLXNjaGVkdWxlZC1ldmVudCNtb2RpZnktZ3VpbGQtc2NoZWR1bGVkLWV2ZW50fVxuICAgKi9cbiAgZWRpdFNjaGVkdWxlZEV2ZW50OiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBldmVudElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFBhcnRpYWw8RWRpdFNjaGVkdWxlZEV2ZW50PikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+PlxuICAvKipcbiAgICogRWRpdHMgYSBzdGFnZSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgc3RhZ2UgY2hhbm5lbCB0aGUgc3RhZ2UgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgdXBkYXRlZCB7QGxpbmsgRGlzY29yZFN0YWdlSW5zdGFuY2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgdXNlciB0byBiZSBhIG1vZGVyYXRvciBvZiB0aGUgc3RhZ2UgY2hhbm5lbC5cbiAgICpcbiAgICogRmlyZXMgYSBfU3RhZ2UgSW5zdGFuY2UgVXBkYXRlXyBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI21vZGlmeS1zdGFnZS1pbnN0YW5jZX1cbiAgICovXG4gIGVkaXRTdGFnZUluc3RhbmNlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIGRhdGE6IEVkaXRTdGFnZUluc3RhbmNlT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4+XG4gIC8qKlxuICAgKiBFZGl0cyBhIHdlYmhvb2suXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNlZGl0LXdlYmhvb2t9XG4gICAqL1xuICBlZGl0V2ViaG9vazogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgd2ViaG9vayBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGVkaXQgdGhlIG1lc3NhZ2Ugb2YuXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSB3ZWJob29rIHRva2VuLCB1c2VkIHRvIGVkaXQgdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRNZXNzYWdlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2VkaXQtd2ViaG9vay1tZXNzYWdlfVxuICAgKi9cbiAgZWRpdFdlYmhvb2tNZXNzYWdlOiAoXG4gICAgd2ViaG9va0lkOiBCaWdTdHJpbmcsXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBtZXNzYWdlSWQ6IEJpZ1N0cmluZyxcbiAgICBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSAmIHsgdGhyZWFkSWQ/OiBCaWdTdHJpbmcgfSxcbiAgKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgd2ViaG9vayB1c2luZyB0aGUgd2ViaG9vayB0b2tlbiwgdGhlcmVieSBieXBhc3NpbmcgdGhlIG5lZWQgZm9yIGF1dGhlbnRpY2F0aW9uICsgcGVybWlzc2lvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZWRpdC5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZWRpdCB0aGUgd2ViaG9vay5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfV2ViaG9va3MgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNtb2RpZnktd2ViaG9vay13aXRoLXRva2VufVxuICAgKi9cbiAgZWRpdFdlYmhvb2tXaXRoVG9rZW46ICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgb3B0aW9uczogT21pdDxNb2RpZnlXZWJob29rLCAnY2hhbm5lbElkJz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAvKipcbiAgICogRXhlY3V0ZXMgYSB3ZWJob29rLCBjYXVzaW5nIGEgbWVzc2FnZSB0byBiZSBwb3N0ZWQgaW4gdGhlIGNoYW5uZWwgY29uZmlndXJlZCBmb3IgdGhlIHdlYmhvb2suXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZXhlY3V0ZS5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZXhlY3V0ZSB0aGUgd2ViaG9vay5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgd2ViaG9vay5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRNZXNzYWdlfSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHtAbGluayBFeGVjdXRlV2ViaG9vay53YWl0IHwgd2FpdH0gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyIGlzIHNldCB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiB0aGUgd2ViaG9vayBjaGFubmVsIGlzIGEgZm9ydW0gY2hhbm5lbCwgeW91IG11c3QgcHJvdmlkZSBhIHZhbHVlIGZvciBlaXRoZXIgYHRocmVhZElkYCBvciBgdGhyZWFkTmFtZWAuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2V4ZWN1dGUtd2ViaG9va31cbiAgICovXG4gIGV4ZWN1dGVXZWJob29rOiAod2ViaG9va0lkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEV4ZWN1dGVXZWJob29rKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPiB8IHVuZGVmaW5lZD5cbiAgLyoqXG4gICAqIEZvbGxvd3MgYW4gYW5ub3VuY2VtZW50IGNoYW5uZWwsIGFsbG93aW5nIG1lc3NhZ2VzIHBvc3RlZCB3aXRoaW4gaXQgdG8gYmUgY3Jvc3MtcG9zdGVkIGludG8gdGhlIHRhcmdldCBjaGFubmVsLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlQ2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSBhbm5vdW5jZW1lbnQgY2hhbm5lbCB0byBmb2xsb3cuXG4gICAqIEBwYXJhbSB0YXJnZXRDaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRhcmdldCBjaGFubmVsIC0gdGhlIGNoYW5uZWwgdG8gY3Jvc3MtcG9zdCB0by5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRGb2xsb3dlZENoYW5uZWx9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbiBpbiB0aGUgX190YXJnZXQgY2hhbm5lbF9fLlxuICAgKlxuICAgKiBGaXJlcyBhIF9XZWJob29rcyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2ZvbGxvdy1hbm5vdW5jZW1lbnQtY2hhbm5lbH1cbiAgICovXG4gIGZvbGxvd0Fubm91bmNlbWVudDogKHNvdXJjZUNoYW5uZWxJZDogQmlnU3RyaW5nLCB0YXJnZXRDaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRm9sbG93ZWRDaGFubmVsPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgYWxsIGFjdGl2ZSB0aHJlYWRzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSB0aHJlYWRzIG9mLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEFjdGl2ZVRocmVhZHN9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXR1cm5zIGJvdGggcHVibGljIGFuZCBwcml2YXRlIHRocmVhZHMuXG4gICAqXG4gICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBpZGAgcHJvcGVydHkgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2xpc3QtYWN0aXZlLWd1aWxkLXRocmVhZHN9XG4gICAqL1xuICBnZXRBY3RpdmVUaHJlYWRzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBY3RpdmVUaHJlYWRzPj5cbiAgLyoqIEdldCB0aGUgYXBwbGljYXRpb25zIGluZm8gKi9cbiAgZ2V0QXBwbGljYXRpb25JbmZvOiAoKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbj4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwZXJtaXNzaW9ucyBvZiBhIGd1aWxkIGFwcGxpY2F0aW9uIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZCBpcyByZWdpc3RlcmVkIGluLlxuICAgKiBAcGFyYW0gY29tbWFuZElkIC0gVGhlIElEIG9mIHRoZSBjb21tYW5kIHRvIGdldCB0aGUgcGVybWlzc2lvbnMgb2YuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ufS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1hcHBsaWNhdGlvbi1jb21tYW5kLXBlcm1pc3Npb25zfVxuICAgKi9cbiAgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgY29tbWFuZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHBlcm1pc3Npb25zIG9mIGFsbCBhcHBsaWNhdGlvbiBjb21tYW5kcyByZWdpc3RlcmVkIGluIGEgZ3VpbGQgYnkgdGhlIElEIG9mIHRoZSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcGVybWlzc2lvbnMgb2JqZWN0cyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ufSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ3VpbGQtYXBwbGljYXRpb24tY29tbWFuZC1wZXJtaXNzaW9uc31cbiAgICovXG4gIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9uc1tdPj5cbiAgLyoqXG4gICAqIEdldHMgYW4gYXV0b21vZCBydWxlIGJ5IGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgcnVsZSBvZi5cbiAgICogQHBhcmFtIHJ1bGVJZCAtIFRoZSBJRCBvZiB0aGUgcnVsZSB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jZ2V0LWF1dG8tbW9kZXJhdGlvbi1ydWxlfVxuICAgKi9cbiAgZ2V0QXV0b21vZFJ1bGU6IChndWlsZElkOiBCaWdTdHJpbmcsIHJ1bGVJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBhdXRvbW9kIHJ1bGVzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBydWxlcyBmcm9tLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgcnVsZSBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9hdXRvLW1vZGVyYXRpb24jbGlzdC1hdXRvLW1vZGVyYXRpb24tcnVsZXMtZm9yLWd1aWxkfVxuICAgKi9cbiAgZ2V0QXV0b21vZFJ1bGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGVbXT4+XG4gIC8qKlxuICAgKiBHZXRzIGEgY2hhbm5lbCBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiB0aGUgY2hhbm5lbCBpcyBhIHRocmVhZCwgYSB7QGxpbmsgVGhyZWFkTWVtYmVyfSBvYmplY3QgaXMgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZ2V0LWNoYW5uZWx9XG4gICAqL1xuICBnZXRDaGFubmVsOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBpbnZpdGVzIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBpbnZpdGVzIG9mLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRJbnZpdGVNZXRhZGF0YX0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnZpdGUgY29kZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfQ0hBTk5FTFNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIE9ubHkgdXNhYmxlIGZvciBndWlsZCBjaGFubmVscy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjZ2V0LWNoYW5uZWwtaW52aXRlc31cbiAgICovXG4gIGdldENoYW5uZWxJbnZpdGVzOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludml0ZU1ldGFkYXRhW10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgY2hhbm5lbHMgb2YuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZENoYW5uZWx9IG9iamVjdHMgYXNzb3J0ZWQgYnkgY2hhbm5lbCBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRXhjbHVkZXMgdGhyZWFkcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1jaGFubmVsc31cbiAgICovXG4gIGdldENoYW5uZWxzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRDaGFubmVsW10+PlxuICAvKipcbiAgICogR2V0cyBhIGxpc3Qgb2Ygd2ViaG9va3MgZm9yIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB3aGljaCB0byBnZXQgdGhlIHdlYmhvb2tzIG9mLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRXZWJob29rfSBvYmplY3RzIGFzc29ydGVkIGJ5IHdlYmhvb2sgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgTUFOQUdFX1dFQkhPT0tTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtY2hhbm5lbC13ZWJob29rc31cbiAgICovXG4gIGdldENoYW5uZWxXZWJob29rczogKGNoYW5uZWxJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rW10+PlxuICAvKipcbiAgICogR2V0cyBvciBjcmVhdGVzIGEgRE0gY2hhbm5lbCB3aXRoIGEgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byBjcmVhdGUgdGhlIERNIGNoYW5uZWwgd2l0aC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRDaGFubmVsfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3VzZXIjY3JlYXRlLWRtfVxuICAgKi9cbiAgZ2V0RG1DaGFubmVsOiAodXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogR2V0cyBhbiBlbW9qaSBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgZW1vamkuXG4gICAqIEBwYXJhbSBlbW9qaUlkIC0gVGhlIElEIG9mIHRoZSBlbW9qaSB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkRW1vaml9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZW1vamkjZ2V0LWd1aWxkLWVtb2ppfVxuICAgKi9cbiAgZ2V0RW1vamk6IChndWlsZElkOiBCaWdTdHJpbmcsIGVtb2ppSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRW1vamk+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBlbW9qaXMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB3aGljaCB0byBnZXQgdGhlIGVtb2ppcyBvZi5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBEaXNjb3JkRW1vaml9IG9iamVjdHMgYXNzb3J0ZWQgYnkgZW1vamkgSUQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9lbW9qaSNsaXN0LWd1aWxkLWVtb2ppc31cbiAgICovXG4gIGdldEVtb2ppczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkRW1vamlbXT4+XG4gIC8qKlxuICAgKiBHZXRzIGEgZm9sbG93LXVwIG1lc3NhZ2UgdG8gYW4gaW50ZXJhY3Rpb24gYnkgdGhlIElEIG9mIHRoZSBtZXNzYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFVubGlrZSBgZ2V0TWVzc2FnZSgpYCwgdGhpcyBlbmRwb2ludCBhbGxvd3MgdGhlIGJvdCB1c2VyIHRvIGFjdCB3aXRob3V0OlxuICAgKiAtIE5lZWRpbmcgdG8gYmUgYWJsZSB0byBzZWUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjaGFubmVsIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4uIChgUkVBRF9NRVNTQUdFU2AgcGVybWlzc2lvbi4pXG4gICAqIC0gUmVxdWlyaW5nIHRoZSBgTUVTU0FHRV9DT05URU5UYCBpbnRlbnQuXG4gICAqXG4gICAqIERvZXMgbm90IHN1cHBvcnQgZXBoZW1lcmFsIGZvbGxvdy11cCBtZXNzYWdlcyBkdWUgdG8gdGhlc2UgYmVpbmcgc3RhdGVsZXNzLlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2dldC1mb2xsb3d1cC1tZXNzYWdlfVxuICAgKi9cbiAgZ2V0Rm9sbG93dXBNZXNzYWdlOiAodG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKiogR2V0IHRoZSBib3RzIEdhdGV3YXkgbWV0YWRhdGEgdGhhdCBjYW4gaGVscCBkdXJpbmcgdGhlIG9wZXJhdGlvbiBvZiBsYXJnZSBvciBzaGFyZGVkIGJvdHMuICovXG4gIGdldEdhdGV3YXlCb3Q6ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEdldEdhdGV3YXlCb3Q+PlxuICAvKipcbiAgICogR2V0cyBhIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kIGJ5IGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRJZCAtIFRoZSBJRCBvZiB0aGUgY29tbWFuZCB0byBnZXQuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBBcHBsaWNhdGlvbkNvbW1hbmR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZ2V0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kOiAoY29tbWFuZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZD4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHlvdXIgYm90J3MgZ2xvYmFsIGFwcGxpY2F0aW9uIGNvbW1hbmRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uQ29tbWFuZH0gb2JqZWN0cyBhc3NvcnRlZCBieSBjb21tYW5kIElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvYXBwbGljYXRpb24tY29tbWFuZHMjZ2V0LWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kc31cbiAgICovXG4gIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHM6ICgpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgLyoqXG4gICAqIEdldHMgYSBndWlsZCBhcHBsaWNhdGlvbiBjb21tYW5kIGJ5IGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRoZSBjb21tYW5kIGlzIHJlZ2lzdGVyZWQgaW4uXG4gICAqIEBwYXJhbSBjb21tYW5kSWQgLSBUaGUgSUQgb2YgdGhlIGNvbW1hbmQgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2dldC1ndWlsZC1hcHBsaWNhdGlvbi1jb21tYW5kfVxuICAgKi9cbiAgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQ6IChjb21tYW5kSWQ6IEJpZ1N0cmluZywgZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiBjb21tYW5kcyByZWdpc3RlcmVkIGJ5IHlvdXIgYm90IGluIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0aGUgY29tbWFuZHMgYXJlIHJlZ2lzdGVyZWQgaW4uXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9hcHBsaWNhdGlvbi1jb21tYW5kcyNnZXQtZ2xvYmFsLWFwcGxpY2F0aW9uLWNvbW1hbmRzc31cbiAgICovXG4gIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kczogKGd1aWxkSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+PlxuICAvKipcbiAgICogR2V0cyBhIHRlbXBsYXRlIGJ5IGl0cyBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gdGVtcGxhdGVDb2RlIC0gVGhlIGNvZGUgb2YgdGhlIHRlbXBsYXRlIHRvIGdldC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFRlbXBsYXRlfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNnZXQtZ3VpbGQtdGVtcGxhdGV9XG4gICAqL1xuICBnZXRHdWlsZFRlbXBsYXRlOiAodGVtcGxhdGVDb2RlOiBzdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgdGVtcGxhdGVzIGZvciBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIHRlbXBsYXRlcyBmb3IuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgVGVtcGxhdGV9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdGVtcGxhdGUgY29kZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC10ZW1wbGF0ZSNnZXQtZ3VpbGQtdGVtcGxhdGVzfVxuICAgKi9cbiAgZ2V0R3VpbGRUZW1wbGF0ZXM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFRlbXBsYXRlW10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiB3ZWJob29rcyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiB3ZWJob29rcyBmb3IuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9IG9iamVjdHMgYXNzb3J0ZWQgYnkgd2ViaG9vayBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfV0VCSE9PS1NgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy93ZWJob29rI2dldC1ndWlsZC13ZWJob29rc31cbiAgICovXG4gIGdldEd1aWxkV2ViaG9va3M6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2tbXT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIGludGVncmF0aW9ucyBhdHRhY2hlZCB0byBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBsaXN0IG9mIGludGVncmF0aW9ucyBmcm9tLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEludGVncmF0aW9ufSBvYmplY3RzIGFzc29ydGVkIGJ5IGludGVncmF0aW9uIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2dldC1ndWlsZC1pbnRlZ3JhdGlvbnN9XG4gICAqL1xuICBnZXRJbnRlZ3JhdGlvbnM6IChndWlsZElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEludGVncmF0aW9uW10+PlxuICAvKipcbiAgICogR2V0cyBhbiBpbnZpdGUgdG8gYSBjaGFubmVsIGJ5IGl0cyBpbnZpdGUgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIGludml0ZUNvZGUgLSBUaGUgaW52aXRlIGNvZGUgb2YgdGhlIGludml0ZSB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgaW52aXRlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZEludml0ZU1ldGFkYXRhfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2ludml0ZSNnZXQtaW52aXRlfVxuICAgKi9cbiAgZ2V0SW52aXRlOiAoaW52aXRlQ29kZTogc3RyaW5nLCBvcHRpb25zPzogR2V0SW52aXRlKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIGludml0ZXMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIGludml0ZXMgZnJvbS5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBJbnZpdGVNZXRhZGF0YSB8IEludml0ZX0gb2JqZWN0cyBhc3NvcnRlZCBieSBpbnZpdGUgY29kZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfR1VJTERgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9pbnZpdGUjZ2V0LWludml0ZXN9XG4gICAqL1xuICBnZXRJbnZpdGVzOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPj5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygc3RpY2tlciBwYWNrcyBhdmFpbGFibGUgdG8gTml0cm8gc3Vic2NyaWJlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBib3QgVGhlIGJvdCBpbnN0YW5jZSB0byB1c2UgdG8gbWFrZSB0aGUgcmVxdWVzdC5cbiAgICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIHtAbGluayBTdGlja2VyUGFja30gb2JqZWN0cyBhc3NvcnRlZCBieSBzdGlja2VyIElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvc3RpY2tlciNsaXN0LW5pdHJvLXN0aWNrZXItcGFja3N9XG4gICAqL1xuICBnZXROaXRyb1N0aWNrZXJQYWNrczogKCkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RpY2tlclBhY2tbXT4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbml0aWFsIG1lc3NhZ2UgcmVzcG9uc2UgdG8gYW4gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBVbmxpa2UgYGdldE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgKlxuICAgKiBEb2VzIG5vdCBzdXBwb3J0IGVwaGVtZXJhbCBmb2xsb3ctdXAgbWVzc2FnZXMgZHVlIHRvIHRoZXNlIGJlaW5nIHN0YXRlbGVzcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL3JlY2VpdmluZy1hbmQtcmVzcG9uZGluZyNnZXQtb3JpZ2luYWwtaW50ZXJhY3Rpb24tcmVzcG9uc2V9XG4gICAqL1xuICBnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2U6ICh0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRNZXNzYWdlPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgcHJpdmF0ZSBhcmNoaXZlZCB0aHJlYWRzIGZvciBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gZ2V0IHRoZSBhcmNoaXZlZCB0aHJlYWRzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBSRUFEX01FU1NBR0VfSElTVE9SWWAgcGVybWlzc2lvbi5cbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogUmV0dXJucyB0aHJlYWRzIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZFByaXZhdGVUaHJlYWR9LlxuICAgKlxuICAgKiBUaHJlYWRzIGFyZSBvcmRlcmVkIGJ5IHRoZSBgYXJjaGl2ZV90aW1lc3RhbXBgIHByb3BlcnR5IGluY2x1ZGVkIGluIHRoZSBtZXRhZGF0YSBvZiB0aGUgb2JqZWN0IGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xpc3QtcHJpdmF0ZS1hcmNoaXZlZC10aHJlYWRzfVxuICAgKi9cbiAgZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkczogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgcHJpdmF0ZSBhcmNoaXZlZCB0aHJlYWRzIHRoZSBib3QgaXMgYSBtZW1iZXIgb2YgZm9yIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlIGFyY2hpdmVkIHRocmVhZHMgZm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhyZWFkcy5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRBcmNoaXZlZFRocmVhZHN9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYFJFQURfTUVTU0FHRV9ISVNUT1JZYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBSZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHJpdmF0ZVRocmVhZH0uXG4gICAqXG4gICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBpZGAgcHJvcGVydHkgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC1qb2luZWQtcHJpdmF0ZS1hcmNoaXZlZC10aHJlYWRzfVxuICAgKi9cbiAgZ2V0UHJpdmF0ZUpvaW5lZEFyY2hpdmVkVGhyZWFkczogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgcHVibGljIGFyY2hpdmVkIHRocmVhZHMgZm9yIGEgY2hhbm5lbC5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCB0byBnZXQgdGhlIGFyY2hpdmVkIHRocmVhZHMgZm9yLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhyZWFkcy5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEFyY2hpdmVkVGhyZWFkc30uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIGNhbGxlZCBvbiBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkVGV4dH0sIHJldHVybnMgdGhyZWFkcyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRQdWJsaWNUaHJlYWR9LlxuICAgKiBJZiBjYWxsZWQgb24gYSBjaGFubmVsIG9mIHR5cGUge0BsaW5rIENoYW5uZWxUeXBlcy5HdWlsZE5ld3N9LCByZXR1cm5zIHRocmVhZHMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkTmV3c1RocmVhZH0uXG4gICAqXG4gICAqIFRocmVhZHMgYXJlIG9yZGVyZWQgYnkgdGhlIGBhcmNoaXZlX3RpbWVzdGFtcGAgcHJvcGVydHkgaW5jbHVkZWQgaW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBvYmplY3QgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC1wdWJsaWMtYXJjaGl2ZWQtdGhyZWFkc31cbiAgICovXG4gIGdldFB1YmxpY0FyY2hpdmVkVGhyZWFkczogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogTGlzdEFyY2hpdmVkVGhyZWFkcykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQXJjaGl2ZWRUaHJlYWRzPj5cbiAgLyoqXG4gICAqIEdldHMgYSBzY2hlZHVsZWQgZXZlbnQgYnkgaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBzY2hlZHVsZWQgZXZlbnQgZnJvbS5cbiAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgc2NoZWR1bGVkIGV2ZW50LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgU2NoZWR1bGVkRXZlbnR9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2dldC1ndWlsZC1zY2hlZHVsZWQtZXZlbnR9XG4gICAqL1xuICBnZXRTY2hlZHVsZWRFdmVudDogKGd1aWxkSWQ6IEJpZ1N0cmluZywgZXZlbnRJZDogQmlnU3RyaW5nLCBvcHRpb25zPzogeyB3aXRoVXNlckNvdW50PzogYm9vbGVhbiB9KSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRTY2hlZHVsZWRFdmVudD4+XG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsaXN0IG9mIHNjaGVkdWxlZCBldmVudHMgZm9yIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHNjaGVkdWxlZCBldmVudHMgZnJvbS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBzY2hlZHVsZWQgZXZlbnRzLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFNjaGVkdWxlZEV2ZW50fSBvYmplY3RzIGFzc29ydGVkIGJ5IGV2ZW50IElELlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtc2NoZWR1bGVkLWV2ZW50I2xpc3Qtc2NoZWR1bGVkLWV2ZW50cy1mb3ItZ3VpbGR9XG4gICAqL1xuICBnZXRTY2hlZHVsZWRFdmVudHM6IChndWlsZElkOiBCaWdTdHJpbmcsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudHMpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFNjaGVkdWxlZEV2ZW50W10+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiBzdWJzY3JpYmVycyB0byBhIHNjaGVkdWxlZCBldmVudCBmcm9tIGEgZ3VpbGQuXG4gICAqXG4gICAqIEBwYXJhbSBndWlsZElkIC0gVGhlIElEIG9mIHRoZSBndWlsZCB0byBnZXQgdGhlIHN1YnNjcmliZXJzIHRvIHRoZSBzY2hlZHVsZWQgZXZlbnQgZnJvbS5cbiAgICogQHBhcmFtIGV2ZW50SWQgLSBUaGUgSUQgb2YgdGhlIHNjaGVkdWxlZCBldmVudCB0byBnZXQgdGhlIHN1YnNjcmliZXJzIG9mLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZmV0Y2hpbmcgb2YgdGhlIHN1YnNjcmliZXJzLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFVzZXJ9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIGBNQU5BR0VfRVZFTlRTYCBwZXJtaXNzaW9uLlxuICAgKlxuICAgKiBVc2VycyBhcmUgb3JkZXJlZCBieSB0aGVpciBJRHMgaW4gX2FzY2VuZGluZ18gb3JkZXIuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZC1zY2hlZHVsZWQtZXZlbnQjZ2V0LWd1aWxkLXNjaGVkdWxlZC1ldmVudC11c2Vyc31cbiAgICovXG4gIGdldFNjaGVkdWxlZEV2ZW50VXNlcnM6IChcbiAgICBndWlsZElkOiBCaWdTdHJpbmcsXG4gICAgZXZlbnRJZDogQmlnU3RyaW5nLFxuICAgIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudFVzZXJzLFxuICApID0+IFByb21pc2U8QXJyYXk8eyB1c2VyOiBDYW1lbGl6ZTxEaXNjb3JkVXNlcj47IG1lbWJlcj86IENhbWVsaXplPERpc2NvcmRNZW1iZXI+IH0+PlxuICAvKiogR2V0IHRoZSBib3RzIEdhdGV3YXkgbWV0YWRhdGEgdGhhdCBjYW4gaGVscCBkdXJpbmcgdGhlIG9wZXJhdGlvbiBvZiBsYXJnZSBvciBzaGFyZGVkIGJvdHMuICovXG4gIGdldFNlc3Npb25JbmZvOiAoKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRHZXRHYXRld2F5Qm90Pj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0YWdlIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIHN0YWdlIGNoYW5uZWwsIGlmIG9uZSBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHN0YWdlIGNoYW5uZWwgdGhlIHN0YWdlIGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRTdGFnZUluc3RhbmNlfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3N0YWdlLWluc3RhbmNlI2dldC1zdGFnZS1pbnN0YW5jZX1cbiAgICovXG4gIGdldFN0YWdlSW5zdGFuY2U6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4+XG4gIC8qKlxuICAgKiBHZXRzIGEgdGhyZWFkIG1lbWJlciBieSB0aGVpciB1c2VyIElELlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gZ2V0IHRoZSB0aHJlYWQgbWVtYmVyIG9mLlxuICAgKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIHRocmVhZCBtZW1iZXIgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFRocmVhZE1lbWJlcn0uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2dldC10aHJlYWQtbWVtYmVyfVxuICAgKi9cbiAgZ2V0VGhyZWFkTWVtYmVyOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUaHJlYWRNZW1iZXI+PlxuICAvKipcbiAgICogR2V0cyB0aGUgbGlzdCBvZiB0aHJlYWQgbWVtYmVycyBmb3IgYSB0aHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byBnZXQgdGhlIHRocmVhZCBtZW1iZXJzIG9mLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRUaHJlYWRNZW1iZXJ9IGFzc29ydGVkIGJ5IHVzZXIgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBhcHBsaWNhdGlvbiB0byBoYXZlIHRoZSBgR1VJTERfTUVNQkVSU2AgcHJpdmlsZWdlZCBpbnRlbnQgZW5hYmxlZC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjbGlzdC10aHJlYWQtbWVtYmVyc31cbiAgICovXG4gIGdldFRocmVhZE1lbWJlcnM6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVGhyZWFkTWVtYmVyW10+PlxuICAvKipcbiAgICogR2V0IGEgdXNlcidzIGRhdGEgZnJvbSB0aGUgYXBpXG4gICAqXG4gICAqIEBwYXJhbSBpZCBUaGUgdXNlcidzIGlkXG4gICAqIEByZXR1cm5zIHtDYW1lbGl6ZTxEaXNjb3JkVXNlcj59XG4gICAqL1xuICBnZXRVc2VyOiAoaWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkVXNlcj4+XG4gIC8qKlxuICAgKiBHZXRzIGEgd2ViaG9vayBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9XRUJIT09LU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LXdlYmhvb2t9XG4gICAqL1xuICBnZXRXZWJob29rOiAod2ViaG9va0lkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZFdlYmhvb2s+PlxuICAvKipcbiAgICogR2V0cyBhIHdlYmhvb2sgbWVzc2FnZSBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWJob29rSWQgLSBUaGUgSUQgb2YgdGhlIHdlYmhvb2sgdG8gZ2V0IGEgbWVzc2FnZSBvZi5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZ2V0IHdlYmhvb2sgbWVzc2FnZXMuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSB0aGUgSUQgb2YgdGhlIHdlYmhvb2sgbWVzc2FnZSB0byBnZXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmZXRjaGluZyBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIERpc2NvcmRNZXNzYWdlfS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZ2V0LXdlYmhvb2stbWVzc2FnZX1cbiAgICovXG4gIGdldFdlYmhvb2tNZXNzYWdlOiAoXG4gICAgd2ViaG9va0lkOiBCaWdTdHJpbmcsXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBtZXNzYWdlSWQ6IEJpZ1N0cmluZyxcbiAgICBvcHRpb25zPzogR2V0V2ViaG9va01lc3NhZ2VPcHRpb25zLFxuICApID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogR2V0cyBhIHdlYmhvb2sgdXNpbmcgdGhlIHdlYmhvb2sgdG9rZW4sIHRoZXJlYnkgYnlwYXNzaW5nIHRoZSBuZWVkIGZvciBhdXRoZW50aWNhdGlvbiArIHBlcm1pc3Npb25zLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViaG9va0lkIC0gVGhlIElEIG9mIHRoZSB3ZWJob29rIHRvIGdldC5cbiAgICogQHBhcmFtIHRva2VuIC0gVGhlIHdlYmhvb2sgdG9rZW4sIHVzZWQgdG8gZ2V0IHRoZSB3ZWJob29rLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGlzY29yZFdlYmhvb2t9LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNnZXQtd2ViaG9vay13aXRoLXRva2VufVxuICAgKi9cbiAgZ2V0V2ViaG9va1dpdGhUb2tlbjogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRXZWJob29rPj5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGJvdCB1c2VyIHRvIGEgdGhyZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbm5lbElkIC0gVGhlIElEIG9mIHRoZSB0aHJlYWQgdG8gYWRkIHRoZSBib3QgdXNlciB0by5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogUmVxdWlyZXMgdGhlIHRocmVhZCBub3QgYmUgYXJjaGl2ZWQuXG4gICAqXG4gICAqIEZpcmVzIGEgX1RocmVhZCBNZW1iZXJzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjam9pbi10aHJlYWR9XG4gICAqL1xuICBqb2luVGhyZWFkOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGJvdCB1c2VyIGZyb20gYSB0aHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byByZW1vdmUgdGhlIGJvdCB1c2VyIGZyb20uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSB0aHJlYWQgbm90IGJlIGFyY2hpdmVkLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgTWVtYmVycyBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI2xlYXZlLXRocmVhZH1cbiAgICovXG4gIGxlYXZlVGhyZWFkOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIENyb3NzLXBvc3RzIGEgbWVzc2FnZSBwb3N0ZWQgaW4gYW4gYW5ub3VuY2VtZW50IGNoYW5uZWwgdG8gc3Vic2NyaWJlZCBjaGFubmVscy5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgYW5ub3VuY2VtZW50IGNoYW5uZWwuXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBUaGUgSUQgb2YgdGhlIG1lc3NhZ2UgdG8gY3Jvc3MtcG9zdC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyb3NzLXBvc3RlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFJlcXVpcmVzIHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogSWYgbm90IGNyb3NzLXBvc3Rpbmcgb3duIG1lc3NhZ2U6XG4gICAqIC0gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgQ3JlYXRlXyBldmVudCBpbiB0aGUgZ3VpbGRzIHRoZSBzdWJzY3JpYmVkIGNoYW5uZWxzIGFyZSBpbi5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjY3Jvc3Nwb3N0LW1lc3NhZ2V9XG4gICAqL1xuICBwdWJsaXNoTWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgbWVtYmVyIGZyb20gYSB0aHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIHRocmVhZCB0byByZW1vdmUgdGhlIHRocmVhZCBtZW1iZXIgb2YuXG4gICAqIEBwYXJhbSB1c2VySWQgLSBUaGUgdXNlciBJRCBvZiB0aGUgdGhyZWFkIG1lbWJlciB0byByZW1vdmUuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIHRoZSB0aHJlYWQgaXMgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHJpdmF0ZVRocmVhZH0sIHJlcXVpcmVzIHRvIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0aHJlYWQuXG4gICAqIE90aGVyd2lzZSwgcmVxdWlyZXMgdGhlIGBNQU5BR0VfVEhSRUFEU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogUmVxdWlyZXMgdGhlIHRocmVhZCBub3QgYmUgYXJjaGl2ZWQuXG4gICAqXG4gICAqIEZpcmVzIGEgX1RocmVhZCBNZW1iZXJzIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjcmVtb3ZlLXRocmVhZC1tZW1iZXJ9XG4gICAqL1xuICByZW1vdmVUaHJlYWRNZW1iZXI6IChjaGFubmVsSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSB0byBhIGNoYW5uZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgdG8gc2VuZCB0aGUgbWVzc2FnZSBpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBib3QgdXNlciBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2UgaXMgdG8gYmUgc2VudCBpbi5cbiAgICpcbiAgICogSWYgc2VuZGluZyBhIG1lc3NhZ2UgdG8gYSBndWlsZCBjaGFubmVsOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgU0VORF9NRVNTQUdFU2AgcGVybWlzc2lvbi5cbiAgICpcbiAgICogSWYgc2VuZGluZyBhIFRUUyBtZXNzYWdlOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgU0VORF9UVFNfTUVTU0FHRVNgIHBlcm1pc3Npb24uXG4gICAqXG4gICAqIElmIHNlbmRpbmcgYSBtZXNzYWdlIGFzIGEgcmVwbHkgdG8gYW5vdGhlciBtZXNzYWdlOlxuICAgKiAtIFJlcXVpcmVzIHRoZSBgUkVBRF9NRVNTQUdFX0hJU1RPUllgIHBlcm1pc3Npb24uXG4gICAqIC0gVGhlIG1lc3NhZ2UgYmVpbmcgcmVwbGllZCB0byBjYW5ub3QgYmUgYSBzeXN0ZW0gbWVzc2FnZS5cbiAgICpcbiAgICog4pqg77iPIFRoZSBtYXhpbXVtIHNpemUgb2YgYSByZXF1ZXN0IChhY2NvdW50aW5nIGZvciBhbnkgYXR0YWNobWVudHMgYW5kIG1lc3NhZ2UgY29udGVudCkgZm9yIGJvdCB1c2VycyBpcyBfOCBNaUJfLlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2NoYW5uZWwjY3JlYXRlLW1lc3NhZ2V9XG4gICAqL1xuICBzZW5kTWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBDcmVhdGVNZXNzYWdlT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG4gIC8qKlxuICAgKiBTZW5kcyBhIGZvbGxvdy11cCBtZXNzYWdlIHRvIGFuIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgaW50ZXJhY3Rpb24gdG9rZW4gdG8gdXNlLCBwcm92aWRlZCBpbiB0aGUgb3JpZ2luYWwgaW50ZXJhY3Rpb24uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiDimqDvuI8gSW50ZXJhY3Rpb24gdG9rZW5zIGFyZSBvbmx5IHZhbGlkIGZvciBfMTUgbWludXRlc18uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIG1lbnRpb25zIGFyZSBzdXBwcmVzc2VkLiBUbyBlbmFibGUgbWVudGlvbnMsIHBhc3MgYSBtZW50aW9uIG9iamVjdCB3aXRoIHRoZSBjYWxsYmFjayBkYXRhLlxuICAgKlxuICAgKiBVbmxpa2UgYHNlbmRNZXNzYWdlKClgLCB0aGlzIGVuZHBvaW50IGFsbG93cyB0aGUgYm90IHVzZXIgdG8gYWN0IHdpdGhvdXQ6XG4gICAqIC0gTmVlZGluZyB0byBiZSBhYmxlIHRvIHNlZSB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5uZWwgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbi4gKGBSRUFEX01FU1NBR0VTYCBwZXJtaXNzaW9uLilcbiAgICogLSBSZXF1aXJpbmcgdGhlIGBNRVNTQUdFX0NPTlRFTlRgIGludGVudC5cbiAgICpcbiAgICogRmlyZXMgYSBfTWVzc2FnZSBDcmVhdGVfIGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9pbnRlcmFjdGlvbnMvcmVjZWl2aW5nLWFuZC1yZXNwb25kaW5nI2NyZWF0ZS1mb2xsb3d1cC1tZXNzYWdlfVxuICAgKi9cbiAgc2VuZEZvbGxvd3VwTWVzc2FnZTogKHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uUmVzcG9uc2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lc3NhZ2U+PlxuICAvKipcbiAgICogU2VuZHMgYSByZXNwb25zZSB0byBhbiBpbnRlcmFjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGludGVyYWN0aW9uSWQgLSBUaGUgSUQgb2YgdGhlIGludGVyYWN0aW9uIHRvIHJlc3BvbmQgdG8uXG4gICAqIEBwYXJhbSB0b2tlbiAtIFRoZSBpbnRlcmFjdGlvbiB0b2tlbiB0byB1c2UsIHByb3ZpZGVkIGluIHRoZSBvcmlnaW5hbCBpbnRlcmFjdGlvbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKaoO+4jyBJbnRlcmFjdGlvbiB0b2tlbnMgYXJlIG9ubHkgdmFsaWQgZm9yIF8xNSBtaW51dGVzXy5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgbWVudGlvbnMgYXJlIHN1cHByZXNzZWQuIFRvIGVuYWJsZSBtZW50aW9ucywgcGFzcyBhIG1lbnRpb24gb2JqZWN0IHdpdGggdGhlIGNhbGxiYWNrIGRhdGEuXG4gICAqXG4gICAqIFVubGlrZSBgc2VuZE1lc3NhZ2UoKWAsIHRoaXMgZW5kcG9pbnQgYWxsb3dzIHRoZSBib3QgdXNlciB0byBhY3Qgd2l0aG91dDpcbiAgICogLSBOZWVkaW5nIHRvIGJlIGFibGUgdG8gc2VlIHRoZSBjb250ZW50cyBvZiB0aGUgY2hhbm5lbCB0aGF0IHRoZSBtZXNzYWdlIGlzIGluLiAoYFJFQURfTUVTU0FHRVNgIHBlcm1pc3Npb24uKVxuICAgKiAtIFJlcXVpcmluZyB0aGUgYE1FU1NBR0VfQ09OVEVOVGAgaW50ZW50LlxuICAgKlxuICAgKiBGaXJlcyBhIF9NZXNzYWdlIENyZWF0ZV8gZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL2ludGVyYWN0aW9ucy9yZWNlaXZpbmctYW5kLXJlc3BvbmRpbmcjY3JlYXRlLWludGVyYWN0aW9uLXJlc3BvbnNlfVxuICAgKi9cbiAgc2VuZEludGVyYWN0aW9uUmVzcG9uc2U6IChpbnRlcmFjdGlvbklkOiBCaWdTdHJpbmcsIHRva2VuOiBzdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0aHJlYWQsIHVzaW5nIGFuIGV4aXN0aW5nIG1lc3NhZ2UgYXMgaXRzIHBvaW50IG9mIG9yaWdpbi5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCBpbiB3aGljaCB0byBjcmVhdGUgdGhlIHRocmVhZC5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBJRCBvZiB0aGUgbWVzc2FnZSB0byB1c2UgYXMgdGhlIHRocmVhZCdzIHBvaW50IG9mIG9yaWdpbi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgdGhyZWFkLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgY3JlYXRlZCB7QGxpbmsgQ2hhbm5lbCB8IFRocmVhZH0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIGNhbGxlZCBvbiBhIGNoYW5uZWwgb2YgdHlwZSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkVGV4dH0sIGNyZWF0ZXMgYSB7QGxpbmsgQ2hhbm5lbFR5cGVzLkd1aWxkUHVibGljVGhyZWFkfS5cbiAgICogSWYgY2FsbGVkIG9uIGEgY2hhbm5lbCBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGROZXdzfSwgY3JlYXRlcyBhIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGROZXdzVGhyZWFkfS5cbiAgICogRG9lcyBub3Qgd29yayBvbiBjaGFubmVscyBvZiB0eXBlIHtAbGluayBDaGFubmVsVHlwZXMuR3VpbGRGb3J1bX0uXG4gICAqXG4gICAqIFRoZSBJRCBvZiB0aGUgY3JlYXRlZCB0aHJlYWQgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgSUQgb2YgdGhlIHNvdXJjZSBtZXNzYWdlLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UaHJlYWQgQ3JlYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvY2hhbm5lbCNzdGFydC10aHJlYWQtZnJvbS1tZXNzYWdlfVxuICAgKi9cbiAgc3RhcnRUaHJlYWRXaXRoTWVzc2FnZTogKGNoYW5uZWxJZDogQmlnU3RyaW5nLCBtZXNzYWdlSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogU3RhcnRUaHJlYWRXaXRoTWVzc2FnZSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkQ2hhbm5lbD4+XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGhyZWFkIHdpdGhvdXQgdXNpbmcgYSBtZXNzYWdlIGFzIHRoZSB0aHJlYWQncyBwb2ludCBvZiBvcmlnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBjaGFubmVsSWQgLSBUaGUgSUQgb2YgdGhlIGNoYW5uZWwgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSB0aHJlYWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHRocmVhZC5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGNyZWF0ZWQge0BsaW5rIERpc2NvcmRDaGFubmVsIHwgVGhyZWFkfS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogQ3JlYXRpbmcgYSBwcml2YXRlIHRocmVhZCByZXF1aXJlcyB0aGUgc2VydmVyIHRvIGJlIGJvb3N0ZWQuXG4gICAqXG4gICAqIEZpcmVzIGEgX1RocmVhZCBDcmVhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3N0YXJ0LXRocmVhZC13aXRob3V0LW1lc3NhZ2V9XG4gICAqL1xuICBzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlOiAoY2hhbm5lbElkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IFN0YXJ0VGhyZWFkV2l0aG91dE1lc3NhZ2UpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZENoYW5uZWw+PlxuICAvKipcbiAgICogU3luY2hyb25pc2VzIGEgdGVtcGxhdGUgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGd1aWxkLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gc3luY2hyb25pc2UgYSB0ZW1wbGF0ZSBvZi5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgVGVtcGxhdGV9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9HVUlMRGAgcGVybWlzc2lvbi5cbiAgICpcbiAgICogRmlyZXMgYSBfR3VpbGQgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQtdGVtcGxhdGUjZ2V0LWd1aWxkLXRlbXBsYXRlc31cbiAgICovXG4gIHN5bmNHdWlsZFRlbXBsYXRlOiAoZ3VpbGRJZDogQmlnU3RyaW5nKSA9PiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+XG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIHR5cGluZyBpbmRpY2F0b3IgZm9yIHRoZSBib3QgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIGNoYW5uZWxJZCAtIFRoZSBJRCBvZiB0aGUgY2hhbm5lbCBpbiB3aGljaCB0byB0cmlnZ2VyIHRoZSB0eXBpbmcgaW5kaWNhdG9yLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBHZW5lcmFsbHksIGJvdHMgc2hvdWxkIF9ub3RfIHVzZSB0aGlzIHJvdXRlLlxuICAgKlxuICAgKiBGaXJlcyBhIF9UeXBpbmcgU3RhcnRfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9jaGFubmVsI3RyaWdnZXItdHlwaW5nLWluZGljYXRvcn1cbiAgICovXG4gIHRyaWdnZXJUeXBpbmdJbmRpY2F0b3I6IChjaGFubmVsSWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxuICAvKipcbiAgICogUmUtcmVnaXN0ZXJzIHRoZSBsaXN0IG9mIGdsb2JhbCBhcHBsaWNhdGlvbiBjb21tYW5kcywgb3ZlcndyaXRpbmcgdGhlIHByZXZpb3VzIGNvbW1hbmRzIGNvbXBsZXRlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIHVzZSB0byBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIGxpc3QuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKdlyBDb21tYW5kcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgYGNvbW1hbmRzYCBhcnJheSB3aWxsIGJlIF9fZGVsZXRlZF9fLlxuICAgKlxuICAgKiDimqDvuI8gQ29tbWFuZHMgdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdCB3aWxsIGNvdW50IHRvd2FyZHMgdGhlIGRhaWx5IGxpbWl0IG9mIF8yMDBfIG5ldyBjb21tYW5kcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2J1bGstb3ZlcndyaXRlLWdsb2JhbC1hcHBsaWNhdGlvbi1jb21tYW5kc31cbiAgICovXG4gIHVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHM6IChjb21tYW5kczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kW10pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgLyoqXG4gICAqIFJlLXJlZ2lzdGVycyB0aGUgbGlzdCBvZiBhcHBsaWNhdGlvbiBjb21tYW5kcyByZWdpc3RlcmVkIGluIGEgZ3VpbGQsIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBjb21tYW5kcyBjb21wbGV0ZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgd2hvc2UgbGlzdCBvZiBjb21tYW5kcyB0byBvdmVyd3JpdGUuXG4gICAqIEBwYXJhbSBjb21tYW5kcyAtIFRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIHVzZSB0byBvdmVyd3JpdGUgdGhlIHByZXZpb3VzIGxpc3QuXG4gICAqIEByZXR1cm5zIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25Db21tYW5kfSBvYmplY3RzIGFzc29ydGVkIGJ5IGNvbW1hbmQgSUQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIOKdlyBDb21tYW5kcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgYGNvbW1hbmRzYCBhcnJheSB3aWxsIGJlIF9fZGVsZXRlZF9fLlxuICAgKlxuICAgKiDimqDvuI8gQ29tbWFuZHMgdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdCB3aWxsIGNvdW50IHRvd2FyZHMgdGhlIGRhaWx5IGxpbWl0IG9mIF8yMDBfIG5ldyBjb21tYW5kcy5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvaW50ZXJhY3Rpb25zL2FwcGxpY2F0aW9uLWNvbW1hbmRzI2J1bGstb3ZlcndyaXRlLWd1aWxkLWFwcGxpY2F0aW9uLWNvbW1hbmRzfVxuICAgKi9cbiAgdXBzZXJ0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBjb21tYW5kczogQ3JlYXRlQXBwbGljYXRpb25Db21tYW5kW10pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPj5cbiAgLyoqXG4gKiBCYW5zIGEgdXNlciBmcm9tIGEgZ3VpbGQuXG4gKlxuXG4gKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gYmFuIHRoZSB1c2VyIGZyb20uXG4gKiBAcGFyYW0gdXNlcklkIC0gVGhlIElEIG9mIHRoZSB1c2VyIHRvIGJhbiBmcm9tIHRoZSBndWlsZC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgYmFuLlxuICpcbiAqIEByZW1hcmtzXG4gKiBSZXF1aXJlcyB0aGUgYEJBTl9NRU1CRVJTYCBwZXJtaXNzaW9uLlxuICpcbiAqIEZpcmVzIGEgX0d1aWxkIEJhbiBBZGRfIGdhdGV3YXkgZXZlbnQuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2NyZWF0ZS1ndWlsZC1iYW59XG4gKi9cbiAgYmFuTWVtYmVyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZywgb3B0aW9ucz86IENyZWF0ZUd1aWxkQmFuKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgbmlja25hbWUgb2YgdGhlIGJvdCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZWRpdCB0aGUgbmlja25hbWUgb2YgdGhlIGJvdCB1c2VyIGluLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbmlja25hbWUuXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHRoZSBlZGl0ZWQge0BsaW5rIERpc2NvcmRNZW1iZXJ9XG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX0d1aWxkIE1lbWJlciBVcGRhdGVfIGdhdGV3YXkgZXZlbnQuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNtb2RpZnktY3VycmVudC1tZW1iZXJ9XG4gICAqL1xuICBlZGl0Qm90TWVtYmVyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBFZGl0Qm90TWVtYmVyT3B0aW9ucykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyPj5cbiAgLyoqXG4gICAqIEVkaXRzIGEgbWVtYmVyJ3MgcHJvcGVydGllcy5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGVkaXQgdGhlIG1lbWJlciBvZi5cbiAgICogQHBhcmFtIHVzZXJJZCAtIFRoZSB1c2VyIElEIG9mIHRoZSBtZW1iZXIgdG8gZWRpdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVkaXQgb2YgdGhlIHVzZXIuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgZW5kcG9pbnQgcmVxdWlyZXMgdmFyaW91cyBwZXJtaXNzaW9ucyBkZXBlbmRpbmcgb24gd2hhdCBpcyBlZGl0ZWQgYWJvdXQgdGhlIG1lbWJlci5cbiAgICogVG8gZmluZCBvdXQgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gdG8gZW5hY3QgYSBjaGFuZ2UsIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhpcyBlbmRwb2ludCdzIHtAbGluayBNb2RpZnlHdWlsZE1lbWJlciB8IHBhcmFtZXRlcnN9LlxuICAgKlxuICAgKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjbW9kaWZ5LWd1aWxkLW1lbWJlcn1cbiAgICovXG4gIGVkaXRNZW1iZXI6IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBNb2RpZnlHdWlsZE1lbWJlcikgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyPj5cbiAgLyoqXG4gKiBHZXRzIHRoZSBtZW1iZXIgb2JqZWN0IGJ5IHVzZXIgSUQuXG4gKlxuXG4gKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8gZ2V0IHRoZSBtZW1iZXIgb2JqZWN0IGZvci5cbiAqIEBwYXJhbSB1c2VySWQgLSBUaGUgSUQgb2YgdGhlIHVzZXIgdG8gZ2V0IHRoZSBtZW1iZXIgb2JqZWN0IGZvci5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIHtAbGluayBEaXNjb3JkTWVtYmVyV2l0aFVzZXJ9LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNnZXQtZ3VpbGQtbWVtYmVyfVxuICovXG4gIGdldE1lbWJlcjogKGd1aWxkSWQ6IEJpZ1N0cmluZywgdXNlcklkOiBCaWdTdHJpbmcpID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyPj5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpc3Qgb2YgbWVtYmVycyBmb3IgYSBndWlsZC5cbiAgICpcbiAgICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIGdldCB0aGUgbGlzdCBvZiBtZW1iZXJzIGZvci5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZldGNoaW5nIG9mIHRoZSBtZW1iZXJzLlxuICAgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJXaXRoVXNlcn0gb2JqZWN0cyBhc3NvcnRlZCBieSB1c2VyIElELlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBSZXF1aXJlcyB0aGUgYEdVSUxEX01FTUJFUlNgIGludGVudC5cbiAgICpcbiAgICog4pqg77iPIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBlbmRwb2ludCB3aXRoIHZlcnkgbGFyZ2UgYm90cy4gSW5zdGVhZCwgb3B0IHRvIHVzZSBgZmV0Y2hNZW1iZXJzKClgOlxuICAgKiBSRVNUIGNvbW11bmljYXRpb24gb25seSBwZXJtaXRzIDUwIHJlcXVlc3RzIHRvIGJlIG1hZGUgcGVyIHNlY29uZCwgd2hpbGUgZ2F0ZXdheXMgYWxsb3cgZm9yIHVwIHRvIDEyMCByZXF1ZXN0c1xuICAgKiBwZXIgbWludXRlIHBlciBzaGFyZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9yYXRlLWxpbWl0cyNyYXRlLWxpbWl0c30uXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNsaXN0LWd1aWxkLW1lbWJlcnN9XG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3RvcGljcy9nYXRld2F5I3JlcXVlc3QtZ3VpbGQtbWVtYmVyc31cbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvdG9waWNzL3JhdGUtbGltaXRzI3JhdGUtbGltaXRzfVxuICAgKi9cbiAgZ2V0TWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgb3B0aW9uczogTGlzdEd1aWxkTWVtYmVycykgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVtYmVyV2l0aFVzZXJbXT4+XG5cbiAgLyoqXG4gKiBLaWNrcyBhIG1lbWJlciBmcm9tIGEgZ3VpbGQuXG4gKlxuXG4gKiBAcGFyYW0gZ3VpbGRJZCAtIFRoZSBJRCBvZiB0aGUgZ3VpbGQgdG8ga2ljayB0aGUgbWVtYmVyIGZyb20uXG4gKiBAcGFyYW0gdXNlcklkIC0gVGhlIHVzZXIgSUQgb2YgdGhlIG1lbWJlciB0byBraWNrIGZyb20gdGhlIGd1aWxkLlxuICpcbiAqIEByZW1hcmtzXG4gKiBSZXF1aXJlcyB0aGUgYEtJQ0tfTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAqXG4gKiBGaXJlcyBhIF9HdWlsZCBNZW1iZXIgUmVtb3ZlXyBnYXRld2F5IGV2ZW50LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNyZW1vdmUtZ3VpbGQtbWVtYmVyfVxuICovXG4gIGtpY2tNZW1iZXI6IChndWlsZElkOiBCaWdTdHJpbmcsIHVzZXJJZDogQmlnU3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cbiAgLyoqXG4gKiBJbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgcHJ1bmluZyBpbmFjdGl2ZSBtZW1iZXJzLlxuICpcblxuICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHBydW5lIHRoZSBtZW1iZXJzIG9mLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHBydW5pbmcgb2YgbWVtYmVycy5cbiAqIEByZXR1cm5zIEEgbnVtYmVyIGluZGljYXRpbmcgaG93IG1hbnkgbWVtYmVycyB3ZXJlIHBydW5lZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmVxdWlyZXMgdGhlIGBLSUNLX01FTUJFUlNgIHBlcm1pc3Npb24uXG4gKlxuICog4p2XIFJlcXVlc3RzIHRvIHRoaXMgZW5kcG9pbnQgd2lsbCB0aW1lIG91dCBmb3IgbGFyZ2UgZ3VpbGRzLiBUbyBwcmV2ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmcsIHNldCB0aGUge0BsaW5rIEJlZ2luR3VpbGRQcnVuZS5jb21wdXRlUHJ1bmVDb3VudH0gcHJvcGVydHkgb2YgdGhlIHtAbGluayBvcHRpb25zfSBvYmplY3QgcGFyYW1ldGVyIHRvIGBmYWxzZWAuIFRoaXMgd2lsbCBiZWdpbiB0aGUgcHJvY2VzcyBvZiBwcnVuaW5nLCBhbmQgaW1tZWRpYXRlbHkgcmV0dXJuIGB1bmRlZmluZWRgLCByYXRoZXIgdGhhbiB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBjb21wbGV0ZSBiZWZvcmUgcmV0dXJuaW5nIHRoZSBhY3R1YWwgY291bnQgb2YgbWVtYmVycyB0aGF0IGhhdmUgYmVlbiBraWNrZWQuXG4gKlxuICog4pqg77iPIEJ5IGRlZmF1bHQsIHRoaXMgcHJvY2VzcyB3aWxsIG5vdCByZW1vdmUgbWVtYmVycyB3aXRoIGEgcm9sZS4gVG8gaW5jbHVkZSB0aGUgbWVtYmVycyB3aG8gaGF2ZSBhIF9wYXJ0aWN1bGFyIHN1YnNldCBvZiByb2xlc18sIHNwZWNpZnkgdGhlIHJvbGUocykgaW4gdGhlIHtAbGluayBCZWdpbkd1aWxkUHJ1bmUuaW5jbHVkZVJvbGVzIHwgaW5jbHVkZVJvbGVzfSBwcm9wZXJ0eSBvZiB0aGUge0BsaW5rIG9wdGlvbnN9IG9iamVjdCBwYXJhbWV0ZXIuXG4gKlxuICogRmlyZXMgYSBfR3VpbGQgTWVtYmVyIFJlbW92ZV8gZ2F0ZXdheSBldmVudCBmb3IgZXZlcnkgbWVtYmVyIGtpY2tlZC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjYmVnaW4tZ3VpbGQtcHJ1bmV9XG4gKi9cbiAgcHJ1bmVNZW1iZXJzOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCBvcHRpb25zOiBCZWdpbkd1aWxkUHJ1bmUpID0+IFByb21pc2U8eyBwcnVuZWQ6IG51bWJlciB8IG51bGwgfT5cbiAgLyoqXG4gKiBHZXRzIHRoZSBsaXN0IG9mIG1lbWJlcnMgd2hvc2UgdXNlcm5hbWVzIG9yIG5pY2tuYW1lcyBzdGFydCB3aXRoIGEgcHJvdmlkZWQgc3RyaW5nLlxuICpcblxuICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHNlYXJjaCBpbi5cbiAqIEBwYXJhbSBxdWVyeSAtIFRoZSBzdHJpbmcgdG8gbWF0Y2ggdXNlcm5hbWVzIG9yIG5pY2tuYW1lcyBhZ2FpbnN0LlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcGFyYW1ldGVycyBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdGhlIG1lbWJlcnMuXG4gKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIERpc2NvcmRNZW1iZXJ9IG9iamVjdHMgYXNzb3J0ZWQgYnkgdXNlciBJRC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvZ3VpbGQjc2VhcmNoLWd1aWxkLW1lbWJlcnN9XG4gKi9cbiAgc2VhcmNoTWVtYmVyczogKGd1aWxkSWQ6IEJpZ1N0cmluZywgcXVlcnk6IHN0cmluZywgb3B0aW9ucz86IE9taXQ8U2VhcmNoTWVtYmVycywgJ3F1ZXJ5Jz4pID0+IFByb21pc2U8Q2FtZWxpemU8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+PlxuICAvKipcbiAqIFVuYmFucyBhIHVzZXIgZnJvbSBhIGd1aWxkLlxuICpcblxuICogQHBhcmFtIGd1aWxkSWQgLSBUaGUgSUQgb2YgdGhlIGd1aWxkIHRvIHVuYmFuIHRoZSB1c2VyIGluLlxuICogQHBhcmFtIHVzZXJJZCAtIFRoZSBJRCBvZiB0aGUgdXNlciB0byB1bmJhbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmVxdWlyZXMgdGhlIGBCQU5fTUVNQkVSU2AgcGVybWlzc2lvbi5cbiAqXG4gKiBGaXJlcyBhIF9HdWlsZCBCYW4gUmVtb3ZlXyBnYXRld2F5IGV2ZW50LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNyZW1vdmUtZ3VpbGQtYmFufVxuICovXG4gIHVuYmFuTWVtYmVyOiAoZ3VpbGRJZDogQmlnU3RyaW5nLCB1c2VySWQ6IEJpZ1N0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0TWV0aG9kcyA9ICdHRVQnIHwgJ1BPU1QnIHwgJ0RFTEVURScgfCAnUEFUQ0gnIHwgJ1BVVCdcbmV4cG9ydCB0eXBlIEFwaVZlcnNpb25zID0gOSB8IDEwXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlV2ViaG9vayBleHRlbmRzIFdpdGhSZWFzb24ge1xuICAvKiogTmFtZSBvZiB0aGUgd2ViaG9vayAoMS04MCBjaGFyYWN0ZXJzKSAqL1xuICBuYW1lOiBzdHJpbmdcbiAgLyoqIEltYWdlIHVybCBmb3IgdGhlIGRlZmF1bHQgd2ViaG9vayBhdmF0YXIgKi9cbiAgYXZhdGFyPzogc3RyaW5nIHwgbnVsbFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVJlcXVlc3RCb2R5T3B0aW9ucyB7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1ldGhvZDogUmVxdWVzdE1ldGhvZHNcbiAgYm9keT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHVuYXV0aG9yaXplZD86IGJvb2xlYW5cbiAgdXJsPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEJvZHkge1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGJvZHk6IHN0cmluZyB8IEZvcm1EYXRhXG4gIG1ldGhvZDogUmVxdWVzdE1ldGhvZHNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUmVxdWVzdE9wdGlvbnMge1xuICAvKiogVGhlIHVybCB0byBzZW5kIHRoZSByZXF1ZXN0IHRvLiAqL1xuICB1cmw6IHN0cmluZ1xuICAvKiogVGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBzZW5kaW5nIHRoZSByZXF1ZXN0LiAqL1xuICBtZXRob2Q6IFJlcXVlc3RNZXRob2RzXG4gIC8qKiBUaGUgYm9keSB0byBiZSBzZW50IGluIHRoZSByZXF1ZXN0LiAqL1xuICBib2R5PzogUmVjb3JkPHN0cmluZywgYW55PlxuICAvKiogVGhlIGFtb3VudCBvZiB0aW1lcyB0aGlzIHJlcXVlc3QgaGFzIGJlZW4gcmV0cmllZC4gKi9cbiAgcmV0cnlDb3VudDogbnVtYmVyXG4gIC8qKiBIYW5kbGVyIHRvIHJldHJ5IGEgcmVxdWVzdCBzaG91bGQgaXQgYmUgcmF0ZSBsaW1pdGVkLiAqL1xuICByZXRyeVJlcXVlc3Q/OiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBSZXNvbHZlIGhhbmRsZXIgd2hlbiBhIHJlcXVlc3Qgc3VjY2VlZHMuICovXG4gIHJlc29sdmU6ICh2YWx1ZTogYW55IHwgUHJvbWlzZUxpa2U8YW55PikgPT4gdm9pZFxuICAvKiogUmVqZWN0IGhhbmRsZXIgd2hlbiBhIHJlcXVlc3QgZmFpbHMuICovXG4gIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZFxuICAvKiogSWYgdGhpcyByZXF1ZXN0IGhhcyBhIGJ1Y2tldCBpZCB3aGljaCBpdCBmYWxscyB1bmRlciBmb3IgcmF0ZSBsaW1pdCAqL1xuICBidWNrZXRJZD86IHN0cmluZ1xuICAvKiogQWRkaXRpb25hbCByZXF1ZXN0IG9wdGlvbnMsIHVzZWQgZm9yIHRoaW5ncyBsaWtlIG92ZXJyaWRpbmcgYXV0aG9yaXphdGlvbiBoZWFkZXIuICovXG4gIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdFJhdGVMaW1pdGVkUGF0aCB7XG4gIHVybDogc3RyaW5nXG4gIHJlc2V0VGltZXN0YW1wOiBudW1iZXJcbiAgYnVja2V0SWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJob29rTWVzc2FnZUVkaXRvciB7XG4gIC8qKlxuICAgKiBFZGl0cyBhIHdlYmhvb2sgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0IHRoZSBtZXNzYWdlIG9mLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIElEIG9mIHRoZSBtZXNzYWdlIHRvIGVkaXQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlZGl0IG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiB0aGUgZWRpdGVkIHtAbGluayBEaXNjb3JkTWVzc2FnZX0uXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIEZpcmVzIGEgX01lc3NhZ2UgVXBkYXRlXyBnYXRld2F5IGV2ZW50LlxuICAgKlxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2Rpc2NvcmQuY29tL2RldmVsb3BlcnMvZG9jcy9yZXNvdXJjZXMvd2ViaG9vayNlZGl0LXdlYmhvb2stbWVzc2FnZX1cbiAgICovXG4gICh3ZWJob29rSWQ6IEJpZ1N0cmluZywgdG9rZW46IHN0cmluZywgbWVzc2FnZUlkOiBCaWdTdHJpbmcsIG9wdGlvbnM6IEludGVyYWN0aW9uQ2FsbGJhY2tEYXRhICYgeyB0aHJlYWRJZD86IEJpZ1N0cmluZyB9KTogUHJvbWlzZTxcbiAgICBDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT5cbiAgPlxuICAvKipcbiAgICogRWRpdHMgdGhlIG9yaWdpbmFsIHdlYmhvb2sgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIHdlYmhvb2tJZCAtIFRoZSBJRCBvZiB0aGUgd2ViaG9vayB0byBlZGl0IHRoZSBvcmlnaW5hbCBtZXNzYWdlIG9mLlxuICAgKiBAcGFyYW0gdG9rZW4gLSBUaGUgd2ViaG9vayB0b2tlbiwgdXNlZCB0byBlZGl0IHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZWRpdCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgdGhlIGVkaXRlZCB7QGxpbmsgRGlzY29yZE1lc3NhZ2V9LlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGaXJlcyBhIF9NZXNzYWdlIFVwZGF0ZV8gZ2F0ZXdheSBldmVudC5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3dlYmhvb2sjZWRpdC13ZWJob29rLW1lc3NhZ2V9XG4gICAqL1xuICBvcmlnaW5hbDogKHdlYmhvb2tJZDogQmlnU3RyaW5nLCB0b2tlbjogc3RyaW5nLCBvcHRpb25zOiBJbnRlcmFjdGlvbkNhbGxiYWNrRGF0YSAmIHsgdGhyZWFkSWQ/OiBCaWdTdHJpbmcgfSkgPT4gUHJvbWlzZTxDYW1lbGl6ZTxEaXNjb3JkTWVzc2FnZT4+XG59XG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVRlbXBsYXRlIHtcbiAgLyoqIE5hbWUgd2hpY2ggdGhlIHRlbXBsYXRlIHNob3VsZCBoYXZlICovXG4gIG5hbWU6IHN0cmluZ1xuICAvKiogRGVzY3JpcHRpb24gb2YgdGhlIHRlbXBsYXRlICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG59XG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL3RlbXBsYXRlI21vZGlmeS1ndWlsZC10ZW1wbGF0ZSAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RpZnlHdWlsZFRlbXBsYXRlIHtcbiAgLyoqIE5hbWUgb2YgdGhlIHRlbXBsYXRlICgxLTEwMCBjaGFyYWN0ZXJzKSAqL1xuICBuYW1lPzogc3RyaW5nXG4gIC8qKiBEZXNjcmlwdGlvbiBvZiB0aGUgdGVtcGxhdGUgKDAtMTIwIGNoYXJhY3RlcnMpICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbFxufVxuLyoqIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNjcmVhdGUtZ3VpbGQtYmFuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUd1aWxkQmFuIGV4dGVuZHMgV2l0aFJlYXNvbiB7XG4gIC8qKiBOdW1iZXIgb2Ygc2Vjb25kcyB0byBkZWxldGUgbWVzc2FnZXMgZm9yLCBiZXR3ZWVuIDAgYW5kIDYwNDgwMCAoNyBkYXlzKSAqL1xuICBkZWxldGVNZXNzYWdlU2Vjb25kcz86IG51bWJlclxufVxuZXhwb3J0IGludGVyZmFjZSBFZGl0Qm90TWVtYmVyT3B0aW9ucyBleHRlbmRzIFdpdGhSZWFzb24ge1xuICBuaWNrPzogc3RyaW5nIHwgbnVsbFxufVxuLyoqIGh0dHBzOi8vZGlzY29yZC5jb20vZGV2ZWxvcGVycy9kb2NzL3Jlc291cmNlcy9ndWlsZCNtb2RpZnktZ3VpbGQtbWVtYmVyICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGlmeUd1aWxkTWVtYmVyIHtcbiAgLyoqIFZhbHVlIHRvIHNldCB1c2VycyBuaWNrbmFtZSB0by4gUmVxdWlyZXMgdGhlIGBNQU5BR0VfTklDS05BTUVTYCBwZXJtaXNzaW9uICovXG4gIG5pY2s/OiBzdHJpbmcgfCBudWxsXG4gIC8qKiBBcnJheSBvZiByb2xlIGlkcyB0aGUgbWVtYmVyIGlzIGFzc2lnbmVkLiBSZXF1aXJlcyB0aGUgYE1BTkFHRV9ST0xFU2AgcGVybWlzc2lvbiAqL1xuICByb2xlcz86IEJpZ1N0cmluZ1tdIHwgbnVsbFxuICAvKiogV2hldGhlciB0aGUgdXNlciBpcyBtdXRlZCBpbiB2b2ljZSBjaGFubmVscy4gV2lsbCB0aHJvdyBhIDQwMCBpZiB0aGUgdXNlciBpcyBub3QgaW4gYSB2b2ljZSBjaGFubmVsLiBSZXF1aXJlcyB0aGUgYE1VVEVfTUVNQkVSU2AgcGVybWlzc2lvbiAqL1xuICBtdXRlPzogYm9vbGVhbiB8IG51bGxcbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgZGVhZmVuZWQgaW4gdm9pY2UgY2hhbm5lbHMuIFdpbGwgdGhyb3cgYSA0MDAgaWYgdGhlIHVzZXIgaXMgbm90IGluIGEgdm9pY2UgY2hhbm5lbC4gUmVxdWlyZXMgdGhlIGBNT1ZFX01FTUJFUlNgIHBlcm1pc3Npb24gKi9cbiAgZGVhZj86IGJvb2xlYW4gfCBudWxsXG4gIC8qKiBJZCBvZiBjaGFubmVsIHRvIG1vdmUgdXNlciB0byAoaWYgdGhleSBhcmUgY29ubmVjdGVkIHRvIHZvaWNlKS4gUmVxdWlyZXMgdGhlIGBNT1ZFX01FTUJFUlNgIHBlcm1pc3Npb24gKi9cbiAgY2hhbm5lbElkPzogQmlnU3RyaW5nIHwgbnVsbFxuICAvKiogd2hlbiB0aGUgdXNlcidzIHRpbWVvdXQgd2lsbCBleHBpcmUgYW5kIHRoZSB1c2VyIHdpbGwgYmUgYWJsZSB0byBjb21tdW5pY2F0ZSBpbiB0aGUgZ3VpbGQgYWdhaW4gKHVwIHRvIDI4IGRheXMgaW4gdGhlIGZ1dHVyZSksIHNldCB0byBudWxsIHRvIHJlbW92ZSB0aW1lb3V0LiBSZXF1aXJlcyB0aGUgYE1PREVSQVRFX01FTUJFUlNgIHBlcm1pc3Npb24gKi9cbiAgY29tbXVuaWNhdGlvbkRpc2FibGVkVW50aWw/OiBudW1iZXIgfCBudWxsXG59XG4vKiogaHR0cHM6Ly9kaXNjb3JkLmNvbS9kZXZlbG9wZXJzL2RvY3MvcmVzb3VyY2VzL2d1aWxkI2JlZ2luLWd1aWxkLXBydW5lICovXG5leHBvcnQgaW50ZXJmYWNlIEJlZ2luR3VpbGRQcnVuZSB7XG4gIC8qKiBOdW1iZXIgb2YgZGF5cyB0byBwcnVuZSAoMSBvciBtb3JlKSwgZGVmYXVsdDogNyAqL1xuICBkYXlzPzogbnVtYmVyXG4gIC8qKiBXaGV0aGVyICdwcnVuZWQnIGlzIHJldHVybmVkLCBkaXNjb3VyYWdlZCBmb3IgbGFyZ2UgZ3VpbGRzLCBkZWZhdWx0OiB0cnVlICovXG4gIGNvbXB1dGVQcnVuZUNvdW50PzogYm9vbGVhblxuICAvKiogUm9sZShzKSBybyBpbmNsdWRlLCBkZWZhdWx0OiBub25lICovXG4gIGluY2x1ZGVSb2xlcz86IHN0cmluZ1tdXG59XG4iXSwibmFtZXMiOlsiSW50ZXJhY3Rpb25SZXNwb25zZVR5cGVzIiwiY2FtZWxpemUiLCJkZWxheSIsImdldEJvdElkRnJvbVRva2VuIiwidXJsVG9CYXNlNjQiLCJjcmVhdGVJbnZhbGlkUmVxdWVzdEJ1Y2tldCIsIlF1ZXVlIiwiY3JlYXRlUmVzdE1hbmFnZXIiLCJvcHRpb25zIiwidG9rZW4iLCJFcnJvciIsInJlc3QiLCJhcHBsaWNhdGlvbklkIiwiQmlnSW50IiwidmVyc2lvbiIsImJhc2VVcmwiLCJtYXhSZXRyeUNvdW50IiwiSW5maW5pdHkiLCJnbG9iYWxseVJhdGVMaW1pdGVkIiwicHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMiLCJxdWV1ZXMiLCJNYXAiLCJyYXRlTGltaXRlZFBhdGhzIiwiaW52YWxpZEJ1Y2tldCIsInJvdXRlcyIsIndlYmhvb2tzIiwiaWQiLCJ3ZWJob29rSWQiLCJtZXNzYWdlIiwibWVzc2FnZUlkIiwidXJsIiwidGhyZWFkSWQiLCJvcmlnaW5hbCIsIndlYmhvb2siLCJ3YWl0IiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJzZXNzaW9uSW5mbyIsImdhdGV3YXlCb3QiLCJjaGFubmVscyIsImRtIiwiY2hhbm5lbElkIiwiY2hhbm5lbCIsImZvbGxvdyIsImZvcnVtIiwiaW52aXRlcyIsIm1lc3NhZ2VzIiwib3ZlcndyaXRlIiwib3ZlcndyaXRlSWQiLCJjcm9zc3Bvc3QiLCJzdGFnZXMiLCJzdGFnZSIsInRocmVhZHMiLCJhbGwiLCJhY3RpdmUiLCJndWlsZElkIiwibWVtYmVycyIsIm1lIiwidXNlciIsInVzZXJJZCIsImFyY2hpdmVkIiwicHVibGljIiwiYmVmb3JlIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwibGltaXQiLCJwcml2YXRlIiwiam9pbmVkIiwidHlwaW5nIiwiZ3VpbGRzIiwiYXV0b21vZCIsInJ1bGUiLCJydWxlSWQiLCJydWxlcyIsImVtb2ppIiwiZW1vamlJZCIsImVtb2ppcyIsImV2ZW50cyIsIndpdGhVc2VyQ291bnQiLCJldmVudCIsImV2ZW50SWQiLCJ1c2VycyIsIndpdGhNZW1iZXIiLCJhZnRlciIsImludGVncmF0aW9uIiwiaW50ZWdyYXRpb25JZCIsImludGVncmF0aW9ucyIsImludml0ZSIsImludml0ZUNvZGUiLCJ3aXRoQ291bnRzIiwid2l0aEV4cGlyYXRpb24iLCJzY2hlZHVsZWRFdmVudElkIiwiYmFuIiwiYm90IiwibWVtYmVyIiwic2VhcmNoIiwicXVlcnkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJwcnVuZSIsImRheXMiLCJBcnJheSIsImlzQXJyYXkiLCJpbmNsdWRlUm9sZXMiLCJqb2luIiwidGVtcGxhdGVzIiwiY29kZSIsImd1aWxkIiwiaW50ZXJhY3Rpb25zIiwiY29tbWFuZHMiLCJvbmUiLCJjb21tYW5kSWQiLCJ3aXRoTG9jYWxpemF0aW9ucyIsInBlcm1pc3Npb25zIiwicGVybWlzc2lvbiIsImNvbW1hbmQiLCJyZXNwb25zZXMiLCJjYWxsYmFjayIsImludGVyYWN0aW9uSWQiLCJ1c2VyQm90Iiwib2F1dGgyQXBwbGljYXRpb24iLCJuaXRyb1N0aWNrZXJQYWNrcyIsImNoZWNrUmF0ZUxpbWl0cyIsInJhdGVsaW1pdGVkIiwiZ2V0IiwiZ2xvYmFsIiwibm93IiwicmVzZXRUaW1lc3RhbXAiLCJjcmVhdGVSZXF1ZXN0IiwiaGVhZGVycyIsInVuYXV0aG9yaXplZCIsImF1dGhvcml6YXRpb24iLCJrZXkiLCJ0b0xvd2VyQ2FzZSIsIm1ldGhvZCIsImJvZHkiLCJyZWFzb24iLCJpbmNsdWRlcyIsImZpbGUiLCJKU09OIiwic3RyaW5naWZ5IiwicHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMiLCJ2YWx1ZSIsImVudHJpZXMiLCJkZWxldGUiLCJzaXplIiwic2V0VGltZW91dCIsInByb2Nlc3NIZWFkZXJzIiwicmF0ZUxpbWl0ZWQiLCJyZW1haW5pbmciLCJyZXRyeUFmdGVyIiwicmVzZXQiLCJOdW1iZXIiLCJidWNrZXRJZCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJpbnRlcnZhbCIsIm1heCIsInNldCIsImdsb2JhbFJlc2V0Iiwic2VuZFJlcXVlc3QiLCJyZXNwb25zZSIsImZldGNoIiwic2ltcGxpZnlVcmwiLCJzdGF0dXMiLCJyZXRyeUNvdW50IiwicmVqZWN0Iiwib2siLCJlcnJvciIsInJlc2V0QWZ0ZXIiLCJyZXRyeVJlcXVlc3QiLCJyZXNvbHZlIiwianNvbiIsInJvdXRlIiwicmVwbGFjZSIsIm1hdGNoIiwicCIsInN1YnN0cmluZyIsImluZGV4T2YiLCJlbmRzV2l0aCIsInByb2Nlc3NSZXF1ZXN0IiwicmVxdWVzdCIsInBhcnRzIiwic3BsaXQiLCJzaGlmdCIsInN0YXJ0c1dpdGgiLCJxdWV1ZSIsIm1ha2VSZXF1ZXN0IiwiYnVja2V0UXVldWUiLCJQcm9taXNlIiwicG9zdCIsInBhdGNoIiwicHV0IiwiZGVsZXRlTWVzc2FnZSIsImVkaXQiLCJlZGl0TWVzc2FnZSIsInNlbmQiLCJzZW5kTWVzc2FnZSIsInB1Ymxpc2giLCJwdWJsaXNoTWVzc2FnZSIsImdldENoYW5uZWwiLCJjcmVhdGUiLCJjcmVhdGVDaGFubmVsIiwiZGVsZXRlQ2hhbm5lbCIsImVkaXRDaGFubmVsIiwic291cmNlQ2hhbm5lbElkIiwidGFyZ2V0Q2hhbm5lbElkIiwiZm9sbG93QW5ub3VuY2VtZW50IiwiZm9ydW1zIiwiY3JlYXRlRm9ydW1UaHJlYWQiLCJlZGl0Q2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZXMiLCJkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlIiwicG9zaXRpb25zIiwiY2hhbm5lbFBvc2l0aW9ucyIsImVkaXRDaGFubmVsUG9zaXRpb25zIiwiZ2V0Q2hhbm5lbEludml0ZXMiLCJjcmVhdGVTdGFnZUluc3RhbmNlIiwiZGVsZXRlU3RhZ2VJbnN0YW5jZSIsImRhdGEiLCJlZGl0U3RhZ2VJbnN0YW5jZSIsImdldFN0YWdlSW5zdGFuY2UiLCJ3aXRoIiwic3RhcnRUaHJlYWRXaXRoTWVzc2FnZSIsIndpdGhvdXQiLCJzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlIiwiZ2V0QWN0aXZlVGhyZWFkcyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzIiwiZ2V0UHVibGljQXJjaGl2ZWRUaHJlYWRzIiwiZ2V0VGhyZWFkTWVtYmVyIiwiZ2V0VGhyZWFkTWVtYmVycyIsImpvaW5UaHJlYWQiLCJsZWF2ZSIsImxlYXZlVGhyZWFkIiwia2ljayIsInJlbW92ZVRocmVhZE1lbWJlciIsInRyaWdnZXJUeXBpbmdJbmRpY2F0b3IiLCJjcmVhdGVFbW9qaSIsImRlbGV0ZUVtb2ppIiwiZWRpdEVtb2ppIiwiZ2V0RW1vamkiLCJjcmVhdGVBdXRvbW9kUnVsZSIsImRlbGV0ZUF1dG9tb2RSdWxlIiwiZWRpdEF1dG9tb2RSdWxlIiwiZ2V0QXV0b21vZFJ1bGUiLCJnZXRBdXRvbW9kUnVsZXMiLCJnZXRDaGFubmVscyIsImdldEVtb2ppcyIsImNyZWF0ZVNjaGVkdWxlZEV2ZW50IiwiZGVsZXRlU2NoZWR1bGVkRXZlbnQiLCJlZGl0U2NoZWR1bGVkRXZlbnQiLCJnZXRTY2hlZHVsZWRFdmVudCIsImdldFNjaGVkdWxlZEV2ZW50cyIsImdldFNjaGVkdWxlZEV2ZW50VXNlcnMiLCJnZXRJbnRlZ3JhdGlvbnMiLCJkZWxldGVJbnRlZ3JhdGlvbiIsImNyZWF0ZUludml0ZSIsImRlbGV0ZUludml0ZSIsImdldEludml0ZSIsImxpc3QiLCJnZXRJbnZpdGVzIiwiY3JlYXRlR3VpbGRUZW1wbGF0ZSIsInRlbXBsYXRlQ29kZSIsImRlbGV0ZUd1aWxkVGVtcGxhdGUiLCJlZGl0R3VpbGRUZW1wbGF0ZSIsImdldEd1aWxkVGVtcGxhdGUiLCJnZXRHdWlsZFRlbXBsYXRlcyIsInN5bmMiLCJzeW5jR3VpbGRUZW1wbGF0ZSIsImJhbk1lbWJlciIsImVkaXRNZW1iZXIiLCJlZGl0U2VsZiIsImVkaXRCb3RNZW1iZXIiLCJnZXRNZW1iZXIiLCJnZXREbUNoYW5uZWwiLCJraWNrTWVtYmVyIiwiZ2V0TWVtYmVycyIsInBydW5lTWVtYmVycyIsInNlYXJjaE1lbWJlcnMiLCJ1bmJhbiIsInVuYmFuTWVtYmVyIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY3JlYXRlR3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJkZWxldGVHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImVkaXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQiLCJiZWFyZXJUb2tlbiIsImVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24iLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsInVwc2VydEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJ1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMiLCJmb2xsb3d1cCIsInNlbmRGb2xsb3d1cE1lc3NhZ2UiLCJzZW5kSW50ZXJhY3Rpb25SZXNwb25zZSIsImRlbGV0ZUZvbGxvd3VwTWVzc2FnZSIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZ2V0Rm9sbG93dXBNZXNzYWdlIiwiZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiY3JlYXRlV2ViaG9vayIsImRlbGV0ZVdlYmhvb2siLCJkZWxldGVXZWJob29rV2l0aFRva2VuIiwiZWRpdFdlYmhvb2siLCJlZGl0V2ViaG9va1dpdGhUb2tlbiIsImV4ZWN1dGUiLCJleGVjdXRlV2ViaG9vayIsImdldENoYW5uZWxXZWJob29rcyIsImdldEd1aWxkV2ViaG9va3MiLCJnZXRXZWJob29rTWVzc2FnZSIsImdldFdlYmhvb2siLCJnZXRXZWJob29rV2l0aFRva2VuIiwiZGVsZXRlV2ViaG9va01lc3NhZ2UiLCJPYmplY3QiLCJhc3NpZ24iLCJlZGl0V2ViaG9va01lc3NhZ2UiLCJlZGl0T3JpZ2luYWxXZWJob29rTWVzc2FnZSIsImFkZFRocmVhZE1lbWJlciIsIm5hbWUiLCJhdmF0YXIiLCJlZGl0Qm90UHJvZmlsZSIsImJvdEF2YXRhclVSTCIsInVzZXJuYW1lIiwidHJpbSIsInR5cGUiLCJVcGRhdGVNZXNzYWdlIiwidG9waWMiLCJ3ZWJob29rX2NoYW5uZWxfaWQiLCJnZXRBcHBsaWNhdGlvbkluZm8iLCJyZWNpcGllbnRfaWQiLCJnZXRHYXRld2F5Qm90IiwiZ2V0Tml0cm9TdGlja2VyUGFja3MiLCJnZXRTZXNzaW9uSW5mbyIsImdldFVzZXIiLCJBdXRob3JpemF0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFTQSw0QkFBQUEsQ0FBd0IsS0FBUSxtQkFBbUIsQUFDNUQsUUFBU0MsWUFBQUEsQ0FBUSxDQUFFQyxTQUFBQSxDQUFLLENBQUVDLHFCQUFBQSxDQUFpQixDQUFFQyxlQUFBQSxDQUFXLEtBQVEsbUJBQW1CLEFBRW5GLFFBQVNDLDhCQUFBQSxDQUEwQixLQUFRLG9CQUFvQixBQUMvRCxRQUFTQyxTQUFBQSxDQUFLLEtBQVEsWUFBWSxBQXlFbEMsUUFBTyxTQUFTQyxrQkFBa0JDLENBQWlDLENBQWUsQ0FFaEYsR0FBSSxDQUFDQSxFQUFRQyxLQUFLLENBQUUsTUFBTSxBQUFJQyxNQUFNLGtDQUFrQyxDQUV0RSxJQUFNQyxFQUFvQixDQUN4QkYsTUFBT0QsRUFBUUMsS0FBSyxDQUNwQkcsY0FBZUosRUFBUUksYUFBYSxDQUFHQyxPQUFPTCxFQUFRSSxhQUFhLEVBQUlULEVBQWtCSyxFQUFRQyxLQUFLLENBQUMsQ0FDdkdLLFFBQVNOLEVBQVFNLE9BQU8sRUFBSSxHQUM1QkMsUUFBU1As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
1
+ /* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable no-const-assign */ import { calculateBits, camelToSnakeCase, camelize, delay, getBotIdFromToken, logger, processReactionString, urlToBase64, snakelize } from '@discordeno/utils';
2
+ import { createInvalidRequestBucket } from './invalidBucket.js';
3
+ import { Queue } from './queue.js';
4
+ import { InteractionResponseTypes } from '@discordeno/types';
5
+ import { createRoutes } from './routes.js';
6
+ // TODO: make dynamic based on package.json file
7
+ const version = '19.0.0-alpha.1';
8
+ export const DISCORD_API_VERSION = 10;
9
+ export const DISCORD_API_URL = 'https://discord.com/api';
10
+ export const AUDIT_LOG_REASON_HEADER = 'x-audit-log-reason';
11
+ export const RATE_LIMIT_REMAINING_HEADER = 'x-ratelimit-remaining';
12
+ export const RATE_LIMIT_RESET_AFTER_HEADER = 'x-ratelimit-reset-after';
13
+ export const RATE_LIMIT_GLOBAL_HEADER = 'x-ratelimit-global';
14
+ export const RATE_LIMIT_BUCKET_HEADER = 'x-ratelimit-bucket';
15
+ export const RATE_LIMIT_LIMIT_HEADER = 'x-ratelimit-limit';
16
+ export const RATE_LIMIT_SCOPE_HEADER = 'x-ratelimit-scope';
17
+ export function createRestManager(options) {
18
+ const applicationId = options.applicationId ? BigInt(options.applicationId) : options.token ? getBotIdFromToken(options.token) : undefined;
19
+ if (!applicationId) {
20
+ throw new Error('`applicationId` was not provided and was not able to extract the id from the bots token. Please explicitly pass `applicationId` to the rest manager.');
21
+ }
22
+ const baseUrl = options.proxy?.baseUrl ?? DISCORD_API_URL;
23
+ const rest = {
24
+ applicationId,
25
+ authorization: options.proxy?.authorization,
26
+ baseUrl,
27
+ deleteQueueDelay: 60000,
28
+ globallyRateLimited: false,
29
+ invalidBucket: createInvalidRequestBucket({}),
30
+ isProxied: !baseUrl.startsWith(DISCORD_API_URL),
31
+ maxRetryCount: Infinity,
32
+ processingRateLimitedPaths: false,
33
+ queues: new Map(),
34
+ rateLimitedPaths: new Map(),
35
+ token: options.token,
36
+ version: options.version ?? DISCORD_API_VERSION,
37
+ routes: createRoutes(),
38
+ checkRateLimits (url) {
39
+ const ratelimited = rest.rateLimitedPaths.get(url);
40
+ const global = rest.rateLimitedPaths.get('global');
41
+ const now = Date.now();
42
+ if (ratelimited && now < ratelimited.resetTimestamp) {
43
+ return ratelimited.resetTimestamp - now;
44
+ }
45
+ if (global && now < global.resetTimestamp) {
46
+ return global.resetTimestamp - now;
47
+ }
48
+ return false;
49
+ },
50
+ changeToDiscordFormat (obj) {
51
+ if (obj === null) return null;
52
+ if (typeof obj === 'object') {
53
+ if (Array.isArray(obj)) {
54
+ return obj.map((item)=>rest.changeToDiscordFormat(item));
55
+ }
56
+ const newObj = {};
57
+ for (const key of Object.keys(obj)){
58
+ const value = obj[key];
59
+ // Some falsy values should be allowed like null or 0
60
+ if (value !== undefined) {
61
+ switch(key){
62
+ case 'permissions':
63
+ case 'allow':
64
+ case 'deny':
65
+ newObj[key] = typeof value === 'string' ? value : calculateBits(value);
66
+ continue;
67
+ case 'defaultMemberPermissions':
68
+ newObj.default_member_permissions = typeof value === 'string' ? value : calculateBits(value);
69
+ continue;
70
+ case 'nameLocalizations':
71
+ newObj.name_localizations = value;
72
+ continue;
73
+ case 'descriptionLocalizations':
74
+ newObj.description_localizations = value;
75
+ continue;
76
+ }
77
+ }
78
+ newObj[camelToSnakeCase(key)] = rest.changeToDiscordFormat(value);
79
+ }
80
+ return newObj;
81
+ }
82
+ if (typeof obj === 'bigint') return obj.toString();
83
+ return obj;
84
+ },
85
+ createRequestBody (method, options) {
86
+ const headers = {
87
+ 'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
88
+ };
89
+ if (options?.unauthorized !== false) headers.authorization = `Bot ${rest.token}`;
90
+ // IF A REASON IS PROVIDED ENCODE IT IN HEADERS
91
+ if (options?.reason !== undefined) {
92
+ headers[AUDIT_LOG_REASON_HEADER] = encodeURIComponent(options?.reason);
93
+ }
94
+ let body;
95
+ // TODO: check if we need to add specific check for GET method
96
+ // Since GET does not allow bodies
97
+ // Have to check for attachments first, since body then has to be send in a different way.
98
+ if (options?.files !== undefined) {
99
+ const form = new FormData();
100
+ for(let i = 0; i < options.files.length; ++i){
101
+ form.append(`file${i}`, options.files[i].blob, options.files[i].name);
102
+ }
103
+ form.append('payload_json', JSON.stringify(snakelize({
104
+ ...options.body,
105
+ files: undefined
106
+ })));
107
+ body = form;
108
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
109
+ } else if (options?.body !== undefined) {
110
+ if (options.body instanceof FormData) {
111
+ body = options.body;
112
+ // No need to set the `content-type` header since `fetch` does that automatically for us when we use a `FormData` object.
113
+ } else {
114
+ body = JSON.stringify(rest.changeToDiscordFormat(options.body));
115
+ headers['content-type'] = `application/json`;
116
+ }
117
+ }
118
+ // SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
119
+ if (options?.headers) {
120
+ Object.assign(headers, options.headers);
121
+ }
122
+ return {
123
+ body,
124
+ headers,
125
+ method
126
+ };
127
+ },
128
+ processRateLimitedPaths () {
129
+ const now = Date.now();
130
+ for (const [key, value] of rest.rateLimitedPaths.entries()){
131
+ // rest.debug(
132
+ // `[REST - processRateLimitedPaths] Running for of loop. ${
133
+ // value.resetTimestamp - now
134
+ // }`
135
+ // )
136
+ // If the time has not reached cancel
137
+ if (value.resetTimestamp > now) continue;
138
+ // Rate limit is over, delete the rate limiter
139
+ rest.rateLimitedPaths.delete(key);
140
+ // If it was global, also mark the global value as false
141
+ if (key === 'global') rest.globallyRateLimited = false;
142
+ }
143
+ // ALL PATHS ARE CLEARED CAN CANCEL OUT!
144
+ if (rest.rateLimitedPaths.size === 0) {
145
+ rest.processingRateLimitedPaths = false;
146
+ } else {
147
+ rest.processingRateLimitedPaths = true;
148
+ // RECHECK IN 1 SECOND
149
+ setTimeout(()=>{
150
+ // rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
151
+ rest.processRateLimitedPaths();
152
+ }, 1000);
153
+ }
154
+ },
155
+ /** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers) {
156
+ let rateLimited = false;
157
+ // GET ALL NECESSARY HEADERS
158
+ const remaining = headers.get(RATE_LIMIT_REMAINING_HEADER);
159
+ const retryAfter = headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
160
+ const reset = Date.now() + Number(retryAfter) * 1000;
161
+ const global = headers.get(RATE_LIMIT_GLOBAL_HEADER);
162
+ // undefined override null needed for typings
163
+ const bucketId = headers.get(RATE_LIMIT_BUCKET_HEADER) ?? undefined;
164
+ const limit = headers.get(RATE_LIMIT_LIMIT_HEADER);
165
+ rest.queues.get(url)?.handleCompletedRequest({
166
+ remaining: remaining ? Number(remaining) : undefined,
167
+ interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
168
+ max: limit ? Number(limit) : undefined
169
+ });
170
+ // IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
171
+ if (remaining === '0') {
172
+ rateLimited = true;
173
+ // SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
174
+ rest.rateLimitedPaths.set(url, {
175
+ url,
176
+ resetTimestamp: reset,
177
+ bucketId
178
+ });
179
+ // SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
180
+ if (bucketId) {
181
+ rest.rateLimitedPaths.set(bucketId, {
182
+ url,
183
+ resetTimestamp: reset,
184
+ bucketId
185
+ });
186
+ }
187
+ }
188
+ // IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
189
+ if (global) {
190
+ const retryAfter = headers.get('retry-after');
191
+ const globalReset = Date.now() + Number(retryAfter) * 1000;
192
+ // rest.debug(
193
+ // `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
194
+ // )
195
+ rest.globallyRateLimited = true;
196
+ rateLimited = true;
197
+ setTimeout(()=>{
198
+ rest.globallyRateLimited = false;
199
+ }, globalReset);
200
+ rest.rateLimitedPaths.set('global', {
201
+ url: 'global',
202
+ resetTimestamp: globalReset,
203
+ bucketId
204
+ });
205
+ if (bucketId) {
206
+ rest.rateLimitedPaths.set(bucketId, {
207
+ url: 'global',
208
+ resetTimestamp: globalReset,
209
+ bucketId
210
+ });
211
+ }
212
+ }
213
+ if (rateLimited && !rest.processingRateLimitedPaths) {
214
+ rest.processRateLimitedPaths();
215
+ }
216
+ return rateLimited ? bucketId : undefined;
217
+ },
218
+ async sendRequest (options) {
219
+ const url = `${rest.baseUrl}/v${rest.version}${options.route}`;
220
+ const payload = rest.createRequestBody(options.method, options.requestBodyOptions);
221
+ logger.debug(`sending request to ${url}`, 'with payload:', {
222
+ ...payload,
223
+ headers: {
224
+ ...payload.headers,
225
+ authorization: 'Bot tokenhere'
226
+ }
227
+ });
228
+ const response = await fetch(url, payload).catch(async (error)=>{
229
+ logger.error(error);
230
+ // Mark request and completed
231
+ rest.invalidBucket.handleCompletedRequest(999, false);
232
+ options.reject({
233
+ ok: false,
234
+ status: 999,
235
+ error: 'Possible network or request shape issue occurred. If this is rare, its a network glitch. If it occurs a lot something is wrong.'
236
+ });
237
+ throw error;
238
+ });
239
+ logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
240
+ // Mark request and completed
241
+ rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get(RATE_LIMIT_SCOPE_HEADER) === 'shared');
242
+ // Set the bucket id if it was available on the headers
243
+ const bucketId = rest.processHeaders(rest.simplifyUrl(options.route, options.method), response.headers);
244
+ if (bucketId) options.bucketId = bucketId;
245
+ if (response.status < 200 || response.status >= 400) {
246
+ logger.debug(`Request to ${url} failed.`);
247
+ if (response.status !== 429) {
248
+ options.reject({
249
+ ok: false,
250
+ status: response.status,
251
+ body: await response.text()
252
+ });
253
+ return;
254
+ }
255
+ logger.debug(`Request to ${url} was ratelimited.`);
256
+ // Too many attempts, get rid of request from queue.
257
+ if (options.retryCount >= rest.maxRetryCount) {
258
+ logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
259
+ // rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
260
+ options.reject({
261
+ ok: false,
262
+ status: response.status,
263
+ error: 'The request was rate limited and it maxed out the retries limit.'
264
+ });
265
+ return;
266
+ }
267
+ options.retryCount += 1;
268
+ const resetAfter = response.headers.get(RATE_LIMIT_RESET_AFTER_HEADER);
269
+ if (resetAfter) await delay(Number(resetAfter) * 1000);
270
+ // process the response to prevent mem leak
271
+ await response.arrayBuffer();
272
+ return await options.retryRequest?.(options);
273
+ }
274
+ // Discord sometimes sends no response with no content.
275
+ options.resolve({
276
+ ok: true,
277
+ status: response.status,
278
+ body: response.status === 204 ? undefined : await response.text()
279
+ });
280
+ },
281
+ simplifyUrl (url, method) {
282
+ const parts = url.split('/');
283
+ const secondLastPart = parts[parts.length - 2];
284
+ if (secondLastPart === 'channels' || secondLastPart === 'guilds') {
285
+ return url;
286
+ }
287
+ if (secondLastPart === 'reactions' || parts[parts.length - 1] === '@me') {
288
+ parts.splice(-2);
289
+ parts.push('reactions');
290
+ } else {
291
+ parts.splice(-1);
292
+ parts.push('x');
293
+ }
294
+ if (parts[parts.length - 3] === 'reactions') {
295
+ parts.splice(-2);
296
+ }
297
+ if (method === 'DELETE' && secondLastPart === 'messages') {
298
+ return `D${parts.join('/')}`;
299
+ }
300
+ return parts.join('/');
301
+ },
302
+ async processRequest (request) {
303
+ const url = rest.simplifyUrl(request.route, request.method);
304
+ if (request.runThroughQueue === false) {
305
+ await rest.sendRequest(request);
306
+ return;
307
+ }
308
+ const queue = rest.queues.get(url);
309
+ if (queue !== undefined) {
310
+ queue.makeRequest(request);
311
+ } else {
312
+ // CREATES A NEW QUEUE
313
+ const bucketQueue = new Queue(rest, {
314
+ url,
315
+ deleteQueueDelay: rest.deleteQueueDelay
316
+ });
317
+ // Add request to queue
318
+ bucketQueue.makeRequest(request);
319
+ // Save queue
320
+ rest.queues.set(url, bucketQueue);
321
+ }
322
+ },
323
+ async makeRequest (method, route, options) {
324
+ if (rest.isProxied) {
325
+ if (rest.authorization !== undefined) {
326
+ options ??= {};
327
+ options.headers ??= {};
328
+ options.headers.authorization = rest.authorization;
329
+ }
330
+ const result = await fetch(`${rest.baseUrl}/v${rest.version}${route}`, rest.createRequestBody(method, options));
331
+ if (!result.ok) {
332
+ const err = await result.json().catch(()=>{});
333
+ // Legacy Handling to not break old code or when body is missing
334
+ if (!err?.body) throw new Error(`Error: ${err.message ?? result.statusText}`);
335
+ throw new Error(JSON.stringify(err));
336
+ }
337
+ return result.status !== 204 ? await result.json() : undefined;
338
+ }
339
+ // eslint-disable-next-line no-async-promise-executor
340
+ return await new Promise(async (resolve, reject)=>{
341
+ const payload = {
342
+ route,
343
+ method,
344
+ requestBodyOptions: options,
345
+ retryCount: 0,
346
+ retryRequest: async function(payload) {
347
+ await rest.processRequest(payload);
348
+ },
349
+ resolve: (data)=>{
350
+ resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined);
351
+ },
352
+ reject,
353
+ runThroughQueue: options?.runThroughQueue
354
+ };
355
+ await rest.processRequest(payload);
356
+ });
357
+ },
358
+ async get (url, options) {
359
+ return camelize(await rest.makeRequest('GET', url, options));
360
+ },
361
+ async post (url, options) {
362
+ return camelize(await rest.makeRequest('POST', url, options));
363
+ },
364
+ async delete (url, options) {
365
+ camelize(await rest.makeRequest('DELETE', url, options));
366
+ },
367
+ async patch (url, options) {
368
+ return camelize(await rest.makeRequest('PATCH', url, options));
369
+ },
370
+ async put (url, options) {
371
+ return camelize(await rest.makeRequest('PUT', url, options));
372
+ },
373
+ async addReaction (channelId, messageId, reaction) {
374
+ reaction = processReactionString(reaction);
375
+ await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
376
+ },
377
+ async addReactions (channelId, messageId, reactions, ordered = false) {
378
+ if (!ordered) {
379
+ await Promise.all(reactions.map(async (reaction)=>{
380
+ await rest.addReaction(channelId, messageId, reaction);
381
+ }));
382
+ return;
383
+ }
384
+ for (const reaction of reactions){
385
+ await rest.addReaction(channelId, messageId, reaction);
386
+ }
387
+ },
388
+ async addRole (guildId, userId, roleId, reason) {
389
+ await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
390
+ reason
391
+ });
392
+ },
393
+ async addThreadMember (channelId, userId) {
394
+ await rest.put(rest.routes.channels.threads.user(channelId, userId));
395
+ },
396
+ async createAutomodRule (guildId, body, reason) {
397
+ return await rest.post(rest.routes.guilds.automod.rules(guildId), {
398
+ body,
399
+ reason
400
+ });
401
+ },
402
+ async createChannel (guildId, body, reason) {
403
+ return await rest.post(rest.routes.guilds.channels(guildId), {
404
+ body,
405
+ reason
406
+ });
407
+ },
408
+ async createEmoji (guildId, body, reason) {
409
+ return await rest.post(rest.routes.guilds.emojis(guildId), {
410
+ body,
411
+ reason
412
+ });
413
+ },
414
+ async createGlobalApplicationCommand (body) {
415
+ return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), {
416
+ body
417
+ });
418
+ },
419
+ async createGuild (body) {
420
+ return await rest.post(rest.routes.guilds.all(), {
421
+ body
422
+ });
423
+ },
424
+ async createGuildApplicationCommand (body, guildId) {
425
+ return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), {
426
+ body
427
+ });
428
+ },
429
+ async createGuildFromTemplate (templateCode, body) {
430
+ if (body.icon) {
431
+ body.icon = await urlToBase64(body.icon);
432
+ }
433
+ return await rest.post(rest.routes.guilds.templates.code(templateCode), {
434
+ body
435
+ });
436
+ },
437
+ async createGuildSticker (guildId, options, reason) {
438
+ const form = new FormData();
439
+ form.append('file', options.file.blob, options.file.name);
440
+ form.append('name', options.name);
441
+ form.append('description', options.description);
442
+ form.append('tags', options.tags);
443
+ return await rest.post(rest.routes.guilds.stickers(guildId), {
444
+ body: form,
445
+ reason
446
+ });
447
+ },
448
+ async createGuildTemplate (guildId, body) {
449
+ return await rest.post(rest.routes.guilds.templates.all(guildId), {
450
+ body
451
+ });
452
+ },
453
+ async createForumThread (channelId, body, reason) {
454
+ return await rest.post(rest.routes.channels.forum(channelId), {
455
+ body,
456
+ files: body.files,
457
+ reason
458
+ });
459
+ },
460
+ async createInvite (channelId, body = {}, reason) {
461
+ return await rest.post(rest.routes.channels.invites(channelId), {
462
+ body,
463
+ reason
464
+ });
465
+ },
466
+ async createRole (guildId, body, reason) {
467
+ return await rest.post(rest.routes.guilds.roles.all(guildId), {
468
+ body,
469
+ reason
470
+ });
471
+ },
472
+ async createScheduledEvent (guildId, body, reason) {
473
+ return await rest.post(rest.routes.guilds.events.events(guildId), {
474
+ body,
475
+ reason
476
+ });
477
+ },
478
+ async createStageInstance (body, reason) {
479
+ return await rest.post(rest.routes.channels.stages(), {
480
+ body,
481
+ reason
482
+ });
483
+ },
484
+ async createWebhook (channelId, options, reason) {
485
+ return await rest.post(rest.routes.channels.webhooks(channelId), {
486
+ body: {
487
+ name: options.name,
488
+ avatar: options.avatar ? await urlToBase64(options.avatar) : undefined
489
+ },
490
+ reason
491
+ });
492
+ },
493
+ async deleteAutomodRule (guildId, ruleId, reason) {
494
+ await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
495
+ reason
496
+ });
497
+ },
498
+ async deleteChannel (channelId, reason) {
499
+ await rest.delete(rest.routes.channels.channel(channelId), {
500
+ reason
501
+ });
502
+ },
503
+ async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
504
+ await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), {
505
+ reason
506
+ });
507
+ },
508
+ async deleteEmoji (guildId, id, reason) {
509
+ await rest.delete(rest.routes.guilds.emoji(guildId, id), {
510
+ reason
511
+ });
512
+ },
513
+ async deleteFollowupMessage (token, messageId) {
514
+ await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
515
+ unauthorized: true
516
+ });
517
+ },
518
+ async deleteGlobalApplicationCommand (commandId) {
519
+ await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
520
+ },
521
+ async deleteGuild (guildId) {
522
+ await rest.delete(rest.routes.guilds.guild(guildId));
523
+ },
524
+ async deleteGuildApplicationCommand (commandId, guildId) {
525
+ await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
526
+ },
527
+ async deleteGuildSticker (guildId, stickerId, reason) {
528
+ await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), {
529
+ reason
530
+ });
531
+ },
532
+ async deleteGuildTemplate (guildId, templateCode) {
533
+ await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
534
+ },
535
+ async deleteIntegration (guildId, integrationId, reason) {
536
+ await rest.delete(rest.routes.guilds.integration(guildId, integrationId), {
537
+ reason
538
+ });
539
+ },
540
+ async deleteInvite (inviteCode, reason) {
541
+ await rest.delete(rest.routes.guilds.invite(inviteCode), {
542
+ reason
543
+ });
544
+ },
545
+ async deleteMessage (channelId, messageId, reason) {
546
+ await rest.delete(rest.routes.channels.message(channelId, messageId), {
547
+ reason
548
+ });
549
+ },
550
+ async deleteMessages (channelId, messageIds, reason) {
551
+ await rest.post(rest.routes.channels.bulk(channelId), {
552
+ body: {
553
+ messages: messageIds.slice(0, 100).map((id)=>id.toString())
554
+ },
555
+ reason
556
+ });
557
+ },
558
+ async deleteOriginalInteractionResponse (token) {
559
+ await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token), {
560
+ unauthorized: true
561
+ });
562
+ },
563
+ async deleteOwnReaction (channelId, messageId, reaction) {
564
+ reaction = processReactionString(reaction);
565
+ await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
566
+ },
567
+ async deleteReactionsAll (channelId, messageId) {
568
+ await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
569
+ },
570
+ async deleteReactionsEmoji (channelId, messageId, reaction) {
571
+ reaction = processReactionString(reaction);
572
+ await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
573
+ },
574
+ async deleteRole (guildId, roleId, reason) {
575
+ await rest.delete(rest.routes.guilds.roles.one(guildId, roleId), {
576
+ reason
577
+ });
578
+ },
579
+ async deleteScheduledEvent (guildId, eventId) {
580
+ await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
581
+ },
582
+ async deleteStageInstance (channelId, reason) {
583
+ await rest.delete(rest.routes.channels.stage(channelId), {
584
+ reason
585
+ });
586
+ },
587
+ async deleteUserReaction (channelId, messageId, userId, reaction) {
588
+ reaction = processReactionString(reaction);
589
+ await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
590
+ },
591
+ async deleteWebhook (webhookId, reason) {
592
+ await rest.delete(rest.routes.webhooks.id(webhookId), {
593
+ reason
594
+ });
595
+ },
596
+ async deleteWebhookMessage (webhookId, token, messageId, options) {
597
+ await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
598
+ },
599
+ async deleteWebhookWithToken (webhookId, token) {
600
+ await rest.delete(rest.routes.webhooks.webhook(webhookId, token));
601
+ },
602
+ async editApplicationCommandPermissions (guildId, commandId, bearerToken, permissions) {
603
+ return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
604
+ body: {
605
+ permissions
606
+ },
607
+ headers: {
608
+ authorization: `Bearer ${bearerToken}`
609
+ }
610
+ });
611
+ },
612
+ async editAutomodRule (guildId, ruleId, body, reason) {
613
+ return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), {
614
+ body,
615
+ reason
616
+ });
617
+ },
618
+ async editBotProfile (options) {
619
+ const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
620
+ return await rest.patch(rest.routes.userBot(), {
621
+ body: {
622
+ username: options.username?.trim(),
623
+ avatar
624
+ }
625
+ });
626
+ },
627
+ async editChannel (channelId, body, reason) {
628
+ return await rest.patch(rest.routes.channels.channel(channelId), {
629
+ body,
630
+ reason
631
+ });
632
+ },
633
+ async editChannelPermissionOverrides (channelId, body, reason) {
634
+ await rest.put(rest.routes.channels.overwrite(channelId, body.id), {
635
+ body,
636
+ reason
637
+ });
638
+ },
639
+ async editChannelPositions (guildId, body) {
640
+ await rest.patch(rest.routes.guilds.channels(guildId), {
641
+ body
642
+ });
643
+ },
644
+ async editEmoji (guildId, id, body, reason) {
645
+ return await rest.patch(rest.routes.guilds.emoji(guildId, id), {
646
+ body,
647
+ reason
648
+ });
649
+ },
650
+ async editFollowupMessage (token, messageId, body) {
651
+ return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
652
+ body,
653
+ files: body.files,
654
+ unauthorized: true
655
+ });
656
+ },
657
+ async editGlobalApplicationCommand (commandId, body) {
658
+ return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), {
659
+ body
660
+ });
661
+ },
662
+ async editGuild (guildId, body, reason) {
663
+ return await rest.patch(rest.routes.guilds.guild(guildId), {
664
+ body,
665
+ reason
666
+ });
667
+ },
668
+ async editGuildApplicationCommand (commandId, guildId, body) {
669
+ return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), {
670
+ body
671
+ });
672
+ },
673
+ async editGuildMfaLevel (guildId, mfaLevel, reason) {
674
+ await rest.post(rest.routes.guilds.mfa(guildId), {
675
+ body: {
676
+ level: mfaLevel
677
+ },
678
+ reason
679
+ });
680
+ },
681
+ async editGuildSticker (guildId, stickerId, body, reason) {
682
+ return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), {
683
+ body,
684
+ reason
685
+ });
686
+ },
687
+ async editGuildTemplate (guildId, templateCode, body) {
688
+ return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), {
689
+ body
690
+ });
691
+ },
692
+ async editMessage (channelId, messageId, body) {
693
+ return await rest.patch(rest.routes.channels.message(channelId, messageId), {
694
+ body,
695
+ files: body.files
696
+ });
697
+ },
698
+ async editOriginalInteractionResponse (token, body) {
699
+ return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), {
700
+ body,
701
+ files: body.files
702
+ });
703
+ },
704
+ async editOriginalWebhookMessage (webhookId, token, options) {
705
+ return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
706
+ body: {
707
+ type: InteractionResponseTypes.UpdateMessage,
708
+ data: options
709
+ },
710
+ files: options.files,
711
+ unauthorized: true
712
+ });
713
+ },
714
+ async editOwnVoiceState (guildId, options) {
715
+ await rest.patch(rest.routes.guilds.voice(guildId), {
716
+ body: {
717
+ ...options,
718
+ request_to_speak_timestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
719
+ }
720
+ });
721
+ },
722
+ async editScheduledEvent (guildId, eventId, body, reason) {
723
+ return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), {
724
+ body,
725
+ reason
726
+ });
727
+ },
728
+ async editRole (guildId, roleId, body, reason) {
729
+ return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), {
730
+ body,
731
+ reason
732
+ });
733
+ },
734
+ async editRolePositions (guildId, body, reason) {
735
+ return await rest.patch(rest.routes.guilds.roles.all(guildId), {
736
+ body,
737
+ reason
738
+ });
739
+ },
740
+ async editStageInstance (channelId, topic, reason) {
741
+ return await rest.patch(rest.routes.channels.stage(channelId), {
742
+ body: {
743
+ topic
744
+ },
745
+ reason
746
+ });
747
+ },
748
+ async editUserVoiceState (guildId, options) {
749
+ await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
750
+ body: options
751
+ });
752
+ },
753
+ async editWebhook (webhookId, body, reason) {
754
+ return await rest.patch(rest.routes.webhooks.id(webhookId), {
755
+ body,
756
+ reason
757
+ });
758
+ },
759
+ async editWebhookMessage (webhookId, token, messageId, options) {
760
+ return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), {
761
+ body: options,
762
+ files: options.files
763
+ });
764
+ },
765
+ async editWebhookWithToken (webhookId, token, body) {
766
+ return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), {
767
+ body
768
+ });
769
+ },
770
+ async editWelcomeScreen (guildId, body, reason) {
771
+ return await rest.patch(rest.routes.guilds.welcome(guildId), {
772
+ body,
773
+ reason
774
+ });
775
+ },
776
+ async editWidgetSettings (guildId, body, reason) {
777
+ return await rest.patch(rest.routes.guilds.widget(guildId), {
778
+ body,
779
+ reason
780
+ });
781
+ },
782
+ async executeWebhook (webhookId, token, options) {
783
+ return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), {
784
+ body: options
785
+ });
786
+ },
787
+ async followAnnouncement (sourceChannelId, targetChannelId) {
788
+ return await rest.post(rest.routes.channels.follow(sourceChannelId), {
789
+ body: {
790
+ webhook_channel_id: targetChannelId
791
+ }
792
+ });
793
+ },
794
+ async getActiveThreads (guildId) {
795
+ return await rest.get(rest.routes.channels.threads.active(guildId));
796
+ },
797
+ async getApplicationCommandPermission (guildId, commandId) {
798
+ return await rest.get(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId));
799
+ },
800
+ async getApplicationCommandPermissions (guildId) {
801
+ return await rest.get(rest.routes.interactions.commands.permissions(rest.applicationId, guildId));
802
+ },
803
+ async getApplicationInfo () {
804
+ return await rest.get(rest.routes.oauth2Application());
805
+ },
806
+ async getAuditLog (guildId, options) {
807
+ return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
808
+ },
809
+ async getAutomodRule (guildId, ruleId) {
810
+ return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
811
+ },
812
+ async getAutomodRules (guildId) {
813
+ return await rest.get(rest.routes.guilds.automod.rules(guildId));
814
+ },
815
+ async getAvailableVoiceRegions () {
816
+ return await rest.get(rest.routes.regions());
817
+ },
818
+ async getBan (guildId, userId) {
819
+ return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
820
+ },
821
+ async getBans (guildId, options) {
822
+ return await rest.get(rest.routes.guilds.members.bans(guildId, options));
823
+ },
824
+ async getChannel (id) {
825
+ return await rest.get(rest.routes.channels.channel(id));
826
+ },
827
+ async getChannelInvites (channelId) {
828
+ return await rest.get(rest.routes.channels.invites(channelId));
829
+ },
830
+ async getChannels (guildId) {
831
+ return await rest.get(rest.routes.guilds.channels(guildId));
832
+ },
833
+ async getChannelWebhooks (channelId) {
834
+ return await rest.get(rest.routes.channels.webhooks(channelId));
835
+ },
836
+ async getDmChannel (userId) {
837
+ return await rest.post(rest.routes.channels.dm(), {
838
+ body: {
839
+ recipient_id: userId
840
+ }
841
+ });
842
+ },
843
+ async getEmoji (guildId, emojiId) {
844
+ return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
845
+ },
846
+ async getEmojis (guildId) {
847
+ return await rest.get(rest.routes.guilds.emojis(guildId));
848
+ },
849
+ async getFollowupMessage (token, messageId) {
850
+ return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), {
851
+ unauthorized: true
852
+ });
853
+ },
854
+ async getGatewayBot () {
855
+ return await rest.get(rest.routes.gatewayBot());
856
+ },
857
+ async getGlobalApplicationCommand (commandId) {
858
+ return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
859
+ },
860
+ async getGlobalApplicationCommands () {
861
+ return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
862
+ },
863
+ async getGuild (guildId, options = {
864
+ counts: true
865
+ }) {
866
+ return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
867
+ },
868
+ async getGuildApplicationCommand (commandId, guildId) {
869
+ return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
870
+ },
871
+ async getGuildApplicationCommands (guildId) {
872
+ return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
873
+ },
874
+ async getGuildPreview (guildId) {
875
+ return await rest.get(rest.routes.guilds.preview(guildId));
876
+ },
877
+ async getGuildTemplate (templateCode) {
878
+ return await rest.get(rest.routes.guilds.templates.code(templateCode));
879
+ },
880
+ async getGuildTemplates (guildId) {
881
+ return await rest.get(rest.routes.guilds.templates.all(guildId));
882
+ },
883
+ async getGuildWebhooks (guildId) {
884
+ return await rest.get(rest.routes.guilds.webhooks(guildId));
885
+ },
886
+ async getIntegrations (guildId) {
887
+ return await rest.get(rest.routes.guilds.integrations(guildId));
888
+ },
889
+ async getInvite (inviteCode, options) {
890
+ return await rest.get(rest.routes.guilds.invite(inviteCode, options));
891
+ },
892
+ async getInvites (guildId) {
893
+ return await rest.get(rest.routes.guilds.invites(guildId));
894
+ },
895
+ async getMessage (channelId, messageId) {
896
+ return await rest.get(rest.routes.channels.message(channelId, messageId));
897
+ },
898
+ async getMessages (channelId, options) {
899
+ return await rest.get(rest.routes.channels.messages(channelId, options));
900
+ },
901
+ async getNitroStickerPacks () {
902
+ return await rest.get(rest.routes.nitroStickerPacks());
903
+ },
904
+ async getOriginalInteractionResponse (token) {
905
+ return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token), {
906
+ unauthorized: true
907
+ });
908
+ },
909
+ async getPinnedMessages (channelId) {
910
+ return await rest.get(rest.routes.channels.pins(channelId));
911
+ },
912
+ async getPrivateArchivedThreads (channelId, options) {
913
+ return await rest.get(rest.routes.channels.threads.private(channelId, options));
914
+ },
915
+ async getPrivateJoinedArchivedThreads (channelId, options) {
916
+ return await rest.get(rest.routes.channels.threads.joined(channelId, options));
917
+ },
918
+ async getPruneCount (guildId, options) {
919
+ return await rest.get(rest.routes.guilds.prune(guildId, options));
920
+ },
921
+ async getPublicArchivedThreads (channelId, options) {
922
+ return await rest.get(rest.routes.channels.threads.public(channelId, options));
923
+ },
924
+ async getRoles (guildId) {
925
+ return await rest.get(rest.routes.guilds.roles.all(guildId));
926
+ },
927
+ async getScheduledEvent (guildId, eventId, options) {
928
+ return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
929
+ },
930
+ async getScheduledEvents (guildId, options) {
931
+ return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
932
+ },
933
+ async getScheduledEventUsers (guildId, eventId, options) {
934
+ return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
935
+ },
936
+ async getSessionInfo () {
937
+ return await rest.getGatewayBot();
938
+ },
939
+ async getStageInstance (channelId) {
940
+ return await rest.get(rest.routes.channels.stage(channelId));
941
+ },
942
+ async getSticker (stickerId) {
943
+ return await rest.get(rest.routes.sticker(stickerId));
944
+ },
945
+ async getGuildSticker (guildId, stickerId) {
946
+ return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
947
+ },
948
+ async getGuildStickers (guildId) {
949
+ return await rest.get(rest.routes.guilds.stickers(guildId));
950
+ },
951
+ async getThreadMember (channelId, userId) {
952
+ return await rest.get(rest.routes.channels.threads.user(channelId, userId));
953
+ },
954
+ async getThreadMembers (channelId) {
955
+ return await rest.get(rest.routes.channels.threads.members(channelId));
956
+ },
957
+ async getReactions (channelId, messageId, reaction, options) {
958
+ return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
959
+ },
960
+ async getUser (id) {
961
+ return await rest.get(rest.routes.user(id));
962
+ },
963
+ async getVanityUrl (guildId) {
964
+ return await rest.get(rest.routes.guilds.vanity(guildId));
965
+ },
966
+ async getVoiceRegions (guildId) {
967
+ return await rest.get(rest.routes.guilds.regions(guildId));
968
+ },
969
+ async getWebhook (webhookId) {
970
+ return await rest.get(rest.routes.webhooks.id(webhookId));
971
+ },
972
+ async getWebhookMessage (webhookId, token, messageId, options) {
973
+ return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options));
974
+ },
975
+ async getWebhookWithToken (webhookId, token) {
976
+ return await rest.get(rest.routes.webhooks.webhook(webhookId, token));
977
+ },
978
+ async getWelcomeScreen (guildId) {
979
+ return await rest.get(rest.routes.guilds.welcome(guildId));
980
+ },
981
+ async getWidget (guildId) {
982
+ return await rest.get(rest.routes.guilds.widgetJson(guildId));
983
+ },
984
+ async getWidgetSettings (guildId) {
985
+ return await rest.get(rest.routes.guilds.widget(guildId));
986
+ },
987
+ async joinThread (channelId) {
988
+ await rest.put(rest.routes.channels.threads.me(channelId));
989
+ },
990
+ async leaveGuild (guildId) {
991
+ await rest.delete(rest.routes.guilds.leave(guildId));
992
+ },
993
+ async leaveThread (channelId) {
994
+ await rest.delete(rest.routes.channels.threads.me(channelId));
995
+ },
996
+ async publishMessage (channelId, messageId) {
997
+ return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
998
+ },
999
+ async removeRole (guildId, userId, roleId, reason) {
1000
+ await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
1001
+ reason
1002
+ });
1003
+ },
1004
+ async removeThreadMember (channelId, userId) {
1005
+ await rest.delete(rest.routes.channels.threads.user(channelId, userId));
1006
+ },
1007
+ async sendFollowupMessage (token, options) {
1008
+ return await rest.post(rest.routes.webhooks.webhook(rest.applicationId, token), {
1009
+ body: options,
1010
+ files: options.files,
1011
+ unauthorized: true
1012
+ });
1013
+ },
1014
+ async sendInteractionResponse (interactionId, token, options) {
1015
+ return await rest.post(rest.routes.interactions.responses.callback(interactionId, token), {
1016
+ body: options,
1017
+ files: options.data?.files,
1018
+ runThroughQueue: false,
1019
+ unauthorized: true
1020
+ });
1021
+ },
1022
+ async sendMessage (channelId, body) {
1023
+ return await rest.post(rest.routes.channels.messages(channelId), {
1024
+ body,
1025
+ files: body.files
1026
+ });
1027
+ },
1028
+ async startThreadWithMessage (channelId, messageId, body, reason) {
1029
+ return await rest.post(rest.routes.channels.threads.message(channelId, messageId), {
1030
+ body,
1031
+ reason
1032
+ });
1033
+ },
1034
+ async startThreadWithoutMessage (channelId, body, reason) {
1035
+ return await rest.post(rest.routes.channels.threads.all(channelId), {
1036
+ body,
1037
+ reason
1038
+ });
1039
+ },
1040
+ async syncGuildTemplate (guildId) {
1041
+ return await rest.put(rest.routes.guilds.templates.all(guildId));
1042
+ },
1043
+ async banMember (guildId, userId, body, reason) {
1044
+ await rest.put(rest.routes.guilds.members.ban(guildId, userId), {
1045
+ body,
1046
+ reason
1047
+ });
1048
+ },
1049
+ async editBotMember (guildId, body, reason) {
1050
+ return await rest.patch(rest.routes.guilds.members.bot(guildId), {
1051
+ body,
1052
+ reason
1053
+ });
1054
+ },
1055
+ async editMember (guildId, userId, body, reason) {
1056
+ return await rest.patch(rest.routes.guilds.members.member(guildId, userId), {
1057
+ body,
1058
+ reason
1059
+ });
1060
+ },
1061
+ async getMember (guildId, userId) {
1062
+ return await rest.get(rest.routes.guilds.members.member(guildId, userId));
1063
+ },
1064
+ async getMembers (guildId, options) {
1065
+ return await rest.get(rest.routes.guilds.members.members(guildId, options));
1066
+ },
1067
+ async kickMember (guildId, userId, reason) {
1068
+ await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
1069
+ reason
1070
+ });
1071
+ },
1072
+ async pinMessage (channelId, messageId, reason) {
1073
+ await rest.put(rest.routes.channels.pin(channelId, messageId), {
1074
+ reason
1075
+ });
1076
+ },
1077
+ async pruneMembers (guildId, body, reason) {
1078
+ return await rest.post(rest.routes.guilds.members.prune(guildId), {
1079
+ body,
1080
+ reason
1081
+ });
1082
+ },
1083
+ async searchMembers (guildId, query, options) {
1084
+ return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
1085
+ },
1086
+ async unbanMember (guildId, userId, reason) {
1087
+ await rest.delete(rest.routes.guilds.members.ban(guildId, userId), {
1088
+ reason
1089
+ });
1090
+ },
1091
+ async unpinMessage (channelId, messageId, reason) {
1092
+ await rest.delete(rest.routes.channels.pin(channelId, messageId), {
1093
+ reason
1094
+ });
1095
+ },
1096
+ async triggerTypingIndicator (channelId) {
1097
+ await rest.post(rest.routes.channels.typing(channelId));
1098
+ },
1099
+ async upsertGlobalApplicationCommands (body) {
1100
+ return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), {
1101
+ body
1102
+ });
1103
+ },
1104
+ async upsertGuildApplicationCommands (guildId, body) {
1105
+ return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), {
1106
+ body
1107
+ });
1108
+ },
1109
+ preferSnakeCase (enabled) {
1110
+ const camelizer = enabled ? (x)=>x : camelize;
1111
+ rest.get = async (url, options)=>{
1112
+ return camelizer(await rest.makeRequest('GET', url, options));
1113
+ };
1114
+ rest.post = async (url, options)=>{
1115
+ return camelizer(await rest.makeRequest('POST', url, options));
1116
+ };
1117
+ rest.delete = async (url, options)=>{
1118
+ camelizer(await rest.makeRequest('DELETE', url, options));
1119
+ };
1120
+ rest.patch = async (url, options)=>{
1121
+ return camelizer(await rest.makeRequest('PATCH', url, options));
1122
+ };
1123
+ rest.put = async (url, options)=>{
1124
+ return camelizer(await rest.makeRequest('PUT', url, options));
1125
+ };
1126
+ return rest;
1127
+ }
1128
+ };
1129
+ return rest;
1130
+ }
1131
+ var HttpResponseCode;
1132
+ (function(HttpResponseCode) {
1133
+ HttpResponseCode[HttpResponseCode[/** Minimum value of a code in oder to consider that it was successful. */ "Success"] = 200] = "Success";
1134
+ HttpResponseCode[HttpResponseCode[/** Request completed successfully, but Discord returned an empty body. */ "NoContent"] = 204] = "NoContent";
1135
+ HttpResponseCode[HttpResponseCode[/** Minimum value of a code in order to consider that something went wrong. */ "Error"] = 400] = "Error";
1136
+ HttpResponseCode[HttpResponseCode[/** This request got rate limited. */ "TooManyRequests"] = 429] = "TooManyRequests";
1137
+ })(HttpResponseCode || (HttpResponseCode = {}));
1138
+
1139
+ //# sourceMappingURL=manager.js.map