diff --git a/dist/Disable.d.ts b/dist/Disable.d.ts index 38e69ff..c57937b 100644 --- a/dist/Disable.d.ts +++ b/dist/Disable.d.ts @@ -1,3 +1,3 @@ -import * as React from "react"; -import { EnableProps } from "./Enable"; +import * as React from 'react'; +import type { EnableProps } from './Enable'; export declare const Disable: React.FC; diff --git a/dist/Enable.d.ts b/dist/Enable.d.ts index 2e6889e..7acc115 100644 --- a/dist/Enable.d.ts +++ b/dist/Enable.d.ts @@ -4,4 +4,4 @@ export interface EnableProps { readonly allFeatures?: string[]; children: React.ReactNode; } -export declare function Enable({ feature, allFeatures, children }: EnableProps): JSX.Element | null; +export declare function Enable({ feature, allFeatures, children, }: EnableProps): JSX.Element | null; diff --git a/dist/EnableContext.d.ts b/dist/EnableContext.d.ts index 78570ec..c65d9db 100644 --- a/dist/EnableContext.d.ts +++ b/dist/EnableContext.d.ts @@ -1,4 +1,4 @@ /// -import { FeatureValue } from './FeatureState'; +import type { FeatureValue } from './FeatureState'; export declare type EnableContextType = (feature: string) => FeatureValue; export declare const EnableContext: import("react").Context; diff --git a/dist/FeatureContext.d.ts b/dist/FeatureContext.d.ts index 4459700..8fc5792 100644 --- a/dist/FeatureContext.d.ts +++ b/dist/FeatureContext.d.ts @@ -1,6 +1,6 @@ /// -import { FeaturesDispatch, FeaturesState } from './FeaturesState'; -import { FeatureDescription, FeatureValue } from './FeatureState'; +import type { FeatureDescription, FeatureValue } from './FeatureState'; +import type { FeaturesDispatch, FeaturesState } from './FeaturesState'; export declare const FeatureContext: import("react").Context; export interface FeatureContextType { overridesSend: FeaturesDispatch; diff --git a/dist/FeatureState.d.ts b/dist/FeatureState.d.ts index 4a6c5e1..f30d354 100644 --- a/dist/FeatureState.d.ts +++ b/dist/FeatureState.d.ts @@ -1,7 +1,11 @@ -import { InterpreterFrom, StateFrom } from 'xstate'; +import type { Dispatch } from 'react'; export declare type FeatureValue = false | true | undefined; -export declare type FeatureState = StateFrom; -export declare type FeatureDispatch = InterpreterFrom['send']; +export declare type FeatureStateValue = 'initial' | 'enabled' | 'disabled' | 'unspecified' | 'asyncEnabled' | 'asyncDisabled' | 'asyncUnspecified'; +export interface FeatureState { + value: FeatureStateValue; + featureDesc?: FeatureDescription; +} +export declare type FeatureDispatch = Dispatch; export declare function valueForState(featureState: FeatureState): [FeatureValue, boolean]; export interface FeatureDescription { readonly name: K; @@ -11,31 +15,6 @@ export interface FeatureDescription { readonly noOverride?: boolean; readonly defaultValue?: FeatureValue; } -interface FeatureContext { - featureDesc?: FeatureDescription; -} -declare type FeatureTypeState = { - value: 'asyncDenabled'; - context: FeatureContext; -} | { - value: 'asyncDisabled'; - context: FeatureContext; -} | { - value: 'asyncUnspecied'; - context: FeatureContext; -} | { - value: 'disabled'; - context: FeatureContext; -} | { - value: 'enabled'; - context: FeatureContext; -} | { - value: 'initial'; - context: never; -} | { - value: 'unspecied'; - context: FeatureContext; -}; export declare type FeatureAction = { type: 'DISABLE'; } | { @@ -50,6 +29,9 @@ export declare type FeatureAction = { type: 'TOGGLE'; } | { type: 'UNSET'; +} | { + type: 'ASYNC_DONE'; + value: FeatureValue; }; -export declare const FeatureMachine: import("xstate").StateMachine>; -export {}; +export declare const initialFeatureState: FeatureState; +export declare function featureReducer(state: FeatureState, action: FeatureAction): FeatureState; diff --git a/dist/Features.d.ts b/dist/Features.d.ts index 0c74a4f..e212700 100644 --- a/dist/Features.d.ts +++ b/dist/Features.d.ts @@ -1,5 +1,5 @@ -import { ReactNode } from 'react'; -import { FeatureDescription } from './FeatureState'; +import { type ReactNode } from 'react'; +import type { FeatureDescription } from './FeatureState'; interface FeatureProps { readonly features: readonly FeatureDescription[]; readonly children?: ReactNode; diff --git a/dist/FeaturesState.d.ts b/dist/FeaturesState.d.ts index ce41867..0a8a804 100644 --- a/dist/FeaturesState.d.ts +++ b/dist/FeaturesState.d.ts @@ -1,8 +1,8 @@ -import { ActorRefFrom, InterpreterFrom, StateFrom } from 'xstate'; -import { FeatureMachine, FeatureDescription, FeatureValue } from './FeatureState'; +import type { Dispatch } from 'react'; +import { type FeatureDescription, type FeatureState, type FeatureValue } from './FeatureState'; export interface FeaturesContext { features: { - [x: string]: ActorRefFrom; + [x: string]: FeatureState; }; } export declare type FeaturesAction = { @@ -31,12 +31,16 @@ export declare type FeaturesAction = { } | { type: 'UNSET'; name: string; +} | { + type: 'ASYNC_DONE'; + name: string; + value: FeatureValue; }; -export interface FeaturesTypeState { - value: 'ready'; +export interface FeaturesState { + value: 'idle' | 'ready'; context: FeaturesContext; } -export declare type FeaturesState = StateFrom; -export declare type FeaturesDispatch = InterpreterFrom['send']; +export declare type FeaturesDispatch = Dispatch; export declare function valueOfFeature(featuresState: FeaturesState, feature: string): [FeatureValue, boolean]; -export declare const FeaturesMachine: import("xstate").StateMachine>; +export declare const initialFeaturesState: FeaturesState; +export declare function featuresReducer(state: FeaturesState, action: FeaturesAction): FeaturesState; diff --git a/dist/GlobalEnable.d.ts b/dist/GlobalEnable.d.ts index 4d29cb6..c6131a6 100644 --- a/dist/GlobalEnable.d.ts +++ b/dist/GlobalEnable.d.ts @@ -1,5 +1,5 @@ -import { FeaturesDispatch } from './FeaturesState'; -import { FeatureDescription, FeatureValue } from './FeatureState'; +import type { FeatureDescription, FeatureValue } from './FeatureState'; +import type { FeaturesDispatch } from './FeaturesState'; export declare class GlobalEnable { private readonly featureDesc; private readonly dispatch; diff --git a/dist/ToggleFeatures.d.ts b/dist/ToggleFeatures.d.ts index fe8b951..7061345 100644 --- a/dist/ToggleFeatures.d.ts +++ b/dist/ToggleFeatures.d.ts @@ -1,9 +1,9 @@ /// -export declare function ToggleFeatures({ defaultOpen, hidden }: { +export declare function ToggleFeatures({ defaultOpen, hidden, }: { defaultOpen?: boolean; hidden?: boolean; }): JSX.Element | null; -export declare function ToggleFeatureUnwrapped({ defaultOpen, hidden }: { +export declare function ToggleFeatureUnwrapped({ defaultOpen, hidden, }: { defaultOpen?: boolean; hidden?: boolean; }): JSX.Element | null; diff --git a/dist/cjs/src/index.js b/dist/cjs/src/index.js index 91d08b5..06f0c20 100644 --- a/dist/cjs/src/index.js +++ b/dist/cjs/src/index.js @@ -1,4 +1,542 @@ -var le=Object.create;var F=Object.defineProperty;var de=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames,H=Object.getOwnPropertySymbols,ce=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty,pe=Object.prototype.propertyIsEnumerable;var q=(t,e,r)=>e in t?F(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,Y=(t,e)=>{for(var r in e||(e={}))K.call(e,r)&&q(t,r,e[r]);if(H)for(var r of H(e))pe.call(e,r)&&q(t,r,e[r]);return t};var fe=(t,e)=>{for(var r in e)F(t,r,{get:e[r],enumerable:!0})},W=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ue(e))!K.call(t,n)&&n!==r&&F(t,n,{get:()=>e[n],enumerable:!(a=de(e,n))||a.enumerable});return t};var k=(t,e,r)=>(r=t!=null?le(ce(t)):{},W(e||!t||!t.__esModule?F(r,"default",{value:t,enumerable:!0}):r,t)),me=t=>W(F({},"__esModule",{value:!0}),t);var C=(t,e,r)=>new Promise((a,n)=>{var i=s=>{try{u(r.next(s))}catch(c){n(c)}},d=s=>{try{u(r.throw(s))}catch(c){n(c)}},u=s=>s.done?a(s.value):Promise.resolve(s.value).then(i,d);u((r=r.apply(t,e)).next())});var xe={};fe(xe,{Disable:()=>ae,Enable:()=>oe,EnableContext:()=>x,Features:()=>re,FeaturesMachine:()=>D,ToggleFeatures:()=>se,useAllDisabled:()=>L,useAllEnabled:()=>A,useDisabled:()=>O,useEnabled:()=>I});module.exports=me(xe);var m=require("xstate");var w=require("xstate");function $(t){var e,r;return[t.matches("enabled")?!0:t.matches("disabled")?!1:void 0,(r=(e=t.context.featureDesc)==null?void 0:e.force)!=null?r:!1]}var Q=(0,w.createMachine)({id:"feature",initial:"initial",context:{},predictableActionArguments:!0,on:{ENABLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],TOGGLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],DISABLE:[{target:"asyncDisabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"disabled"}],UNSET:[{target:"asyncUnspecied",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"unspecified"}],SET:[{target:"asyncEnabled",cond:(t,e)=>{var r;return e.value===!0&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncDisabled",cond:(t,e)=>{var r;return e.value===!1&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncUnspecied",cond:(t,e)=>{var r;return((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"enabled",cond:(t,e)=>e.value===!0},{target:"disabled",cond:(t,e)=>e.value===!1},{target:"unspecified"}]},states:{initial:{on:{INIT:[{actions:(0,w.assign)({featureDesc:(t,e)=>e.feature}),target:"enabled",cond:(t,e)=>e.feature.defaultValue===!0},{actions:(0,w.assign)({featureDesc:(t,e)=>e.feature}),target:"unspecified",cond:(t,e)=>e.feature.defaultValue===void 0},{actions:(0,w.assign)({featureDesc:(t,e)=>e.feature}),target:"disabled",cond:(t,e)=>e.feature.defaultValue===!1}]}},unspecified:{},disabled:{},enabled:{},asyncDisabled:{invoke:{id:"set-off-upstream",src:t=>C(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!1)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncUnspecied:{invoke:{id:"set-unset-upstream",src:t=>C(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,void 0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncEnabled:{invoke:{id:"set-on-upstream",src:t=>C(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}}}});function h(t,e){if(t.context.features[e]==null)return[void 0,!1];let r=t.context.features[e].getSnapshot();return r!=null?$(r):[void 0,!1]}var D=(0,m.createMachine)({id:"features",initial:"idle",predictableActionArguments:!0,context:{features:{}},states:{idle:{on:{INIT:{target:"ready",cond:(t,e)=>e.features.length>0,actions:(0,m.assign)({features:(t,e)=>{let r={};for(let a of e.features)r[a.name]=(0,m.spawn)(Q,{name:a.name,sync:!0}),r[a.name].send({type:"INIT",feature:a});return r}})}}},ready:{on:{DE_INIT:{target:"idle",actions:(0,m.assign)({features:(t,e)=>({})})},SET_ALL:{actions:(0,m.assign)({features:(t,e)=>{let r=Y({},t.features);return Object.keys(r).forEach(a=>{var n;r[a].send({type:"SET",value:(n=e.features[a])!=null?n:void 0})}),r}})},SET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"SET",value:e.value})}},TOGGLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"TOGGLE"})}},ENABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"ENABLE"})}},DISABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"DISABLE"})}},UNSET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"UNSET"})}}}}}});var p=k(require("react")),J=require("@xstate/react");var Z=require("react"),x=(0,Z.createContext)(t=>!1);var R=require("react"),E=(0,R.createContext)(null);var ee=require("react");var N=class{constructor(e,r,a){this.featureDesc=a,this.dispatch=e,this.testFeature=r}toggle(e){this.dispatch({type:"TOGGLE",name:e})}enable(e){this.dispatch({type:"ENABLE",name:e})}unset(e){this.dispatch({type:"UNSET",name:e})}disable(e){this.dispatch({type:"DISABLE",name:e})}setAll(e){this.dispatch({type:"SET_ALL",features:e})}listFeatures(){return this.featureDesc.map(e=>[e.name,this.testFeature(e.name)])}};function j(t,e,r,a){(0,ee.useEffect)(()=>t?(window.feature=new N(a,r,e),()=>{window.feature!=null&&delete window.feature}):()=>{},[e,a,t,r])}var z=require("react");var B="react-enable:feature-values";function P(t,e,r){let a=(0,z.useMemo)(()=>{let i={};if(r.matches("ready"))for(let d of e){let[u]=h(r,d.name);u!=null&&(i[d.name]=u)}return i},[e,r]),n=Object.keys(a).length===0||t==null?"{}":JSON.stringify({overrides:a});(0,z.useEffect)(()=>{try{t!=null&&r.matches("ready")&&t.setItem(B,n)}catch(i){}},[r,t,n])}var te=require("react");function U(t,e){let r=e.map(a=>h(a,t));for(let[a,n]of r)if(a!=null&&n)return a;for(let[a]of r)if(a!=null)return a}function G(t,e){return(0,te.useCallback)(r=>U(r,[t,e]),[t,e])}function re({children:t,features:e,disableConsole:r=!1,storage:a=window.sessionStorage}){let n=(0,p.useRef)(e),[i,d]=(0,J.useMachine)(D),[u,s]=(0,J.useMachine)(D);(0,p.useEffect)(()=>(s({type:"INIT",features:e}),()=>{s({type:"DE_INIT"})}),[s,e]),(0,p.useEffect)(()=>{let b={};if(a!=null)try{let l=a.getItem(B);l!=null&&(b=JSON.parse(l).overrides)}catch(l){console.error("error in localStorage",l)}return d({type:"INIT",features:n.current.filter(l=>l.noOverride!==!0).map(l=>{var f;return{name:l.name,description:l.description,defaultValue:(f=b==null?void 0:b[l.name])!=null?f:void 0}})}),()=>{d({type:"DE_INIT"})}},[n,d,a]),P(a,n.current,i);let c=G(i,u);j(!r,n.current,c,s);let S=(0,p.useMemo)(()=>({overridesSend:d,defaultsSend:s,featuresDescription:n.current,overridesState:i,defaultsState:u,test:c}),[d,s,i,u,c]);return p.default.createElement(E.Provider,{value:S},p.default.createElement(x.Provider,{value:c},t))}var V=k(require("react"));var T=require("react");function g(t){let e=(0,T.useContext)(x),r=(0,T.useMemo)(()=>t==null?[]:Array.isArray(t)?t:[t],[t]);return[e,r]}function A(t){let[e,r]=g(t);return r.length>0&&r.every(e)}function I(t){let[e,r]=g(t);return r.some(e)}function oe({feature:t=[],allFeatures:e=[],children:r}){let a=I(t),n=A(e);return a||n?V.createElement(V.Fragment,null,r):null}var M=k(require("react"));function L(t){let[e,r]=g(t);return t.length>0&&r.every(a=>{var n;return!((n=e(a))!=null&&n)})}function O(t){let[e,r]=g(t);return r.some(a=>{var n;return!((n=e(a))!=null&&n)})}var ae=({feature:t=[],allFeatures:e=[],children:r})=>{let a=O(t),n=L(e);return a||n?M.createElement(M.Fragment,null,r):null};var o=k(require("react")),ie=k(require("react-dom")),v=require("@headlessui/react");var ne=`/* +var __create = Object.create; +var __defProp = Object.defineProperty; +var __defProps = Object.defineProperties; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// src/index.tsx +var src_exports = {}; +__export(src_exports, { + Disable: () => Disable, + Enable: () => Enable, + EnableContext: () => EnableContext, + Features: () => Features, + ToggleFeatures: () => ToggleFeatures, + useAllDisabled: () => useAllDisabled, + useAllEnabled: () => useAllEnabled, + useDisabled: () => useDisabled, + useEnabled: () => useEnabled +}); +module.exports = __toCommonJS(src_exports); + +// src/Disable.tsx +var React = __toESM(require("react")); + +// src/utils.ts +var import_react2 = require("react"); + +// src/EnableContext.tsx +var import_react = require("react"); +var EnableContext = (0, import_react.createContext)((_s) => false); + +// src/utils.ts +function useTestAndConvert(input) { + const test = (0, import_react2.useContext)(EnableContext); + const converted = (0, import_react2.useMemo)(() => input == null ? [] : Array.isArray(input) ? input : [input], [input]); + return [test, converted]; +} + +// src/useAllDisabled.tsx +function useAllDisabled(withoutAll) { + const [test, queryAllWithout] = useTestAndConvert(withoutAll); + return withoutAll.length > 0 && queryAllWithout.every((x) => { + var _a; + return !((_a = test(x)) != null ? _a : false); + }); +} + +// src/useDisabled.tsx +function useDisabled(without) { + const [test, queryAnyWithout] = useTestAndConvert(without); + return queryAnyWithout.some((x) => { + var _a; + return !((_a = test(x)) != null ? _a : false); + }); +} + +// src/Disable.tsx +var Disable = ({ + feature = [], + allFeatures = [], + children +}) => { + const isAny = useDisabled(feature); + const isAll = useAllDisabled(allFeatures); + if (isAny || isAll) { + return /* @__PURE__ */ React.createElement(React.Fragment, null, children); + } + return null; +}; + +// src/Enable.tsx +var React2 = __toESM(require("react")); + +// src/useAllEnabled.tsx +function useAllEnabled(allFeatures) { + const [test, queryAllPresent] = useTestAndConvert(allFeatures); + return queryAllPresent.length > 0 && queryAllPresent.every(test); +} + +// src/useEnabled.tsx +function useEnabled(feature) { + const [test, queryAnyPresent] = useTestAndConvert(feature); + return queryAnyPresent.some(test); +} + +// src/Enable.tsx +function Enable({ + feature = [], + allFeatures = [], + children +}) { + const isAny = useEnabled(feature); + const isAll = useAllEnabled(allFeatures); + if (isAny || isAll) { + return /* @__PURE__ */ React2.createElement(React2.Fragment, null, children); + } + return null; +} + +// src/Features.tsx +var import_react7 = __toESM(require("react")); + +// src/FeatureContext.tsx +var import_react3 = require("react"); +var FeatureContext = (0, import_react3.createContext)(null); + +// src/FeatureState.tsx +function valueForState(featureState) { + var _a, _b; + return [ + featureState.value === "enabled" || featureState.value === "asyncEnabled" ? true : featureState.value === "disabled" || featureState.value === "asyncDisabled" ? false : void 0, + (_b = (_a = featureState.featureDesc) == null ? void 0 : _a.force) != null ? _b : false + ]; +} + +// src/FeaturesState.tsx +function valueOfFeature(featuresState, feature) { + if (featuresState.context.features[feature] == null) { + return [void 0, false]; + } + const featureState = featuresState.context.features[feature]; + if (featureState != null) { + return valueForState(featureState); + } + return [void 0, false]; +} +var initialFeaturesState = { + value: "idle", + context: { + features: {} + } +}; +function featuresReducer(state, action) { + var _a, _b, _c, _d, _e; + switch (action.type) { + case "INIT": { + if (action.features.length === 0) { + return state; + } + const features = {}; + for (const feature of action.features) { + const featureState = { + value: feature.defaultValue === true ? "enabled" : feature.defaultValue === false ? "disabled" : "unspecified", + featureDesc: feature + }; + features[feature.name] = featureState; + } + return { + value: "ready", + context: { features } + }; + } + case "DE_INIT": { + return initialFeaturesState; + } + case "SET_ALL": { + if (state.value !== "ready") { + return state; + } + const features = __spreadValues({}, state.context.features); + Object.keys(features).forEach((name) => { + var _a2, _b2; + const value = (_a2 = action.features[name]) != null ? _a2 : void 0; + const currentFeature = features[name]; + if (((_b2 = currentFeature.featureDesc) == null ? void 0 : _b2.onChangeDefault) != null) { + if (value === true) { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncEnabled" }); + } else if (value === false) { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncDisabled" }); + } else { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncUnspecified" }); + } + } else { + if (value === true) { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "enabled" }); + } else if (value === false) { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "disabled" }); + } else { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "unspecified" }); + } + } + }); + return __spreadProps(__spreadValues({}, state), { + context: { features } + }); + } + case "SET": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const { value } = action; + let newValue; + if (((_a = feature.featureDesc) == null ? void 0 : _a.onChangeDefault) != null) { + if (value === true) { + newValue = "asyncEnabled"; + } else if (value === false) { + newValue = "asyncDisabled"; + } else { + newValue = "asyncUnspecified"; + } + } else { + if (value === true) { + newValue = "enabled"; + } else if (value === false) { + newValue = "disabled"; + } else { + newValue = "unspecified"; + } + } + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "TOGGLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = ((_b = feature.featureDesc) == null ? void 0 : _b.onChangeDefault) != null ? "asyncEnabled" : "enabled"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "ENABLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = ((_c = feature.featureDesc) == null ? void 0 : _c.onChangeDefault) != null ? "asyncEnabled" : "enabled"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "DISABLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = ((_d = feature.featureDesc) == null ? void 0 : _d.onChangeDefault) != null ? "asyncDisabled" : "disabled"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "UNSET": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = ((_e = feature.featureDesc) == null ? void 0 : _e.onChangeDefault) != null ? "asyncUnspecified" : "unspecified"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "ASYNC_DONE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const { value } = action; + const newValue = value === true ? "enabled" : value === false ? "disabled" : "unspecified"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + default: + return state; + } +} + +// src/useConsoleOverride.tsx +var import_react4 = require("react"); + +// src/GlobalEnable.tsx +var GlobalEnable = class { + constructor(dispatch, testFeature2, featureDesc) { + this.featureDesc = featureDesc; + this.dispatch = dispatch; + this.testFeature = testFeature2; + } + toggle(feature) { + this.dispatch({ type: "TOGGLE", name: feature }); + } + enable(feature) { + this.dispatch({ type: "ENABLE", name: feature }); + } + unset(feature) { + this.dispatch({ type: "UNSET", name: feature }); + } + disable(feature) { + this.dispatch({ type: "DISABLE", name: feature }); + } + setAll(features) { + this.dispatch({ type: "SET_ALL", features }); + } + listFeatures() { + return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]); + } +}; + +// src/useConsoleOverride.tsx +function useConsoleOverride(consoleOverride, features, testFeature2, dispatch) { + (0, import_react4.useEffect)(() => { + if (!consoleOverride) { + if (window.feature != null) { + window.feature = void 0; + } + return () => { + if (window.feature != null) { + window.feature = void 0; + } + }; + } + window.feature = new GlobalEnable(dispatch, testFeature2, features); + return () => { + if (window.feature != null) { + window.feature = void 0; + } + }; + }, [features, dispatch, consoleOverride, testFeature2]); +} + +// src/usePersist.tsx +var import_react5 = require("react"); +var KEY = "react-enable:feature-values"; +function usePersist(storage, features, overrideState) { + const overrides = (0, import_react5.useMemo)(() => { + const newOverrides = {}; + if (overrideState.value === "ready") { + for (const feature of features) { + const [value] = valueOfFeature(overrideState, feature.name); + if (value != null) { + newOverrides[feature.name] = value; + } + } + } + return newOverrides; + }, [features, overrideState]); + const strState = Object.keys(overrides).length === 0 || storage == null ? "{}" : JSON.stringify({ overrides }); + (0, import_react5.useEffect)(() => { + try { + if (storage != null && overrideState.value === "ready") { + storage.setItem(KEY, strState); + } + } catch (e) { + } + }, [overrideState, storage, strState]); +} + +// src/useTestCallback.tsx +var import_react6 = require("react"); + +// src/testFeature.tsx +function testFeature(feature, states) { + const values = states.map((state) => valueOfFeature(state, feature)); + for (const [featureValue, featureForced] of values) { + if (featureValue != null && featureForced) { + return featureValue; + } + } + for (const [featureValue] of values) { + if (featureValue != null) { + return featureValue; + } + } + return void 0; +} + +// src/useTestCallback.tsx +function useTestCallback(defaultsState, overridesState) { + return (0, import_react6.useCallback)((f) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]); +} + +// src/Features.tsx +function Features({ + children, + features, + disableConsole = false, + storage = window.sessionStorage +}) { + const featuresRef = (0, import_react7.useRef)(features); + const [overridesState, overridesDispatch] = (0, import_react7.useReducer)(featuresReducer, initialFeaturesState); + const [defaultsState, defaultsDispatch] = (0, import_react7.useReducer)(featuresReducer, initialFeaturesState); + (0, import_react7.useEffect)(() => { + defaultsDispatch({ type: "INIT", features }); + return () => { + defaultsDispatch({ type: "DE_INIT" }); + }; + }, [features]); + (0, import_react7.useEffect)(() => { + let f = {}; + if (storage != null) { + try { + const featuresJson = storage.getItem(KEY); + if (featuresJson != null) { + const fh = JSON.parse(featuresJson); + f = fh.overrides; + } + } catch (e) { + console.error("error in localStorage", e); + } + } + overridesDispatch({ + type: "INIT", + features: featuresRef.current.filter((x) => x.noOverride !== true).map((x) => { + var _a; + return { + name: x.name, + description: x.description, + defaultValue: (_a = f == null ? void 0 : f[x.name]) != null ? _a : void 0 + }; + }) + }); + return () => { + overridesDispatch({ type: "DE_INIT" }); + }; + }, [storage]); + (0, import_react7.useEffect)(() => { + if (defaultsState.value !== "ready") { + return; + } + Object.entries(defaultsState.context.features).forEach(([name, feature]) => { + var _a; + if (feature.value === "asyncEnabled" || feature.value === "asyncDisabled" || feature.value === "asyncUnspecified") { + const targetValue = feature.value === "asyncEnabled" ? true : feature.value === "asyncDisabled" ? false : void 0; + const onChangeDefault = (_a = feature.featureDesc) == null ? void 0 : _a.onChangeDefault; + if (onChangeDefault != null && feature.featureDesc != null) { + onChangeDefault(feature.featureDesc.name, targetValue).then((result) => { + defaultsDispatch({ type: "ASYNC_DONE", name, value: result }); + }).catch(() => { + defaultsDispatch({ + type: "ASYNC_DONE", + name, + value: void 0 + }); + }); + } + } + }); + }, [defaultsState]); + usePersist(storage, featuresRef.current, overridesState); + const testCallback = useTestCallback(overridesState, defaultsState); + useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsDispatch); + const featureValue = (0, import_react7.useMemo)(() => ({ + overridesSend: overridesDispatch, + defaultsSend: defaultsDispatch, + featuresDescription: featuresRef.current, + overridesState, + defaultsState, + test: testCallback + }), [overridesState, defaultsState, testCallback]); + return /* @__PURE__ */ import_react7.default.createElement(FeatureContext.Provider, { + value: featureValue + }, /* @__PURE__ */ import_react7.default.createElement(EnableContext.Provider, { + value: testCallback + }, children)); +} + +// src/ToggleFeatures.tsx +var import_react8 = require("@headlessui/react"); +var import_react9 = __toESM(require("react")); +var import_react_dom = __toESM(require("react-dom")); + +// src/tailwind.css +var tailwind_default = `/* ! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com */ @@ -639,6 +1177,40 @@ select { --tw-backdrop-sepia: ; } +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + .sr-only { position: absolute; width: 1px; @@ -922,14 +1494,14 @@ select { border-color: rgb(107 114 128 / var(--tw-border-opacity)); } -.bg-white { +.bg-blue-600 { --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); } -.bg-blue-600 { +.bg-white { --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } .p-3 { @@ -1031,6 +1603,11 @@ select { line-height: 1.75rem; } +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + .text-gray-900 { --tw-text-opacity: 1; color: rgb(17 24 39 / var(--tw-text-opacity)); @@ -1046,11 +1623,6 @@ select { color: rgb(34 197 94 / var(--tw-text-opacity)); } -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - .text-red-500 { --tw-text-opacity: 1; color: rgb(239 68 68 / var(--tw-text-opacity)); @@ -1189,5 +1761,234 @@ select { gap: 1rem; } } -`;function X(...t){return t.filter(Boolean).join(" ")}function be({feature:t}){var c,S,b;let e=(0,o.useContext)(E),r=(0,o.useCallback)(l=>{if((e==null?void 0:e.overridesSend)!=null)switch(l){case"true":{e.overridesSend({type:"ENABLE",name:t.name});break}case"false":{e.overridesSend({type:"DISABLE",name:t.name});break}case"unset":{e.overridesSend({type:"UNSET",name:t.name});break}}},[t.name,e]);if(e==null)return null;let{overridesState:a,test:n,defaultsState:i}=e,d=((c=h(i,t.name)[0])!=null?c:"unset").toString(),u=((S=h(a,t.name)[0])!=null?S:"unset").toString(),s=n(t.name);return o.default.createElement(v.RadioGroup,{disabled:t.noOverride,onChange:r,value:u},o.default.createElement(v.RadioGroup.Label,null,o.default.createElement("h6",{className:"text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7"},o.default.createElement("span",{className:"font-medium"},"Feature: ",o.default.createElement("code",null,t.name)),t.noOverride===!0?o.default.createElement("div",{className:"border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.default.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",fillRule:"evenodd"})),o.default.createElement("div",null,"No Overrides")):null,s===!0?o.default.createElement("div",{className:"flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1"},o.default.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"})),o.default.createElement("div",null,s?"Enabled":"Disabled")):null),t.description==null?null:o.default.createElement("p",{className:"text-base text-gray-500 text-sm"},t.description)),o.default.createElement("div",{className:"mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4"},[{id:"false",title:`Disable ${t.name}`,description:"Override the feature to be disabled"},{id:"unset",title:"Default",description:"Inherit enabled state from defaults",disabled:((b=t.noOverride)!=null?b:!1)||t.force,defaultValue:d==="true"?o.default.createElement("div",{className:"text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.default.createElement("span",null,"Enabled")):o.default.createElement("div",{className:"text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.default.createElement("span",null,"Disabled"))},{id:"true",title:`Enable ${t.name}`,description:"Override the feature to be enabled"}].map(l=>o.default.createElement(v.RadioGroup.Option,{className:({checked:f,active:_,disabled:y})=>X(f?"border-transparent":"border-gray-300",!y&&_?"border-blue-500 ring-2 ring-blue-500":"",y?"border-transparent ring-gray-500 cursor-not-allowed":"cursor-pointer","relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"),disabled:l.disabled,key:l.id,value:l.id},({checked:f,active:_,disabled:y})=>o.default.createElement(o.default.Fragment,null,o.default.createElement("div",{className:"flex flex-col grow"},o.default.createElement(v.RadioGroup.Label,{as:"span",className:"flex flex-nowrap flex-row gap-1 items-center space-between"},o.default.createElement("span",{className:"text-sm font-medium text-gray-900 grow shrink"},l.title),l.defaultValue!=null?l.defaultValue:null,o.default.createElement("svg",{"aria-hidden":"true",className:X(f?"":"invisible","h-5 w-5 text-blue-500 min-w-4"),fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"}))),o.default.createElement(v.RadioGroup.Description,{as:"span",className:"mt-1 flex items-center text-sm text-gray-500"},l.description)),o.default.createElement("div",{"aria-hidden":"true",className:X(!y&&_?"border":"border-2",f?y?"border-gray-500":"border-blue-500":"border-transparent","absolute -inset-px rounded-lg pointer-events-none")}))))))}function he({root:t,children:e}){return ie.default.createPortal(e,t)}function se({defaultOpen:t=!1,hidden:e=!1}){let[r,a]=(0,o.useState)(null),n=i=>{if(i==null||r!=null)return;let d=i==null?void 0:i.attachShadow({mode:"open"}),u=document.createElement("style"),s=document.createElement("div");u.textContent=ne,d.appendChild(u),d.appendChild(s),a(s)};return e?null:o.default.createElement("div",{ref:n,style:{zIndex:99999,position:"fixed",width:"0",height:"0",bottom:0}},r!=null?o.default.createElement(he,{root:r},o.default.createElement(we,{defaultOpen:t})):null)}function we({defaultOpen:t=!1,hidden:e=!1}){let[r,a]=(0,o.useState)(t),n=(0,o.useContext)(E);if(n==null||e)return null;let{featuresDescription:i}=n;return i.length===0?null:o.default.createElement("div",{className:"relative"},o.default.createElement("div",{className:"absolute bottom-0 left-0 mx-4 my-4"},o.default.createElement("button",{className:"inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>a(!0),title:"Toggle features",type:"button"},o.default.createElement("svg",{className:"w-6 h-6 min-h-6 min-w-6",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.default.createElement("path",{clipRule:"evenodd",d:"M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z",fillRule:"evenodd"})))),r?o.default.createElement("div",{className:"fixed z-10 inset-0 overflow-y-auto"},o.default.createElement("div",{className:"flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0"},o.default.createElement("div",{className:"relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full"},o.default.createElement("div",null,o.default.createElement("div",{className:"mt-1 sm:mt-3"},o.default.createElement("h3",{className:"flex flex-row gap-4 flex-nowrap items-center space-between"},o.default.createElement("div",{className:"grow text-lg leading-6 font-medium text-gray-900"},"Feature Flag Overrides")),o.default.createElement("p",{className:"text-sm text-gray-500"},"Features can be enabled or disabled unless they are forced upstream. You can also revert to default."),o.default.createElement("div",{className:"mt-6"},o.default.createElement("fieldset",{className:"flex flex-col gap-9"},o.default.createElement("legend",{className:"sr-only"},"Feature Flags"),i.map(d=>o.default.createElement(be,{feature:d,key:d.name})))),o.default.createElement("div",{className:"flex justify-center items-center mt-5 sm:mt-6"},o.default.createElement("button",{className:"inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>a(!1),type:"button"},"Done"))))))):null)} -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvRmVhdHVyZXNTdGF0ZS50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVTdGF0ZS50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzLnRzeCIsICIuLi8uLi8uLi9zcmMvRW5hYmxlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVDb250ZXh0LnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlQ29uc29sZU92ZXJyaWRlLnRzeCIsICIuLi8uLi8uLi9zcmMvR2xvYmFsRW5hYmxlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlUGVyc2lzdC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZVRlc3RDYWxsYmFjay50c3giLCAiLi4vLi4vLi4vc3JjL3Rlc3RGZWF0dXJlLnRzeCIsICIuLi8uLi8uLi9zcmMvRW5hYmxlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXRpbHMudHMiLCAiLi4vLi4vLi4vc3JjL3VzZUFsbEVuYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvRGlzYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUFsbERpc2FibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRGlzYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy9Ub2dnbGVGZWF0dXJlcy50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IEZlYXR1cmVzTWFjaGluZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5leHBvcnQgeyBGZWF0dXJlcyB9IGZyb20gJy4vRmVhdHVyZXMnO1xuZXhwb3J0IHsgRW5hYmxlIH0gZnJvbSAnLi9FbmFibGUnO1xuZXhwb3J0IHsgRGlzYWJsZSB9IGZyb20gJy4vRGlzYWJsZSc7XG5leHBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gJy4vdXNlRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG5leHBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gJy4vdXNlQWxsRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlQWxsRW5hYmxlZCB9IGZyb20gJy4vdXNlQWxsRW5hYmxlZCc7XG5leHBvcnQgdHlwZSB7IEVuYWJsZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcbmV4cG9ydCB0eXBlIHsgRmVhdHVyZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5leHBvcnQgdHlwZSB7IEZlYXR1cmVWYWx1ZSwgRmVhdHVyZVN0YXRlLCBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVEaXNwYXRjaCB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmV4cG9ydCB7IEVuYWJsZUNvbnRleHQgfSBmcm9tICcuL0VuYWJsZUNvbnRleHQnO1xuZXhwb3J0IHsgVG9nZ2xlRmVhdHVyZXMgfSBmcm9tICcuL1RvZ2dsZUZlYXR1cmVzJztcbiIsICJpbXBvcnQgeyBBY3RvclJlZkZyb20sIEludGVycHJldGVyRnJvbSwgU3RhdGVGcm9tLCBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIHNwYXduIH0gZnJvbSAneHN0YXRlJztcblxuaW1wb3J0IHsgRmVhdHVyZU1hY2hpbmUsIEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlLCB2YWx1ZUZvclN0YXRlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzQ29udGV4dCB7XG4gIC8vIGZlYXR1cmVzIGFyZSBsYXllcmVkOlxuICAvLyAgLSBkZWZhdWx0czogaWYgbm90aGluZyBlbHNlIG1hdGNoZXMsIHByb3ZpZGVkIGEgdmFsdWUgZm9yIGZlYXR1cmVcbiAgLy8gIC0gYnJvd3NlcjogYnJvd3Nlci1sb2NhbCB2YWx1ZXMgZm9yIGZlYXR1cmVzIChrZXB0IGluIGxvY2FsIHN0b3JhZ2UsIGV0YylcbiAgLy8gIC0gdXNlcjogdmFsdWVzIGZyb20gdGhlIHVzZXIncyBwcm9maWxlLCBpZiBhbnlcbiAgLy8gIC0gb3JnOiB2YWx1ZSBmcm9tIHRoZSBvcmcncyBwcm9maWxlLCBpZiBhbnlcbiAgZmVhdHVyZXM6IHsgW3g6IHN0cmluZ106IEFjdG9yUmVmRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+IH07XG59XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVzQWN0aW9uID1cbiAgfCB7IHR5cGU6ICdERV9JTklUJyB9XG4gIHwgeyB0eXBlOiAnRElTQUJMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnRU5BQkxFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdJTklUJzsgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdIH1cbiAgfCB7IHR5cGU6ICdTRVRfQUxMJzsgZmVhdHVyZXM6IHsgW2tleTogc3RyaW5nXTogRmVhdHVyZVZhbHVlIH0gfVxuICB8IHsgdHlwZTogJ1NFVCc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IEZlYXR1cmVWYWx1ZSB9XG4gIHwgeyB0eXBlOiAnVE9HR0xFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdVTlNFVCc7IG5hbWU6IHN0cmluZyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzVHlwZVN0YXRlIHtcbiAgdmFsdWU6ICdyZWFkeSc7XG4gIGNvbnRleHQ6IEZlYXR1cmVzQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZXNTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZXNNYWNoaW5lPjtcbmV4cG9ydCB0eXBlIEZlYXR1cmVzRGlzcGF0Y2ggPSBJbnRlcnByZXRlckZyb208dHlwZW9mIEZlYXR1cmVzTWFjaGluZT5bJ3NlbmQnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlT2ZGZWF0dXJlKGZlYXR1cmVzU3RhdGU6IEZlYXR1cmVzU3RhdGUsIGZlYXR1cmU6IHN0cmluZyk6IFtGZWF0dXJlVmFsdWUsIGJvb2xlYW5dIHtcbiAgaWYgKGZlYXR1cmVzU3RhdGUuY29udGV4dC5mZWF0dXJlc1tmZWF0dXJlXSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIGZhbHNlXTtcbiAgfVxuICBjb25zdCBmZWF0dXJlU3RhdGUgPSBmZWF0dXJlc1N0YXRlLmNvbnRleHQuZmVhdHVyZXNbZmVhdHVyZV0uZ2V0U25hcHNob3QoKTtcbiAgaWYgKGZlYXR1cmVTdGF0ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlRm9yU3RhdGUoZmVhdHVyZVN0YXRlKTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgZmFsc2VdO1xufVxuXG4vLy8gc3RhdGUgbWFjaGluZSB0aGF0IG1hbmFnZXMgYSBzZXQgb2YgZmVhdHVyZXMgd2l0aCB1c2VyLCBvcmcsIGFuZCBsb2NhbCBvdmVycmlkZXNcbmV4cG9ydCBjb25zdCBGZWF0dXJlc01hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVzQ29udGV4dCwgRmVhdHVyZXNBY3Rpb24sIEZlYXR1cmVzVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZXMnLFxuICBpbml0aWFsOiAnaWRsZScsXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBjb250ZXh0OiB7XG4gICAgZmVhdHVyZXM6IHt9LFxuICB9LFxuICBzdGF0ZXM6IHtcbiAgICBpZGxlOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiB7XG4gICAgICAgICAgdGFyZ2V0OiAncmVhZHknLFxuICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmVzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY29udGV4dCwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXM6IHR5cGVvZiBjb250ZXh0LmZlYXR1cmVzID0ge307XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGV2ZW50LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbZmVhdHVyZS5uYW1lXSA9IHNwYXduKEZlYXR1cmVNYWNoaW5lLCB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBmZWF0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzW2ZlYXR1cmUubmFtZV0uc2VuZCh7IHR5cGU6ICdJTklUJywgZmVhdHVyZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gdGhlIGZlYXR1cmVzIGFyZSBsb2FkZWQgYW5kIHJlYWR5IHRvIGJlIHVzZWRcbiAgICByZWFkeToge1xuICAgICAgb246IHtcbiAgICAgICAgREVfSU5JVDogeyB0YXJnZXQ6ICdpZGxlJywgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZXM6IChfLCBfXykgPT4gKHt9KSB9KSB9LFxuICAgICAgICBTRVRfQUxMOiB7XG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0geyAuLi5jdHguZmVhdHVyZXMgfTtcbiAgICAgICAgICAgICAgLy8gQWxsIGNvbmZpZ3VyZWQgZmVhdHVyZXMgYXJlIHNldCB0byBvbi9vZmYgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZlYXR1cmVzKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0uc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS5mZWF0dXJlc1tuYW1lXSA/PyB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFNldCBhIGZlYXR1cmUgdG8gYSB2YWx1ZVxuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS52YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHRvZ2dsZSBhIGZlYXR1cmVcbiAgICAgICAgVE9HR0xFOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVE9HR0xFJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHdoZW4gYSBmZWF0dXJlIGlzIGVuYWJsZWQsIHNlbmQgdGhlIGVuYWJsZSBtZXNzYWdlIHRvIHRoZSBhY3RvclxuICAgICAgICBFTkFCTEU6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdFTkFCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgZGlzYWJsZWQsIHNlbmQgdGhlIGRpc2FibGUgbWVzc2FnZSB0byB0aGUgYWN0b3JcbiAgICAgICAgRElTQUJMRToge1xuICAgICAgICAgIGFjdGlvbnM6IChjdHgsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjdHguZmVhdHVyZXNbZS5uYW1lXTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZmVhdHVyZS5zZW5kKHsgdHlwZTogJ0RJU0FCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgdW5zZXQsIHNlbmQgdGhlIHVuc2V0IG1lc3NhZ2UgdG8gdGhlIGFjdG9yXG4gICAgICAgIFVOU0VUOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVU5TRVQnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIERvbmVJbnZva2VFdmVudCwgSW50ZXJwcmV0ZXJGcm9tLCBTdGF0ZUZyb20gfSBmcm9tICd4c3RhdGUnO1xuXG4vKipcbiAqIEZlYXR1cmUgaXMgZWl0aGVyIG9uLCBvZmYsIG9yICd1bnNldCcsXG4gKiB3aGljaCBtZWFucyBpdCB3aWxsIGdvIHRvIHRoZSBkZWZhdWx0IHZhbHVlIG9yIHRoZSBsZXNzIHNwZWNpZmljIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlVmFsdWUgPSBmYWxzZSB8IHRydWUgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+O1xuZXhwb3J0IHR5cGUgRmVhdHVyZURpc3BhdGNoID0gSW50ZXJwcmV0ZXJGcm9tPHR5cGVvZiBGZWF0dXJlTWFjaGluZT5bJ3NlbmQnXTtcblxuLy8vIEdpdmVuIGEgZmVhdHVyZXN0YXRlLCBkZXRlcm1pbmUgdGhlIHZhbHVlIChvbiwgb2ZmLCBvciB1bnNldClcbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUZvclN0YXRlKGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlKTogW0ZlYXR1cmVWYWx1ZSwgYm9vbGVhbl0ge1xuICByZXR1cm4gW1xuICAgIGZlYXR1cmVTdGF0ZS5tYXRjaGVzKCdlbmFibGVkJykgPyB0cnVlIDogZmVhdHVyZVN0YXRlLm1hdGNoZXMoJ2Rpc2FibGVkJykgPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICBmZWF0dXJlU3RhdGUuY29udGV4dC5mZWF0dXJlRGVzYz8uZm9yY2UgPz8gZmFsc2UsXG4gIF07XG59XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIGZlYXR1cmUgdGhhdCBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAqIEsgaXMgdGhlIHR5cGUgb2YgdGhlIGtleSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGZlYXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZURlc2NyaXB0aW9uPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgcmVhZG9ubHkgbmFtZTogSztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8vIElmIHNldCwgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSBkZWZhdWx0IHN0YXRlIGluc3RlYWQgb2Ygc2ltcGx5IG92ZXJyaWRpbmcuXG4gIC8vLyBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHVzZSB0aGlzIHRvIHVwZGF0ZSBhIGZlYXR1cmUgZmxhZyBvbiBhIGJhY2tlbmQgc2VydmVyLlxuICAvLy8gd2hlbiBzZXQsIHRoZSBmZWF0dXJlIHdpbGwgYmUgdXBkYXRlZCBvbiB0aGUgYmFja2VuZCBzZXJ2ZXIsIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY1xuICAvLy8gd2lsbCBiZSB1c2VkIGZvciB0aGUgZmluYWwgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZS4gd2hpbGUgY2hhbmdpbmcsIHRoZSBmZWF0dXJlIHdpbGwgYmVcbiAgLy8vIGluIHRoZSAnY2hhbmdpbmcnIHN0YXRlLiBBbHNvIG5vdGUgdGhhdCB0aGUgZmVhdHVyZSB3aWxsIGJlIGNoYW5nZWQgYXQgdGhlIFwiZGVmYXVsdFwiIGxheWVyLlxuICByZWFkb25seSBvbkNoYW5nZURlZmF1bHQ/OiAobmFtZTogSywgbmV3VmFsdWU6IEZlYXR1cmVWYWx1ZSkgPT4gUHJvbWlzZTxGZWF0dXJlVmFsdWU+O1xuXG4gIC8vLyBpZiBzZXQgdHJ1ZSwgd2lsbCBmb3JjZSB0aGUgZmllbGQgdG8gd2hhdCBpdCBpcyBzZXQgaGVyZSB0aHJvdWdoIGxheWVycyBvZiBzdGF0ZXMuXG4gIC8vLyB1c2VmdWwgdG8gaW52ZXJ0IHRoZSBsYXllcnMsIHNpbWlsYXIgdG8gIWltcG9ydGFudCBpbiBDU1MuXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvLy8gSWYgc2V0IHRvIHRydWUsIHRoZSBmZWF0dXJlIHdpbGwgbm90IGJlIG92ZXJyaWRhYmxlIGJ5IHRoZSB1c2VyLlxuICByZWFkb25seSBub092ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvLy8gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHNldCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuXG4gIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZT86IEZlYXR1cmVWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIEZlYXR1cmVDb250ZXh0IHtcbiAgZmVhdHVyZURlc2M/OiBGZWF0dXJlRGVzY3JpcHRpb247XG59XG5cbnR5cGUgRmVhdHVyZVR5cGVTdGF0ZSA9XG4gIHwge1xuICAgICAgdmFsdWU6ICdhc3luY0RlbmFibGVkJztcbiAgICAgIGNvbnRleHQ6IEZlYXR1cmVDb250ZXh0O1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ2FzeW5jRGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnYXN5bmNVbnNwZWNpZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZW5hYmxlZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9XG4gIHwge1xuICAgICAgdmFsdWU6ICdpbml0aWFsJztcbiAgICAgIGNvbnRleHQ6IG5ldmVyO1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ3Vuc3BlY2llZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9O1xuXG4vKipcbiAqIEFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZUFjdGlvbiA9XG4gIHwgeyB0eXBlOiAnRElTQUJMRScgfVxuICB8IHsgdHlwZTogJ0VOQUJMRScgfVxuICB8IHsgdHlwZTogJ0lOSVQnOyBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb24gfVxuICB8IHsgdHlwZTogJ1NFVCc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRScgfVxuICB8IHsgdHlwZTogJ1VOU0VUJyB9O1xuXG4vKipcbiAqIEZ1bGx5IGRlc2NyaWJlIHRoZSBzdGF0ZXMgYSBmZWF0dXJlIGNhbiBiZSBpblxuICovXG5leHBvcnQgY29uc3QgRmVhdHVyZU1hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVDb250ZXh0LCBGZWF0dXJlQWN0aW9uLCBGZWF0dXJlVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZScsXG4gIGluaXRpYWw6ICdpbml0aWFsJyxcbiAgY29udGV4dDoge30sXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBvbjoge1xuICAgIEVOQUJMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFRPR0dMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIERJU0FCTEU6IFtcbiAgICAgIHsgdGFyZ2V0OiAnYXN5bmNEaXNhYmxlZCcsIGNvbmQ6IChjdHgpID0+IGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwgfSxcbiAgICAgIHsgdGFyZ2V0OiAnZGlzYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFVOU0VUOiBbXG4gICAgICB7IHRhcmdldDogJ2FzeW5jVW5zcGVjaWVkJywgY29uZDogKGN0eCkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCB9LFxuICAgICAgeyB0YXJnZXQ6ICd1bnNwZWNpZmllZCcgfSxcbiAgICBdLFxuXG4gICAgU0VUOiBbXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRW5hYmxlZCcsXG4gICAgICAgIGNvbmQ6IChjdHgsIGUpID0+IGUudmFsdWUgPT09IHRydWUgJiYgY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRGlzYWJsZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBlKSA9PiBlLnZhbHVlID09PSBmYWxzZSAmJiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGFyZ2V0OiAnYXN5bmNVbnNwZWNpZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBfZSkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICBjb25kOiAoX2N0eCwgZSkgPT4gZS52YWx1ZSA9PT0gdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgY29uZDogKF9jdHgsIGUpID0+IGUudmFsdWUgPT09IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgXSxcbiAgfSxcblxuICBzdGF0ZXM6IHtcbiAgICBpbml0aWFsOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdlbmFibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICd1bnNwZWNpZmllZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHVuc3BlY2lmaWVkOiB7fSxcbiAgICBkaXNhYmxlZDoge30sXG4gICAgZW5hYmxlZDoge30sXG5cbiAgICBhc3luY0Rpc2FibGVkOiB7XG4gICAgICBpbnZva2U6IHtcbiAgICAgICAgaWQ6ICdzZXQtb2ZmLXVwc3RyZWFtJyxcbiAgICAgICAgc3JjOiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25jaGFuZ2UgPSBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdDtcbiAgICAgICAgICBpZiAob25jaGFuZ2UgIT0gbnVsbCAmJiBjdHguZmVhdHVyZURlc2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uY2hhbmdlKGN0eC5mZWF0dXJlRGVzYy5uYW1lLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgYXN5bmNVbnNwZWNpZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC11bnNldC11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgb25Eb25lOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0OiAnZW5hYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfY3R4LCBlOiBEb25lSW52b2tlRXZlbnQ8RmVhdHVyZVZhbHVlPikgPT4gZS5kYXRhID09PSBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG9uRXJyb3I6ICd1bnNwZWNpZmllZCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBhc3luY0VuYWJsZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC1vbi11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8sIFJlYWN0Tm9kZSwgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZU1hY2hpbmUgfSBmcm9tICdAeHN0YXRlL3JlYWN0JztcblxuaW1wb3J0IHsgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5pbXBvcnQgeyBGZWF0dXJlQ29udGV4dCB9IGZyb20gJy4vRmVhdHVyZUNvbnRleHQnO1xuaW1wb3J0IHsgRmVhdHVyZXNNYWNoaW5lIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVEZXNjcmlwdGlvbiB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB1c2VDb25zb2xlT3ZlcnJpZGUgZnJvbSAnLi91c2VDb25zb2xlT3ZlcnJpZGUnO1xuaW1wb3J0IHVzZVBlcnNpc3QsIHsgS0VZIH0gZnJvbSAnLi91c2VQZXJzaXN0JztcbmltcG9ydCB1c2VUZXN0Q2FsbGJhY2sgZnJvbSAnLi91c2VUZXN0Q2FsbGJhY2snO1xuXG5pbnRlcmZhY2UgRmVhdHVyZVByb3BzIHtcbiAgcmVhZG9ubHkgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuICByZWFkb25seSBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgZGlzYWJsZUNvbnNvbGU/OiBib29sZWFuO1xuICByZWFkb25seSBzdG9yYWdlPzogU3RvcmFnZTtcbn1cblxuLyoqXG4gKiBBIG1vcmUgYmF0dGVyaWVzLWVuYWJsZWQgcGFyZW50IGNvbXBvbmVudCB0aGF0IGtlZXBzIHRyYWNrIG9mIGZlYXR1cmUgc3RhdGVcbiAqIGludGVybmFsbHksIGFuZCBjcmVhdGVzIHdpbmRvdy5mZWF0dXJlLmVuYWJsZShcImZcIikgYW5kIHdpbmRvdy5mZWF0dXJlLmRpc2FibGUoXCJmXCIpLlxuICogS2VlcHMgdHJhY2sgb2Ygb3ZlcnJpZGVzIGFuZCBkZWZhdWx0cywgd2l0aCBkZWZhdWx0cyBwb3RlbnRpYWxseSBjb21pbmcgZnJvbSB5b3VyIHByb3BzXG4gKiBhbmQgb3ZlcnJpZGVzIGJlaW5nIHBlcnNpc3RlZCB0byB5b3VyIGNob2ljZSBvZiBzdG9yYWdlIGxheWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRmVhdHVyZXMoe1xuICBjaGlsZHJlbixcbiAgZmVhdHVyZXMsXG4gIGRpc2FibGVDb25zb2xlID0gZmFsc2UsXG4gIHN0b3JhZ2UgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UsXG59OiBGZWF0dXJlUHJvcHMpOiBKU1guRWxlbWVudCB7XG4gIC8vIENhcHR1cmUgb25seSBmaXJzdCB2YWx1ZTsgd2UgZG9uJ3QgY2FyZSBhYm91dCBmdXR1cmUgdXBkYXRlc1xuICBjb25zdCBmZWF0dXJlc1JlZiA9IHVzZVJlZihmZWF0dXJlcyk7XG4gIGNvbnN0IFtvdmVycmlkZXNTdGF0ZSwgb3ZlcnJpZGVzU2VuZF0gPSB1c2VNYWNoaW5lKEZlYXR1cmVzTWFjaGluZSk7XG4gIGNvbnN0IFtkZWZhdWx0c1N0YXRlLCBkZWZhdWx0c1NlbmRdID0gdXNlTWFjaGluZShGZWF0dXJlc01hY2hpbmUpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8vIExvYWQgZGVmYXVsdHNcbiAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnSU5JVCcsIGZlYXR1cmVzIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2RlZmF1bHRzU2VuZCwgZmVhdHVyZXNdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBmOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgIGlmIChzdG9yYWdlICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzSnNvbiA9IHN0b3JhZ2UuZ2V0SXRlbShLRVkpO1xuICAgICAgICBpZiAoZmVhdHVyZXNKc29uICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaCA9IEpTT04ucGFyc2UoZmVhdHVyZXNKc29uKTtcbiAgICAgICAgICBmID0gZmgub3ZlcnJpZGVzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIENhbid0IHBhcnNlIG9yIGdldCBvciBvdGhlcndpc2U7IGlnbm9yZVxuICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBpbiBsb2NhbFN0b3JhZ2UnLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZXNTZW5kKHtcbiAgICAgIHR5cGU6ICdJTklUJyxcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlc1JlZi5jdXJyZW50XG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHgubm9PdmVycmlkZSAhPT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeCkgPT4gKHsgbmFtZTogeC5uYW1lLCBkZXNjcmlwdGlvbjogeC5kZXNjcmlwdGlvbiwgZGVmYXVsdFZhbHVlOiBmPy5beC5uYW1lXSA/PyB1bmRlZmluZWQgfSkpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG92ZXJyaWRlc1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzUmVmLCBvdmVycmlkZXNTZW5kLCBzdG9yYWdlXSk7XG5cbiAgdXNlUGVyc2lzdChzdG9yYWdlLCBmZWF0dXJlc1JlZi5jdXJyZW50LCBvdmVycmlkZXNTdGF0ZSk7XG5cbiAgY29uc3QgdGVzdENhbGxiYWNrID0gdXNlVGVzdENhbGxiYWNrKG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlKTtcbiAgdXNlQ29uc29sZU92ZXJyaWRlKCFkaXNhYmxlQ29uc29sZSwgZmVhdHVyZXNSZWYuY3VycmVudCwgdGVzdENhbGxiYWNrLCBkZWZhdWx0c1NlbmQpO1xuXG4gIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIG92ZXJyaWRlc1NlbmQsXG4gICAgICBkZWZhdWx0c1NlbmQsXG4gICAgICBmZWF0dXJlc0Rlc2NyaXB0aW9uOiBmZWF0dXJlc1JlZi5jdXJyZW50LFxuICAgICAgb3ZlcnJpZGVzU3RhdGUsXG4gICAgICBkZWZhdWx0c1N0YXRlLFxuICAgICAgdGVzdDogdGVzdENhbGxiYWNrLFxuICAgIH0pLFxuICAgIFtvdmVycmlkZXNTZW5kLCBkZWZhdWx0c1NlbmQsIG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlLCB0ZXN0Q2FsbGJhY2tdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmVhdHVyZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ZlYXR1cmVWYWx1ZX0+XG4gICAgICA8RW5hYmxlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dGVzdENhbGxiYWNrfT57Y2hpbGRyZW59PC9FbmFibGVDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvRmVhdHVyZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgdHlwZSBFbmFibGVDb250ZXh0VHlwZSA9IChmZWF0dXJlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuLyoqXG4gKiBDb250YWluZWQgZnVuY3Rpb24gY2FuIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBFbmFibGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxFbmFibGVDb250ZXh0VHlwZT4oKF9zKSA9PiBmYWxzZSk7XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCwgRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IGNvbnN0IEZlYXR1cmVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxGZWF0dXJlQ29udGV4dFR5cGUgfCBudWxsPihudWxsKTtcblxuLy8vIEdpdmUgYWNjZXNzIHRvIHRoZSBvdmVycmlkZXMgbGF5ZXJcbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZUNvbnRleHRUeXBlIHtcbiAgLy8gTWFrZSBjaGFuZ2VzIHRvIHRoZSBvdmVycmlkZXNcbiAgb3ZlcnJpZGVzU2VuZDogRmVhdHVyZXNEaXNwYXRjaDtcblxuICAvLyBNYWtlIGNoYW5nZXMgdG8gZGVmYXVsdHNcbiAgZGVmYXVsdHNTZW5kOiBGZWF0dXJlc0Rpc3BhdGNoO1xuXG4gIGZlYXR1cmVzRGVzY3JpcHRpb246IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuXG4gIC8vIFN0YXRlIGlzIGluIGxheWVyczsgb3ZlcnJpZGVzIGFuZCBkZWZhdWx0c1xuICBvdmVycmlkZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcblxuICAvLy8gVGVzdCB3aXRoIHByb3BlciBmYWxsYmFjayBhbmQgcmVzcGVjdGluZyB0aGUgdXNlcidzIGZvcmNlIHByZWZlcmVuY2VcbiAgdGVzdDogKGZsYWc6IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlO1xufVxuIiwgImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IEdsb2JhbEVuYWJsZSB9IGZyb20gJy4vR2xvYmFsRW5hYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ29uc29sZU92ZXJyaWRlKFxuICBjb25zb2xlT3ZlcnJpZGU6IGJvb2xlYW4sXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2hcbik6IHZvaWQge1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29uc29sZU92ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvKiBlbXB0eSAqL1xuICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93LmZlYXR1cmUgPSBuZXcgR2xvYmFsRW5hYmxlKGRpc3BhdGNoLCB0ZXN0RmVhdHVyZSwgZmVhdHVyZXMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAod2luZG93LmZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgd2luZG93LmZlYXR1cmU7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzLCBkaXNwYXRjaCwgY29uc29sZU92ZXJyaWRlLCB0ZXN0RmVhdHVyZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzRGlzcGF0Y2ggfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBHbG9iYWxFbmFibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaDtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0RmVhdHVyZTogKHZhbHVlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaCxcbiAgICB0ZXN0RmVhdHVyZTogKF86IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlLFxuICAgIGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXVxuICApIHtcbiAgICB0aGlzLmZlYXR1cmVEZXNjID0gZmVhdHVyZURlc2M7XG4gICAgdGhpcy5kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMudGVzdEZlYXR1cmUgPSB0ZXN0RmVhdHVyZTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdUT0dHTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5zZXQoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0RJU0FCTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFsbChmZWF0dXJlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0FMTCcsIGZlYXR1cmVzIH0pO1xuICB9XG5cbiAgcHVibGljIGxpc3RGZWF0dXJlcygpOiByZWFkb25seSBbc3RyaW5nLCBGZWF0dXJlVmFsdWVdW10ge1xuICAgIHJldHVybiB0aGlzLmZlYXR1cmVEZXNjLm1hcCgoZikgPT4gW2YubmFtZSwgdGhpcy50ZXN0RmVhdHVyZShmLm5hbWUpXSk7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgZmVhdHVyZT86IEdsb2JhbEVuYWJsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHVzZU1lbW8sIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNTdGF0ZSwgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjb25zdCBLRVkgPSAncmVhY3QtZW5hYmxlOmZlYXR1cmUtdmFsdWVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUGVyc2lzdChcbiAgc3RvcmFnZTogU3RvcmFnZSB8IHVuZGVmaW5lZCxcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdLFxuICBvdmVycmlkZVN0YXRlOiBGZWF0dXJlc1N0YXRlXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbmV3T3ZlcnJpZGVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9ID0ge307XG4gICAgaWYgKG92ZXJyaWRlU3RhdGUubWF0Y2hlcygncmVhZHknKSkge1xuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZV0gPSB2YWx1ZU9mRmVhdHVyZShvdmVycmlkZVN0YXRlLCBmZWF0dXJlLm5hbWUpO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld092ZXJyaWRlc1tmZWF0dXJlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld092ZXJyaWRlcztcbiAgfSwgW2ZlYXR1cmVzLCBvdmVycmlkZVN0YXRlXSk7XG5cbiAgY29uc3Qgc3RyU3RhdGUgPSBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA9PT0gMCB8fCBzdG9yYWdlID09IG51bGwgPyAne30nIDogSlNPTi5zdHJpbmdpZnkoeyBvdmVycmlkZXMgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHN0b3JhZ2UgIT0gbnVsbCAmJiBvdmVycmlkZVN0YXRlLm1hdGNoZXMoJ3JlYWR5JykpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKEtFWSwgc3RyU3RhdGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbid0IHNldCBmb3Igc29tZSByZWFzb25cbiAgICB9XG4gIH0sIFtvdmVycmlkZVN0YXRlLCBzdG9yYWdlLCBzdHJTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBGZWF0dXJlc1N0YXRlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB0ZXN0RmVhdHVyZSBmcm9tICcuL3Rlc3RGZWF0dXJlJztcblxuLy8vIEEgY2FsbGJhY2sgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIHRlc3QgaWYgYSBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWRcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRlc3RDYWxsYmFjayhcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbiAgb3ZlcnJpZGVzU3RhdGU6IEZlYXR1cmVzU3RhdGVcbik6IChmZWF0dXJlOiBzdHJpbmcpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXNlQ2FsbGJhY2soKGY6IHN0cmluZykgPT4gdGVzdEZlYXR1cmUoZiwgW2RlZmF1bHRzU3RhdGUsIG92ZXJyaWRlc1N0YXRlXSksIFtkZWZhdWx0c1N0YXRlLCBvdmVycmlkZXNTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzU3RhdGUsIHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuLyoqIERldGVybWluZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkIGluIG9uZSBvZiB0aGUgc3RhdGUgbWFjaGluZXMsIGluIG9yZGVyXG4gKlxuICogQHBhcmFtIHN0YXRlIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtYWNoaW5lXG4gKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSB0byBjaGVja1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRlc3RGZWF0dXJlKGZlYXR1cmU6IHN0cmluZywgc3RhdGVzOiBGZWF0dXJlc1N0YXRlW10pOiBGZWF0dXJlVmFsdWUge1xuICBjb25zdCB2YWx1ZXMgPSBzdGF0ZXMubWFwKChzdGF0ZSkgPT4gdmFsdWVPZkZlYXR1cmUoc3RhdGUsIGZlYXR1cmUpKTtcblxuICAvLyBsb29rIGZvciBiZXN0IGZvcmNlZCBvcHRpb24sIGluIG9yZGVyXG4gIGZvciAoY29uc3QgW2ZlYXR1cmVWYWx1ZSwgZmVhdHVyZUZvcmNlZF0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKGZlYXR1cmVWYWx1ZSAhPSBudWxsICYmIGZlYXR1cmVGb3JjZWQpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gbG9vayBmb3IgYmVzdCBub24tZm9yY2VkIG9wdGlvbiwgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBbZmVhdHVyZVZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoZmVhdHVyZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gdW5zZXQgaWYgbm90aGluZyBoaXRcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZUFsbEVuYWJsZWQgfSBmcm9tICcuL3VzZUFsbEVuYWJsZWQnO1xuaW1wb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUHJvcHMge1xuICByZWFkb25seSBmZWF0dXJlPzogc3RyaW5nW10gfCBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsbEZlYXR1cmVzPzogc3RyaW5nW107XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGVuYWJsZWQgaWYgYW55IGZlYXR1cmUgaW4gdGhlIGxpc3QgYXJlIGVuYWJsZWQsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbmFibGUoeyBmZWF0dXJlID0gW10sIGFsbEZlYXR1cmVzID0gW10sIGNoaWxkcmVuIH06IEVuYWJsZVByb3BzKTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgaXNBbnkgPSB1c2VFbmFibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXMpO1xuXG4gIGlmIChpc0FueSB8fCBpc0FsbCkge1xuICAgIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBFbmFibGVDb250ZXh0VHlwZSwgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5cbi8vIEhlbHBlcjogZ2V0IHJpZCBvZiBzb21lIGJvaWxlcnBsYXRlLlxuLy8ganVzdCBpbnB1dCBtYXNoaW5nIGFuZCBzYW5pdGF0aW9uLCByZW1vdmluZyBleHRyYSByZW5kZXJzLCBhbmQgZ2V0dGluZyB0ZXN0IGZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gdXNlVGVzdEFuZENvbnZlcnQoaW5wdXQ/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiBbRW5hYmxlQ29udGV4dFR5cGUsIHN0cmluZ1tdXSB7XG4gIGNvbnN0IHRlc3QgPSB1c2VDb250ZXh0KEVuYWJsZUNvbnRleHQpO1xuXG4gIC8vIFdlIG1lbW9pemUganVzdCB0byBwcmV2ZW50IHJlLXJlbmRlcnMgc2luY2UgdGhpcyBjb3VsZCBiZSBhdCB0aGUgbGVhZiBvZiBhIHRyZWVcbiAgY29uc3QgY29udmVydGVkID0gdXNlTWVtbygoKSA9PiAoaW5wdXQgPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF0pLCBbaW5wdXRdKTtcblxuICByZXR1cm4gW3Rlc3QsIGNvbnZlcnRlZF07XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFsbCBzcGVjaWZpZWQgZmVhdHVyZXMgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFsbFByZXNlbnRdID0gdXNlVGVzdEFuZENvbnZlcnQoYWxsRmVhdHVyZXMpO1xuICByZXR1cm4gcXVlcnlBbGxQcmVzZW50Lmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxQcmVzZW50LmV2ZXJ5KHRlc3QpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRW5hYmxlZChmZWF0dXJlOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbnlQcmVzZW50XSA9IHVzZVRlc3RBbmRDb252ZXJ0KGZlYXR1cmUpO1xuICByZXR1cm4gcXVlcnlBbnlQcmVzZW50LnNvbWUodGVzdCk7XG59XG4iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IEVuYWJsZVByb3BzIH0gZnJvbSBcIi4vRW5hYmxlXCI7XG5pbXBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gXCIuL3VzZUFsbERpc2FibGVkXCI7XG5pbXBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gXCIuL3VzZURpc2FibGVkXCI7XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGRpc2FibGVkIGlmIGFueSBpbiB0aGUgbGlzdCBhcmUgZW5hYmxlZFxuICovXG5leHBvcnQgY29uc3QgRGlzYWJsZTogUmVhY3QuRkM8RW5hYmxlUHJvcHM+ID0gKHtcbiAgZmVhdHVyZSA9IFtdLFxuICBhbGxGZWF0dXJlcyA9IFtdLFxuICBjaGlsZHJlblxufSkgPT4ge1xuICBjb25zdCBpc0FueSA9IHVzZURpc2FibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbERpc2FibGVkKGFsbEZlYXR1cmVzKTtcblxuICBpZiAoaXNBbnkgfHwgaXNBbGwpIHtcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbGwgc3BlY2lmaWVkIGZlYXR1cmVzIGFyZSBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWxsRGlzYWJsZWQod2l0aG91dEFsbDogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QWxsV2l0aG91dF0gPSB1c2VUZXN0QW5kQ29udmVydCh3aXRob3V0QWxsKTtcbiAgcmV0dXJuIHdpdGhvdXRBbGwubGVuZ3RoID4gMCAmJiBxdWVyeUFsbFdpdGhvdXQuZXZlcnkoKHgpID0+ICEodGVzdCh4KSA/PyBmYWxzZSkpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURpc2FibGVkKHdpdGhvdXQ6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFueVdpdGhvdXRdID0gdXNlVGVzdEFuZENvbnZlcnQod2l0aG91dCk7XG4gIHJldHVybiBxdWVyeUFueVdpdGhvdXQuc29tZSgoeCkgPT4gISh0ZXN0KHgpID8/IGZhbHNlKSk7XG59XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCB7IFJhZGlvR3JvdXAgfSBmcm9tICdAaGVhZGxlc3N1aS9yZWFjdCc7XG5cbmltcG9ydCB7IEZlYXR1cmVDb250ZXh0IH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5pbXBvcnQgeyB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24gfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG4vLyBAdHMtZXhwZWN0LWVycm9yIGJ1bmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhpc1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3RhaWx3aW5kLmNzcyc7XG5cbmZ1bmN0aW9uIGNsYXNzTmFtZXMoLi4uY2xhc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gY2xhc3Nlcy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBUb2dnbGVGZWF0dXJlKHsgZmVhdHVyZSB9OiB7IGZlYXR1cmU6IEZlYXR1cmVEZXNjcmlwdGlvbiB9KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuICBjb25zdCBoYW5kbGVDaGFuZ2VTZWxlY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6ICdmYWxzZScgfCAndHJ1ZScgfCAndW5zZXQnKSA9PiB7XG4gICAgICBpZiAoY29udGV4dD8ub3ZlcnJpZGVzU2VuZCAhPSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICBjYXNlICd0cnVlJzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdmYWxzZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdESVNBQkxFJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3Vuc2V0Jzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ1VOU0VUJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmVhdHVyZS5uYW1lLCBjb250ZXh0XVxuICApO1xuXG4gIGlmIChjb250ZXh0ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgb3ZlcnJpZGVzU3RhdGUsIHRlc3Q6IHRlc3RGZWF0dXJlLCBkZWZhdWx0c1N0YXRlIH0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHZhbHVlSW5EZWZhdWx0cyA9ICh2YWx1ZU9mRmVhdHVyZShkZWZhdWx0c1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCB2YWx1ZUluT3ZlcnJpZGVzID0gKHZhbHVlT2ZGZWF0dXJlKG92ZXJyaWRlc1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCBhY3R1YWxDaGVja2VkID0gdGVzdEZlYXR1cmUoZmVhdHVyZS5uYW1lKTtcblxuICByZXR1cm4gKFxuICAgIDxSYWRpb0dyb3VwIGRpc2FibGVkPXtmZWF0dXJlLm5vT3ZlcnJpZGV9IG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2VTZWxlY3Rpb259IHZhbHVlPXt2YWx1ZUluT3ZlcnJpZGVzfT5cbiAgICAgIDxSYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICA8aDYgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTkwMCBhbGlnbi1jZW50ZXIgZmxleCBmbGV4LXJvdyBmbGV4LW5vd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTIgbGc6Z2FwLTQgaC03XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgIEZlYXR1cmU6IDxjb2RlPntmZWF0dXJlLm5hbWV9PC9jb2RlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7ZmVhdHVyZS5ub092ZXJyaWRlID09PSB0cnVlID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItb3JhbmdlLTUwMCB0ZXh0LW9yYW5nZS01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk01IDlWN2E1IDUgMCAwMTEwIDB2MmEyIDIgMCAwMTIgMnY1YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMnYtNWEyIDIgMCAwMTItMnptOC0ydjJIN1Y3YTMgMyAwIDAxNiAwelwiXG4gICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2Pk5vIE92ZXJyaWRlczwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAge2FjdHVhbENoZWNrZWQgPT09IHRydWUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1ub3dyYXAgdGV4dC14cyB0ZXh0LWdyZWVuLTUwMCBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWdyZWVuLTUwMCBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdj57YWN0dWFsQ2hlY2tlZCA/ICdFbmFibGVkJyA6ICdEaXNhYmxlZCd9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9oNj5cbiAgICAgICAge2ZlYXR1cmUuZGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UgdGV4dC1ncmF5LTUwMCB0ZXh0LXNtXCI+e2ZlYXR1cmUuZGVzY3JpcHRpb259PC9wPn1cbiAgICAgIDwvUmFkaW9Hcm91cC5MYWJlbD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBncmlkIGdyaWQtY29scy0xIGdhcC15LTYgc206Z3JpZC1jb2xzLTMgc206Z2FwLXgtNFwiPlxuICAgICAgICB7W1xuICAgICAgICAgIHsgaWQ6ICdmYWxzZScsIHRpdGxlOiBgRGlzYWJsZSAke2ZlYXR1cmUubmFtZX1gLCBkZXNjcmlwdGlvbjogJ092ZXJyaWRlIHRoZSBmZWF0dXJlIHRvIGJlIGRpc2FibGVkJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndW5zZXQnLFxuICAgICAgICAgICAgdGl0bGU6ICdEZWZhdWx0JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSW5oZXJpdCBlbmFibGVkIHN0YXRlIGZyb20gZGVmYXVsdHMnLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IChmZWF0dXJlLm5vT3ZlcnJpZGUgPz8gZmFsc2UpIHx8IGZlYXR1cmUuZm9yY2UsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6XG4gICAgICAgICAgICAgIHZhbHVlSW5EZWZhdWx0cyA9PT0gJ3RydWUnID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ncmVlbi01MDAgYm9yZGVyLWdyZWVuLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RW5hYmxlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtcmVkLTUwMCBib3JkZXItcmVkLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RGlzYWJsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGlkOiAndHJ1ZScsIHRpdGxlOiBgRW5hYmxlICR7ZmVhdHVyZS5uYW1lfWAsIGRlc2NyaXB0aW9uOiAnT3ZlcnJpZGUgdGhlIGZlYXR1cmUgdG8gYmUgZW5hYmxlZCcgfSxcbiAgICAgICAgXS5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxSYWRpb0dyb3VwLk9wdGlvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXsoeyBjaGVja2VkLCBhY3RpdmUsIGRpc2FibGVkIH0pID0+XG4gICAgICAgICAgICAgIGNsYXNzTmFtZXMoXG4gICAgICAgICAgICAgICAgY2hlY2tlZCA/ICdib3JkZXItdHJhbnNwYXJlbnQnIDogJ2JvcmRlci1ncmF5LTMwMCcsXG4gICAgICAgICAgICAgICAgIWRpc2FibGVkICYmIGFjdGl2ZSA/ICdib3JkZXItYmx1ZS01MDAgcmluZy0yIHJpbmctYmx1ZS01MDAnIDogJycsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPyAnYm9yZGVyLXRyYW5zcGFyZW50IHJpbmctZ3JheS01MDAgY3Vyc29yLW5vdC1hbGxvd2VkJyA6ICdjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICAgICAgJ3JlbGF0aXZlIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkLWxnIHNoYWRvdy1zbSBwLTMgZmxleCBmb2N1czpvdXRsaW5lLW5vbmUnXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc2FibGVkPXtvcHRpb24uZGlzYWJsZWR9XG4gICAgICAgICAgICBrZXk9e29wdGlvbi5pZH1cbiAgICAgICAgICAgIHZhbHVlPXtvcHRpb24uaWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNoZWNrZWQsIGFjdGl2ZSwgZGlzYWJsZWQgfSkgPT4gKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBncm93XCI+XG4gICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5MYWJlbCBhcz1cInNwYW5cIiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtbm93cmFwIGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBncm93IHNocmlua1wiPntvcHRpb24udGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmRlZmF1bHRWYWx1ZSAhPSBudWxsID8gb3B0aW9uLmRlZmF1bHRWYWx1ZSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyghY2hlY2tlZCA/ICdpbnZpc2libGUnIDogJycsICdoLTUgdy01IHRleHQtYmx1ZS01MDAgbWluLXctNCcpfVxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwIDE4YTggOCAwIDEwMC0xNiA4IDggMCAwMDAgMTZ6bTMuNzA3LTkuMjkzYTEgMSAwIDAwLTEuNDE0LTEuNDE0TDkgMTAuNTg2IDcuNzA3IDkuMjkzYTEgMSAwIDAwLTEuNDE0IDEuNDE0bDIgMmExIDEgMCAwMDEuNDE0IDBsNC00elwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuRGVzY3JpcHRpb24gYXM9XCJzcGFuXCIgY2xhc3NOYW1lPVwibXQtMSBmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5EZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgICAgICAhZGlzYWJsZWQgJiYgYWN0aXZlID8gJ2JvcmRlcicgOiAnYm9yZGVyLTInLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkID8gKGRpc2FibGVkID8gJ2JvcmRlci1ncmF5LTUwMCcgOiAnYm9yZGVyLWJsdWUtNTAwJykgOiAnYm9yZGVyLXRyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ2Fic29sdXRlIC1pbnNldC1weCByb3VuZGVkLWxnIHBvaW50ZXItZXZlbnRzLW5vbmUnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1JhZGlvR3JvdXAuT3B0aW9uPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvUmFkaW9Hcm91cD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2hhZG93Q29udGVudCh7IHJvb3QsIGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZTsgcm9vdDogRWxlbWVudCB9KSB7XG4gIHJldHVybiBSZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHJvb3QpO1xufVxuXG4vLy8gUGVybWl0IHVzZXJzIHRvIG92ZXJyaWRlIGZlYXR1cmUgZmxhZ3MgdmlhIGEgR1VJLlxuLy8vIFJlbmRlcnMgYSBzbWFsbCBmbG9hdGluZyBidXR0b24gaW4gbG93ZXIgbGVmdCBvciByaWdodCwgcHJlc3NpbmcgaXQgYnJpbmdzIHVwXG4vLy8gYSBsaXN0IG9mIGZlYXR1cmVzIHRvIHRvZ2dsZSBhbmQgdGhlaXIgY3VycmVudCBvdmVycmlkZSBzdGF0ZS4geW91IGNhbiBvdmVycmlkZSBvbiBvciBvdmVycmlkZSBvZmYsXG4vLy8gb3IgdW5zZXQgdGhlIG92ZXJyaWRlIGFuZCBnbyBiYWNrIHRvIGRlZmF1bHQgdmFsdWUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbmV4cG9ydCBmdW5jdGlvbiBUb2dnbGVGZWF0dXJlcyh7IGRlZmF1bHRPcGVuID0gZmFsc2UsIGhpZGRlbiA9IGZhbHNlIH06IHsgZGVmYXVsdE9wZW4/OiBib29sZWFuOyBoaWRkZW4/OiBib29sZWFuIH0pOiBKU1guRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBbcm9vdCwgc2V0Q29yZVJvb3RdID0gdXNlU3RhdGU8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBzZXRSb290ID0gKGhvc3Q6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgIGlmIChob3N0ID09IG51bGwgfHwgcm9vdCAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0Py5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGNvbnN0IHJlbmRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gc3R5bGVzO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQocmVuZGVyRGl2KTtcbiAgICBzZXRDb3JlUm9vdChyZW5kZXJEaXYpO1xuICB9O1xuXG4gIGlmIChoaWRkZW4pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiByZWY9e3NldFJvb3R9IHN0eWxlPXt7IHpJbmRleDogOTk5OTksIHBvc2l0aW9uOiAnZml4ZWQnLCB3aWR0aDogJzAnLCBoZWlnaHQ6ICcwJywgYm90dG9tOiAwIH19PlxuICAgICAge3Jvb3QgIT0gbnVsbCA/IChcbiAgICAgICAgPFNoYWRvd0NvbnRlbnQgcm9vdD17cm9vdH0+XG4gICAgICAgICAgPFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQgZGVmYXVsdE9wZW49e2RlZmF1bHRPcGVufSAvPlxuICAgICAgICA8L1NoYWRvd0NvbnRlbnQ+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8vIExpa2UgVG9nZ2xlRmVhdHVyZXMsIGJ1dCBkb2VzIG5vdCBpbmplY3Qgc3R5bGVzIGludG8gYSBzaGFkb3cgRE9NIHJvb3Qgbm9kZS5cbi8vLyB1c2VmdWwgaWYgeW91J3JlIHVzaW5nIHRhaWx3aW5kLlxuZXhwb3J0IGZ1bmN0aW9uIFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQoeyBkZWZhdWx0T3BlbiA9IGZhbHNlLCBoaWRkZW4gPSBmYWxzZSB9OiB7IGRlZmF1bHRPcGVuPzogYm9vbGVhbjsgaGlkZGVuPzogYm9vbGVhbiB9KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZGVmYXVsdE9wZW4pO1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChGZWF0dXJlQ29udGV4dCk7XG5cbiAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGhpZGRlbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gV2Ugd2FudDogUmVhbCB2YWx1ZSBhZnRlciBhbGwgbmVzdGluZ3MsIHZhbHVlIG9mIHRoZSBvdmVycmlkZS4gd2UgdG9nZ2xlIG92ZXJyaWRlXG4gIGNvbnN0IHsgZmVhdHVyZXNEZXNjcmlwdGlvbiB9ID0gY29udGV4dDtcblxuICBpZiAoZmVhdHVyZXNEZXNjcmlwdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgbXgtNCBteS00XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSBwLTEgaC04IHctOCBhbGlnbi1taWRkbGUgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1mdWxsIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQganVzdGlmeS1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWJsdWUtNjAwIHNtOnRleHQtc21cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4odHJ1ZSl9XG4gICAgICAgICAgdGl0bGU9XCJUb2dnbGUgZmVhdHVyZXNcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy02IGgtNiBtaW4taC02IG1pbi13LTZcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgIGQ9XCJNMyA2YTMgMyAwIDAxMy0zaDEwYTEgMSAwIDAxLjggMS42TDE0LjI1IDhsMi41NSAzLjRBMSAxIDAgMDExNiAxM0g2YTEgMSAwIDAwLTEgMXYzYTEgMSAwIDExLTIgMFY2elwiXG4gICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFvcGVuID8gbnVsbCA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCB6LTEwIGluc2V0LTAgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWZsZXgtc3RhcnQgbXgtOCBteS00IG1pbi1oLXNjcmVlbiBwdC00IHB4LTQgcGItMTAgc206YmxvY2sgc206cC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGlubGluZS1ibG9jayBhbGlnbi1ib3R0b20gYmctd2hpdGUgcm91bmRlZC1sZyBweC00IHB0LTUgcGItNCB0ZXh0LWxlZnQgb3ZlcmZsb3ctaGlkZGVuIHNoYWRvdy14bCB0cmFuc2Zvcm0gdHJhbnNpdGlvbi1hbGwgc206bXktOCBzbTphbGlnbi1taWRkbGUgc206cC02IGxnOm1heC13LVs4MCVdIG1heC13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgc206bXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgZ2FwLTQgZmxleC1ub3dyYXAgaXRlbXMtY2VudGVyIHNwYWNlLWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncm93IHRleHQtbGcgbGVhZGluZy02IGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj5GZWF0dXJlIEZsYWcgT3ZlcnJpZGVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIEZlYXR1cmVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHVubGVzcyB0aGV5IGFyZSBmb3JjZWQgdXBzdHJlYW0uIFlvdSBjYW4gYWxzbyByZXZlcnQgdG8gZGVmYXVsdC5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtOVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3NOYW1lPVwic3Itb25seVwiPkZlYXR1cmUgRmxhZ3M8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgICAgICAgICB7ZmVhdHVyZXNEZXNjcmlwdGlvbi5tYXAoKGZlYXR1cmUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUb2dnbGVGZWF0dXJlIGZlYXR1cmU9e2ZlYXR1cmV9IGtleT17ZmVhdHVyZS5uYW1lfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIG10LTUgc206bXQtNlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gZm9udC1tZWRpdW0gcHQtMCBwYi0wIHByLTQgcGwtNCBoLTggbGVhZGluZy03IGFsaWduLW1pZGRsZSBjdXJzb3ItcG9pbnRlciByb3VuZGVkLXNtIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBqdXN0aWZ5LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW9mZnNldC0yIGZvY3VzOnJpbmctYmx1ZS02MDAgc206dGV4dC1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0T3BlbihmYWxzZSl9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBEb25lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJxaENBQUEsa09DQUEsTUFBdUYsa0JDQXZGLE1BQW1GLGtCQVk1RSxXQUF1QixFQUFxRCxDQVpuRixRQWFFLE1BQU8sQ0FDTCxFQUFhLFFBQVEsU0FBUyxFQUFJLEdBQU8sRUFBYSxRQUFRLFVBQVUsRUFBSSxHQUFRLE9BQ3BGLFFBQWEsUUFBUSxjQUFyQixjQUFrQyxRQUFsQyxPQUEyQyxFQUM3QyxDQUNGLENBNEVPLEdBQU0sR0FBaUIsb0JBQStELENBQzNGLEdBQUksVUFDSixRQUFTLFVBQ1QsUUFBUyxDQUFDLEVBQ1YsMkJBQTRCLEdBQzVCLEdBQUksQ0FDRixPQUFRLENBQ04sQ0FBRSxPQUFRLGVBQWdCLEtBQU0sQUFBQyxHQUFL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 +`; + +// src/ToggleFeatures.tsx +function classNames(...classes) { + return classes.filter(Boolean).join(" "); +} +function ToggleFeature({ + feature +}) { + var _a, _b, _c; + const context = (0, import_react9.useContext)(FeatureContext); + const handleChangeSelection = (0, import_react9.useCallback)((value) => { + if ((context == null ? void 0 : context.overridesSend) != null) { + switch (value) { + case "true": { + context.overridesSend({ type: "ENABLE", name: feature.name }); + break; + } + case "false": { + context.overridesSend({ type: "DISABLE", name: feature.name }); + break; + } + case "unset": { + context.overridesSend({ type: "UNSET", name: feature.name }); + break; + } + } + } + }, [feature.name, context]); + if (context == null) { + return null; + } + const { overridesState, test: testFeature2, defaultsState } = context; + const valueInDefaults = ((_a = valueOfFeature(defaultsState, feature.name)[0]) != null ? _a : "unset").toString(); + const valueInOverrides = ((_b = valueOfFeature(overridesState, feature.name)[0]) != null ? _b : "unset").toString(); + const actualChecked = testFeature2(feature.name); + return /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup, { + disabled: feature.noOverride, + onChange: handleChangeSelection, + value: valueInOverrides + }, /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup.Label, null, /* @__PURE__ */ import_react9.default.createElement("h6", { + className: "text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7" + }, /* @__PURE__ */ import_react9.default.createElement("span", { + className: "font-medium" + }, "Feature: ", /* @__PURE__ */ import_react9.default.createElement("code", null, feature.name)), feature.noOverride === true ? /* @__PURE__ */ import_react9.default.createElement("div", { + className: "border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" + }, /* @__PURE__ */ import_react9.default.createElement("svg", { + "aria-hidden": "true", + className: "h-4 w-4 min-w-4", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg" + }, /* @__PURE__ */ import_react9.default.createElement("path", { + clipRule: "evenodd", + d: "M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z", + fillRule: "evenodd" + })), /* @__PURE__ */ import_react9.default.createElement("div", null, "No Overrides")) : null, actualChecked === true ? /* @__PURE__ */ import_react9.default.createElement("div", { + className: "flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1" + }, /* @__PURE__ */ import_react9.default.createElement("svg", { + "aria-hidden": "true", + className: "h-4 w-4 min-w-4", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg" + }, /* @__PURE__ */ import_react9.default.createElement("path", { + clipRule: "evenodd", + d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", + fillRule: "evenodd" + })), /* @__PURE__ */ import_react9.default.createElement("div", null, actualChecked ? "Enabled" : "Disabled")) : null), feature.description == null ? null : /* @__PURE__ */ import_react9.default.createElement("p", { + className: "text-base text-gray-500 text-sm" + }, feature.description)), /* @__PURE__ */ import_react9.default.createElement("div", { + className: "mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4" + }, [ + { + id: "false", + title: `Disable ${feature.name}`, + description: "Override the feature to be disabled" + }, + { + id: "unset", + title: "Default", + description: "Inherit enabled state from defaults", + disabled: ((_c = feature.noOverride) != null ? _c : false) || feature.force, + defaultValue: valueInDefaults === "true" ? /* @__PURE__ */ import_react9.default.createElement("div", { + className: "text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" + }, /* @__PURE__ */ import_react9.default.createElement("span", null, "Enabled")) : /* @__PURE__ */ import_react9.default.createElement("div", { + className: "text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" + }, /* @__PURE__ */ import_react9.default.createElement("span", null, "Disabled")) + }, + { + id: "true", + title: `Enable ${feature.name}`, + description: "Override the feature to be enabled" + } + ].map((option) => /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup.Option, { + className: ({ checked, active, disabled }) => classNames(checked ? "border-transparent" : "border-gray-300", !disabled && active ? "border-blue-500 ring-2 ring-blue-500" : "", disabled ? "border-transparent ring-gray-500 cursor-not-allowed" : "cursor-pointer", "relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"), + disabled: option.disabled, + key: option.id, + value: option.id + }, ({ checked, active, disabled }) => /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("div", { + className: "flex flex-col grow" + }, /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup.Label, { + as: "span", + className: "flex flex-nowrap flex-row gap-1 items-center space-between" + }, /* @__PURE__ */ import_react9.default.createElement("span", { + className: "text-sm font-medium text-gray-900 grow shrink" + }, option.title), option.defaultValue != null ? option.defaultValue : null, /* @__PURE__ */ import_react9.default.createElement("svg", { + "aria-hidden": "true", + className: classNames(!checked ? "invisible" : "", "h-5 w-5 text-blue-500 min-w-4"), + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg" + }, /* @__PURE__ */ import_react9.default.createElement("path", { + clipRule: "evenodd", + d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", + fillRule: "evenodd" + }))), /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup.Description, { + as: "span", + className: "mt-1 flex items-center text-sm text-gray-500" + }, option.description)), /* @__PURE__ */ import_react9.default.createElement("div", { + "aria-hidden": "true", + className: classNames(!disabled && active ? "border" : "border-2", checked ? disabled ? "border-gray-500" : "border-blue-500" : "border-transparent", "absolute -inset-px rounded-lg pointer-events-none") + })))))); +} +function ShadowContent({ + root, + children +}) { + return import_react_dom.default.createPortal(children, root); +} +function ToggleFeatures({ + defaultOpen = false, + hidden = false +}) { + const [root, setCoreRoot] = (0, import_react9.useState)(null); + const setRoot = (host) => { + if (host == null || root != null) { + return; + } + const shadowRoot = host == null ? void 0 : host.attachShadow({ mode: "open" }); + const style = document.createElement("style"); + const renderDiv = document.createElement("div"); + style.textContent = tailwind_default; + shadowRoot.appendChild(style); + shadowRoot.appendChild(renderDiv); + setCoreRoot(renderDiv); + }; + if (hidden) { + return null; + } + return /* @__PURE__ */ import_react9.default.createElement("div", { + ref: setRoot, + style: { + zIndex: 99999, + position: "fixed", + width: "0", + height: "0", + bottom: 0 + } + }, root != null ? /* @__PURE__ */ import_react9.default.createElement(ShadowContent, { + root + }, /* @__PURE__ */ import_react9.default.createElement(ToggleFeatureUnwrapped, { + defaultOpen + })) : null); +} +function ToggleFeatureUnwrapped({ + defaultOpen = false, + hidden = false +}) { + const [open, setOpen] = (0, import_react9.useState)(defaultOpen); + const context = (0, import_react9.useContext)(FeatureContext); + if (context == null) { + return null; + } + if (hidden) { + return null; + } + const { featuresDescription } = context; + if (featuresDescription.length === 0) { + return null; + } + return /* @__PURE__ */ import_react9.default.createElement("div", { + className: "relative" + }, /* @__PURE__ */ import_react9.default.createElement("div", { + className: "absolute bottom-0 left-0 mx-4 my-4" + }, /* @__PURE__ */ import_react9.default.createElement("button", { + className: "inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", + onClick: () => setOpen(true), + title: "Toggle features", + type: "button" + }, /* @__PURE__ */ import_react9.default.createElement("svg", { + className: "w-6 h-6 min-h-6 min-w-6", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg" + }, /* @__PURE__ */ import_react9.default.createElement("path", { + clipRule: "evenodd", + d: "M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z", + fillRule: "evenodd" + })))), !open ? null : /* @__PURE__ */ import_react9.default.createElement("div", { + className: "fixed z-10 inset-0 overflow-y-auto" + }, /* @__PURE__ */ import_react9.default.createElement("div", { + className: "flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0" + }, /* @__PURE__ */ import_react9.default.createElement("div", { + className: "relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full" + }, /* @__PURE__ */ import_react9.default.createElement("div", null, /* @__PURE__ */ import_react9.default.createElement("div", { + className: "mt-1 sm:mt-3" + }, /* @__PURE__ */ import_react9.default.createElement("h3", { + className: "flex flex-row gap-4 flex-nowrap items-center space-between" + }, /* @__PURE__ */ import_react9.default.createElement("div", { + className: "grow text-lg leading-6 font-medium text-gray-900" + }, "Feature Flag Overrides")), /* @__PURE__ */ import_react9.default.createElement("p", { + className: "text-sm text-gray-500" + }, "Features can be enabled or disabled unless they are forced upstream. You can also revert to default."), /* @__PURE__ */ import_react9.default.createElement("div", { + className: "mt-6" + }, /* @__PURE__ */ import_react9.default.createElement("fieldset", { + className: "flex flex-col gap-9" + }, /* @__PURE__ */ import_react9.default.createElement("legend", { + className: "sr-only" + }, "Feature Flags"), featuresDescription.map((feature) => /* @__PURE__ */ import_react9.default.createElement(ToggleFeature, { + feature, + key: feature.name + })))), /* @__PURE__ */ import_react9.default.createElement("div", { + className: "flex justify-center items-center mt-5 sm:mt-6" + }, /* @__PURE__ */ import_react9.default.createElement("button", { + className: "inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", + onClick: () => setOpen(false), + type: "button" + }, "Done")))))))); +} +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvRGlzYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9FbmFibGVDb250ZXh0LnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlQWxsRGlzYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VEaXNhYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL0VuYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUFsbEVuYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvRmVhdHVyZXMudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVTdGF0ZS50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VDb25zb2xlT3ZlcnJpZGUudHN4IiwgIi4uLy4uLy4uL3NyYy9HbG9iYWxFbmFibGUudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VQZXJzaXN0LnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlVGVzdENhbGxiYWNrLnRzeCIsICIuLi8uLi8uLi9zcmMvdGVzdEZlYXR1cmUudHN4IiwgIi4uLy4uLy4uL3NyYy9Ub2dnbGVGZWF0dXJlcy50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IERpc2FibGUgfSBmcm9tICcuL0Rpc2FibGUnO1xuZXhwb3J0IHsgRW5hYmxlIH0gZnJvbSAnLi9FbmFibGUnO1xuZXhwb3J0IHR5cGUgeyBFbmFibGVDb250ZXh0VHlwZSB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5leHBvcnQgeyBFbmFibGVDb250ZXh0IH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcbmV4cG9ydCB0eXBlIHsgRmVhdHVyZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5leHBvcnQgdHlwZSB7XG4gIEZlYXR1cmVEZXNjcmlwdGlvbixcbiAgRmVhdHVyZURpc3BhdGNoLFxuICBGZWF0dXJlU3RhdGUsXG4gIEZlYXR1cmVWYWx1ZSxcbn0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuZXhwb3J0IHsgRmVhdHVyZXMgfSBmcm9tICcuL0ZlYXR1cmVzJztcbmV4cG9ydCB7IFRvZ2dsZUZlYXR1cmVzIH0gZnJvbSAnLi9Ub2dnbGVGZWF0dXJlcyc7XG5leHBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gJy4vdXNlQWxsRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlQWxsRW5hYmxlZCB9IGZyb20gJy4vdXNlQWxsRW5hYmxlZCc7XG5leHBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gJy4vdXNlRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG4iLCAiLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogSlNYIHJlcXVpcmVzIFJlYWN0IGF0IHJ1bnRpbWVcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBFbmFibGVQcm9wcyB9IGZyb20gJy4vRW5hYmxlJztcbmltcG9ydCB7IHVzZUFsbERpc2FibGVkIH0gZnJvbSAnLi91c2VBbGxEaXNhYmxlZCc7XG5pbXBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gJy4vdXNlRGlzYWJsZWQnO1xuXG4vKipcbiAqIEZlYXR1cmUgd2lsbCBiZSBkaXNhYmxlZCBpZiBhbnkgaW4gdGhlIGxpc3QgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGNvbnN0IERpc2FibGU6IFJlYWN0LkZDPEVuYWJsZVByb3BzPiA9ICh7XG4gIGZlYXR1cmUgPSBbXSxcbiAgYWxsRmVhdHVyZXMgPSBbXSxcbiAgY2hpbGRyZW4sXG59KSA9PiB7XG4gIGNvbnN0IGlzQW55ID0gdXNlRGlzYWJsZWQoZmVhdHVyZSk7XG4gIGNvbnN0IGlzQWxsID0gdXNlQWxsRGlzYWJsZWQoYWxsRmVhdHVyZXMpO1xuXG4gIGlmIChpc0FueSB8fCBpc0FsbCkge1xuICAgIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG4iLCAiaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRW5hYmxlQ29udGV4dCwgdHlwZSBFbmFibGVDb250ZXh0VHlwZSB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5cbi8vIEhlbHBlcjogZ2V0IHJpZCBvZiBzb21lIGJvaWxlcnBsYXRlLlxuLy8ganVzdCBpbnB1dCBtYXNoaW5nIGFuZCBzYW5pdGF0aW9uLCByZW1vdmluZyBleHRyYSByZW5kZXJzLCBhbmQgZ2V0dGluZyB0ZXN0IGZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gdXNlVGVzdEFuZENvbnZlcnQoXG4gIGlucHV0Pzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLFxuKTogW0VuYWJsZUNvbnRleHRUeXBlLCBzdHJpbmdbXV0ge1xuICBjb25zdCB0ZXN0ID0gdXNlQ29udGV4dChFbmFibGVDb250ZXh0KTtcblxuICAvLyBXZSBtZW1vaXplIGp1c3QgdG8gcHJldmVudCByZS1yZW5kZXJzIHNpbmNlIHRoaXMgY291bGQgYmUgYXQgdGhlIGxlYWYgb2YgYSB0cmVlXG4gIGNvbnN0IGNvbnZlcnRlZCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKGlucHV0ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBbaW5wdXRdKSxcbiAgICBbaW5wdXRdLFxuICApO1xuXG4gIHJldHVybiBbdGVzdCwgY29udmVydGVkXTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IHR5cGUgRW5hYmxlQ29udGV4dFR5cGUgPSAoZmVhdHVyZTogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWU7XG5cbi8qKlxuICogQ29udGFpbmVkIGZ1bmN0aW9uIGNhbiBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gZmVhdHVyZSBpcyBlbmFibGVkLlxuICovXG5leHBvcnQgY29uc3QgRW5hYmxlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RW5hYmxlQ29udGV4dFR5cGU+KChfcykgPT4gZmFsc2UpO1xuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbGwgc3BlY2lmaWVkIGZlYXR1cmVzIGFyZSBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWxsRGlzYWJsZWQod2l0aG91dEFsbDogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QWxsV2l0aG91dF0gPSB1c2VUZXN0QW5kQ29udmVydCh3aXRob3V0QWxsKTtcbiAgcmV0dXJuIChcbiAgICB3aXRob3V0QWxsLmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxXaXRob3V0LmV2ZXJ5KCh4KSA9PiAhKHRlc3QoeCkgPz8gZmFsc2UpKVxuICApO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURpc2FibGVkKHdpdGhvdXQ6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFueVdpdGhvdXRdID0gdXNlVGVzdEFuZENvbnZlcnQod2l0aG91dCk7XG4gIHJldHVybiBxdWVyeUFueVdpdGhvdXQuc29tZSgoeCkgPT4gISh0ZXN0KHgpID8/IGZhbHNlKSk7XG59XG4iLCAiLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogSlNYIHJlcXVpcmVzIFJlYWN0IGF0IHJ1bnRpbWVcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgdXNlQWxsRW5hYmxlZCB9IGZyb20gJy4vdXNlQWxsRW5hYmxlZCc7XG5pbXBvcnQgeyB1c2VFbmFibGVkIH0gZnJvbSAnLi91c2VFbmFibGVkJztcblxuZXhwb3J0IGludGVyZmFjZSBFbmFibGVQcm9wcyB7XG4gIHJlYWRvbmx5IGZlYXR1cmU/OiBzdHJpbmdbXSB8IHN0cmluZztcbiAgcmVhZG9ubHkgYWxsRmVhdHVyZXM/OiBzdHJpbmdbXTtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn1cblxuLyoqXG4gKiBGZWF0dXJlIHdpbGwgYmUgZW5hYmxlZCBpZiBhbnkgZmVhdHVyZSBpbiB0aGUgbGlzdCBhcmUgZW5hYmxlZCxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSh7XG4gIGZlYXR1cmUgPSBbXSxcbiAgYWxsRmVhdHVyZXMgPSBbXSxcbiAgY2hpbGRyZW4sXG59OiBFbmFibGVQcm9wcyk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGlzQW55ID0gdXNlRW5hYmxlZChmZWF0dXJlKTtcbiAgY29uc3QgaXNBbGwgPSB1c2VBbGxFbmFibGVkKGFsbEZlYXR1cmVzKTtcblxuICBpZiAoaXNBbnkgfHwgaXNBbGwpIHtcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFsbCBzcGVjaWZpZWQgZmVhdHVyZXMgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFsbFByZXNlbnRdID0gdXNlVGVzdEFuZENvbnZlcnQoYWxsRmVhdHVyZXMpO1xuICByZXR1cm4gcXVlcnlBbGxQcmVzZW50Lmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxQcmVzZW50LmV2ZXJ5KHRlc3QpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRW5hYmxlZChmZWF0dXJlOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbnlQcmVzZW50XSA9IHVzZVRlc3RBbmRDb252ZXJ0KGZlYXR1cmUpO1xuICByZXR1cm4gcXVlcnlBbnlQcmVzZW50LnNvbWUodGVzdCk7XG59XG4iLCAiaW1wb3J0IFJlYWN0LCB7XG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZHVjZXIsXG4gIHVzZVJlZixcbn0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBFbmFibGVDb250ZXh0IH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcbmltcG9ydCB7IEZlYXR1cmVDb250ZXh0IH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IGZlYXR1cmVzUmVkdWNlciwgaW5pdGlhbEZlYXR1cmVzU3RhdGUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHVzZUNvbnNvbGVPdmVycmlkZSBmcm9tICcuL3VzZUNvbnNvbGVPdmVycmlkZSc7XG5pbXBvcnQgdXNlUGVyc2lzdCwgeyBLRVkgfSBmcm9tICcuL3VzZVBlcnNpc3QnO1xuaW1wb3J0IHVzZVRlc3RDYWxsYmFjayBmcm9tICcuL3VzZVRlc3RDYWxsYmFjayc7XG5cbmludGVyZmFjZSBGZWF0dXJlUHJvcHMge1xuICByZWFkb25seSBmZWF0dXJlczogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW107XG4gIHJlYWRvbmx5IGNoaWxkcmVuPzogUmVhY3ROb2RlO1xuICByZWFkb25seSBkaXNhYmxlQ29uc29sZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBTdG9yYWdlO1xufVxuXG4vKipcbiAqIEEgbW9yZSBiYXR0ZXJpZXMtZW5hYmxlZCBwYXJlbnQgY29tcG9uZW50IHRoYXQga2VlcHMgdHJhY2sgb2YgZmVhdHVyZSBzdGF0ZVxuICogaW50ZXJuYWxseSwgYW5kIGNyZWF0ZXMgd2luZG93LmZlYXR1cmUuZW5hYmxlKFwiZlwiKSBhbmQgd2luZG93LmZlYXR1cmUuZGlzYWJsZShcImZcIikuXG4gKiBLZWVwcyB0cmFjayBvZiBvdmVycmlkZXMgYW5kIGRlZmF1bHRzLCB3aXRoIGRlZmF1bHRzIHBvdGVudGlhbGx5IGNvbWluZyBmcm9tIHlvdXIgcHJvcHNcbiAqIGFuZCBvdmVycmlkZXMgYmVpbmcgcGVyc2lzdGVkIHRvIHlvdXIgY2hvaWNlIG9mIHN0b3JhZ2UgbGF5ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBGZWF0dXJlcyh7XG4gIGNoaWxkcmVuLFxuICBmZWF0dXJlcyxcbiAgZGlzYWJsZUNvbnNvbGUgPSBmYWxzZSxcbiAgc3RvcmFnZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZSxcbn06IEZlYXR1cmVQcm9wcyk6IEpTWC5FbGVtZW50IHtcbiAgLy8gQ2FwdHVyZSBvbmx5IGZpcnN0IHZhbHVlOyB3ZSBkb24ndCBjYXJlIGFib3V0IGZ1dHVyZSB1cGRhdGVzXG4gIGNvbnN0IGZlYXR1cmVzUmVmID0gdXNlUmVmKGZlYXR1cmVzKTtcbiAgY29uc3QgW292ZXJyaWRlc1N0YXRlLCBvdmVycmlkZXNEaXNwYXRjaF0gPSB1c2VSZWR1Y2VyKFxuICAgIGZlYXR1cmVzUmVkdWNlcixcbiAgICBpbml0aWFsRmVhdHVyZXNTdGF0ZSxcbiAgKTtcbiAgY29uc3QgW2RlZmF1bHRzU3RhdGUsIGRlZmF1bHRzRGlzcGF0Y2hdID0gdXNlUmVkdWNlcihcbiAgICBmZWF0dXJlc1JlZHVjZXIsXG4gICAgaW5pdGlhbEZlYXR1cmVzU3RhdGUsXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLy8gTG9hZCBkZWZhdWx0c1xuICAgIGRlZmF1bHRzRGlzcGF0Y2goeyB0eXBlOiAnSU5JVCcsIGZlYXR1cmVzIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZWZhdWx0c0Rpc3BhdGNoKHsgdHlwZTogJ0RFX0lOSVQnIH0pO1xuICAgIH07XG4gIH0sIFtmZWF0dXJlc10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGY6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWQ+ID0ge307XG4gICAgaWYgKHN0b3JhZ2UgIT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmVhdHVyZXNKc29uID0gc3RvcmFnZS5nZXRJdGVtKEtFWSk7XG4gICAgICAgIGlmIChmZWF0dXJlc0pzb24gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGZoID0gSlNPTi5wYXJzZShmZWF0dXJlc0pzb24pO1xuICAgICAgICAgIGYgPSBmaC5vdmVycmlkZXM7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gQ2FuJ3QgcGFyc2Ugb3IgZ2V0IG9yIG90aGVyd2lzZTsgaWdub3JlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIGluIGxvY2FsU3RvcmFnZScsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlc0Rpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdJTklUJyxcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlc1JlZi5jdXJyZW50XG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHgubm9PdmVycmlkZSAhPT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeCkgPT4gKHtcbiAgICAgICAgICBuYW1lOiB4Lm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHguZGVzY3JpcHRpb24sXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiBmPy5beC5uYW1lXSA/PyB1bmRlZmluZWQsXG4gICAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBvdmVycmlkZXNEaXNwYXRjaCh7IHR5cGU6ICdERV9JTklUJyB9KTtcbiAgICB9O1xuICB9LCBbc3RvcmFnZV0pO1xuXG4gIC8vIEhhbmRsZSBhc3luYyBvcGVyYXRpb25zIGZvciBmZWF0dXJlcyB3aXRoIG9uQ2hhbmdlRGVmYXVsdFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkZWZhdWx0c1N0YXRlLnZhbHVlICE9PSAncmVhZHknKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGZlYXR1cmVzIGluIGFzeW5jIHN0YXRlcyBhbmQgaGFuZGxlIHRoZW1cbiAgICBPYmplY3QuZW50cmllcyhkZWZhdWx0c1N0YXRlLmNvbnRleHQuZmVhdHVyZXMpLmZvckVhY2goXG4gICAgICAoW25hbWUsIGZlYXR1cmVdKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmZWF0dXJlLnZhbHVlID09PSAnYXN5bmNFbmFibGVkJyB8fFxuICAgICAgICAgIGZlYXR1cmUudmFsdWUgPT09ICdhc3luY0Rpc2FibGVkJyB8fFxuICAgICAgICAgIGZlYXR1cmUudmFsdWUgPT09ICdhc3luY1Vuc3BlY2lmaWVkJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9XG4gICAgICAgICAgICBmZWF0dXJlLnZhbHVlID09PSAnYXN5bmNFbmFibGVkJ1xuICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgOiBmZWF0dXJlLnZhbHVlID09PSAnYXN5bmNEaXNhYmxlZCdcbiAgICAgICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBjb25zdCBvbkNoYW5nZURlZmF1bHQgPSBmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsICYmIGZlYXR1cmUuZmVhdHVyZURlc2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgb25DaGFuZ2VEZWZhdWx0KGZlYXR1cmUuZmVhdHVyZURlc2MubmFtZSwgdGFyZ2V0VmFsdWUpXG4gICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c0Rpc3BhdGNoKHsgdHlwZTogJ0FTWU5DX0RPTkUnLCBuYW1lLCB2YWx1ZTogcmVzdWx0IH0pO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRzRGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ0FTWU5DX0RPTkUnLFxuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9LCBbZGVmYXVsdHNTdGF0ZV0pO1xuXG4gIHVzZVBlcnNpc3Qoc3RvcmFnZSwgZmVhdHVyZXNSZWYuY3VycmVudCwgb3ZlcnJpZGVzU3RhdGUpO1xuXG4gIGNvbnN0IHRlc3RDYWxsYmFjayA9IHVzZVRlc3RDYWxsYmFjayhvdmVycmlkZXNTdGF0ZSwgZGVmYXVsdHNTdGF0ZSk7XG4gIHVzZUNvbnNvbGVPdmVycmlkZShcbiAgICAhZGlzYWJsZUNvbnNvbGUsXG4gICAgZmVhdHVyZXNSZWYuY3VycmVudCxcbiAgICB0ZXN0Q2FsbGJhY2ssXG4gICAgZGVmYXVsdHNEaXNwYXRjaCxcbiAgKTtcblxuICBjb25zdCBmZWF0dXJlVmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBvdmVycmlkZXNTZW5kOiBvdmVycmlkZXNEaXNwYXRjaCxcbiAgICAgIGRlZmF1bHRzU2VuZDogZGVmYXVsdHNEaXNwYXRjaCxcbiAgICAgIGZlYXR1cmVzRGVzY3JpcHRpb246IGZlYXR1cmVzUmVmLmN1cnJlbnQsXG4gICAgICBvdmVycmlkZXNTdGF0ZSxcbiAgICAgIGRlZmF1bHRzU3RhdGUsXG4gICAgICB0ZXN0OiB0ZXN0Q2FsbGJhY2ssXG4gICAgfSksXG4gICAgW292ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlLCB0ZXN0Q2FsbGJhY2tdLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEZlYXR1cmVDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtmZWF0dXJlVmFsdWV9PlxuICAgICAgPEVuYWJsZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3Rlc3RDYWxsYmFja30+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvRW5hYmxlQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L0ZlYXR1cmVDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlc0Rpc3BhdGNoLCBGZWF0dXJlc1N0YXRlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcblxuZXhwb3J0IGNvbnN0IEZlYXR1cmVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxGZWF0dXJlQ29udGV4dFR5cGUgfCBudWxsPihudWxsKTtcblxuLy8vIEdpdmUgYWNjZXNzIHRvIHRoZSBvdmVycmlkZXMgbGF5ZXJcbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZUNvbnRleHRUeXBlIHtcbiAgLy8gTWFrZSBjaGFuZ2VzIHRvIHRoZSBvdmVycmlkZXNcbiAgb3ZlcnJpZGVzU2VuZDogRmVhdHVyZXNEaXNwYXRjaDtcblxuICAvLyBNYWtlIGNoYW5nZXMgdG8gZGVmYXVsdHNcbiAgZGVmYXVsdHNTZW5kOiBGZWF0dXJlc0Rpc3BhdGNoO1xuXG4gIGZlYXR1cmVzRGVzY3JpcHRpb246IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuXG4gIC8vIFN0YXRlIGlzIGluIGxheWVyczsgb3ZlcnJpZGVzIGFuZCBkZWZhdWx0c1xuICBvdmVycmlkZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcblxuICAvLy8gVGVzdCB3aXRoIHByb3BlciBmYWxsYmFjayBhbmQgcmVzcGVjdGluZyB0aGUgdXNlcidzIGZvcmNlIHByZWZlcmVuY2VcbiAgdGVzdDogKGZsYWc6IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRGlzcGF0Y2ggfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogRmVhdHVyZSBpcyBlaXRoZXIgb24sIG9mZiwgb3IgJ3Vuc2V0JyxcbiAqIHdoaWNoIG1lYW5zIGl0IHdpbGwgZ28gdG8gdGhlIGRlZmF1bHQgdmFsdWUgb3IgdGhlIGxlc3Mgc3BlY2lmaWMgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIEZlYXR1cmVWYWx1ZSA9IGZhbHNlIHwgdHJ1ZSB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgRmVhdHVyZVN0YXRlVmFsdWUgPVxuICB8ICdpbml0aWFsJ1xuICB8ICdlbmFibGVkJ1xuICB8ICdkaXNhYmxlZCdcbiAgfCAndW5zcGVjaWZpZWQnXG4gIHwgJ2FzeW5jRW5hYmxlZCdcbiAgfCAnYXN5bmNEaXNhYmxlZCdcbiAgfCAnYXN5bmNVbnNwZWNpZmllZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZVN0YXRlIHtcbiAgdmFsdWU6IEZlYXR1cmVTdGF0ZVZhbHVlO1xuICBmZWF0dXJlRGVzYz86IEZlYXR1cmVEZXNjcmlwdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZURpc3BhdGNoID0gRGlzcGF0Y2g8RmVhdHVyZUFjdGlvbj47XG5cbi8vLyBHaXZlbiBhIGZlYXR1cmVzdGF0ZSwgZGV0ZXJtaW5lIHRoZSB2YWx1ZSAob24sIG9mZiwgb3IgdW5zZXQpXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVGb3JTdGF0ZShcbiAgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsXG4pOiBbRmVhdHVyZVZhbHVlLCBib29sZWFuXSB7XG4gIHJldHVybiBbXG4gICAgZmVhdHVyZVN0YXRlLnZhbHVlID09PSAnZW5hYmxlZCcgfHwgZmVhdHVyZVN0YXRlLnZhbHVlID09PSAnYXN5bmNFbmFibGVkJ1xuICAgICAgPyB0cnVlXG4gICAgICA6IGZlYXR1cmVTdGF0ZS52YWx1ZSA9PT0gJ2Rpc2FibGVkJyB8fFxuICAgICAgICAgIGZlYXR1cmVTdGF0ZS52YWx1ZSA9PT0gJ2FzeW5jRGlzYWJsZWQnXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgZmVhdHVyZVN0YXRlLmZlYXR1cmVEZXNjPy5mb3JjZSA/PyBmYWxzZSxcbiAgXTtcbn1cblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgZmVhdHVyZSB0aGF0IGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkLlxuICogSyBpcyB0aGUgdHlwZSBvZiB0aGUga2V5IHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlRGVzY3JpcHRpb248SyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICByZWFkb25seSBuYW1lOiBLO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvLy8gSWYgc2V0LCB3aWxsIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIGRlZmF1bHQgc3RhdGUgaW5zdGVhZCBvZiBzaW1wbHkgb3ZlcnJpZGluZy5cbiAgLy8vIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgdXNlIHRoaXMgdG8gdXBkYXRlIGEgZmVhdHVyZSBmbGFnIG9uIGEgYmFja2VuZCBzZXJ2ZXIuXG4gIC8vLyB3aGVuIHNldCwgdGhlIGZlYXR1cmUgd2lsbCBiZSB1cGRhdGVkIG9uIHRoZSBiYWNrZW5kIHNlcnZlciwgYW5kIHRoZSByZXN1bHQgb2YgdGhlIGFzeW5jXG4gIC8vLyB3aWxsIGJlIHVzZWQgZm9yIHRoZSBmaW5hbCBzdGF0ZSBhZnRlciB0aGUgY2hhbmdlLiB3aGlsZSBjaGFuZ2luZywgdGhlIGZlYXR1cmUgd2lsbCBiZVxuICAvLy8gaW4gdGhlICdjaGFuZ2luZycgc3RhdGUuIEFsc28gbm90ZSB0aGF0IHRoZSBmZWF0dXJlIHdpbGwgYmUgY2hhbmdlZCBhdCB0aGUgXCJkZWZhdWx0XCIgbGF5ZXIuXG4gIHJlYWRvbmx5IG9uQ2hhbmdlRGVmYXVsdD86IChcbiAgICBuYW1lOiBLLFxuICAgIG5ld1ZhbHVlOiBGZWF0dXJlVmFsdWUsXG4gICkgPT4gUHJvbWlzZTxGZWF0dXJlVmFsdWU+O1xuXG4gIC8vLyBpZiBzZXQgdHJ1ZSwgd2lsbCBmb3JjZSB0aGUgZmllbGQgdG8gd2hhdCBpdCBpcyBzZXQgaGVyZSB0aHJvdWdoIGxheWVycyBvZiBzdGF0ZXMuXG4gIC8vLyB1c2VmdWwgdG8gaW52ZXJ0IHRoZSBsYXllcnMsIHNpbWlsYXIgdG8gIWltcG9ydGFudCBpbiBDU1MuXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvLy8gSWYgc2V0IHRvIHRydWUsIHRoZSBmZWF0dXJlIHdpbGwgbm90IGJlIG92ZXJyaWRhYmxlIGJ5IHRoZSB1c2VyLlxuICByZWFkb25seSBub092ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvLy8gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHNldCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuXG4gIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZT86IEZlYXR1cmVWYWx1ZTtcbn1cblxuLyoqXG4gKiBBY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhIGZlYXR1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIEZlYXR1cmVBY3Rpb24gPVxuICB8IHsgdHlwZTogJ0RJU0FCTEUnIH1cbiAgfCB7IHR5cGU6ICdFTkFCTEUnIH1cbiAgfCB7IHR5cGU6ICdJTklUJzsgZmVhdHVyZTogRmVhdHVyZURlc2NyaXB0aW9uIH1cbiAgfCB7IHR5cGU6ICdTRVQnOyB2YWx1ZTogRmVhdHVyZVZhbHVlIH1cbiAgfCB7IHR5cGU6ICdUT0dHTEUnIH1cbiAgfCB7IHR5cGU6ICdVTlNFVCcgfVxuICB8IHsgdHlwZTogJ0FTWU5DX0RPTkUnOyB2YWx1ZTogRmVhdHVyZVZhbHVlIH07XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsRmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUgPSB7XG4gIHZhbHVlOiAnaW5pdGlhbCcsXG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIG1hbmFnaW5nIGluZGl2aWR1YWwgZmVhdHVyZSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZVJlZHVjZXIoXG4gIHN0YXRlOiBGZWF0dXJlU3RhdGUsXG4gIGFjdGlvbjogRmVhdHVyZUFjdGlvbixcbik6IEZlYXR1cmVTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdJTklUJzoge1xuICAgICAgY29uc3QgeyBmZWF0dXJlIH0gPSBhY3Rpb247XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIGZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSB0cnVlXG4gICAgICAgICAgPyAnZW5hYmxlZCdcbiAgICAgICAgICA6IGZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSBmYWxzZVxuICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICA6ICd1bnNwZWNpZmllZCc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUgYXMgRmVhdHVyZVN0YXRlVmFsdWUsXG4gICAgICAgIGZlYXR1cmVEZXNjOiBmZWF0dXJlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdFTkFCTEUnOiB7XG4gICAgICBpZiAoc3RhdGUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2FzeW5jRW5hYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2VuYWJsZWQnIH07XG4gICAgfVxuXG4gICAgY2FzZSAnRElTQUJMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNEaXNhYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2Rpc2FibGVkJyB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1RPR0dMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNFbmFibGVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICB9XG5cbiAgICBjYXNlICdVTlNFVCc6IHtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNVbnNwZWNpZmllZCcgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ3Vuc3BlY2lmaWVkJyB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1NFVCc6IHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGFjdGlvbjtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNFbmFibGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY0Rpc2FibGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2FzeW5jVW5zcGVjaWZpZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZGlzYWJsZWQnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICd1bnNwZWNpZmllZCcgfTtcbiAgICB9XG5cbiAgICBjYXNlICdBU1lOQ19ET05FJzoge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYWN0aW9uO1xuICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2VuYWJsZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2Rpc2FibGVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAndW5zcGVjaWZpZWQnIH07XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgRGlzcGF0Y2ggfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7XG4gIHR5cGUgRmVhdHVyZURlc2NyaXB0aW9uLFxuICB0eXBlIEZlYXR1cmVTdGF0ZSxcbiAgdHlwZSBGZWF0dXJlVmFsdWUsXG4gIHZhbHVlRm9yU3RhdGUsXG59IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlc0NvbnRleHQge1xuICAvLyBmZWF0dXJlcyBhcmUgbGF5ZXJlZDpcbiAgLy8gIC0gZGVmYXVsdHM6IGlmIG5vdGhpbmcgZWxzZSBtYXRjaGVzLCBwcm92aWRlZCBhIHZhbHVlIGZvciBmZWF0dXJlXG4gIC8vICAtIGJyb3dzZXI6IGJyb3dzZXItbG9jYWwgdmFsdWVzIGZvciBmZWF0dXJlcyAoa2VwdCBpbiBsb2NhbCBzdG9yYWdlLCBldGMpXG4gIC8vICAtIHVzZXI6IHZhbHVlcyBmcm9tIHRoZSB1c2VyJ3MgcHJvZmlsZSwgaWYgYW55XG4gIC8vICAtIG9yZzogdmFsdWUgZnJvbSB0aGUgb3JnJ3MgcHJvZmlsZSwgaWYgYW55XG4gIGZlYXR1cmVzOiB7IFt4OiBzdHJpbmddOiBGZWF0dXJlU3RhdGUgfTtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZXNBY3Rpb24gPVxuICB8IHsgdHlwZTogJ0RFX0lOSVQnIH1cbiAgfCB7IHR5cGU6ICdESVNBQkxFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdFTkFCTEUnOyBuYW1lOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ0lOSVQnOyBmZWF0dXJlczogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW10gfVxuICB8IHsgdHlwZTogJ1NFVF9BTEwnOyBmZWF0dXJlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSB9XG4gIHwgeyB0eXBlOiAnU0VUJzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmVhdHVyZVZhbHVlIH1cbiAgfCB7IHR5cGU6ICdUT0dHTEUnOyBuYW1lOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ1VOU0VUJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdBU1lOQ19ET05FJzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmVhdHVyZVZhbHVlIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZXNTdGF0ZSB7XG4gIHZhbHVlOiAnaWRsZScgfCAncmVhZHknO1xuICBjb250ZXh0OiBGZWF0dXJlc0NvbnRleHQ7XG59XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVzRGlzcGF0Y2ggPSBEaXNwYXRjaDxGZWF0dXJlc0FjdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZU9mRmVhdHVyZShcbiAgZmVhdHVyZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbiAgZmVhdHVyZTogc3RyaW5nLFxuKTogW0ZlYXR1cmVWYWx1ZSwgYm9vbGVhbl0ge1xuICBpZiAoZmVhdHVyZXNTdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2ZlYXR1cmVdID09IG51bGwpIHtcbiAgICByZXR1cm4gW3VuZGVmaW5lZCwgZmFsc2VdO1xuICB9XG4gIGNvbnN0IGZlYXR1cmVTdGF0ZSA9IGZlYXR1cmVzU3RhdGUuY29udGV4dC5mZWF0dXJlc1tmZWF0dXJlXTtcbiAgaWYgKGZlYXR1cmVTdGF0ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlRm9yU3RhdGUoZmVhdHVyZVN0YXRlKTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgZmFsc2VdO1xufVxuXG5leHBvcnQgY29uc3QgaW5pdGlhbEZlYXR1cmVzU3RhdGU6IEZlYXR1cmVzU3RhdGUgPSB7XG4gIHZhbHVlOiAnaWRsZScsXG4gIGNvbnRleHQ6IHtcbiAgICBmZWF0dXJlczoge30sXG4gIH0sXG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIG1hbmFnaW5nIGEgY29sbGVjdGlvbiBvZiBmZWF0dXJlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZXNSZWR1Y2VyKFxuICBzdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbiAgYWN0aW9uOiBGZWF0dXJlc0FjdGlvbixcbik6IEZlYXR1cmVzU3RhdGUge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnSU5JVCc6IHtcbiAgICAgIGlmIChhY3Rpb24uZmVhdHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmVhdHVyZXM6IHsgW3g6IHN0cmluZ106IEZlYXR1cmVTdGF0ZSB9ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgYWN0aW9uLmZlYXR1cmVzKSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgZWFjaCBmZWF0dXJlXG4gICAgICAgIGNvbnN0IGZlYXR1cmVTdGF0ZSA9IHtcbiAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgIGZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSB0cnVlXG4gICAgICAgICAgICAgID8gKCdlbmFibGVkJyBhcyBjb25zdClcbiAgICAgICAgICAgICAgOiBmZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICA/ICgnZGlzYWJsZWQnIGFzIGNvbnN0KVxuICAgICAgICAgICAgICAgIDogKCd1bnNwZWNpZmllZCcgYXMgY29uc3QpLFxuICAgICAgICAgIGZlYXR1cmVEZXNjOiBmZWF0dXJlLFxuICAgICAgICB9O1xuICAgICAgICBmZWF0dXJlc1tmZWF0dXJlLm5hbWVdID0gZmVhdHVyZVN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogJ3JlYWR5JyxcbiAgICAgICAgY29udGV4dDogeyBmZWF0dXJlcyB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdERV9JTklUJzoge1xuICAgICAgcmV0dXJuIGluaXRpYWxGZWF0dXJlc1N0YXRlO1xuICAgIH1cblxuICAgIGNhc2UgJ1NFVF9BTEwnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlcyA9IHsgLi4uc3RhdGUuY29udGV4dC5mZWF0dXJlcyB9O1xuICAgICAgT2JqZWN0LmtleXMoZmVhdHVyZXMpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhY3Rpb24uZmVhdHVyZXNbbmFtZV0gPz8gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBjdXJyZW50RmVhdHVyZSA9IGZlYXR1cmVzW25hbWVdO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmVhdHVyZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICdhc3luY0VuYWJsZWQnIH07XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICdhc3luY0Rpc2FibGVkJyB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZWF0dXJlc1tuYW1lXSA9IHsgLi4uY3VycmVudEZlYXR1cmUsIHZhbHVlOiAnYXN5bmNVbnNwZWNpZmllZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBmZWF0dXJlc1tuYW1lXSA9IHsgLi4uY3VycmVudEZlYXR1cmUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0gPSB7IC4uLmN1cnJlbnRGZWF0dXJlLCB2YWx1ZTogJ2Rpc2FibGVkJyB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZWF0dXJlc1tuYW1lXSA9IHsgLi4uY3VycmVudEZlYXR1cmUsIHZhbHVlOiAndW5zcGVjaWZpZWQnIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGNvbnRleHQ6IHsgZmVhdHVyZXMgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnU0VUJzoge1xuICAgICAgaWYgKHN0YXRlLnZhbHVlICE9PSAncmVhZHknKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmVhdHVyZSA9IHN0YXRlLmNvbnRleHQuZmVhdHVyZXNbYWN0aW9uLm5hbWVdO1xuICAgICAgaWYgKGZlYXR1cmUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGFjdGlvbjtcbiAgICAgIGxldCBuZXdWYWx1ZTogRmVhdHVyZVN0YXRlWyd2YWx1ZSddO1xuXG4gICAgICBpZiAoZmVhdHVyZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSAnYXN5bmNFbmFibGVkJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdhc3luY0Rpc2FibGVkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdhc3luY1Vuc3BlY2lmaWVkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSAnZW5hYmxlZCc7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSAnZGlzYWJsZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1ZhbHVlID0gJ3Vuc3BlY2lmaWVkJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZlYXR1cmVzOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzLFxuICAgICAgICAgICAgW2FjdGlvbi5uYW1lXTogeyAuLi5mZWF0dXJlLCB2YWx1ZTogbmV3VmFsdWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdUT0dHTEUnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3VmFsdWUgPVxuICAgICAgICBmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbFxuICAgICAgICAgID8gJ2FzeW5jRW5hYmxlZCdcbiAgICAgICAgICA6ICdlbmFibGVkJztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBmZWF0dXJlczoge1xuICAgICAgICAgICAgLi4uc3RhdGUuY29udGV4dC5mZWF0dXJlcyxcbiAgICAgICAgICAgIFthY3Rpb24ubmFtZV06IHsgLi4uZmVhdHVyZSwgdmFsdWU6IG5ld1ZhbHVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnRU5BQkxFJzoge1xuICAgICAgaWYgKHN0YXRlLnZhbHVlICE9PSAncmVhZHknKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmVhdHVyZSA9IHN0YXRlLmNvbnRleHQuZmVhdHVyZXNbYWN0aW9uLm5hbWVdO1xuICAgICAgaWYgKGZlYXR1cmUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgZmVhdHVyZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGxcbiAgICAgICAgICA/ICdhc3luY0VuYWJsZWQnXG4gICAgICAgICAgOiAnZW5hYmxlZCc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0RJU0FCTEUnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3VmFsdWUgPVxuICAgICAgICBmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbFxuICAgICAgICAgID8gJ2FzeW5jRGlzYWJsZWQnXG4gICAgICAgICAgOiAnZGlzYWJsZWQnO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZlYXR1cmVzOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzLFxuICAgICAgICAgICAgW2FjdGlvbi5uYW1lXTogeyAuLi5mZWF0dXJlLCB2YWx1ZTogbmV3VmFsdWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdVTlNFVCc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBzdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2FjdGlvbi5uYW1lXTtcbiAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgICAgIGZlYXR1cmUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsXG4gICAgICAgICAgPyAnYXN5bmNVbnNwZWNpZmllZCdcbiAgICAgICAgICA6ICd1bnNwZWNpZmllZCc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0FTWU5DX0RPTkUnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYWN0aW9uO1xuICAgICAgY29uc3QgbmV3VmFsdWUgPVxuICAgICAgICB2YWx1ZSA9PT0gdHJ1ZVxuICAgICAgICAgID8gJ2VuYWJsZWQnXG4gICAgICAgICAgOiB2YWx1ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgID8gJ2Rpc2FibGVkJ1xuICAgICAgICAgICAgOiAndW5zcGVjaWZpZWQnO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZlYXR1cmVzOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzLFxuICAgICAgICAgICAgW2FjdGlvbi5uYW1lXTogeyAuLi5mZWF0dXJlLCB2YWx1ZTogbmV3VmFsdWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZXNEaXNwYXRjaCB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBHbG9iYWxFbmFibGUgfSBmcm9tICcuL0dsb2JhbEVuYWJsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNvbnNvbGVPdmVycmlkZShcbiAgY29uc29sZU92ZXJyaWRlOiBib29sZWFuLFxuICBmZWF0dXJlczogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW10sXG4gIHRlc3RGZWF0dXJlOiAoXzogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWUsXG4gIGRpc3BhdGNoOiBGZWF0dXJlc0Rpc3BhdGNoLFxuKTogdm9pZCB7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjb25zb2xlT3ZlcnJpZGUpIHtcbiAgICAgIC8vIENsZWFuIHVwIHdpbmRvdy5mZWF0dXJlIGltbWVkaWF0ZWx5IGlmIGNvbnNvbGVPdmVycmlkZSBpcyBkaXNhYmxlZFxuICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgd2luZG93LmZlYXR1cmUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAod2luZG93LmZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgIHdpbmRvdy5mZWF0dXJlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cuZmVhdHVyZSA9IG5ldyBHbG9iYWxFbmFibGUoZGlzcGF0Y2gsIHRlc3RGZWF0dXJlLCBmZWF0dXJlcyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICh3aW5kb3cuZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgIHdpbmRvdy5mZWF0dXJlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtmZWF0dXJlcywgZGlzcGF0Y2gsIGNvbnNvbGVPdmVycmlkZSwgdGVzdEZlYXR1cmVdKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlc0Rpc3BhdGNoIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcblxuZXhwb3J0IGNsYXNzIEdsb2JhbEVuYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmVhdHVyZURlc2M6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BhdGNoOiBGZWF0dXJlc0Rpc3BhdGNoO1xuICBwcml2YXRlIHJlYWRvbmx5IHRlc3RGZWF0dXJlOiAodmFsdWU6IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRpc3BhdGNoOiBGZWF0dXJlc0Rpc3BhdGNoLFxuICAgIHRlc3RGZWF0dXJlOiAoXzogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWUsXG4gICAgZmVhdHVyZURlc2M6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdLFxuICApIHtcbiAgICB0aGlzLmZlYXR1cmVEZXNjID0gZmVhdHVyZURlc2M7XG4gICAgdGhpcy5kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMudGVzdEZlYXR1cmUgPSB0ZXN0RmVhdHVyZTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdUT0dHTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5zZXQoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0RJU0FCTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFsbChmZWF0dXJlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0FMTCcsIGZlYXR1cmVzIH0pO1xuICB9XG5cbiAgcHVibGljIGxpc3RGZWF0dXJlcygpOiByZWFkb25seSBbc3RyaW5nLCBGZWF0dXJlVmFsdWVdW10ge1xuICAgIHJldHVybiB0aGlzLmZlYXR1cmVEZXNjLm1hcCgoZikgPT4gW2YubmFtZSwgdGhpcy50ZXN0RmVhdHVyZShmLm5hbWUpXSk7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgZmVhdHVyZT86IEdsb2JhbEVuYWJsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgeyB0eXBlIEZlYXR1cmVzU3RhdGUsIHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcblxuZXhwb3J0IGNvbnN0IEtFWSA9ICdyZWFjdC1lbmFibGU6ZmVhdHVyZS12YWx1ZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VQZXJzaXN0KFxuICBzdG9yYWdlOiBTdG9yYWdlIHwgdW5kZWZpbmVkLFxuICBmZWF0dXJlczogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW10sXG4gIG92ZXJyaWRlU3RhdGU6IEZlYXR1cmVzU3RhdGUsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbmV3T3ZlcnJpZGVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9ID0ge307XG4gICAgaWYgKG92ZXJyaWRlU3RhdGUudmFsdWUgPT09ICdyZWFkeScpIHtcbiAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuICAgICAgICBjb25zdCBbdmFsdWVdID0gdmFsdWVPZkZlYXR1cmUob3ZlcnJpZGVTdGF0ZSwgZmVhdHVyZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdPdmVycmlkZXNbZmVhdHVyZS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdPdmVycmlkZXM7XG4gIH0sIFtmZWF0dXJlcywgb3ZlcnJpZGVTdGF0ZV0pO1xuXG4gIGNvbnN0IHN0clN0YXRlID1cbiAgICBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA9PT0gMCB8fCBzdG9yYWdlID09IG51bGxcbiAgICAgID8gJ3t9J1xuICAgICAgOiBKU09OLnN0cmluZ2lmeSh7IG92ZXJyaWRlcyB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoc3RvcmFnZSAhPSBudWxsICYmIG92ZXJyaWRlU3RhdGUudmFsdWUgPT09ICdyZWFkeScpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKEtFWSwgc3RyU3RhdGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbid0IHNldCBmb3Igc29tZSByZWFzb25cbiAgICB9XG4gIH0sIFtvdmVycmlkZVN0YXRlLCBzdG9yYWdlLCBzdHJTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVzU3RhdGUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHRlc3RGZWF0dXJlIGZyb20gJy4vdGVzdEZlYXR1cmUnO1xuXG4vLy8gQSBjYWxsYmFjayB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gdGVzdCBpZiBhIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVGVzdENhbGxiYWNrKFxuICBkZWZhdWx0c1N0YXRlOiBGZWF0dXJlc1N0YXRlLFxuICBvdmVycmlkZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbik6IChmZWF0dXJlOiBzdHJpbmcpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXNlQ2FsbGJhY2soXG4gICAgKGY6IHN0cmluZykgPT4gdGVzdEZlYXR1cmUoZiwgW2RlZmF1bHRzU3RhdGUsIG92ZXJyaWRlc1N0YXRlXSksXG4gICAgW2RlZmF1bHRzU3RhdGUsIG92ZXJyaWRlc1N0YXRlXSxcbiAgKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IHR5cGUgRmVhdHVyZXNTdGF0ZSwgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuXG4vKiogRGV0ZXJtaW5lIGlmIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQgaW4gb25lIG9mIHRoZSBzdGF0ZSBtYWNoaW5lcywgaW4gb3JkZXJcbiAqXG4gKiBAcGFyYW0gc3RhdGUgVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1hY2hpbmVcbiAqIEBwYXJhbSBmZWF0dXJlIFRoZSBmZWF0dXJlIHRvIGNoZWNrXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGVzdEZlYXR1cmUoXG4gIGZlYXR1cmU6IHN0cmluZyxcbiAgc3RhdGVzOiBGZWF0dXJlc1N0YXRlW10sXG4pOiBGZWF0dXJlVmFsdWUge1xuICBjb25zdCB2YWx1ZXMgPSBzdGF0ZXMubWFwKChzdGF0ZSkgPT4gdmFsdWVPZkZlYXR1cmUoc3RhdGUsIGZlYXR1cmUpKTtcblxuICAvLyBsb29rIGZvciBiZXN0IGZvcmNlZCBvcHRpb24sIGluIG9yZGVyXG4gIGZvciAoY29uc3QgW2ZlYXR1cmVWYWx1ZSwgZmVhdHVyZUZvcmNlZF0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKGZlYXR1cmVWYWx1ZSAhPSBudWxsICYmIGZlYXR1cmVGb3JjZWQpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gbG9vayBmb3IgYmVzdCBub24tZm9yY2VkIG9wdGlvbiwgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBbZmVhdHVyZVZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoZmVhdHVyZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gdW5zZXQgaWYgbm90aGluZyBoaXRcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgeyBSYWRpb0dyb3VwIH0gZnJvbSAnQGhlYWRsZXNzdWkvcmVhY3QnO1xuaW1wb3J0IFJlYWN0LCB7XG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dCxcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgeyBGZWF0dXJlQ29udGV4dCB9IGZyb20gJy4vRmVhdHVyZUNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRGVzY3JpcHRpb24gfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgeyB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG4vLyBAdHMtZXhwZWN0LWVycm9yIGJ1bmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhpc1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3RhaWx3aW5kLmNzcyc7XG5cbmZ1bmN0aW9uIGNsYXNzTmFtZXMoLi4uY2xhc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gY2xhc3Nlcy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBUb2dnbGVGZWF0dXJlKHtcbiAgZmVhdHVyZSxcbn06IHtcbiAgZmVhdHVyZTogRmVhdHVyZURlc2NyaXB0aW9uO1xufSk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KEZlYXR1cmVDb250ZXh0KTtcbiAgY29uc3QgaGFuZGxlQ2hhbmdlU2VsZWN0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKHZhbHVlOiAnZmFsc2UnIHwgJ3RydWUnIHwgJ3Vuc2V0JykgPT4ge1xuICAgICAgaWYgKGNvbnRleHQ/Lm92ZXJyaWRlc1NlbmQgIT0gbnVsbCkge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAndHJ1ZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdFTkFCTEUnLCBuYW1lOiBmZWF0dXJlLm5hbWUgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnZmFsc2UnOiB7XG4gICAgICAgICAgICBjb250ZXh0Lm92ZXJyaWRlc1NlbmQoeyB0eXBlOiAnRElTQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICd1bnNldCc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2ZlYXR1cmUubmFtZSwgY29udGV4dF0sXG4gICk7XG5cbiAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBvdmVycmlkZXNTdGF0ZSwgdGVzdDogdGVzdEZlYXR1cmUsIGRlZmF1bHRzU3RhdGUgfSA9IGNvbnRleHQ7XG5cbiAgY29uc3QgdmFsdWVJbkRlZmF1bHRzID0gKFxuICAgIHZhbHVlT2ZGZWF0dXJlKGRlZmF1bHRzU3RhdGUsIGZlYXR1cmUubmFtZSlbMF0gPz8gJ3Vuc2V0J1xuICApLnRvU3RyaW5nKCkgYXMgJ2ZhbHNlJyB8ICd0cnVlJyB8ICd1bnNldCc7XG5cbiAgY29uc3QgdmFsdWVJbk92ZXJyaWRlcyA9IChcbiAgICB2YWx1ZU9mRmVhdHVyZShvdmVycmlkZXNTdGF0ZSwgZmVhdHVyZS5uYW1lKVswXSA/PyAndW5zZXQnXG4gICkudG9TdHJpbmcoKSBhcyAnZmFsc2UnIHwgJ3RydWUnIHwgJ3Vuc2V0JztcblxuICBjb25zdCBhY3R1YWxDaGVja2VkID0gdGVzdEZlYXR1cmUoZmVhdHVyZS5uYW1lKTtcblxuICByZXR1cm4gKFxuICAgIDxSYWRpb0dyb3VwXG4gICAgICBkaXNhYmxlZD17ZmVhdHVyZS5ub092ZXJyaWRlfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZVNlbGVjdGlvbn1cbiAgICAgIHZhbHVlPXt2YWx1ZUluT3ZlcnJpZGVzfVxuICAgID5cbiAgICAgIDxSYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICA8aDYgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTkwMCBhbGlnbi1jZW50ZXIgZmxleCBmbGV4LXJvdyBmbGV4LW5vd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTIgbGc6Z2FwLTQgaC03XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgIEZlYXR1cmU6IDxjb2RlPntmZWF0dXJlLm5hbWV9PC9jb2RlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7ZmVhdHVyZS5ub092ZXJyaWRlID09PSB0cnVlID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItb3JhbmdlLTUwMCB0ZXh0LW9yYW5nZS01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk01IDlWN2E1IDUgMCAwMTEwIDB2MmEyIDIgMCAwMTIgMnY1YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMnYtNWEyIDIgMCAwMTItMnptOC0ydjJIN1Y3YTMgMyAwIDAxNiAwelwiXG4gICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2Pk5vIE92ZXJyaWRlczwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAge2FjdHVhbENoZWNrZWQgPT09IHRydWUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1ub3dyYXAgdGV4dC14cyB0ZXh0LWdyZWVuLTUwMCBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWdyZWVuLTUwMCBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdj57YWN0dWFsQ2hlY2tlZCA/ICdFbmFibGVkJyA6ICdEaXNhYmxlZCd9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9oNj5cbiAgICAgICAge2ZlYXR1cmUuZGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1iYXNlIHRleHQtZ3JheS01MDAgdGV4dC1zbVwiPlxuICAgICAgICAgICAge2ZlYXR1cmUuZGVzY3JpcHRpb259XG4gICAgICAgICAgPC9wPlxuICAgICAgICApfVxuICAgICAgPC9SYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IGdyaWQgZ3JpZC1jb2xzLTEgZ2FwLXktNiBzbTpncmlkLWNvbHMtMyBzbTpnYXAteC00XCI+XG4gICAgICAgIHtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdmYWxzZScsXG4gICAgICAgICAgICB0aXRsZTogYERpc2FibGUgJHtmZWF0dXJlLm5hbWV9YCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT3ZlcnJpZGUgdGhlIGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd1bnNldCcsXG4gICAgICAgICAgICB0aXRsZTogJ0RlZmF1bHQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdJbmhlcml0IGVuYWJsZWQgc3RhdGUgZnJvbSBkZWZhdWx0cycsXG4gICAgICAgICAgICBkaXNhYmxlZDogKGZlYXR1cmUubm9PdmVycmlkZSA/PyBmYWxzZSkgfHwgZmVhdHVyZS5mb3JjZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTpcbiAgICAgICAgICAgICAgdmFsdWVJbkRlZmF1bHRzID09PSAndHJ1ZScgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWdyZWVuLTUwMCBib3JkZXItZ3JlZW4tNTAwIGZsZXggZmxleC1ub3dyYXAgdGV4dC14cyBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtMiBweS0xXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5FbmFibGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1yZWQtNTAwIGJvcmRlci1yZWQtNTAwIGZsZXggZmxleC1ub3dyYXAgdGV4dC14cyBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtMiBweS0xXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5EaXNhYmxlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndHJ1ZScsXG4gICAgICAgICAgICB0aXRsZTogYEVuYWJsZSAke2ZlYXR1cmUubmFtZX1gLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPdmVycmlkZSB0aGUgZmVhdHVyZSB0byBiZSBlbmFibGVkJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgPFJhZGlvR3JvdXAuT3B0aW9uXG4gICAgICAgICAgICBjbGFzc05hbWU9eyh7IGNoZWNrZWQsIGFjdGl2ZSwgZGlzYWJsZWQgfSkgPT5cbiAgICAgICAgICAgICAgY2xhc3NOYW1lcyhcbiAgICAgICAgICAgICAgICBjaGVja2VkID8gJ2JvcmRlci10cmFuc3BhcmVudCcgOiAnYm9yZGVyLWdyYXktMzAwJyxcbiAgICAgICAgICAgICAgICAhZGlzYWJsZWQgJiYgYWN0aXZlXG4gICAgICAgICAgICAgICAgICA/ICdib3JkZXItYmx1ZS01MDAgcmluZy0yIHJpbmctYmx1ZS01MDAnXG4gICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICA/ICdib3JkZXItdHJhbnNwYXJlbnQgcmluZy1ncmF5LTUwMCBjdXJzb3Itbm90LWFsbG93ZWQnXG4gICAgICAgICAgICAgICAgICA6ICdjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICAgICAgJ3JlbGF0aXZlIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkLWxnIHNoYWRvdy1zbSBwLTMgZmxleCBmb2N1czpvdXRsaW5lLW5vbmUnLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNhYmxlZD17b3B0aW9uLmRpc2FibGVkfVxuICAgICAgICAgICAga2V5PXtvcHRpb24uaWR9XG4gICAgICAgICAgICB2YWx1ZT17b3B0aW9uLmlkfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsoeyBjaGVja2VkLCBhY3RpdmUsIGRpc2FibGVkIH0pID0+IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuTGFiZWxcbiAgICAgICAgICAgICAgICAgICAgYXM9XCJzcGFuXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LW5vd3JhcCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXIgc3BhY2UtYmV0d2VlblwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBncm93IHNocmlua1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHtvcHRpb24udGl0bGV9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZWZhdWx0VmFsdWUgIT0gbnVsbCA/IG9wdGlvbi5kZWZhdWx0VmFsdWUgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tlZCA/ICdpbnZpc2libGUnIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnaC01IHctNSB0ZXh0LWJsdWUtNTAwIG1pbi13LTQnLFxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAgMThhOCA4IDAgMTAwLTE2IDggOCAwIDAwMCAxNnptMy43MDctOS4yOTNhMSAxIDAgMDAtMS40MTQtMS40MTRMOSAxMC41ODYgNy43MDcgOS4yOTNhMSAxIDAgMDAtMS40MTQgMS40MTRsMiAyYTEgMSAwIDAwMS40MTQgMGw0LTR6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXAuTGFiZWw+XG4gICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5EZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICBhcz1cInNwYW5cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtdC0xIGZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtvcHRpb24uZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXAuRGVzY3JpcHRpb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICAgICAgICAgICAgIWRpc2FibGVkICYmIGFjdGl2ZSA/ICdib3JkZXInIDogJ2JvcmRlci0yJyxcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgID8gZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci1ncmF5LTUwMCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JvcmRlci1ibHVlLTUwMCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdib3JkZXItdHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgICAnYWJzb2x1dGUgLWluc2V0LXB4IHJvdW5kZWQtbGcgcG9pbnRlci1ldmVudHMtbm9uZScsXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1JhZGlvR3JvdXAuT3B0aW9uPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvUmFkaW9Hcm91cD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2hhZG93Q29udGVudCh7XG4gIHJvb3QsXG4gIGNoaWxkcmVuLFxufToge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICByb290OiBFbGVtZW50O1xufSkge1xuICByZXR1cm4gUmVhY3RET00uY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCByb290KTtcbn1cblxuLy8vIFBlcm1pdCB1c2VycyB0byBvdmVycmlkZSBmZWF0dXJlIGZsYWdzIHZpYSBhIEdVSS5cbi8vLyBSZW5kZXJzIGEgc21hbGwgZmxvYXRpbmcgYnV0dG9uIGluIGxvd2VyIGxlZnQgb3IgcmlnaHQsIHByZXNzaW5nIGl0IGJyaW5ncyB1cFxuLy8vIGEgbGlzdCBvZiBmZWF0dXJlcyB0byB0b2dnbGUgYW5kIHRoZWlyIGN1cnJlbnQgb3ZlcnJpZGUgc3RhdGUuIHlvdSBjYW4gb3ZlcnJpZGUgb24gb3Igb3ZlcnJpZGUgb2ZmLFxuLy8vIG9yIHVuc2V0IHRoZSBvdmVycmlkZSBhbmQgZ28gYmFjayB0byBkZWZhdWx0IHZhbHVlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5leHBvcnQgZnVuY3Rpb24gVG9nZ2xlRmVhdHVyZXMoe1xuICBkZWZhdWx0T3BlbiA9IGZhbHNlLFxuICBoaWRkZW4gPSBmYWxzZSxcbn06IHtcbiAgZGVmYXVsdE9wZW4/OiBib29sZWFuO1xuICBoaWRkZW4/OiBib29sZWFuO1xufSk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IFtyb290LCBzZXRDb3JlUm9vdF0gPSB1c2VTdGF0ZTxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IHNldFJvb3QgPSAoaG9zdDogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByb290ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hhZG93Um9vdCA9IGhvc3Q/LmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgcmVuZGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBzdHlsZXM7XG4gICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChyZW5kZXJEaXYpO1xuICAgIHNldENvcmVSb290KHJlbmRlckRpdik7XG4gIH07XG5cbiAgaWYgKGhpZGRlbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByZWY9e3NldFJvb3R9XG4gICAgICBzdHlsZT17e1xuICAgICAgICB6SW5kZXg6IDk5OTk5LFxuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgd2lkdGg6ICcwJyxcbiAgICAgICAgaGVpZ2h0OiAnMCcsXG4gICAgICAgIGJvdHRvbTogMCxcbiAgICAgIH19XG4gICAgPlxuICAgICAge3Jvb3QgIT0gbnVsbCA/IChcbiAgICAgICAgPFNoYWRvd0NvbnRlbnQgcm9vdD17cm9vdH0+XG4gICAgICAgICAgPFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQgZGVmYXVsdE9wZW49e2RlZmF1bHRPcGVufSAvPlxuICAgICAgICA8L1NoYWRvd0NvbnRlbnQ+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8vIExpa2UgVG9nZ2xlRmVhdHVyZXMsIGJ1dCBkb2VzIG5vdCBpbmplY3Qgc3R5bGVzIGludG8gYSBzaGFkb3cgRE9NIHJvb3Qgbm9kZS5cbi8vLyB1c2VmdWwgaWYgeW91J3JlIHVzaW5nIHRhaWx3aW5kLlxuZXhwb3J0IGZ1bmN0aW9uIFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQoe1xuICBkZWZhdWx0T3BlbiA9IGZhbHNlLFxuICBoaWRkZW4gPSBmYWxzZSxcbn06IHtcbiAgZGVmYXVsdE9wZW4/OiBib29sZWFuO1xuICBoaWRkZW4/OiBib29sZWFuO1xufSk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGRlZmF1bHRPcGVuKTtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuXG4gIGlmIChjb250ZXh0ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChoaWRkZW4pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdlIHdhbnQ6IFJlYWwgdmFsdWUgYWZ0ZXIgYWxsIG5lc3RpbmdzLCB2YWx1ZSBvZiB0aGUgb3ZlcnJpZGUuIHdlIHRvZ2dsZSBvdmVycmlkZVxuICBjb25zdCB7IGZlYXR1cmVzRGVzY3JpcHRpb24gfSA9IGNvbnRleHQ7XG5cbiAgaWYgKGZlYXR1cmVzRGVzY3JpcHRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgYm90dG9tLTAgbGVmdC0wIG14LTQgbXktNFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gZm9udC1tZWRpdW0gcC0xIGgtOCB3LTggYWxpZ24tbWlkZGxlIGN1cnNvci1wb2ludGVyIHJvdW5kZWQtZnVsbCBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlICBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGp1c3RpZnktY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb2Zmc2V0LTIgZm9jdXM6cmluZy1ibHVlLTYwMCBzbTp0ZXh0LXNtXCJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKHRydWUpfVxuICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIGZlYXR1cmVzXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNiBoLTYgbWluLWgtNiBtaW4tdy02XCJcbiAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICBkPVwiTTMgNmEzIDMgMCAwMTMtM2gxMGExIDEgMCAwMS44IDEuNkwxNC4yNSA4bDIuNTUgMy40QTEgMSAwIDAxMTYgMTNINmExIDEgMCAwMC0xIDF2M2ExIDEgMCAxMS0yIDBWNnpcIlxuICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIHshb3BlbiA/IG51bGwgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZml4ZWQgei0xMCBpbnNldC0wIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1lbmQganVzdGlmeS1mbGV4LXN0YXJ0IG14LTggbXktNCBtaW4taC1zY3JlZW4gcHQtNCBweC00IHBiLTEwIHNtOmJsb2NrIHNtOnAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBpbmxpbmUtYmxvY2sgYWxpZ24tYm90dG9tIGJnLXdoaXRlIHJvdW5kZWQtbGcgcHgtNCBwdC01IHBiLTQgdGV4dC1sZWZ0IG92ZXJmbG93LWhpZGRlbiBzaGFkb3cteGwgdHJhbnNmb3JtIHRyYW5zaXRpb24tYWxsIHNtOm15LTggc206YWxpZ24tbWlkZGxlIHNtOnAtNiBsZzptYXgtdy1bODAlXSBtYXgtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHNtOm10LTNcIj5cbiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGdhcC00IGZsZXgtbm93cmFwIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JvdyB0ZXh0LWxnIGxlYWRpbmctNiBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZSBGbGFnIE92ZXJyaWRlc1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgRmVhdHVyZXMgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgdW5sZXNzIHRoZXkgYXJlIGZvcmNlZFxuICAgICAgICAgICAgICAgICAgICB1cHN0cmVhbS4gWW91IGNhbiBhbHNvIHJldmVydCB0byBkZWZhdWx0LlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC05XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZCBjbGFzc05hbWU9XCJzci1vbmx5XCI+RmVhdHVyZSBGbGFnczwvbGVnZW5kPlxuICAgICAgICAgICAgICAgICAgICAgIHtmZWF0dXJlc0Rlc2NyaXB0aW9uLm1hcCgoZmVhdHVyZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFRvZ2dsZUZlYXR1cmUgZmVhdHVyZT17ZmVhdHVyZX0ga2V5PXtmZWF0dXJlLm5hbWV9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgbXQtNSBzbTptdC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSBwdC0wIHBiLTAgcHItNCBwbC00IGgtOCBsZWFkaW5nLTcgYWxpZ24tbWlkZGxlIGN1cnNvci1wb2ludGVyIHJvdW5kZWQtc20gYmctYmx1ZS02MDAgdGV4dC13aGl0ZSBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGp1c3RpZnktY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb2Zmc2V0LTIgZm9jdXM6cmluZy1ibHVlLTYwMCBzbTp0ZXh0LXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKGZhbHNlKX1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIERvbmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0NBLFlBQXVCOzs7QUNEdkIsb0JBQW9DOzs7QUNBcEMsbUJBQThCO0FBU3ZCLElBQU0sZ0JBQWdCLGdDQUFpQyxDQUFDLE9BQU8sS0FBSzs7O0FESHBFLDJCQUNMLE9BQytCO0FBQy9CLFFBQU0sT0FBTyw4QkFBVyxhQUFhO0FBR3JDLFFBQU0sWUFBWSwyQkFDaEIsTUFBTyxTQUFTLE9BQU8sQ0FBQyxJQUFJLE1BQU0sUUFBUSxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssR0FDakUsQ0FBQyxLQUFLLENBQ1I7QUFFQSxTQUFPLENBQUMsTUFBTSxTQUFTO0FBQ3pCOzs7QUViTyx3QkFBd0IsWUFBd0M7QUFDckUsUUFBTSxDQUFDLE1BQU0sbUJBQW1CLGtCQUFrQixVQUFVO0FBQzVELFNBQ0UsV0FBVyxTQUFT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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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 diff --git a/dist/cjs/src/index.js.map b/dist/cjs/src/index.js.map index c76e7bf..0340967 100644 --- a/dist/cjs/src/index.js.map +++ b/dist/cjs/src/index.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../../../src/index.tsx", "../../../src/FeaturesState.tsx", "../../../src/FeatureState.tsx", "../../../src/Features.tsx", "../../../src/EnableContext.tsx", "../../../src/FeatureContext.tsx", "../../../src/useConsoleOverride.tsx", "../../../src/GlobalEnable.tsx", "../../../src/usePersist.tsx", "../../../src/useTestCallback.tsx", "../../../src/testFeature.tsx", "../../../src/Enable.tsx", "../../../src/utils.ts", "../../../src/useAllEnabled.tsx", "../../../src/useEnabled.tsx", "../../../src/Disable.tsx", "../../../src/useAllDisabled.tsx", "../../../src/useDisabled.tsx", "../../../src/ToggleFeatures.tsx"], - "sourcesContent": ["export { FeaturesMachine } from './FeaturesState';\nexport { Features } from './Features';\nexport { Enable } from './Enable';\nexport { Disable } from './Disable';\nexport { useDisabled } from './useDisabled';\nexport { useEnabled } from './useEnabled';\nexport { useAllDisabled } from './useAllDisabled';\nexport { useAllEnabled } from './useAllEnabled';\nexport type { EnableContextType } from './EnableContext';\nexport type { FeatureContextType } from './FeatureContext';\nexport type { FeatureValue, FeatureState, FeatureDescription, FeatureDispatch } from './FeatureState';\nexport { EnableContext } from './EnableContext';\nexport { ToggleFeatures } from './ToggleFeatures';\n", "import { ActorRefFrom, InterpreterFrom, StateFrom, assign, createMachine, spawn } from 'xstate';\n\nimport { FeatureMachine, FeatureDescription, FeatureValue, valueForState } from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: ActorRefFrom };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string };\n\nexport interface FeaturesTypeState {\n value: 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesState = StateFrom;\nexport type FeaturesDispatch = InterpreterFrom['send'];\n\nexport function valueOfFeature(featuresState: FeaturesState, feature: string): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature].getSnapshot();\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\n/// state machine that manages a set of features with user, org, and local overrides\nexport const FeaturesMachine = createMachine({\n id: 'features',\n initial: 'idle',\n predictableActionArguments: true,\n context: {\n features: {},\n },\n states: {\n idle: {\n on: {\n INIT: {\n target: 'ready',\n cond: (_, e) => e.features.length > 0,\n actions: assign({\n features: (context, event) => {\n const features: typeof context.features = {};\n\n for (const feature of event.features) {\n features[feature.name] = spawn(FeatureMachine, {\n name: feature.name,\n sync: true,\n });\n features[feature.name].send({ type: 'INIT', feature });\n }\n return features;\n },\n }),\n },\n },\n },\n\n // the features are loaded and ready to be used\n ready: {\n on: {\n DE_INIT: { target: 'idle', actions: assign({ features: (_, __) => ({}) }) },\n SET_ALL: {\n actions: assign({\n features: (ctx, e) => {\n const features = { ...ctx.features };\n // All configured features are set to on/off or undefined\n Object.keys(features).forEach((name) => {\n features[name].send({ type: 'SET', value: e.features[name] ?? undefined });\n });\n return features;\n },\n }),\n },\n\n // Set a feature to a value\n SET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'SET', value: e.value });\n }\n },\n },\n\n // toggle a feature\n TOGGLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'TOGGLE' });\n }\n },\n },\n\n // when a feature is enabled, send the enable message to the actor\n ENABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'ENABLE' });\n }\n },\n },\n\n // when a feature is disabled, send the disable message to the actor\n DISABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'DISABLE' });\n }\n },\n },\n\n // when a feature is unset, send the unset message to the actor\n UNSET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'UNSET' });\n }\n },\n },\n },\n },\n },\n});\n", "import { assign, createMachine, DoneInvokeEvent, InterpreterFrom, StateFrom } from 'xstate';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureState = StateFrom;\nexport type FeatureDispatch = InterpreterFrom['send'];\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(featureState: FeatureState): [FeatureValue, boolean] {\n return [\n featureState.matches('enabled') ? true : featureState.matches('disabled') ? false : undefined,\n featureState.context.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (name: K, newValue: FeatureValue) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\ninterface FeatureContext {\n featureDesc?: FeatureDescription;\n}\n\ntype FeatureTypeState =\n | {\n value: 'asyncDenabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncDisabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncUnspecied';\n context: FeatureContext;\n }\n | {\n value: 'disabled';\n context: FeatureContext;\n }\n | {\n value: 'enabled';\n context: FeatureContext;\n }\n | {\n value: 'initial';\n context: never;\n }\n | {\n value: 'unspecied';\n context: FeatureContext;\n };\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' };\n\n/**\n * Fully describe the states a feature can be in\n */\nexport const FeatureMachine = createMachine({\n id: 'feature',\n initial: 'initial',\n context: {},\n predictableActionArguments: true,\n on: {\n ENABLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n TOGGLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n DISABLE: [\n { target: 'asyncDisabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'disabled' },\n ],\n\n UNSET: [\n { target: 'asyncUnspecied', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'unspecified' },\n ],\n\n SET: [\n {\n target: 'asyncEnabled',\n cond: (ctx, e) => e.value === true && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncDisabled',\n cond: (ctx, e) => e.value === false && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncUnspecied',\n cond: (ctx, _e) => ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'enabled',\n cond: (_ctx, e) => e.value === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e) => e.value === false,\n },\n { target: 'unspecified' },\n ],\n },\n\n states: {\n initial: {\n on: {\n INIT: [\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'enabled',\n cond: (_, e) => e.feature.defaultValue === true,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'unspecified',\n cond: (_, e) => e.feature.defaultValue === undefined,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'disabled',\n cond: (_, e) => e.feature.defaultValue === false,\n },\n ],\n },\n },\n\n unspecified: {},\n disabled: {},\n enabled: {},\n\n asyncDisabled: {\n invoke: {\n id: 'set-off-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, false);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncUnspecied: {\n invoke: {\n id: 'set-unset-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, undefined);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncEnabled: {\n invoke: {\n id: 'set-on-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, true);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n },\n});\n", "import React, { useMemo, ReactNode, useEffect, useRef } from 'react';\n\nimport { useMachine } from '@xstate/react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport { FeaturesMachine } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesSend] = useMachine(FeaturesMachine);\n const [defaultsState, defaultsSend] = useMachine(FeaturesMachine);\n\n useEffect(() => {\n /// Load defaults\n defaultsSend({ type: 'INIT', features });\n return () => {\n defaultsSend({ type: 'DE_INIT' });\n };\n }, [defaultsSend, features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesSend({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({ name: x.name, description: x.description, defaultValue: f?.[x.name] ?? undefined })),\n });\n\n return () => {\n overridesSend({ type: 'DE_INIT' });\n };\n }, [featuresRef, overridesSend, storage]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsSend);\n\n const featureValue = useMemo(\n () => ({\n overridesSend,\n defaultsSend,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesSend, defaultsSend, overridesState, defaultsState, testCallback]\n );\n\n return (\n \n {children}\n \n );\n}\n", "import { createContext } from 'react';\n\nimport { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { createContext } from 'react';\n\nimport { FeaturesDispatch, FeaturesState } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import { useEffect } from 'react';\n\nimport { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n return () => {\n /* empty */\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n delete window.feature;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[]\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useMemo, useEffect } from 'react';\n\nimport { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.matches('ready')) {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState = Object.keys(overrides).length === 0 || storage == null ? '{}' : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.matches('ready')) {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState\n): (feature: string) => boolean | undefined {\n return useCallback((f: string) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]);\n}\n", "import { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureValue } from './FeatureState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(feature: string, states: FeaturesState[]): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({ feature = [], allFeatures = [], children }: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContextType, EnableContext } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(input?: string[] | string | null): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(() => (input == null ? [] : Array.isArray(input) ? input : [input]), [input]);\n\n return [test, converted];\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import * as React from \"react\";\n\nimport { EnableProps } from \"./Enable\";\nimport { useAllDisabled } from \"./useAllDisabled\";\nimport { useDisabled } from \"./useDisabled\";\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false));\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "import React, { useContext, useState, useCallback, ReactNode } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { RadioGroup } from '@headlessui/react';\n\nimport { FeatureContext } from './FeatureContext';\nimport { valueOfFeature } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({ feature }: { feature: FeatureDescription }): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context]\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (valueOfFeature(defaultsState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const valueInOverrides = (valueOfFeature(overridesState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null :

{feature.description}

}\n
\n
\n {[\n { id: 'false', title: `Disable ${feature.name}`, description: 'Override the feature to be disabled' },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n { id: 'true', title: `Enable ${feature.name}`, description: 'Override the feature to be enabled' },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active ? 'border-blue-500 ring-2 ring-blue-500' : '',\n disabled ? 'border-transparent ring-gray-500 cursor-not-allowed' : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none'\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n {option.title}\n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n
\n );\n}\n\nfunction ShadowContent({ root, children }: { children: ReactNode; root: Element }) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({ defaultOpen = false, hidden = false }: { defaultOpen?: boolean; hidden?: boolean }): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n
\n {root != null ? (\n \n \n \n ) : null}\n
\n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({ defaultOpen = false, hidden = false }: { defaultOpen?: boolean; hidden?: boolean }): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
Feature Flag Overrides
\n

\n

\n Features can be enabled or disabled unless they are forced upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], - "mappings": "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", + "sources": ["../../../src/index.tsx", "../../../src/Disable.tsx", "../../../src/utils.ts", "../../../src/EnableContext.tsx", "../../../src/useAllDisabled.tsx", "../../../src/useDisabled.tsx", "../../../src/Enable.tsx", "../../../src/useAllEnabled.tsx", "../../../src/useEnabled.tsx", "../../../src/Features.tsx", "../../../src/FeatureContext.tsx", "../../../src/FeatureState.tsx", "../../../src/FeaturesState.tsx", "../../../src/useConsoleOverride.tsx", "../../../src/GlobalEnable.tsx", "../../../src/usePersist.tsx", "../../../src/useTestCallback.tsx", "../../../src/testFeature.tsx", "../../../src/ToggleFeatures.tsx"], + "sourcesContent": ["export { Disable } from './Disable';\nexport { Enable } from './Enable';\nexport type { EnableContextType } from './EnableContext';\nexport { EnableContext } from './EnableContext';\nexport type { FeatureContextType } from './FeatureContext';\nexport type {\n FeatureDescription,\n FeatureDispatch,\n FeatureState,\n FeatureValue,\n} from './FeatureState';\nexport { Features } from './Features';\nexport { ToggleFeatures } from './ToggleFeatures';\nexport { useAllDisabled } from './useAllDisabled';\nexport { useAllEnabled } from './useAllEnabled';\nexport { useDisabled } from './useDisabled';\nexport { useEnabled } from './useEnabled';\n", "// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport type { EnableProps } from './Enable';\nimport { useAllDisabled } from './useAllDisabled';\nimport { useDisabled } from './useDisabled';\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children,\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContext, type EnableContextType } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(\n input?: string[] | string | null,\n): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(\n () => (input == null ? [] : Array.isArray(input) ? input : [input]),\n [input],\n );\n\n return [test, converted];\n}\n", "import { createContext } from 'react';\n\nimport type { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return (\n withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false))\n );\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({\n feature = [],\n allFeatures = [],\n children,\n}: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import React, {\n type ReactNode,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { featuresReducer, initialFeaturesState } from './FeaturesState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n const [defaultsState, defaultsDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n\n useEffect(() => {\n /// Load defaults\n defaultsDispatch({ type: 'INIT', features });\n return () => {\n defaultsDispatch({ type: 'DE_INIT' });\n };\n }, [features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesDispatch({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({\n name: x.name,\n description: x.description,\n defaultValue: f?.[x.name] ?? undefined,\n })),\n });\n\n return () => {\n overridesDispatch({ type: 'DE_INIT' });\n };\n }, [storage]);\n\n // Handle async operations for features with onChangeDefault\n useEffect(() => {\n if (defaultsState.value !== 'ready') {\n return;\n }\n\n // Check for features in async states and handle them\n Object.entries(defaultsState.context.features).forEach(\n ([name, feature]) => {\n if (\n feature.value === 'asyncEnabled' ||\n feature.value === 'asyncDisabled' ||\n feature.value === 'asyncUnspecified'\n ) {\n const targetValue =\n feature.value === 'asyncEnabled'\n ? true\n : feature.value === 'asyncDisabled'\n ? false\n : undefined;\n\n const onChangeDefault = feature.featureDesc?.onChangeDefault;\n if (onChangeDefault != null && feature.featureDesc != null) {\n onChangeDefault(feature.featureDesc.name, targetValue)\n .then((result) => {\n defaultsDispatch({ type: 'ASYNC_DONE', name, value: result });\n })\n .catch(() => {\n defaultsDispatch({\n type: 'ASYNC_DONE',\n name,\n value: undefined,\n });\n });\n }\n }\n },\n );\n }, [defaultsState]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(\n !disableConsole,\n featuresRef.current,\n testCallback,\n defaultsDispatch,\n );\n\n const featureValue = useMemo(\n () => ({\n overridesSend: overridesDispatch,\n defaultsSend: defaultsDispatch,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesState, defaultsState, testCallback],\n );\n\n return (\n \n \n {children}\n \n \n );\n}\n", "import { createContext } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch, FeaturesState } from './FeaturesState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import type { Dispatch } from 'react';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureStateValue =\n | 'initial'\n | 'enabled'\n | 'disabled'\n | 'unspecified'\n | 'asyncEnabled'\n | 'asyncDisabled'\n | 'asyncUnspecified';\n\nexport interface FeatureState {\n value: FeatureStateValue;\n featureDesc?: FeatureDescription;\n}\n\nexport type FeatureDispatch = Dispatch;\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(\n featureState: FeatureState,\n): [FeatureValue, boolean] {\n return [\n featureState.value === 'enabled' || featureState.value === 'asyncEnabled'\n ? true\n : featureState.value === 'disabled' ||\n featureState.value === 'asyncDisabled'\n ? false\n : undefined,\n featureState.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (\n name: K,\n newValue: FeatureValue,\n ) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' }\n | { type: 'ASYNC_DONE'; value: FeatureValue };\n\nexport const initialFeatureState: FeatureState = {\n value: 'initial',\n};\n\n/**\n * Reducer for managing individual feature state\n */\nexport function featureReducer(\n state: FeatureState,\n action: FeatureAction,\n): FeatureState {\n switch (action.type) {\n case 'INIT': {\n const { feature } = action;\n const value =\n feature.defaultValue === true\n ? 'enabled'\n : feature.defaultValue === false\n ? 'disabled'\n : 'unspecified';\n return {\n value: value as FeatureStateValue,\n featureDesc: feature,\n };\n }\n\n case 'ENABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'DISABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'disabled' };\n }\n\n case 'TOGGLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'UNSET': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncUnspecified' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'SET': {\n const { value } = action;\n if (state.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n return { ...state, value: 'asyncEnabled' };\n }\n if (value === false) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'asyncUnspecified' };\n }\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'ASYNC_DONE': {\n const { value } = action;\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n default:\n return state;\n }\n}\n", "import type { Dispatch } from 'react';\n\nimport {\n type FeatureDescription,\n type FeatureState,\n type FeatureValue,\n valueForState,\n} from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: FeatureState };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string }\n | { type: 'ASYNC_DONE'; name: string; value: FeatureValue };\n\nexport interface FeaturesState {\n value: 'idle' | 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesDispatch = Dispatch;\n\nexport function valueOfFeature(\n featuresState: FeaturesState,\n feature: string,\n): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature];\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\nexport const initialFeaturesState: FeaturesState = {\n value: 'idle',\n context: {\n features: {},\n },\n};\n\n/**\n * Reducer for managing a collection of features\n */\nexport function featuresReducer(\n state: FeaturesState,\n action: FeaturesAction,\n): FeaturesState {\n switch (action.type) {\n case 'INIT': {\n if (action.features.length === 0) {\n return state;\n }\n\n const features: { [x: string]: FeatureState } = {};\n for (const feature of action.features) {\n // Initialize each feature\n const featureState = {\n value:\n feature.defaultValue === true\n ? ('enabled' as const)\n : feature.defaultValue === false\n ? ('disabled' as const)\n : ('unspecified' as const),\n featureDesc: feature,\n };\n features[feature.name] = featureState;\n }\n\n return {\n value: 'ready',\n context: { features },\n };\n }\n\n case 'DE_INIT': {\n return initialFeaturesState;\n }\n\n case 'SET_ALL': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const features = { ...state.context.features };\n Object.keys(features).forEach((name) => {\n const value = action.features[name] ?? undefined;\n const currentFeature = features[name];\n\n if (currentFeature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'asyncEnabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'asyncDisabled' };\n } else {\n features[name] = { ...currentFeature, value: 'asyncUnspecified' };\n }\n } else {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'enabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'disabled' };\n } else {\n features[name] = { ...currentFeature, value: 'unspecified' };\n }\n }\n });\n\n return {\n ...state,\n context: { features },\n };\n }\n\n case 'SET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n let newValue: FeatureState['value'];\n\n if (feature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n newValue = 'asyncEnabled';\n } else if (value === false) {\n newValue = 'asyncDisabled';\n } else {\n newValue = 'asyncUnspecified';\n }\n } else {\n if (value === true) {\n newValue = 'enabled';\n } else if (value === false) {\n newValue = 'disabled';\n } else {\n newValue = 'unspecified';\n }\n }\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'TOGGLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ENABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'DISABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncDisabled'\n : 'disabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'UNSET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncUnspecified'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ASYNC_DONE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n const newValue =\n value === true\n ? 'enabled'\n : value === false\n ? 'disabled'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n default:\n return state;\n }\n}\n", "import { useEffect } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch,\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n // Clean up window.feature immediately if consoleOverride is disabled\n if (window.feature != null) {\n window.feature = undefined;\n }\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[],\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useEffect, useMemo } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState,\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.value === 'ready') {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState =\n Object.keys(overrides).length === 0 || storage == null\n ? '{}'\n : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.value === 'ready') {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport type { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState,\n): (feature: string) => boolean | undefined {\n return useCallback(\n (f: string) => testFeature(f, [defaultsState, overridesState]),\n [defaultsState, overridesState],\n );\n}\n", "import type { FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(\n feature: string,\n states: FeaturesState[],\n): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import { RadioGroup } from '@headlessui/react';\nimport React, {\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { valueOfFeature } from './FeaturesState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({\n feature,\n}: {\n feature: FeatureDescription;\n}): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context],\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (\n valueOfFeature(defaultsState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const valueInOverrides = (\n valueOfFeature(overridesState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null : (\n

\n {feature.description}\n

\n )}\n
\n
\n {[\n {\n id: 'false',\n title: `Disable ${feature.name}`,\n description: 'Override the feature to be disabled',\n },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n {\n id: 'true',\n title: `Enable ${feature.name}`,\n description: 'Override the feature to be enabled',\n },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active\n ? 'border-blue-500 ring-2 ring-blue-500'\n : '',\n disabled\n ? 'border-transparent ring-gray-500 cursor-not-allowed'\n : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none',\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n \n {option.title}\n \n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n \n );\n}\n\nfunction ShadowContent({\n root,\n children,\n}: {\n children: ReactNode;\n root: Element;\n}) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n \n {root != null ? (\n \n \n \n ) : null}\n \n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
\n Feature Flag Overrides\n
\n

\n

\n Features can be enabled or disabled unless they are forced\n upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], + "mappings": "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", "names": [] } diff --git a/dist/esm/src/index.js b/dist/esm/src/index.js index 58aa113..650c36a 100644 --- a/dist/esm/src/index.js +++ b/dist/esm/src/index.js @@ -1,4 +1,518 @@ -var $=Object.defineProperty;var B=Object.getOwnPropertySymbols;var Q=Object.prototype.hasOwnProperty,Z=Object.prototype.propertyIsEnumerable;var P=(t,e,r)=>e in t?$(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,U=(t,e)=>{for(var r in e||(e={}))Q.call(e,r)&&P(t,r,e[r]);if(B)for(var r of B(e))Z.call(e,r)&&P(t,r,e[r]);return t};var y=(t,e,r)=>new Promise((a,n)=>{var i=s=>{try{u(r.next(s))}catch(c){n(c)}},d=s=>{try{u(r.throw(s))}catch(c){n(c)}},u=s=>s.done?a(s.value):Promise.resolve(s.value).then(i,d);u((r=r.apply(t,e)).next())});import{assign as N,createMachine as ee,spawn as te}from"xstate";import{assign as C,createMachine as R}from"xstate";function G(t){var e,r;return[t.matches("enabled")?!0:t.matches("disabled")?!1:void 0,(r=(e=t.context.featureDesc)==null?void 0:e.force)!=null?r:!1]}var J=R({id:"feature",initial:"initial",context:{},predictableActionArguments:!0,on:{ENABLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],TOGGLE:[{target:"asyncEnabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"enabled"}],DISABLE:[{target:"asyncDisabled",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"disabled"}],UNSET:[{target:"asyncUnspecied",cond:t=>{var e;return((e=t.featureDesc)==null?void 0:e.onChangeDefault)!=null}},{target:"unspecified"}],SET:[{target:"asyncEnabled",cond:(t,e)=>{var r;return e.value===!0&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncDisabled",cond:(t,e)=>{var r;return e.value===!1&&((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"asyncUnspecied",cond:(t,e)=>{var r;return((r=t.featureDesc)==null?void 0:r.onChangeDefault)!=null}},{target:"enabled",cond:(t,e)=>e.value===!0},{target:"disabled",cond:(t,e)=>e.value===!1},{target:"unspecified"}]},states:{initial:{on:{INIT:[{actions:C({featureDesc:(t,e)=>e.feature}),target:"enabled",cond:(t,e)=>e.feature.defaultValue===!0},{actions:C({featureDesc:(t,e)=>e.feature}),target:"unspecified",cond:(t,e)=>e.feature.defaultValue===void 0},{actions:C({featureDesc:(t,e)=>e.feature}),target:"disabled",cond:(t,e)=>e.feature.defaultValue===!1}]}},unspecified:{},disabled:{},enabled:{},asyncDisabled:{invoke:{id:"set-off-upstream",src:t=>y(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!1)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncUnspecied:{invoke:{id:"set-unset-upstream",src:t=>y(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,void 0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}},asyncEnabled:{invoke:{id:"set-on-upstream",src:t=>y(void 0,null,function*(){var r;let e=(r=t.featureDesc)==null?void 0:r.onChangeDefault;if(e!=null&&t.featureDesc!=null)return e(t.featureDesc.name,!0)}),onDone:[{target:"enabled",cond:(t,e)=>e.data===!0},{target:"disabled",cond:(t,e)=>e.data===!1},{target:"unspecified"}],onError:"unspecified"}}}});function g(t,e){if(t.context.features[e]==null)return[void 0,!1];let r=t.context.features[e].getSnapshot();return r!=null?G(r):[void 0,!1]}var F=ee({id:"features",initial:"idle",predictableActionArguments:!0,context:{features:{}},states:{idle:{on:{INIT:{target:"ready",cond:(t,e)=>e.features.length>0,actions:N({features:(t,e)=>{let r={};for(let a of e.features)r[a.name]=te(J,{name:a.name,sync:!0}),r[a.name].send({type:"INIT",feature:a});return r}})}}},ready:{on:{DE_INIT:{target:"idle",actions:N({features:(t,e)=>({})})},SET_ALL:{actions:N({features:(t,e)=>{let r=U({},t.features);return Object.keys(r).forEach(a=>{var n;r[a].send({type:"SET",value:(n=e.features[a])!=null?n:void 0})}),r}})},SET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"SET",value:e.value})}},TOGGLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"TOGGLE"})}},ENABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"ENABLE"})}},DISABLE:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"DISABLE"})}},UNSET:{actions:(t,e)=>{let r=t.features[e.name];r!=null&&r.send({type:"UNSET"})}}}}}});import X,{useMemo as le,useEffect as H,useRef as de}from"react";import{useMachine as q}from"@xstate/react";import{createContext as re}from"react";var h=re(t=>!1);import{createContext as oe}from"react";var w=oe(null);import{useEffect as ae}from"react";var k=class{constructor(e,r,a){this.featureDesc=a,this.dispatch=e,this.testFeature=r}toggle(e){this.dispatch({type:"TOGGLE",name:e})}enable(e){this.dispatch({type:"ENABLE",name:e})}unset(e){this.dispatch({type:"UNSET",name:e})}disable(e){this.dispatch({type:"DISABLE",name:e})}setAll(e){this.dispatch({type:"SET_ALL",features:e})}listFeatures(){return this.featureDesc.map(e=>[e.name,this.testFeature(e.name)])}};function z(t,e,r,a){ae(()=>t?(window.feature=new k(a,r,e),()=>{window.feature!=null&&delete window.feature}):()=>{},[e,a,t,r])}import{useMemo as ne,useEffect as ie}from"react";var T="react-enable:feature-values";function A(t,e,r){let a=ne(()=>{let i={};if(r.matches("ready"))for(let d of e){let[u]=g(r,d.name);u!=null&&(i[d.name]=u)}return i},[e,r]),n=Object.keys(a).length===0||t==null?"{}":JSON.stringify({overrides:a});ie(()=>{try{t!=null&&r.matches("ready")&&t.setItem(T,n)}catch(i){}},[r,t,n])}import{useCallback as se}from"react";function I(t,e){let r=e.map(a=>g(a,t));for(let[a,n]of r)if(a!=null&&n)return a;for(let[a]of r)if(a!=null)return a}function V(t,e){return se(r=>I(r,[t,e]),[t,e])}function ue({children:t,features:e,disableConsole:r=!1,storage:a=window.sessionStorage}){let n=de(e),[i,d]=q(F),[u,s]=q(F);H(()=>(s({type:"INIT",features:e}),()=>{s({type:"DE_INIT"})}),[s,e]),H(()=>{let m={};if(a!=null)try{let l=a.getItem(T);l!=null&&(m=JSON.parse(l).overrides)}catch(l){console.error("error in localStorage",l)}return d({type:"INIT",features:n.current.filter(l=>l.noOverride!==!0).map(l=>{var p;return{name:l.name,description:l.description,defaultValue:(p=m==null?void 0:m[l.name])!=null?p:void 0}})}),()=>{d({type:"DE_INIT"})}},[n,d,a]),A(a,n.current,i);let c=V(i,u);z(!r,n.current,c,s);let v=le(()=>({overridesSend:d,defaultsSend:s,featuresDescription:n.current,overridesState:i,defaultsState:u,test:c}),[d,s,i,u,c]);return X.createElement(w.Provider,{value:v},X.createElement(h.Provider,{value:c},t))}import*as D from"react";import{useContext as ce,useMemo as pe}from"react";function f(t){let e=ce(h),r=pe(()=>t==null?[]:Array.isArray(t)?t:[t],[t]);return[e,r]}function L(t){let[e,r]=f(t);return r.length>0&&r.every(e)}function O(t){let[e,r]=f(t);return r.some(e)}function fe({feature:t=[],allFeatures:e=[],children:r}){let a=O(t),n=L(e);return a||n?D.createElement(D.Fragment,null,r):null}import*as E from"react";function M(t){let[e,r]=f(t);return t.length>0&&r.every(a=>{var n;return!((n=e(a))!=null&&n)})}function _(t){let[e,r]=f(t);return r.some(a=>{var n;return!((n=e(a))!=null&&n)})}var me=({feature:t=[],allFeatures:e=[],children:r})=>{let a=_(t),n=M(e);return a||n?E.createElement(E.Fragment,null,r):null};import o,{useContext as Y,useState as W,useCallback as be}from"react";import he from"react-dom";import{RadioGroup as x}from"@headlessui/react";var K=`/* +var __defProp = Object.defineProperty; +var __defProps = Object.defineProperties; +var __getOwnPropDescs = Object.getOwnPropertyDescriptors; +var __getOwnPropSymbols = Object.getOwnPropertySymbols; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __propIsEnum = Object.prototype.propertyIsEnumerable; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __spreadValues = (a, b) => { + for (var prop in b || (b = {})) + if (__hasOwnProp.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + if (__getOwnPropSymbols) + for (var prop of __getOwnPropSymbols(b)) { + if (__propIsEnum.call(b, prop)) + __defNormalProp(a, prop, b[prop]); + } + return a; +}; +var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); + +// src/Disable.tsx +import * as React from "react"; + +// src/utils.ts +import { useContext, useMemo } from "react"; + +// src/EnableContext.tsx +import { createContext } from "react"; +var EnableContext = createContext((_s) => false); + +// src/utils.ts +function useTestAndConvert(input) { + const test = useContext(EnableContext); + const converted = useMemo(() => input == null ? [] : Array.isArray(input) ? input : [input], [input]); + return [test, converted]; +} + +// src/useAllDisabled.tsx +function useAllDisabled(withoutAll) { + const [test, queryAllWithout] = useTestAndConvert(withoutAll); + return withoutAll.length > 0 && queryAllWithout.every((x) => { + var _a; + return !((_a = test(x)) != null ? _a : false); + }); +} + +// src/useDisabled.tsx +function useDisabled(without) { + const [test, queryAnyWithout] = useTestAndConvert(without); + return queryAnyWithout.some((x) => { + var _a; + return !((_a = test(x)) != null ? _a : false); + }); +} + +// src/Disable.tsx +var Disable = ({ + feature = [], + allFeatures = [], + children +}) => { + const isAny = useDisabled(feature); + const isAll = useAllDisabled(allFeatures); + if (isAny || isAll) { + return /* @__PURE__ */ React.createElement(React.Fragment, null, children); + } + return null; +}; + +// src/Enable.tsx +import * as React2 from "react"; + +// src/useAllEnabled.tsx +function useAllEnabled(allFeatures) { + const [test, queryAllPresent] = useTestAndConvert(allFeatures); + return queryAllPresent.length > 0 && queryAllPresent.every(test); +} + +// src/useEnabled.tsx +function useEnabled(feature) { + const [test, queryAnyPresent] = useTestAndConvert(feature); + return queryAnyPresent.some(test); +} + +// src/Enable.tsx +function Enable({ + feature = [], + allFeatures = [], + children +}) { + const isAny = useEnabled(feature); + const isAll = useAllEnabled(allFeatures); + if (isAny || isAll) { + return /* @__PURE__ */ React2.createElement(React2.Fragment, null, children); + } + return null; +} + +// src/Features.tsx +import React3, { + useEffect as useEffect3, + useMemo as useMemo3, + useReducer, + useRef +} from "react"; + +// src/FeatureContext.tsx +import { createContext as createContext2 } from "react"; +var FeatureContext = createContext2(null); + +// src/FeatureState.tsx +function valueForState(featureState) { + var _a, _b; + return [ + featureState.value === "enabled" || featureState.value === "asyncEnabled" ? true : featureState.value === "disabled" || featureState.value === "asyncDisabled" ? false : void 0, + (_b = (_a = featureState.featureDesc) == null ? void 0 : _a.force) != null ? _b : false + ]; +} + +// src/FeaturesState.tsx +function valueOfFeature(featuresState, feature) { + if (featuresState.context.features[feature] == null) { + return [void 0, false]; + } + const featureState = featuresState.context.features[feature]; + if (featureState != null) { + return valueForState(featureState); + } + return [void 0, false]; +} +var initialFeaturesState = { + value: "idle", + context: { + features: {} + } +}; +function featuresReducer(state, action) { + var _a, _b, _c, _d, _e; + switch (action.type) { + case "INIT": { + if (action.features.length === 0) { + return state; + } + const features = {}; + for (const feature of action.features) { + const featureState = { + value: feature.defaultValue === true ? "enabled" : feature.defaultValue === false ? "disabled" : "unspecified", + featureDesc: feature + }; + features[feature.name] = featureState; + } + return { + value: "ready", + context: { features } + }; + } + case "DE_INIT": { + return initialFeaturesState; + } + case "SET_ALL": { + if (state.value !== "ready") { + return state; + } + const features = __spreadValues({}, state.context.features); + Object.keys(features).forEach((name) => { + var _a2, _b2; + const value = (_a2 = action.features[name]) != null ? _a2 : void 0; + const currentFeature = features[name]; + if (((_b2 = currentFeature.featureDesc) == null ? void 0 : _b2.onChangeDefault) != null) { + if (value === true) { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncEnabled" }); + } else if (value === false) { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncDisabled" }); + } else { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncUnspecified" }); + } + } else { + if (value === true) { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "enabled" }); + } else if (value === false) { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "disabled" }); + } else { + features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "unspecified" }); + } + } + }); + return __spreadProps(__spreadValues({}, state), { + context: { features } + }); + } + case "SET": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const { value } = action; + let newValue; + if (((_a = feature.featureDesc) == null ? void 0 : _a.onChangeDefault) != null) { + if (value === true) { + newValue = "asyncEnabled"; + } else if (value === false) { + newValue = "asyncDisabled"; + } else { + newValue = "asyncUnspecified"; + } + } else { + if (value === true) { + newValue = "enabled"; + } else if (value === false) { + newValue = "disabled"; + } else { + newValue = "unspecified"; + } + } + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "TOGGLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = ((_b = feature.featureDesc) == null ? void 0 : _b.onChangeDefault) != null ? "asyncEnabled" : "enabled"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "ENABLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = ((_c = feature.featureDesc) == null ? void 0 : _c.onChangeDefault) != null ? "asyncEnabled" : "enabled"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "DISABLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = ((_d = feature.featureDesc) == null ? void 0 : _d.onChangeDefault) != null ? "asyncDisabled" : "disabled"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "UNSET": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = ((_e = feature.featureDesc) == null ? void 0 : _e.onChangeDefault) != null ? "asyncUnspecified" : "unspecified"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + case "ASYNC_DONE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const { value } = action; + const newValue = value === true ? "enabled" : value === false ? "disabled" : "unspecified"; + return __spreadProps(__spreadValues({}, state), { + context: { + features: __spreadProps(__spreadValues({}, state.context.features), { + [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) + }) + } + }); + } + default: + return state; + } +} + +// src/useConsoleOverride.tsx +import { useEffect } from "react"; + +// src/GlobalEnable.tsx +var GlobalEnable = class { + constructor(dispatch, testFeature2, featureDesc) { + this.featureDesc = featureDesc; + this.dispatch = dispatch; + this.testFeature = testFeature2; + } + toggle(feature) { + this.dispatch({ type: "TOGGLE", name: feature }); + } + enable(feature) { + this.dispatch({ type: "ENABLE", name: feature }); + } + unset(feature) { + this.dispatch({ type: "UNSET", name: feature }); + } + disable(feature) { + this.dispatch({ type: "DISABLE", name: feature }); + } + setAll(features) { + this.dispatch({ type: "SET_ALL", features }); + } + listFeatures() { + return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]); + } +}; + +// src/useConsoleOverride.tsx +function useConsoleOverride(consoleOverride, features, testFeature2, dispatch) { + useEffect(() => { + if (!consoleOverride) { + if (window.feature != null) { + window.feature = void 0; + } + return () => { + if (window.feature != null) { + window.feature = void 0; + } + }; + } + window.feature = new GlobalEnable(dispatch, testFeature2, features); + return () => { + if (window.feature != null) { + window.feature = void 0; + } + }; + }, [features, dispatch, consoleOverride, testFeature2]); +} + +// src/usePersist.tsx +import { useEffect as useEffect2, useMemo as useMemo2 } from "react"; +var KEY = "react-enable:feature-values"; +function usePersist(storage, features, overrideState) { + const overrides = useMemo2(() => { + const newOverrides = {}; + if (overrideState.value === "ready") { + for (const feature of features) { + const [value] = valueOfFeature(overrideState, feature.name); + if (value != null) { + newOverrides[feature.name] = value; + } + } + } + return newOverrides; + }, [features, overrideState]); + const strState = Object.keys(overrides).length === 0 || storage == null ? "{}" : JSON.stringify({ overrides }); + useEffect2(() => { + try { + if (storage != null && overrideState.value === "ready") { + storage.setItem(KEY, strState); + } + } catch (e) { + } + }, [overrideState, storage, strState]); +} + +// src/useTestCallback.tsx +import { useCallback } from "react"; + +// src/testFeature.tsx +function testFeature(feature, states) { + const values = states.map((state) => valueOfFeature(state, feature)); + for (const [featureValue, featureForced] of values) { + if (featureValue != null && featureForced) { + return featureValue; + } + } + for (const [featureValue] of values) { + if (featureValue != null) { + return featureValue; + } + } + return void 0; +} + +// src/useTestCallback.tsx +function useTestCallback(defaultsState, overridesState) { + return useCallback((f) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]); +} + +// src/Features.tsx +function Features({ + children, + features, + disableConsole = false, + storage = window.sessionStorage +}) { + const featuresRef = useRef(features); + const [overridesState, overridesDispatch] = useReducer(featuresReducer, initialFeaturesState); + const [defaultsState, defaultsDispatch] = useReducer(featuresReducer, initialFeaturesState); + useEffect3(() => { + defaultsDispatch({ type: "INIT", features }); + return () => { + defaultsDispatch({ type: "DE_INIT" }); + }; + }, [features]); + useEffect3(() => { + let f = {}; + if (storage != null) { + try { + const featuresJson = storage.getItem(KEY); + if (featuresJson != null) { + const fh = JSON.parse(featuresJson); + f = fh.overrides; + } + } catch (e) { + console.error("error in localStorage", e); + } + } + overridesDispatch({ + type: "INIT", + features: featuresRef.current.filter((x) => x.noOverride !== true).map((x) => { + var _a; + return { + name: x.name, + description: x.description, + defaultValue: (_a = f == null ? void 0 : f[x.name]) != null ? _a : void 0 + }; + }) + }); + return () => { + overridesDispatch({ type: "DE_INIT" }); + }; + }, [storage]); + useEffect3(() => { + if (defaultsState.value !== "ready") { + return; + } + Object.entries(defaultsState.context.features).forEach(([name, feature]) => { + var _a; + if (feature.value === "asyncEnabled" || feature.value === "asyncDisabled" || feature.value === "asyncUnspecified") { + const targetValue = feature.value === "asyncEnabled" ? true : feature.value === "asyncDisabled" ? false : void 0; + const onChangeDefault = (_a = feature.featureDesc) == null ? void 0 : _a.onChangeDefault; + if (onChangeDefault != null && feature.featureDesc != null) { + onChangeDefault(feature.featureDesc.name, targetValue).then((result) => { + defaultsDispatch({ type: "ASYNC_DONE", name, value: result }); + }).catch(() => { + defaultsDispatch({ + type: "ASYNC_DONE", + name, + value: void 0 + }); + }); + } + } + }); + }, [defaultsState]); + usePersist(storage, featuresRef.current, overridesState); + const testCallback = useTestCallback(overridesState, defaultsState); + useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsDispatch); + const featureValue = useMemo3(() => ({ + overridesSend: overridesDispatch, + defaultsSend: defaultsDispatch, + featuresDescription: featuresRef.current, + overridesState, + defaultsState, + test: testCallback + }), [overridesState, defaultsState, testCallback]); + return /* @__PURE__ */ React3.createElement(FeatureContext.Provider, { + value: featureValue + }, /* @__PURE__ */ React3.createElement(EnableContext.Provider, { + value: testCallback + }, children)); +} + +// src/ToggleFeatures.tsx +import { RadioGroup } from "@headlessui/react"; +import React4, { + useCallback as useCallback2, + useContext as useContext2, + useState +} from "react"; +import ReactDOM from "react-dom"; + +// src/tailwind.css +var tailwind_default = `/* ! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com */ @@ -639,6 +1153,40 @@ select { --tw-backdrop-sepia: ; } +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + .sr-only { position: absolute; width: 1px; @@ -922,14 +1470,14 @@ select { border-color: rgb(107 114 128 / var(--tw-border-opacity)); } -.bg-white { +.bg-blue-600 { --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); } -.bg-blue-600 { +.bg-white { --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } .p-3 { @@ -1031,6 +1579,11 @@ select { line-height: 1.75rem; } +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + .text-gray-900 { --tw-text-opacity: 1; color: rgb(17 24 39 / var(--tw-text-opacity)); @@ -1046,11 +1599,6 @@ select { color: rgb(34 197 94 / var(--tw-text-opacity)); } -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - .text-red-500 { --tw-text-opacity: 1; color: rgb(239 68 68 / var(--tw-text-opacity)); @@ -1189,5 +1737,245 @@ select { gap: 1rem; } } -`;function j(...t){return t.filter(Boolean).join(" ")}function we({feature:t}){var c,v,m;let e=Y(w),r=be(l=>{if((e==null?void 0:e.overridesSend)!=null)switch(l){case"true":{e.overridesSend({type:"ENABLE",name:t.name});break}case"false":{e.overridesSend({type:"DISABLE",name:t.name});break}case"unset":{e.overridesSend({type:"UNSET",name:t.name});break}}},[t.name,e]);if(e==null)return null;let{overridesState:a,test:n,defaultsState:i}=e,d=((c=g(i,t.name)[0])!=null?c:"unset").toString(),u=((v=g(a,t.name)[0])!=null?v:"unset").toString(),s=n(t.name);return o.createElement(x,{disabled:t.noOverride,onChange:r,value:u},o.createElement(x.Label,null,o.createElement("h6",{className:"text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7"},o.createElement("span",{className:"font-medium"},"Feature: ",o.createElement("code",null,t.name)),t.noOverride===!0?o.createElement("div",{className:"border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z",fillRule:"evenodd"})),o.createElement("div",null,"No Overrides")):null,s===!0?o.createElement("div",{className:"flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1"},o.createElement("svg",{"aria-hidden":"true",className:"h-4 w-4 min-w-4",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"})),o.createElement("div",null,s?"Enabled":"Disabled")):null),t.description==null?null:o.createElement("p",{className:"text-base text-gray-500 text-sm"},t.description)),o.createElement("div",{className:"mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4"},[{id:"false",title:`Disable ${t.name}`,description:"Override the feature to be disabled"},{id:"unset",title:"Default",description:"Inherit enabled state from defaults",disabled:((m=t.noOverride)!=null?m:!1)||t.force,defaultValue:d==="true"?o.createElement("div",{className:"text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.createElement("span",null,"Enabled")):o.createElement("div",{className:"text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1"},o.createElement("span",null,"Disabled"))},{id:"true",title:`Enable ${t.name}`,description:"Override the feature to be enabled"}].map(l=>o.createElement(x.Option,{className:({checked:p,active:S,disabled:b})=>j(p?"border-transparent":"border-gray-300",!b&&S?"border-blue-500 ring-2 ring-blue-500":"",b?"border-transparent ring-gray-500 cursor-not-allowed":"cursor-pointer","relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"),disabled:l.disabled,key:l.id,value:l.id},({checked:p,active:S,disabled:b})=>o.createElement(o.Fragment,null,o.createElement("div",{className:"flex flex-col grow"},o.createElement(x.Label,{as:"span",className:"flex flex-nowrap flex-row gap-1 items-center space-between"},o.createElement("span",{className:"text-sm font-medium text-gray-900 grow shrink"},l.title),l.defaultValue!=null?l.defaultValue:null,o.createElement("svg",{"aria-hidden":"true",className:j(p?"":"invisible","h-5 w-5 text-blue-500 min-w-4"),fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z",fillRule:"evenodd"}))),o.createElement(x.Description,{as:"span",className:"mt-1 flex items-center text-sm text-gray-500"},l.description)),o.createElement("div",{"aria-hidden":"true",className:j(!b&&S?"border":"border-2",p?b?"border-gray-500":"border-blue-500":"border-transparent","absolute -inset-px rounded-lg pointer-events-none")}))))))}function xe({root:t,children:e}){return he.createPortal(e,t)}function ve({defaultOpen:t=!1,hidden:e=!1}){let[r,a]=W(null),n=i=>{if(i==null||r!=null)return;let d=i==null?void 0:i.attachShadow({mode:"open"}),u=document.createElement("style"),s=document.createElement("div");u.textContent=K,d.appendChild(u),d.appendChild(s),a(s)};return e?null:o.createElement("div",{ref:n,style:{zIndex:99999,position:"fixed",width:"0",height:"0",bottom:0}},r!=null?o.createElement(xe,{root:r},o.createElement(ye,{defaultOpen:t})):null)}function ye({defaultOpen:t=!1,hidden:e=!1}){let[r,a]=W(t),n=Y(w);if(n==null||e)return null;let{featuresDescription:i}=n;return i.length===0?null:o.createElement("div",{className:"relative"},o.createElement("div",{className:"absolute bottom-0 left-0 mx-4 my-4"},o.createElement("button",{className:"inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>a(!0),title:"Toggle features",type:"button"},o.createElement("svg",{className:"w-6 h-6 min-h-6 min-w-6",fill:"currentColor",viewBox:"0 0 20 20",xmlns:"http://www.w3.org/2000/svg"},o.createElement("path",{clipRule:"evenodd",d:"M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z",fillRule:"evenodd"})))),r?o.createElement("div",{className:"fixed z-10 inset-0 overflow-y-auto"},o.createElement("div",{className:"flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0"},o.createElement("div",{className:"relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full"},o.createElement("div",null,o.createElement("div",{className:"mt-1 sm:mt-3"},o.createElement("h3",{className:"flex flex-row gap-4 flex-nowrap items-center space-between"},o.createElement("div",{className:"grow text-lg leading-6 font-medium text-gray-900"},"Feature Flag Overrides")),o.createElement("p",{className:"text-sm text-gray-500"},"Features can be enabled or disabled unless they are forced upstream. You can also revert to default."),o.createElement("div",{className:"mt-6"},o.createElement("fieldset",{className:"flex flex-col gap-9"},o.createElement("legend",{className:"sr-only"},"Feature Flags"),i.map(d=>o.createElement(we,{feature:d,key:d.name})))),o.createElement("div",{className:"flex justify-center items-center mt-5 sm:mt-6"},o.createElement("button",{className:"inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm",onClick:()=>a(!1),type:"button"},"Done"))))))):null)}export{me as Disable,fe as Enable,h as EnableContext,ue as Features,F as FeaturesMachine,ve as ToggleFeatures,M as useAllDisabled,L as useAllEnabled,_ as useDisabled,O as useEnabled}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlcy50c3giLCAiLi4vLi4vLi4vc3JjL0VuYWJsZUNvbnRleHQudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUNvbnNvbGVPdmVycmlkZS50c3giLCAiLi4vLi4vLi4vc3JjL0dsb2JhbEVuYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3VzZVBlcnNpc3QudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VUZXN0Q2FsbGJhY2sudHN4IiwgIi4uLy4uLy4uL3NyYy90ZXN0RmVhdHVyZS50c3giLCAiLi4vLi4vLi4vc3JjL0VuYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy91c2VBbGxFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRW5hYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL0Rpc2FibGUudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VBbGxEaXNhYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZURpc2FibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvVG9nZ2xlRmVhdHVyZXMudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBBY3RvclJlZkZyb20sIEludGVycHJldGVyRnJvbSwgU3RhdGVGcm9tLCBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIHNwYXduIH0gZnJvbSAneHN0YXRlJztcblxuaW1wb3J0IHsgRmVhdHVyZU1hY2hpbmUsIEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlLCB2YWx1ZUZvclN0YXRlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzQ29udGV4dCB7XG4gIC8vIGZlYXR1cmVzIGFyZSBsYXllcmVkOlxuICAvLyAgLSBkZWZhdWx0czogaWYgbm90aGluZyBlbHNlIG1hdGNoZXMsIHByb3ZpZGVkIGEgdmFsdWUgZm9yIGZlYXR1cmVcbiAgLy8gIC0gYnJvd3NlcjogYnJvd3Nlci1sb2NhbCB2YWx1ZXMgZm9yIGZlYXR1cmVzIChrZXB0IGluIGxvY2FsIHN0b3JhZ2UsIGV0YylcbiAgLy8gIC0gdXNlcjogdmFsdWVzIGZyb20gdGhlIHVzZXIncyBwcm9maWxlLCBpZiBhbnlcbiAgLy8gIC0gb3JnOiB2YWx1ZSBmcm9tIHRoZSBvcmcncyBwcm9maWxlLCBpZiBhbnlcbiAgZmVhdHVyZXM6IHsgW3g6IHN0cmluZ106IEFjdG9yUmVmRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+IH07XG59XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVzQWN0aW9uID1cbiAgfCB7IHR5cGU6ICdERV9JTklUJyB9XG4gIHwgeyB0eXBlOiAnRElTQUJMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnRU5BQkxFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdJTklUJzsgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdIH1cbiAgfCB7IHR5cGU6ICdTRVRfQUxMJzsgZmVhdHVyZXM6IHsgW2tleTogc3RyaW5nXTogRmVhdHVyZVZhbHVlIH0gfVxuICB8IHsgdHlwZTogJ1NFVCc7IG5hbWU6IHN0cmluZzsgdmFsdWU6IEZlYXR1cmVWYWx1ZSB9XG4gIHwgeyB0eXBlOiAnVE9HR0xFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdVTlNFVCc7IG5hbWU6IHN0cmluZyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzVHlwZVN0YXRlIHtcbiAgdmFsdWU6ICdyZWFkeSc7XG4gIGNvbnRleHQ6IEZlYXR1cmVzQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZXNTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZXNNYWNoaW5lPjtcbmV4cG9ydCB0eXBlIEZlYXR1cmVzRGlzcGF0Y2ggPSBJbnRlcnByZXRlckZyb208dHlwZW9mIEZlYXR1cmVzTWFjaGluZT5bJ3NlbmQnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlT2ZGZWF0dXJlKGZlYXR1cmVzU3RhdGU6IEZlYXR1cmVzU3RhdGUsIGZlYXR1cmU6IHN0cmluZyk6IFtGZWF0dXJlVmFsdWUsIGJvb2xlYW5dIHtcbiAgaWYgKGZlYXR1cmVzU3RhdGUuY29udGV4dC5mZWF0dXJlc1tmZWF0dXJlXSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFt1bmRlZmluZWQsIGZhbHNlXTtcbiAgfVxuICBjb25zdCBmZWF0dXJlU3RhdGUgPSBmZWF0dXJlc1N0YXRlLmNvbnRleHQuZmVhdHVyZXNbZmVhdHVyZV0uZ2V0U25hcHNob3QoKTtcbiAgaWYgKGZlYXR1cmVTdGF0ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlRm9yU3RhdGUoZmVhdHVyZVN0YXRlKTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgZmFsc2VdO1xufVxuXG4vLy8gc3RhdGUgbWFjaGluZSB0aGF0IG1hbmFnZXMgYSBzZXQgb2YgZmVhdHVyZXMgd2l0aCB1c2VyLCBvcmcsIGFuZCBsb2NhbCBvdmVycmlkZXNcbmV4cG9ydCBjb25zdCBGZWF0dXJlc01hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVzQ29udGV4dCwgRmVhdHVyZXNBY3Rpb24sIEZlYXR1cmVzVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZXMnLFxuICBpbml0aWFsOiAnaWRsZScsXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBjb250ZXh0OiB7XG4gICAgZmVhdHVyZXM6IHt9LFxuICB9LFxuICBzdGF0ZXM6IHtcbiAgICBpZGxlOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiB7XG4gICAgICAgICAgdGFyZ2V0OiAncmVhZHknLFxuICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmVzLmxlbmd0aCA+IDAsXG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY29udGV4dCwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXM6IHR5cGVvZiBjb250ZXh0LmZlYXR1cmVzID0ge307XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGV2ZW50LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbZmVhdHVyZS5uYW1lXSA9IHNwYXduKEZlYXR1cmVNYWNoaW5lLCB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBmZWF0dXJlLm5hbWUsXG4gICAgICAgICAgICAgICAgICBzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVzW2ZlYXR1cmUubmFtZV0uc2VuZCh7IHR5cGU6ICdJTklUJywgZmVhdHVyZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gdGhlIGZlYXR1cmVzIGFyZSBsb2FkZWQgYW5kIHJlYWR5IHRvIGJlIHVzZWRcbiAgICByZWFkeToge1xuICAgICAgb246IHtcbiAgICAgICAgREVfSU5JVDogeyB0YXJnZXQ6ICdpZGxlJywgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZXM6IChfLCBfXykgPT4gKHt9KSB9KSB9LFxuICAgICAgICBTRVRfQUxMOiB7XG4gICAgICAgICAgYWN0aW9uczogYXNzaWduKHtcbiAgICAgICAgICAgIGZlYXR1cmVzOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0geyAuLi5jdHguZmVhdHVyZXMgfTtcbiAgICAgICAgICAgICAgLy8gQWxsIGNvbmZpZ3VyZWQgZmVhdHVyZXMgYXJlIHNldCB0byBvbi9vZmYgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZlYXR1cmVzKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0uc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS5mZWF0dXJlc1tuYW1lXSA/PyB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gZmVhdHVyZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFNldCBhIGZlYXR1cmUgdG8gYSB2YWx1ZVxuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdTRVQnLCB2YWx1ZTogZS52YWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHRvZ2dsZSBhIGZlYXR1cmVcbiAgICAgICAgVE9HR0xFOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVE9HR0xFJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHdoZW4gYSBmZWF0dXJlIGlzIGVuYWJsZWQsIHNlbmQgdGhlIGVuYWJsZSBtZXNzYWdlIHRvIHRoZSBhY3RvclxuICAgICAgICBFTkFCTEU6IHtcbiAgICAgICAgICBhY3Rpb25zOiAoY3R4LCBlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmZWF0dXJlID0gY3R4LmZlYXR1cmVzW2UubmFtZV07XG4gICAgICAgICAgICBpZiAoZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIGZlYXR1cmUuc2VuZCh7IHR5cGU6ICdFTkFCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgZGlzYWJsZWQsIHNlbmQgdGhlIGRpc2FibGUgbWVzc2FnZSB0byB0aGUgYWN0b3JcbiAgICAgICAgRElTQUJMRToge1xuICAgICAgICAgIGFjdGlvbnM6IChjdHgsIGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmUgPSBjdHguZmVhdHVyZXNbZS5uYW1lXTtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZmVhdHVyZS5zZW5kKHsgdHlwZTogJ0RJU0FCTEUnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gd2hlbiBhIGZlYXR1cmUgaXMgdW5zZXQsIHNlbmQgdGhlIHVuc2V0IG1lc3NhZ2UgdG8gdGhlIGFjdG9yXG4gICAgICAgIFVOU0VUOiB7XG4gICAgICAgICAgYWN0aW9uczogKGN0eCwgZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGN0eC5mZWF0dXJlc1tlLm5hbWVdO1xuICAgICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBmZWF0dXJlLnNlbmQoeyB0eXBlOiAnVU5TRVQnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiIsICJpbXBvcnQgeyBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIERvbmVJbnZva2VFdmVudCwgSW50ZXJwcmV0ZXJGcm9tLCBTdGF0ZUZyb20gfSBmcm9tICd4c3RhdGUnO1xuXG4vKipcbiAqIEZlYXR1cmUgaXMgZWl0aGVyIG9uLCBvZmYsIG9yICd1bnNldCcsXG4gKiB3aGljaCBtZWFucyBpdCB3aWxsIGdvIHRvIHRoZSBkZWZhdWx0IHZhbHVlIG9yIHRoZSBsZXNzIHNwZWNpZmljIHZhbHVlLlxuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlVmFsdWUgPSBmYWxzZSB8IHRydWUgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVTdGF0ZSA9IFN0YXRlRnJvbTx0eXBlb2YgRmVhdHVyZU1hY2hpbmU+O1xuZXhwb3J0IHR5cGUgRmVhdHVyZURpc3BhdGNoID0gSW50ZXJwcmV0ZXJGcm9tPHR5cGVvZiBGZWF0dXJlTWFjaGluZT5bJ3NlbmQnXTtcblxuLy8vIEdpdmVuIGEgZmVhdHVyZXN0YXRlLCBkZXRlcm1pbmUgdGhlIHZhbHVlIChvbiwgb2ZmLCBvciB1bnNldClcbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUZvclN0YXRlKGZlYXR1cmVTdGF0ZTogRmVhdHVyZVN0YXRlKTogW0ZlYXR1cmVWYWx1ZSwgYm9vbGVhbl0ge1xuICByZXR1cm4gW1xuICAgIGZlYXR1cmVTdGF0ZS5tYXRjaGVzKCdlbmFibGVkJykgPyB0cnVlIDogZmVhdHVyZVN0YXRlLm1hdGNoZXMoJ2Rpc2FibGVkJykgPyBmYWxzZSA6IHVuZGVmaW5lZCxcbiAgICBmZWF0dXJlU3RhdGUuY29udGV4dC5mZWF0dXJlRGVzYz8uZm9yY2UgPz8gZmFsc2UsXG4gIF07XG59XG5cbi8qKlxuICogRGVmaW5pdGlvbiBvZiBhIGZlYXR1cmUgdGhhdCBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAqIEsgaXMgdGhlIHR5cGUgb2YgdGhlIGtleSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGZlYXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZURlc2NyaXB0aW9uPEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IHtcbiAgcmVhZG9ubHkgbmFtZTogSztcbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLy8vIElmIHNldCwgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSBkZWZhdWx0IHN0YXRlIGluc3RlYWQgb2Ygc2ltcGx5IG92ZXJyaWRpbmcuXG4gIC8vLyBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHVzZSB0aGlzIHRvIHVwZGF0ZSBhIGZlYXR1cmUgZmxhZyBvbiBhIGJhY2tlbmQgc2VydmVyLlxuICAvLy8gd2hlbiBzZXQsIHRoZSBmZWF0dXJlIHdpbGwgYmUgdXBkYXRlZCBvbiB0aGUgYmFja2VuZCBzZXJ2ZXIsIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY1xuICAvLy8gd2lsbCBiZSB1c2VkIGZvciB0aGUgZmluYWwgc3RhdGUgYWZ0ZXIgdGhlIGNoYW5nZS4gd2hpbGUgY2hhbmdpbmcsIHRoZSBmZWF0dXJlIHdpbGwgYmVcbiAgLy8vIGluIHRoZSAnY2hhbmdpbmcnIHN0YXRlLiBBbHNvIG5vdGUgdGhhdCB0aGUgZmVhdHVyZSB3aWxsIGJlIGNoYW5nZWQgYXQgdGhlIFwiZGVmYXVsdFwiIGxheWVyLlxuICByZWFkb25seSBvbkNoYW5nZURlZmF1bHQ/OiAobmFtZTogSywgbmV3VmFsdWU6IEZlYXR1cmVWYWx1ZSkgPT4gUHJvbWlzZTxGZWF0dXJlVmFsdWU+O1xuXG4gIC8vLyBpZiBzZXQgdHJ1ZSwgd2lsbCBmb3JjZSB0aGUgZmllbGQgdG8gd2hhdCBpdCBpcyBzZXQgaGVyZSB0aHJvdWdoIGxheWVycyBvZiBzdGF0ZXMuXG4gIC8vLyB1c2VmdWwgdG8gaW52ZXJ0IHRoZSBsYXllcnMsIHNpbWlsYXIgdG8gIWltcG9ydGFudCBpbiBDU1MuXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvLy8gSWYgc2V0IHRvIHRydWUsIHRoZSBmZWF0dXJlIHdpbGwgbm90IGJlIG92ZXJyaWRhYmxlIGJ5IHRoZSB1c2VyLlxuICByZWFkb25seSBub092ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvLy8gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHNldCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuXG4gIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZT86IEZlYXR1cmVWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIEZlYXR1cmVDb250ZXh0IHtcbiAgZmVhdHVyZURlc2M/OiBGZWF0dXJlRGVzY3JpcHRpb247XG59XG5cbnR5cGUgRmVhdHVyZVR5cGVTdGF0ZSA9XG4gIHwge1xuICAgICAgdmFsdWU6ICdhc3luY0RlbmFibGVkJztcbiAgICAgIGNvbnRleHQ6IEZlYXR1cmVDb250ZXh0O1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ2FzeW5jRGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnYXN5bmNVbnNwZWNpZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZGlzYWJsZWQnO1xuICAgICAgY29udGV4dDogRmVhdHVyZUNvbnRleHQ7XG4gICAgfVxuICB8IHtcbiAgICAgIHZhbHVlOiAnZW5hYmxlZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9XG4gIHwge1xuICAgICAgdmFsdWU6ICdpbml0aWFsJztcbiAgICAgIGNvbnRleHQ6IG5ldmVyO1xuICAgIH1cbiAgfCB7XG4gICAgICB2YWx1ZTogJ3Vuc3BlY2llZCc7XG4gICAgICBjb250ZXh0OiBGZWF0dXJlQ29udGV4dDtcbiAgICB9O1xuXG4vKipcbiAqIEFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZUFjdGlvbiA9XG4gIHwgeyB0eXBlOiAnRElTQUJMRScgfVxuICB8IHsgdHlwZTogJ0VOQUJMRScgfVxuICB8IHsgdHlwZTogJ0lOSVQnOyBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb24gfVxuICB8IHsgdHlwZTogJ1NFVCc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRScgfVxuICB8IHsgdHlwZTogJ1VOU0VUJyB9O1xuXG4vKipcbiAqIEZ1bGx5IGRlc2NyaWJlIHRoZSBzdGF0ZXMgYSBmZWF0dXJlIGNhbiBiZSBpblxuICovXG5leHBvcnQgY29uc3QgRmVhdHVyZU1hY2hpbmUgPSBjcmVhdGVNYWNoaW5lPEZlYXR1cmVDb250ZXh0LCBGZWF0dXJlQWN0aW9uLCBGZWF0dXJlVHlwZVN0YXRlPih7XG4gIGlkOiAnZmVhdHVyZScsXG4gIGluaXRpYWw6ICdpbml0aWFsJyxcbiAgY29udGV4dDoge30sXG4gIHByZWRpY3RhYmxlQWN0aW9uQXJndW1lbnRzOiB0cnVlLFxuICBvbjoge1xuICAgIEVOQUJMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFRPR0dMRTogW1xuICAgICAgeyB0YXJnZXQ6ICdhc3luY0VuYWJsZWQnLCBjb25kOiAoY3R4KSA9PiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsIH0sXG4gICAgICB7IHRhcmdldDogJ2VuYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIERJU0FCTEU6IFtcbiAgICAgIHsgdGFyZ2V0OiAnYXN5bmNEaXNhYmxlZCcsIGNvbmQ6IChjdHgpID0+IGN0eC5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwgfSxcbiAgICAgIHsgdGFyZ2V0OiAnZGlzYWJsZWQnIH0sXG4gICAgXSxcblxuICAgIFVOU0VUOiBbXG4gICAgICB7IHRhcmdldDogJ2FzeW5jVW5zcGVjaWVkJywgY29uZDogKGN0eCkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCB9LFxuICAgICAgeyB0YXJnZXQ6ICd1bnNwZWNpZmllZCcgfSxcbiAgICBdLFxuXG4gICAgU0VUOiBbXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRW5hYmxlZCcsXG4gICAgICAgIGNvbmQ6IChjdHgsIGUpID0+IGUudmFsdWUgPT09IHRydWUgJiYgY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2FzeW5jRGlzYWJsZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBlKSA9PiBlLnZhbHVlID09PSBmYWxzZSAmJiBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGFyZ2V0OiAnYXN5bmNVbnNwZWNpZWQnLFxuICAgICAgICBjb25kOiAoY3R4LCBfZSkgPT4gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICBjb25kOiAoX2N0eCwgZSkgPT4gZS52YWx1ZSA9PT0gdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgY29uZDogKF9jdHgsIGUpID0+IGUudmFsdWUgPT09IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgXSxcbiAgfSxcblxuICBzdGF0ZXM6IHtcbiAgICBpbml0aWFsOiB7XG4gICAgICBvbjoge1xuICAgICAgICBJTklUOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdlbmFibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfLCBlKSA9PiBlLmZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICd1bnNwZWNpZmllZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogYXNzaWduKHsgZmVhdHVyZURlc2M6IChfLCBlKSA9PiBlLmZlYXR1cmUgfSksXG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoXywgZSkgPT4gZS5mZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHVuc3BlY2lmaWVkOiB7fSxcbiAgICBkaXNhYmxlZDoge30sXG4gICAgZW5hYmxlZDoge30sXG5cbiAgICBhc3luY0Rpc2FibGVkOiB7XG4gICAgICBpbnZva2U6IHtcbiAgICAgICAgaWQ6ICdzZXQtb2ZmLXVwc3RyZWFtJyxcbiAgICAgICAgc3JjOiBhc3luYyAoY3R4KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb25jaGFuZ2UgPSBjdHguZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdDtcbiAgICAgICAgICBpZiAob25jaGFuZ2UgIT0gbnVsbCAmJiBjdHguZmVhdHVyZURlc2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uY2hhbmdlKGN0eC5mZWF0dXJlRGVzYy5uYW1lLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgYXN5bmNVbnNwZWNpZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC11bnNldC11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgb25Eb25lOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFyZ2V0OiAnZW5hYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2Rpc2FibGVkJyxcbiAgICAgICAgICAgIGNvbmQ6IChfY3R4LCBlOiBEb25lSW52b2tlRXZlbnQ8RmVhdHVyZVZhbHVlPikgPT4gZS5kYXRhID09PSBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdGFyZ2V0OiAndW5zcGVjaWZpZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG9uRXJyb3I6ICd1bnNwZWNpZmllZCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBhc3luY0VuYWJsZWQ6IHtcbiAgICAgIGludm9rZToge1xuICAgICAgICBpZDogJ3NldC1vbi11cHN0cmVhbScsXG4gICAgICAgIHNyYzogYXN5bmMgKGN0eCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uY2hhbmdlID0gY3R4LmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uY2hhbmdlICE9IG51bGwgJiYgY3R4LmZlYXR1cmVEZXNjICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBvbmNoYW5nZShjdHguZmVhdHVyZURlc2MubmFtZSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRG9uZTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhcmdldDogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgY29uZDogKF9jdHgsIGU6IERvbmVJbnZva2VFdmVudDxGZWF0dXJlVmFsdWU+KSA9PiBlLmRhdGEgPT09IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0YXJnZXQ6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICBjb25kOiAoX2N0eCwgZTogRG9uZUludm9rZUV2ZW50PEZlYXR1cmVWYWx1ZT4pID0+IGUuZGF0YSA9PT0gZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHRhcmdldDogJ3Vuc3BlY2lmaWVkJyB9LFxuICAgICAgICBdLFxuICAgICAgICBvbkVycm9yOiAndW5zcGVjaWZpZWQnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8sIFJlYWN0Tm9kZSwgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZU1hY2hpbmUgfSBmcm9tICdAeHN0YXRlL3JlYWN0JztcblxuaW1wb3J0IHsgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5pbXBvcnQgeyBGZWF0dXJlQ29udGV4dCB9IGZyb20gJy4vRmVhdHVyZUNvbnRleHQnO1xuaW1wb3J0IHsgRmVhdHVyZXNNYWNoaW5lIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVEZXNjcmlwdGlvbiB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB1c2VDb25zb2xlT3ZlcnJpZGUgZnJvbSAnLi91c2VDb25zb2xlT3ZlcnJpZGUnO1xuaW1wb3J0IHVzZVBlcnNpc3QsIHsgS0VZIH0gZnJvbSAnLi91c2VQZXJzaXN0JztcbmltcG9ydCB1c2VUZXN0Q2FsbGJhY2sgZnJvbSAnLi91c2VUZXN0Q2FsbGJhY2snO1xuXG5pbnRlcmZhY2UgRmVhdHVyZVByb3BzIHtcbiAgcmVhZG9ubHkgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuICByZWFkb25seSBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbiAgcmVhZG9ubHkgZGlzYWJsZUNvbnNvbGU/OiBib29sZWFuO1xuICByZWFkb25seSBzdG9yYWdlPzogU3RvcmFnZTtcbn1cblxuLyoqXG4gKiBBIG1vcmUgYmF0dGVyaWVzLWVuYWJsZWQgcGFyZW50IGNvbXBvbmVudCB0aGF0IGtlZXBzIHRyYWNrIG9mIGZlYXR1cmUgc3RhdGVcbiAqIGludGVybmFsbHksIGFuZCBjcmVhdGVzIHdpbmRvdy5mZWF0dXJlLmVuYWJsZShcImZcIikgYW5kIHdpbmRvdy5mZWF0dXJlLmRpc2FibGUoXCJmXCIpLlxuICogS2VlcHMgdHJhY2sgb2Ygb3ZlcnJpZGVzIGFuZCBkZWZhdWx0cywgd2l0aCBkZWZhdWx0cyBwb3RlbnRpYWxseSBjb21pbmcgZnJvbSB5b3VyIHByb3BzXG4gKiBhbmQgb3ZlcnJpZGVzIGJlaW5nIHBlcnNpc3RlZCB0byB5b3VyIGNob2ljZSBvZiBzdG9yYWdlIGxheWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRmVhdHVyZXMoe1xuICBjaGlsZHJlbixcbiAgZmVhdHVyZXMsXG4gIGRpc2FibGVDb25zb2xlID0gZmFsc2UsXG4gIHN0b3JhZ2UgPSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UsXG59OiBGZWF0dXJlUHJvcHMpOiBKU1guRWxlbWVudCB7XG4gIC8vIENhcHR1cmUgb25seSBmaXJzdCB2YWx1ZTsgd2UgZG9uJ3QgY2FyZSBhYm91dCBmdXR1cmUgdXBkYXRlc1xuICBjb25zdCBmZWF0dXJlc1JlZiA9IHVzZVJlZihmZWF0dXJlcyk7XG4gIGNvbnN0IFtvdmVycmlkZXNTdGF0ZSwgb3ZlcnJpZGVzU2VuZF0gPSB1c2VNYWNoaW5lKEZlYXR1cmVzTWFjaGluZSk7XG4gIGNvbnN0IFtkZWZhdWx0c1N0YXRlLCBkZWZhdWx0c1NlbmRdID0gdXNlTWFjaGluZShGZWF0dXJlc01hY2hpbmUpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8vIExvYWQgZGVmYXVsdHNcbiAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnSU5JVCcsIGZlYXR1cmVzIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZWZhdWx0c1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2RlZmF1bHRzU2VuZCwgZmVhdHVyZXNdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBmOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgIGlmIChzdG9yYWdlICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVzSnNvbiA9IHN0b3JhZ2UuZ2V0SXRlbShLRVkpO1xuICAgICAgICBpZiAoZmVhdHVyZXNKc29uICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBmaCA9IEpTT04ucGFyc2UoZmVhdHVyZXNKc29uKTtcbiAgICAgICAgICBmID0gZmgub3ZlcnJpZGVzO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIENhbid0IHBhcnNlIG9yIGdldCBvciBvdGhlcndpc2U7IGlnbm9yZVxuICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBpbiBsb2NhbFN0b3JhZ2UnLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZXNTZW5kKHtcbiAgICAgIHR5cGU6ICdJTklUJyxcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlc1JlZi5jdXJyZW50XG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHgubm9PdmVycmlkZSAhPT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeCkgPT4gKHsgbmFtZTogeC5uYW1lLCBkZXNjcmlwdGlvbjogeC5kZXNjcmlwdGlvbiwgZGVmYXVsdFZhbHVlOiBmPy5beC5uYW1lXSA/PyB1bmRlZmluZWQgfSkpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG92ZXJyaWRlc1NlbmQoeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzUmVmLCBvdmVycmlkZXNTZW5kLCBzdG9yYWdlXSk7XG5cbiAgdXNlUGVyc2lzdChzdG9yYWdlLCBmZWF0dXJlc1JlZi5jdXJyZW50LCBvdmVycmlkZXNTdGF0ZSk7XG5cbiAgY29uc3QgdGVzdENhbGxiYWNrID0gdXNlVGVzdENhbGxiYWNrKG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlKTtcbiAgdXNlQ29uc29sZU92ZXJyaWRlKCFkaXNhYmxlQ29uc29sZSwgZmVhdHVyZXNSZWYuY3VycmVudCwgdGVzdENhbGxiYWNrLCBkZWZhdWx0c1NlbmQpO1xuXG4gIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIG92ZXJyaWRlc1NlbmQsXG4gICAgICBkZWZhdWx0c1NlbmQsXG4gICAgICBmZWF0dXJlc0Rlc2NyaXB0aW9uOiBmZWF0dXJlc1JlZi5jdXJyZW50LFxuICAgICAgb3ZlcnJpZGVzU3RhdGUsXG4gICAgICBkZWZhdWx0c1N0YXRlLFxuICAgICAgdGVzdDogdGVzdENhbGxiYWNrLFxuICAgIH0pLFxuICAgIFtvdmVycmlkZXNTZW5kLCBkZWZhdWx0c1NlbmQsIG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlLCB0ZXN0Q2FsbGJhY2tdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmVhdHVyZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ZlYXR1cmVWYWx1ZX0+XG4gICAgICA8RW5hYmxlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dGVzdENhbGxiYWNrfT57Y2hpbGRyZW59PC9FbmFibGVDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvRmVhdHVyZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgdHlwZSBFbmFibGVDb250ZXh0VHlwZSA9IChmZWF0dXJlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuLyoqXG4gKiBDb250YWluZWQgZnVuY3Rpb24gY2FuIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBFbmFibGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxFbmFibGVDb250ZXh0VHlwZT4oKF9zKSA9PiBmYWxzZSk7XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCwgRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IGNvbnN0IEZlYXR1cmVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxGZWF0dXJlQ29udGV4dFR5cGUgfCBudWxsPihudWxsKTtcblxuLy8vIEdpdmUgYWNjZXNzIHRvIHRoZSBvdmVycmlkZXMgbGF5ZXJcbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZUNvbnRleHRUeXBlIHtcbiAgLy8gTWFrZSBjaGFuZ2VzIHRvIHRoZSBvdmVycmlkZXNcbiAgb3ZlcnJpZGVzU2VuZDogRmVhdHVyZXNEaXNwYXRjaDtcblxuICAvLyBNYWtlIGNoYW5nZXMgdG8gZGVmYXVsdHNcbiAgZGVmYXVsdHNTZW5kOiBGZWF0dXJlc0Rpc3BhdGNoO1xuXG4gIGZlYXR1cmVzRGVzY3JpcHRpb246IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuXG4gIC8vIFN0YXRlIGlzIGluIGxheWVyczsgb3ZlcnJpZGVzIGFuZCBkZWZhdWx0c1xuICBvdmVycmlkZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcblxuICAvLy8gVGVzdCB3aXRoIHByb3BlciBmYWxsYmFjayBhbmQgcmVzcGVjdGluZyB0aGUgdXNlcidzIGZvcmNlIHByZWZlcmVuY2VcbiAgdGVzdDogKGZsYWc6IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlO1xufVxuIiwgImltcG9ydCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNEaXNwYXRjaCB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IEdsb2JhbEVuYWJsZSB9IGZyb20gJy4vR2xvYmFsRW5hYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ29uc29sZU92ZXJyaWRlKFxuICBjb25zb2xlT3ZlcnJpZGU6IGJvb2xlYW4sXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2hcbik6IHZvaWQge1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY29uc29sZU92ZXJyaWRlKSB7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvKiBlbXB0eSAqL1xuICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93LmZlYXR1cmUgPSBuZXcgR2xvYmFsRW5hYmxlKGRpc3BhdGNoLCB0ZXN0RmVhdHVyZSwgZmVhdHVyZXMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAod2luZG93LmZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgd2luZG93LmZlYXR1cmU7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzLCBkaXNwYXRjaCwgY29uc29sZU92ZXJyaWRlLCB0ZXN0RmVhdHVyZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzRGlzcGF0Y2ggfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjbGFzcyBHbG9iYWxFbmFibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaDtcbiAgcHJpdmF0ZSByZWFkb25seSB0ZXN0RmVhdHVyZTogKHZhbHVlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkaXNwYXRjaDogRmVhdHVyZXNEaXNwYXRjaCxcbiAgICB0ZXN0RmVhdHVyZTogKF86IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlLFxuICAgIGZlYXR1cmVEZXNjOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXVxuICApIHtcbiAgICB0aGlzLmZlYXR1cmVEZXNjID0gZmVhdHVyZURlc2M7XG4gICAgdGhpcy5kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMudGVzdEZlYXR1cmUgPSB0ZXN0RmVhdHVyZTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdUT0dHTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5zZXQoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0RJU0FCTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFsbChmZWF0dXJlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0FMTCcsIGZlYXR1cmVzIH0pO1xuICB9XG5cbiAgcHVibGljIGxpc3RGZWF0dXJlcygpOiByZWFkb25seSBbc3RyaW5nLCBGZWF0dXJlVmFsdWVdW10ge1xuICAgIHJldHVybiB0aGlzLmZlYXR1cmVEZXNjLm1hcCgoZikgPT4gW2YubmFtZSwgdGhpcy50ZXN0RmVhdHVyZShmLm5hbWUpXSk7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgZmVhdHVyZT86IEdsb2JhbEVuYWJsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHVzZU1lbW8sIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRmVhdHVyZXNTdGF0ZSwgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5cbmV4cG9ydCBjb25zdCBLRVkgPSAncmVhY3QtZW5hYmxlOmZlYXR1cmUtdmFsdWVzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlUGVyc2lzdChcbiAgc3RvcmFnZTogU3RvcmFnZSB8IHVuZGVmaW5lZCxcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdLFxuICBvdmVycmlkZVN0YXRlOiBGZWF0dXJlc1N0YXRlXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbmV3T3ZlcnJpZGVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9ID0ge307XG4gICAgaWYgKG92ZXJyaWRlU3RhdGUubWF0Y2hlcygncmVhZHknKSkge1xuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZV0gPSB2YWx1ZU9mRmVhdHVyZShvdmVycmlkZVN0YXRlLCBmZWF0dXJlLm5hbWUpO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld092ZXJyaWRlc1tmZWF0dXJlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld092ZXJyaWRlcztcbiAgfSwgW2ZlYXR1cmVzLCBvdmVycmlkZVN0YXRlXSk7XG5cbiAgY29uc3Qgc3RyU3RhdGUgPSBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA9PT0gMCB8fCBzdG9yYWdlID09IG51bGwgPyAne30nIDogSlNPTi5zdHJpbmdpZnkoeyBvdmVycmlkZXMgfSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHN0b3JhZ2UgIT0gbnVsbCAmJiBvdmVycmlkZVN0YXRlLm1hdGNoZXMoJ3JlYWR5JykpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKEtFWSwgc3RyU3RhdGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbid0IHNldCBmb3Igc29tZSByZWFzb25cbiAgICB9XG4gIH0sIFtvdmVycmlkZVN0YXRlLCBzdG9yYWdlLCBzdHJTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBGZWF0dXJlc1N0YXRlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB0ZXN0RmVhdHVyZSBmcm9tICcuL3Rlc3RGZWF0dXJlJztcblxuLy8vIEEgY2FsbGJhY2sgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIHRlc3QgaWYgYSBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWRcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVRlc3RDYWxsYmFjayhcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbiAgb3ZlcnJpZGVzU3RhdGU6IEZlYXR1cmVzU3RhdGVcbik6IChmZWF0dXJlOiBzdHJpbmcpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXNlQ2FsbGJhY2soKGY6IHN0cmluZykgPT4gdGVzdEZlYXR1cmUoZiwgW2RlZmF1bHRzU3RhdGUsIG92ZXJyaWRlc1N0YXRlXSksIFtkZWZhdWx0c1N0YXRlLCBvdmVycmlkZXNTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IEZlYXR1cmVzU3RhdGUsIHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuLyoqIERldGVybWluZSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkIGluIG9uZSBvZiB0aGUgc3RhdGUgbWFjaGluZXMsIGluIG9yZGVyXG4gKlxuICogQHBhcmFtIHN0YXRlIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtYWNoaW5lXG4gKiBAcGFyYW0gZmVhdHVyZSBUaGUgZmVhdHVyZSB0byBjaGVja1xuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRlc3RGZWF0dXJlKGZlYXR1cmU6IHN0cmluZywgc3RhdGVzOiBGZWF0dXJlc1N0YXRlW10pOiBGZWF0dXJlVmFsdWUge1xuICBjb25zdCB2YWx1ZXMgPSBzdGF0ZXMubWFwKChzdGF0ZSkgPT4gdmFsdWVPZkZlYXR1cmUoc3RhdGUsIGZlYXR1cmUpKTtcblxuICAvLyBsb29rIGZvciBiZXN0IGZvcmNlZCBvcHRpb24sIGluIG9yZGVyXG4gIGZvciAoY29uc3QgW2ZlYXR1cmVWYWx1ZSwgZmVhdHVyZUZvcmNlZF0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKGZlYXR1cmVWYWx1ZSAhPSBudWxsICYmIGZlYXR1cmVGb3JjZWQpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gbG9vayBmb3IgYmVzdCBub24tZm9yY2VkIG9wdGlvbiwgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBbZmVhdHVyZVZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoZmVhdHVyZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gdW5zZXQgaWYgbm90aGluZyBoaXRcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IHVzZUFsbEVuYWJsZWQgfSBmcm9tICcuL3VzZUFsbEVuYWJsZWQnO1xuaW1wb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUHJvcHMge1xuICByZWFkb25seSBmZWF0dXJlPzogc3RyaW5nW10gfCBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsbEZlYXR1cmVzPzogc3RyaW5nW107XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGVuYWJsZWQgaWYgYW55IGZlYXR1cmUgaW4gdGhlIGxpc3QgYXJlIGVuYWJsZWQsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbmFibGUoeyBmZWF0dXJlID0gW10sIGFsbEZlYXR1cmVzID0gW10sIGNoaWxkcmVuIH06IEVuYWJsZVByb3BzKTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgaXNBbnkgPSB1c2VFbmFibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXMpO1xuXG4gIGlmIChpc0FueSB8fCBpc0FsbCkge1xuICAgIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBFbmFibGVDb250ZXh0VHlwZSwgRW5hYmxlQ29udGV4dCB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5cbi8vIEhlbHBlcjogZ2V0IHJpZCBvZiBzb21lIGJvaWxlcnBsYXRlLlxuLy8ganVzdCBpbnB1dCBtYXNoaW5nIGFuZCBzYW5pdGF0aW9uLCByZW1vdmluZyBleHRyYSByZW5kZXJzLCBhbmQgZ2V0dGluZyB0ZXN0IGZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gdXNlVGVzdEFuZENvbnZlcnQoaW5wdXQ/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwpOiBbRW5hYmxlQ29udGV4dFR5cGUsIHN0cmluZ1tdXSB7XG4gIGNvbnN0IHRlc3QgPSB1c2VDb250ZXh0KEVuYWJsZUNvbnRleHQpO1xuXG4gIC8vIFdlIG1lbW9pemUganVzdCB0byBwcmV2ZW50IHJlLXJlbmRlcnMgc2luY2UgdGhpcyBjb3VsZCBiZSBhdCB0aGUgbGVhZiBvZiBhIHRyZWVcbiAgY29uc3QgY29udmVydGVkID0gdXNlTWVtbygoKSA9PiAoaW5wdXQgPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF0pLCBbaW5wdXRdKTtcblxuICByZXR1cm4gW3Rlc3QsIGNvbnZlcnRlZF07XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFsbCBzcGVjaWZpZWQgZmVhdHVyZXMgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFsbFByZXNlbnRdID0gdXNlVGVzdEFuZENvbnZlcnQoYWxsRmVhdHVyZXMpO1xuICByZXR1cm4gcXVlcnlBbGxQcmVzZW50Lmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxQcmVzZW50LmV2ZXJ5KHRlc3QpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRW5hYmxlZChmZWF0dXJlOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbnlQcmVzZW50XSA9IHVzZVRlc3RBbmRDb252ZXJ0KGZlYXR1cmUpO1xuICByZXR1cm4gcXVlcnlBbnlQcmVzZW50LnNvbWUodGVzdCk7XG59XG4iLCAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IEVuYWJsZVByb3BzIH0gZnJvbSBcIi4vRW5hYmxlXCI7XG5pbXBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gXCIuL3VzZUFsbERpc2FibGVkXCI7XG5pbXBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gXCIuL3VzZURpc2FibGVkXCI7XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGRpc2FibGVkIGlmIGFueSBpbiB0aGUgbGlzdCBhcmUgZW5hYmxlZFxuICovXG5leHBvcnQgY29uc3QgRGlzYWJsZTogUmVhY3QuRkM8RW5hYmxlUHJvcHM+ID0gKHtcbiAgZmVhdHVyZSA9IFtdLFxuICBhbGxGZWF0dXJlcyA9IFtdLFxuICBjaGlsZHJlblxufSkgPT4ge1xuICBjb25zdCBpc0FueSA9IHVzZURpc2FibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbERpc2FibGVkKGFsbEZlYXR1cmVzKTtcblxuICBpZiAoaXNBbnkgfHwgaXNBbGwpIHtcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbGwgc3BlY2lmaWVkIGZlYXR1cmVzIGFyZSBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWxsRGlzYWJsZWQod2l0aG91dEFsbDogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QWxsV2l0aG91dF0gPSB1c2VUZXN0QW5kQ29udmVydCh3aXRob3V0QWxsKTtcbiAgcmV0dXJuIHdpdGhvdXRBbGwubGVuZ3RoID4gMCAmJiBxdWVyeUFsbFdpdGhvdXQuZXZlcnkoKHgpID0+ICEodGVzdCh4KSA/PyBmYWxzZSkpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURpc2FibGVkKHdpdGhvdXQ6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFueVdpdGhvdXRdID0gdXNlVGVzdEFuZENvbnZlcnQod2l0aG91dCk7XG4gIHJldHVybiBxdWVyeUFueVdpdGhvdXQuc29tZSgoeCkgPT4gISh0ZXN0KHgpID8/IGZhbHNlKSk7XG59XG4iLCAiaW1wb3J0IFJlYWN0LCB7IHVzZUNvbnRleHQsIHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCB7IFJhZGlvR3JvdXAgfSBmcm9tICdAaGVhZGxlc3N1aS9yZWFjdCc7XG5cbmltcG9ydCB7IEZlYXR1cmVDb250ZXh0IH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5pbXBvcnQgeyB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBGZWF0dXJlRGVzY3JpcHRpb24gfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG4vLyBAdHMtZXhwZWN0LWVycm9yIGJ1bmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhpc1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3RhaWx3aW5kLmNzcyc7XG5cbmZ1bmN0aW9uIGNsYXNzTmFtZXMoLi4uY2xhc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gY2xhc3Nlcy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBUb2dnbGVGZWF0dXJlKHsgZmVhdHVyZSB9OiB7IGZlYXR1cmU6IEZlYXR1cmVEZXNjcmlwdGlvbiB9KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuICBjb25zdCBoYW5kbGVDaGFuZ2VTZWxlY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6ICdmYWxzZScgfCAndHJ1ZScgfCAndW5zZXQnKSA9PiB7XG4gICAgICBpZiAoY29udGV4dD8ub3ZlcnJpZGVzU2VuZCAhPSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICBjYXNlICd0cnVlJzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdmYWxzZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdESVNBQkxFJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3Vuc2V0Jzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ1VOU0VUJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmVhdHVyZS5uYW1lLCBjb250ZXh0XVxuICApO1xuXG4gIGlmIChjb250ZXh0ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgb3ZlcnJpZGVzU3RhdGUsIHRlc3Q6IHRlc3RGZWF0dXJlLCBkZWZhdWx0c1N0YXRlIH0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHZhbHVlSW5EZWZhdWx0cyA9ICh2YWx1ZU9mRmVhdHVyZShkZWZhdWx0c1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCB2YWx1ZUluT3ZlcnJpZGVzID0gKHZhbHVlT2ZGZWF0dXJlKG92ZXJyaWRlc1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCcpLnRvU3RyaW5nKCkgYXNcbiAgICB8ICdmYWxzZSdcbiAgICB8ICd0cnVlJ1xuICAgIHwgJ3Vuc2V0JztcblxuICBjb25zdCBhY3R1YWxDaGVja2VkID0gdGVzdEZlYXR1cmUoZmVhdHVyZS5uYW1lKTtcblxuICByZXR1cm4gKFxuICAgIDxSYWRpb0dyb3VwIGRpc2FibGVkPXtmZWF0dXJlLm5vT3ZlcnJpZGV9IG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2VTZWxlY3Rpb259IHZhbHVlPXt2YWx1ZUluT3ZlcnJpZGVzfT5cbiAgICAgIDxSYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICA8aDYgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTkwMCBhbGlnbi1jZW50ZXIgZmxleCBmbGV4LXJvdyBmbGV4LW5vd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTIgbGc6Z2FwLTQgaC03XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgIEZlYXR1cmU6IDxjb2RlPntmZWF0dXJlLm5hbWV9PC9jb2RlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7ZmVhdHVyZS5ub092ZXJyaWRlID09PSB0cnVlID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItb3JhbmdlLTUwMCB0ZXh0LW9yYW5nZS01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk01IDlWN2E1IDUgMCAwMTEwIDB2MmEyIDIgMCAwMTIgMnY1YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMnYtNWEyIDIgMCAwMTItMnptOC0ydjJIN1Y3YTMgMyAwIDAxNiAwelwiXG4gICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2Pk5vIE92ZXJyaWRlczwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAge2FjdHVhbENoZWNrZWQgPT09IHRydWUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1ub3dyYXAgdGV4dC14cyB0ZXh0LWdyZWVuLTUwMCBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWdyZWVuLTUwMCBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdj57YWN0dWFsQ2hlY2tlZCA/ICdFbmFibGVkJyA6ICdEaXNhYmxlZCd9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9oNj5cbiAgICAgICAge2ZlYXR1cmUuZGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UgdGV4dC1ncmF5LTUwMCB0ZXh0LXNtXCI+e2ZlYXR1cmUuZGVzY3JpcHRpb259PC9wPn1cbiAgICAgIDwvUmFkaW9Hcm91cC5MYWJlbD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBncmlkIGdyaWQtY29scy0xIGdhcC15LTYgc206Z3JpZC1jb2xzLTMgc206Z2FwLXgtNFwiPlxuICAgICAgICB7W1xuICAgICAgICAgIHsgaWQ6ICdmYWxzZScsIHRpdGxlOiBgRGlzYWJsZSAke2ZlYXR1cmUubmFtZX1gLCBkZXNjcmlwdGlvbjogJ092ZXJyaWRlIHRoZSBmZWF0dXJlIHRvIGJlIGRpc2FibGVkJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndW5zZXQnLFxuICAgICAgICAgICAgdGl0bGU6ICdEZWZhdWx0JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSW5oZXJpdCBlbmFibGVkIHN0YXRlIGZyb20gZGVmYXVsdHMnLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IChmZWF0dXJlLm5vT3ZlcnJpZGUgPz8gZmFsc2UpIHx8IGZlYXR1cmUuZm9yY2UsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6XG4gICAgICAgICAgICAgIHZhbHVlSW5EZWZhdWx0cyA9PT0gJ3RydWUnID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1ncmVlbi01MDAgYm9yZGVyLWdyZWVuLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RW5hYmxlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtcmVkLTUwMCBib3JkZXItcmVkLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RGlzYWJsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGlkOiAndHJ1ZScsIHRpdGxlOiBgRW5hYmxlICR7ZmVhdHVyZS5uYW1lfWAsIGRlc2NyaXB0aW9uOiAnT3ZlcnJpZGUgdGhlIGZlYXR1cmUgdG8gYmUgZW5hYmxlZCcgfSxcbiAgICAgICAgXS5tYXAoKG9wdGlvbikgPT4gKFxuICAgICAgICAgIDxSYWRpb0dyb3VwLk9wdGlvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXsoeyBjaGVja2VkLCBhY3RpdmUsIGRpc2FibGVkIH0pID0+XG4gICAgICAgICAgICAgIGNsYXNzTmFtZXMoXG4gICAgICAgICAgICAgICAgY2hlY2tlZCA/ICdib3JkZXItdHJhbnNwYXJlbnQnIDogJ2JvcmRlci1ncmF5LTMwMCcsXG4gICAgICAgICAgICAgICAgIWRpc2FibGVkICYmIGFjdGl2ZSA/ICdib3JkZXItYmx1ZS01MDAgcmluZy0yIHJpbmctYmx1ZS01MDAnIDogJycsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPyAnYm9yZGVyLXRyYW5zcGFyZW50IHJpbmctZ3JheS01MDAgY3Vyc29yLW5vdC1hbGxvd2VkJyA6ICdjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICAgICAgJ3JlbGF0aXZlIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkLWxnIHNoYWRvdy1zbSBwLTMgZmxleCBmb2N1czpvdXRsaW5lLW5vbmUnXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc2FibGVkPXtvcHRpb24uZGlzYWJsZWR9XG4gICAgICAgICAgICBrZXk9e29wdGlvbi5pZH1cbiAgICAgICAgICAgIHZhbHVlPXtvcHRpb24uaWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNoZWNrZWQsIGFjdGl2ZSwgZGlzYWJsZWQgfSkgPT4gKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBncm93XCI+XG4gICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5MYWJlbCBhcz1cInNwYW5cIiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtbm93cmFwIGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBncm93IHNocmlua1wiPntvcHRpb24udGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmRlZmF1bHRWYWx1ZSAhPSBudWxsID8gb3B0aW9uLmRlZmF1bHRWYWx1ZSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyghY2hlY2tlZCA/ICdpbnZpc2libGUnIDogJycsICdoLTUgdy01IHRleHQtYmx1ZS01MDAgbWluLXctNCcpfVxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwIDE4YTggOCAwIDEwMC0xNiA4IDggMCAwMDAgMTZ6bTMuNzA3LTkuMjkzYTEgMSAwIDAwLTEuNDE0LTEuNDE0TDkgMTAuNTg2IDcuNzA3IDkuMjkzYTEgMSAwIDAwLTEuNDE0IDEuNDE0bDIgMmExIDEgMCAwMDEuNDE0IDBsNC00elwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9SYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuRGVzY3JpcHRpb24gYXM9XCJzcGFuXCIgY2xhc3NOYW1lPVwibXQtMSBmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5EZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgICAgICAhZGlzYWJsZWQgJiYgYWN0aXZlID8gJ2JvcmRlcicgOiAnYm9yZGVyLTInLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkID8gKGRpc2FibGVkID8gJ2JvcmRlci1ncmF5LTUwMCcgOiAnYm9yZGVyLWJsdWUtNTAwJykgOiAnYm9yZGVyLXRyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgJ2Fic29sdXRlIC1pbnNldC1weCByb3VuZGVkLWxnIHBvaW50ZXItZXZlbnRzLW5vbmUnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1JhZGlvR3JvdXAuT3B0aW9uPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvUmFkaW9Hcm91cD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2hhZG93Q29udGVudCh7IHJvb3QsIGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZTsgcm9vdDogRWxlbWVudCB9KSB7XG4gIHJldHVybiBSZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHJvb3QpO1xufVxuXG4vLy8gUGVybWl0IHVzZXJzIHRvIG92ZXJyaWRlIGZlYXR1cmUgZmxhZ3MgdmlhIGEgR1VJLlxuLy8vIFJlbmRlcnMgYSBzbWFsbCBmbG9hdGluZyBidXR0b24gaW4gbG93ZXIgbGVmdCBvciByaWdodCwgcHJlc3NpbmcgaXQgYnJpbmdzIHVwXG4vLy8gYSBsaXN0IG9mIGZlYXR1cmVzIHRvIHRvZ2dsZSBhbmQgdGhlaXIgY3VycmVudCBvdmVycmlkZSBzdGF0ZS4geW91IGNhbiBvdmVycmlkZSBvbiBvciBvdmVycmlkZSBvZmYsXG4vLy8gb3IgdW5zZXQgdGhlIG92ZXJyaWRlIGFuZCBnbyBiYWNrIHRvIGRlZmF1bHQgdmFsdWUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbmV4cG9ydCBmdW5jdGlvbiBUb2dnbGVGZWF0dXJlcyh7IGRlZmF1bHRPcGVuID0gZmFsc2UsIGhpZGRlbiA9IGZhbHNlIH06IHsgZGVmYXVsdE9wZW4/OiBib29sZWFuOyBoaWRkZW4/OiBib29sZWFuIH0pOiBKU1guRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBbcm9vdCwgc2V0Q29yZVJvb3RdID0gdXNlU3RhdGU8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBzZXRSb290ID0gKGhvc3Q6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgIGlmIChob3N0ID09IG51bGwgfHwgcm9vdCAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBob3N0Py5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGNvbnN0IHJlbmRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gc3R5bGVzO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQocmVuZGVyRGl2KTtcbiAgICBzZXRDb3JlUm9vdChyZW5kZXJEaXYpO1xuICB9O1xuXG4gIGlmIChoaWRkZW4pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiByZWY9e3NldFJvb3R9IHN0eWxlPXt7IHpJbmRleDogOTk5OTksIHBvc2l0aW9uOiAnZml4ZWQnLCB3aWR0aDogJzAnLCBoZWlnaHQ6ICcwJywgYm90dG9tOiAwIH19PlxuICAgICAge3Jvb3QgIT0gbnVsbCA/IChcbiAgICAgICAgPFNoYWRvd0NvbnRlbnQgcm9vdD17cm9vdH0+XG4gICAgICAgICAgPFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQgZGVmYXVsdE9wZW49e2RlZmF1bHRPcGVufSAvPlxuICAgICAgICA8L1NoYWRvd0NvbnRlbnQ+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8vIExpa2UgVG9nZ2xlRmVhdHVyZXMsIGJ1dCBkb2VzIG5vdCBpbmplY3Qgc3R5bGVzIGludG8gYSBzaGFkb3cgRE9NIHJvb3Qgbm9kZS5cbi8vLyB1c2VmdWwgaWYgeW91J3JlIHVzaW5nIHRhaWx3aW5kLlxuZXhwb3J0IGZ1bmN0aW9uIFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQoeyBkZWZhdWx0T3BlbiA9IGZhbHNlLCBoaWRkZW4gPSBmYWxzZSB9OiB7IGRlZmF1bHRPcGVuPzogYm9vbGVhbjsgaGlkZGVuPzogYm9vbGVhbiB9KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZGVmYXVsdE9wZW4pO1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChGZWF0dXJlQ29udGV4dCk7XG5cbiAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGhpZGRlbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gV2Ugd2FudDogUmVhbCB2YWx1ZSBhZnRlciBhbGwgbmVzdGluZ3MsIHZhbHVlIG9mIHRoZSBvdmVycmlkZS4gd2UgdG9nZ2xlIG92ZXJyaWRlXG4gIGNvbnN0IHsgZmVhdHVyZXNEZXNjcmlwdGlvbiB9ID0gY29udGV4dDtcblxuICBpZiAoZmVhdHVyZXNEZXNjcmlwdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgbXgtNCBteS00XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSBwLTEgaC04IHctOCBhbGlnbi1taWRkbGUgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1mdWxsIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQganVzdGlmeS1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWJsdWUtNjAwIHNtOnRleHQtc21cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4odHJ1ZSl9XG4gICAgICAgICAgdGl0bGU9XCJUb2dnbGUgZmVhdHVyZXNcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy02IGgtNiBtaW4taC02IG1pbi13LTZcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgIGQ9XCJNMyA2YTMgMyAwIDAxMy0zaDEwYTEgMSAwIDAxLjggMS42TDE0LjI1IDhsMi41NSAzLjRBMSAxIDAgMDExNiAxM0g2YTEgMSAwIDAwLTEgMXYzYTEgMSAwIDExLTIgMFY2elwiXG4gICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFvcGVuID8gbnVsbCA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCB6LTEwIGluc2V0LTAgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWZsZXgtc3RhcnQgbXgtOCBteS00IG1pbi1oLXNjcmVlbiBwdC00IHB4LTQgcGItMTAgc206YmxvY2sgc206cC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGlubGluZS1ibG9jayBhbGlnbi1ib3R0b20gYmctd2hpdGUgcm91bmRlZC1sZyBweC00IHB0LTUgcGItNCB0ZXh0LWxlZnQgb3ZlcmZsb3ctaGlkZGVuIHNoYWRvdy14bCB0cmFuc2Zvcm0gdHJhbnNpdGlvbi1hbGwgc206bXktOCBzbTphbGlnbi1taWRkbGUgc206cC02IGxnOm1heC13LVs4MCVdIG1heC13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgc206bXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgZ2FwLTQgZmxleC1ub3dyYXAgaXRlbXMtY2VudGVyIHNwYWNlLWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncm93IHRleHQtbGcgbGVhZGluZy02IGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj5GZWF0dXJlIEZsYWcgT3ZlcnJpZGVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIEZlYXR1cmVzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHVubGVzcyB0aGV5IGFyZSBmb3JjZWQgdXBzdHJlYW0uIFlvdSBjYW4gYWxzbyByZXZlcnQgdG8gZGVmYXVsdC5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtOVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsZWdlbmQgY2xhc3NOYW1lPVwic3Itb25seVwiPkZlYXR1cmUgRmxhZ3M8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgICAgICAgICB7ZmVhdHVyZXNEZXNjcmlwdGlvbi5tYXAoKGZlYXR1cmUpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUb2dnbGVGZWF0dXJlIGZlYXR1cmU9e2ZlYXR1cmV9IGtleT17ZmVhdHVyZS5uYW1lfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIG10LTUgc206bXQtNlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gZm9udC1tZWRpdW0gcHQtMCBwYi0wIHByLTQgcGwtNCBoLTggbGVhZGluZy03IGFsaWduLW1pZGRsZSBjdXJzb3ItcG9pbnRlciByb3VuZGVkLXNtIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBqdXN0aWZ5LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW9mZnNldC0yIGZvY3VzOnJpbmctYmx1ZS02MDAgc206dGV4dC1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0T3BlbihmYWxzZSl9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBEb25lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJzaUJBQUEsZ0VDQUEsbURBWU8sV0FBdUIsRUFBcUQsQ0FabkYsUUFhRSxNQUFPLENBQ0wsRUFBYSxRQUFRLFNBQVMsRUFBSSxHQUFPLEVBQWEsUUFBUSxVQUFVLEVBQUksR0FBUSxPQUNwRixRQUFhLFFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBUUEsY0FBdUIsRUFBMkIsQ0FDaEQsTUFBTyxHQUFRLE9BQU8sT0FBTyxFQUFFLEtBQUssR0FBRyxD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 +`; + +// src/ToggleFeatures.tsx +function classNames(...classes) { + return classes.filter(Boolean).join(" "); +} +function ToggleFeature({ + feature +}) { + var _a, _b, _c; + const context = useContext2(FeatureContext); + const handleChangeSelection = useCallback2((value) => { + if ((context == null ? void 0 : context.overridesSend) != null) { + switch (value) { + case "true": { + context.overridesSend({ type: "ENABLE", name: feature.name }); + break; + } + case "false": { + context.overridesSend({ type: "DISABLE", name: feature.name }); + break; + } + case "unset": { + context.overridesSend({ type: "UNSET", name: feature.name }); + break; + } + } + } + }, [feature.name, context]); + if (context == null) { + return null; + } + const { overridesState, test: testFeature2, defaultsState } = context; + const valueInDefaults = ((_a = valueOfFeature(defaultsState, feature.name)[0]) != null ? _a : "unset").toString(); + const valueInOverrides = ((_b = valueOfFeature(overridesState, feature.name)[0]) != null ? _b : "unset").toString(); + const actualChecked = testFeature2(feature.name); + return /* @__PURE__ */ React4.createElement(RadioGroup, { + disabled: feature.noOverride, + onChange: handleChangeSelection, + value: valueInOverrides + }, /* @__PURE__ */ React4.createElement(RadioGroup.Label, null, /* @__PURE__ */ React4.createElement("h6", { + className: "text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7" + }, /* @__PURE__ */ React4.createElement("span", { + className: "font-medium" + }, "Feature: ", /* @__PURE__ */ React4.createElement("code", null, feature.name)), feature.noOverride === true ? /* @__PURE__ */ React4.createElement("div", { + className: "border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" + }, /* @__PURE__ */ React4.createElement("svg", { + "aria-hidden": "true", + className: "h-4 w-4 min-w-4", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg" + }, /* @__PURE__ */ React4.createElement("path", { + clipRule: "evenodd", + d: "M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z", + fillRule: "evenodd" + })), /* @__PURE__ */ React4.createElement("div", null, "No Overrides")) : null, actualChecked === true ? /* @__PURE__ */ React4.createElement("div", { + className: "flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1" + }, /* @__PURE__ */ React4.createElement("svg", { + "aria-hidden": "true", + className: "h-4 w-4 min-w-4", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg" + }, /* @__PURE__ */ React4.createElement("path", { + clipRule: "evenodd", + d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", + fillRule: "evenodd" + })), /* @__PURE__ */ React4.createElement("div", null, actualChecked ? "Enabled" : "Disabled")) : null), feature.description == null ? null : /* @__PURE__ */ React4.createElement("p", { + className: "text-base text-gray-500 text-sm" + }, feature.description)), /* @__PURE__ */ React4.createElement("div", { + className: "mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4" + }, [ + { + id: "false", + title: `Disable ${feature.name}`, + description: "Override the feature to be disabled" + }, + { + id: "unset", + title: "Default", + description: "Inherit enabled state from defaults", + disabled: ((_c = feature.noOverride) != null ? _c : false) || feature.force, + defaultValue: valueInDefaults === "true" ? /* @__PURE__ */ React4.createElement("div", { + className: "text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" + }, /* @__PURE__ */ React4.createElement("span", null, "Enabled")) : /* @__PURE__ */ React4.createElement("div", { + className: "text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" + }, /* @__PURE__ */ React4.createElement("span", null, "Disabled")) + }, + { + id: "true", + title: `Enable ${feature.name}`, + description: "Override the feature to be enabled" + } + ].map((option) => /* @__PURE__ */ React4.createElement(RadioGroup.Option, { + className: ({ checked, active, disabled }) => classNames(checked ? "border-transparent" : "border-gray-300", !disabled && active ? "border-blue-500 ring-2 ring-blue-500" : "", disabled ? "border-transparent ring-gray-500 cursor-not-allowed" : "cursor-pointer", "relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"), + disabled: option.disabled, + key: option.id, + value: option.id + }, ({ checked, active, disabled }) => /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement("div", { + className: "flex flex-col grow" + }, /* @__PURE__ */ React4.createElement(RadioGroup.Label, { + as: "span", + className: "flex flex-nowrap flex-row gap-1 items-center space-between" + }, /* @__PURE__ */ React4.createElement("span", { + className: "text-sm font-medium text-gray-900 grow shrink" + }, option.title), option.defaultValue != null ? option.defaultValue : null, /* @__PURE__ */ React4.createElement("svg", { + "aria-hidden": "true", + className: classNames(!checked ? "invisible" : "", "h-5 w-5 text-blue-500 min-w-4"), + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg" + }, /* @__PURE__ */ React4.createElement("path", { + clipRule: "evenodd", + d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", + fillRule: "evenodd" + }))), /* @__PURE__ */ React4.createElement(RadioGroup.Description, { + as: "span", + className: "mt-1 flex items-center text-sm text-gray-500" + }, option.description)), /* @__PURE__ */ React4.createElement("div", { + "aria-hidden": "true", + className: classNames(!disabled && active ? "border" : "border-2", checked ? disabled ? "border-gray-500" : "border-blue-500" : "border-transparent", "absolute -inset-px rounded-lg pointer-events-none") + })))))); +} +function ShadowContent({ + root, + children +}) { + return ReactDOM.createPortal(children, root); +} +function ToggleFeatures({ + defaultOpen = false, + hidden = false +}) { + const [root, setCoreRoot] = useState(null); + const setRoot = (host) => { + if (host == null || root != null) { + return; + } + const shadowRoot = host == null ? void 0 : host.attachShadow({ mode: "open" }); + const style = document.createElement("style"); + const renderDiv = document.createElement("div"); + style.textContent = tailwind_default; + shadowRoot.appendChild(style); + shadowRoot.appendChild(renderDiv); + setCoreRoot(renderDiv); + }; + if (hidden) { + return null; + } + return /* @__PURE__ */ React4.createElement("div", { + ref: setRoot, + style: { + zIndex: 99999, + position: "fixed", + width: "0", + height: "0", + bottom: 0 + } + }, root != null ? /* @__PURE__ */ React4.createElement(ShadowContent, { + root + }, /* @__PURE__ */ React4.createElement(ToggleFeatureUnwrapped, { + defaultOpen + })) : null); +} +function ToggleFeatureUnwrapped({ + defaultOpen = false, + hidden = false +}) { + const [open, setOpen] = useState(defaultOpen); + const context = useContext2(FeatureContext); + if (context == null) { + return null; + } + if (hidden) { + return null; + } + const { featuresDescription } = context; + if (featuresDescription.length === 0) { + return null; + } + return /* @__PURE__ */ React4.createElement("div", { + className: "relative" + }, /* @__PURE__ */ React4.createElement("div", { + className: "absolute bottom-0 left-0 mx-4 my-4" + }, /* @__PURE__ */ React4.createElement("button", { + className: "inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", + onClick: () => setOpen(true), + title: "Toggle features", + type: "button" + }, /* @__PURE__ */ React4.createElement("svg", { + className: "w-6 h-6 min-h-6 min-w-6", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg" + }, /* @__PURE__ */ React4.createElement("path", { + clipRule: "evenodd", + d: "M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z", + fillRule: "evenodd" + })))), !open ? null : /* @__PURE__ */ React4.createElement("div", { + className: "fixed z-10 inset-0 overflow-y-auto" + }, /* @__PURE__ */ React4.createElement("div", { + className: "flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0" + }, /* @__PURE__ */ React4.createElement("div", { + className: "relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full" + }, /* @__PURE__ */ React4.createElement("div", null, /* @__PURE__ */ React4.createElement("div", { + className: "mt-1 sm:mt-3" + }, /* @__PURE__ */ React4.createElement("h3", { + className: "flex flex-row gap-4 flex-nowrap items-center space-between" + }, /* @__PURE__ */ React4.createElement("div", { + className: "grow text-lg leading-6 font-medium text-gray-900" + }, "Feature Flag Overrides")), /* @__PURE__ */ React4.createElement("p", { + className: "text-sm text-gray-500" + }, "Features can be enabled or disabled unless they are forced upstream. You can also revert to default."), /* @__PURE__ */ React4.createElement("div", { + className: "mt-6" + }, /* @__PURE__ */ React4.createElement("fieldset", { + className: "flex flex-col gap-9" + }, /* @__PURE__ */ React4.createElement("legend", { + className: "sr-only" + }, "Feature Flags"), featuresDescription.map((feature) => /* @__PURE__ */ React4.createElement(ToggleFeature, { + feature, + key: feature.name + })))), /* @__PURE__ */ React4.createElement("div", { + className: "flex justify-center items-center mt-5 sm:mt-6" + }, /* @__PURE__ */ React4.createElement("button", { + className: "inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", + onClick: () => setOpen(false), + type: "button" + }, "Done")))))))); +} +export { + Disable, + Enable, + EnableContext, + Features, + ToggleFeatures, + useAllDisabled, + useAllEnabled, + useDisabled, + useEnabled +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0Rpc2FibGUudHN4IiwgIi4uLy4uLy4uL3NyYy91dGlscy50cyIsICIuLi8uLi8uLi9zcmMvRW5hYmxlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUFsbERpc2FibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRGlzYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy9FbmFibGUudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VBbGxFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRW5hYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzLnRzeCIsICIuLi8uLi8uLi9zcmMvRmVhdHVyZUNvbnRleHQudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlc1N0YXRlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlQ29uc29sZU92ZXJyaWRlLnRzeCIsICIuLi8uLi8uLi9zcmMvR2xvYmFsRW5hYmxlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlUGVyc2lzdC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZVRlc3RDYWxsYmFjay50c3giLCAiLi4vLi4vLi4vc3JjL3Rlc3RGZWF0dXJlLnRzeCIsICIuLi8uLi8uLi9zcmMvVG9nZ2xlRmVhdHVyZXMudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiBKU1ggcmVxdWlyZXMgUmVhY3QgYXQgcnVudGltZVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IEVuYWJsZVByb3BzIH0gZnJvbSAnLi9FbmFibGUnO1xuaW1wb3J0IHsgdXNlQWxsRGlzYWJsZWQgfSBmcm9tICcuL3VzZUFsbERpc2FibGVkJztcbmltcG9ydCB7IHVzZURpc2FibGVkIH0gZnJvbSAnLi91c2VEaXNhYmxlZCc7XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGRpc2FibGVkIGlmIGFueSBpbiB0aGUgbGlzdCBhcmUgZW5hYmxlZFxuICovXG5leHBvcnQgY29uc3QgRGlzYWJsZTogUmVhY3QuRkM8RW5hYmxlUHJvcHM+ID0gKHtcbiAgZmVhdHVyZSA9IFtdLFxuICBhbGxGZWF0dXJlcyA9IFtdLFxuICBjaGlsZHJlbixcbn0pID0+IHtcbiAgY29uc3QgaXNBbnkgPSB1c2VEaXNhYmxlZChmZWF0dXJlKTtcbiAgY29uc3QgaXNBbGwgPSB1c2VBbGxEaXNhYmxlZChhbGxGZWF0dXJlcyk7XG5cbiAgaWYgKGlzQW55IHx8IGlzQWxsKSB7XG4gICAgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcbiIsICJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBFbmFibGVDb250ZXh0LCB0eXBlIEVuYWJsZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcblxuLy8gSGVscGVyOiBnZXQgcmlkIG9mIHNvbWUgYm9pbGVycGxhdGUuXG4vLyBqdXN0IGlucHV0IG1hc2hpbmcgYW5kIHNhbml0YXRpb24sIHJlbW92aW5nIGV4dHJhIHJlbmRlcnMsIGFuZCBnZXR0aW5nIHRlc3QgZnVuY3Rpb25cbmV4cG9ydCBmdW5jdGlvbiB1c2VUZXN0QW5kQ29udmVydChcbiAgaW5wdXQ/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsXG4pOiBbRW5hYmxlQ29udGV4dFR5cGUsIHN0cmluZ1tdXSB7XG4gIGNvbnN0IHRlc3QgPSB1c2VDb250ZXh0KEVuYWJsZUNvbnRleHQpO1xuXG4gIC8vIFdlIG1lbW9pemUganVzdCB0byBwcmV2ZW50IHJlLXJlbmRlcnMgc2luY2UgdGhpcyBjb3VsZCBiZSBhdCB0aGUgbGVhZiBvZiBhIHRyZWVcbiAgY29uc3QgY29udmVydGVkID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoaW5wdXQgPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF0pLFxuICAgIFtpbnB1dF0sXG4gICk7XG5cbiAgcmV0dXJuIFt0ZXN0LCBjb252ZXJ0ZWRdO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB0eXBlIHsgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgdHlwZSBFbmFibGVDb250ZXh0VHlwZSA9IChmZWF0dXJlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuLyoqXG4gKiBDb250YWluZWQgZnVuY3Rpb24gY2FuIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBFbmFibGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxFbmFibGVDb250ZXh0VHlwZT4oKF9zKSA9PiBmYWxzZSk7XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFsbCBzcGVjaWZpZWQgZmVhdHVyZXMgYXJlIGRpc2FibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBbGxEaXNhYmxlZCh3aXRob3V0QWxsOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbGxXaXRob3V0XSA9IHVzZVRlc3RBbmRDb252ZXJ0KHdpdGhvdXRBbGwpO1xuICByZXR1cm4gKFxuICAgIHdpdGhvdXRBbGwubGVuZ3RoID4gMCAmJiBxdWVyeUFsbFdpdGhvdXQuZXZlcnkoKHgpID0+ICEodGVzdCh4KSA/PyBmYWxzZSkpXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFueSBzcGVjaWZpZWQgZmVhdHVyZSBpcyBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGlzYWJsZWQod2l0aG91dDogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QW55V2l0aG91dF0gPSB1c2VUZXN0QW5kQ29udmVydCh3aXRob3V0KTtcbiAgcmV0dXJuIHF1ZXJ5QW55V2l0aG91dC5zb21lKCh4KSA9PiAhKHRlc3QoeCkgPz8gZmFsc2UpKTtcbn1cbiIsICIvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiBKU1ggcmVxdWlyZXMgUmVhY3QgYXQgcnVudGltZVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyB1c2VBbGxFbmFibGVkIH0gZnJvbSAnLi91c2VBbGxFbmFibGVkJztcbmltcG9ydCB7IHVzZUVuYWJsZWQgfSBmcm9tICcuL3VzZUVuYWJsZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuYWJsZVByb3BzIHtcbiAgcmVhZG9ubHkgZmVhdHVyZT86IHN0cmluZ1tdIHwgc3RyaW5nO1xuICByZWFkb25seSBhbGxGZWF0dXJlcz86IHN0cmluZ1tdO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufVxuXG4vKipcbiAqIEZlYXR1cmUgd2lsbCBiZSBlbmFibGVkIGlmIGFueSBmZWF0dXJlIGluIHRoZSBsaXN0IGFyZSBlbmFibGVkLFxuICovXG5leHBvcnQgZnVuY3Rpb24gRW5hYmxlKHtcbiAgZmVhdHVyZSA9IFtdLFxuICBhbGxGZWF0dXJlcyA9IFtdLFxuICBjaGlsZHJlbixcbn06IEVuYWJsZVByb3BzKTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgaXNBbnkgPSB1c2VFbmFibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXMpO1xuXG4gIGlmIChpc0FueSB8fCBpc0FsbCkge1xuICAgIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyB1c2VUZXN0QW5kQ29udmVydCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZmYgYWxsIHNwZWNpZmllZCBmZWF0dXJlcyBhcmUgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWxsRW5hYmxlZChhbGxGZWF0dXJlczogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QWxsUHJlc2VudF0gPSB1c2VUZXN0QW5kQ29udmVydChhbGxGZWF0dXJlcyk7XG4gIHJldHVybiBxdWVyeUFsbFByZXNlbnQubGVuZ3RoID4gMCAmJiBxdWVyeUFsbFByZXNlbnQuZXZlcnkodGVzdCk7XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFueSBzcGVjaWZpZWQgZmVhdHVyZSBpcyBlbmFibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VFbmFibGVkKGZlYXR1cmU6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFueVByZXNlbnRdID0gdXNlVGVzdEFuZENvbnZlcnQoZmVhdHVyZSk7XG4gIHJldHVybiBxdWVyeUFueVByZXNlbnQuc29tZSh0ZXN0KTtcbn1cbiIsICJpbXBvcnQgUmVhY3QsIHtcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVkdWNlcixcbiAgdXNlUmVmLFxufSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEVuYWJsZUNvbnRleHQgfSBmcm9tICcuL0VuYWJsZUNvbnRleHQnO1xuaW1wb3J0IHsgRmVhdHVyZUNvbnRleHQgfSBmcm9tICcuL0ZlYXR1cmVDb250ZXh0JztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZURlc2NyaXB0aW9uIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHsgZmVhdHVyZXNSZWR1Y2VyLCBpbml0aWFsRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgdXNlQ29uc29sZU92ZXJyaWRlIGZyb20gJy4vdXNlQ29uc29sZU92ZXJyaWRlJztcbmltcG9ydCB1c2VQZXJzaXN0LCB7IEtFWSB9IGZyb20gJy4vdXNlUGVyc2lzdCc7XG5pbXBvcnQgdXNlVGVzdENhbGxiYWNrIGZyb20gJy4vdXNlVGVzdENhbGxiYWNrJztcblxuaW50ZXJmYWNlIEZlYXR1cmVQcm9wcyB7XG4gIHJlYWRvbmx5IGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXTtcbiAgcmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IGRpc2FibGVDb25zb2xlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RvcmFnZT86IFN0b3JhZ2U7XG59XG5cbi8qKlxuICogQSBtb3JlIGJhdHRlcmllcy1lbmFibGVkIHBhcmVudCBjb21wb25lbnQgdGhhdCBrZWVwcyB0cmFjayBvZiBmZWF0dXJlIHN0YXRlXG4gKiBpbnRlcm5hbGx5LCBhbmQgY3JlYXRlcyB3aW5kb3cuZmVhdHVyZS5lbmFibGUoXCJmXCIpIGFuZCB3aW5kb3cuZmVhdHVyZS5kaXNhYmxlKFwiZlwiKS5cbiAqIEtlZXBzIHRyYWNrIG9mIG92ZXJyaWRlcyBhbmQgZGVmYXVsdHMsIHdpdGggZGVmYXVsdHMgcG90ZW50aWFsbHkgY29taW5nIGZyb20geW91ciBwcm9wc1xuICogYW5kIG92ZXJyaWRlcyBiZWluZyBwZXJzaXN0ZWQgdG8geW91ciBjaG9pY2Ugb2Ygc3RvcmFnZSBsYXllci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZlYXR1cmVzKHtcbiAgY2hpbGRyZW4sXG4gIGZlYXR1cmVzLFxuICBkaXNhYmxlQ29uc29sZSA9IGZhbHNlLFxuICBzdG9yYWdlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLFxufTogRmVhdHVyZVByb3BzKTogSlNYLkVsZW1lbnQge1xuICAvLyBDYXB0dXJlIG9ubHkgZmlyc3QgdmFsdWU7IHdlIGRvbid0IGNhcmUgYWJvdXQgZnV0dXJlIHVwZGF0ZXNcbiAgY29uc3QgZmVhdHVyZXNSZWYgPSB1c2VSZWYoZmVhdHVyZXMpO1xuICBjb25zdCBbb3ZlcnJpZGVzU3RhdGUsIG92ZXJyaWRlc0Rpc3BhdGNoXSA9IHVzZVJlZHVjZXIoXG4gICAgZmVhdHVyZXNSZWR1Y2VyLFxuICAgIGluaXRpYWxGZWF0dXJlc1N0YXRlLFxuICApO1xuICBjb25zdCBbZGVmYXVsdHNTdGF0ZSwgZGVmYXVsdHNEaXNwYXRjaF0gPSB1c2VSZWR1Y2VyKFxuICAgIGZlYXR1cmVzUmVkdWNlcixcbiAgICBpbml0aWFsRmVhdHVyZXNTdGF0ZSxcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vLyBMb2FkIGRlZmF1bHRzXG4gICAgZGVmYXVsdHNEaXNwYXRjaCh7IHR5cGU6ICdJTklUJywgZmVhdHVyZXMgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRlZmF1bHRzRGlzcGF0Y2goeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgZjogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICBpZiAoc3RvcmFnZSAhPSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmZWF0dXJlc0pzb24gPSBzdG9yYWdlLmdldEl0ZW0oS0VZKTtcbiAgICAgICAgaWYgKGZlYXR1cmVzSnNvbiAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZmggPSBKU09OLnBhcnNlKGZlYXR1cmVzSnNvbik7XG4gICAgICAgICAgZiA9IGZoLm92ZXJyaWRlcztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBDYW4ndCBwYXJzZSBvciBnZXQgb3Igb3RoZXJ3aXNlOyBpZ25vcmVcbiAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3IgaW4gbG9jYWxTdG9yYWdlJywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGVzRGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ0lOSVQnLFxuICAgICAgZmVhdHVyZXM6IGZlYXR1cmVzUmVmLmN1cnJlbnRcbiAgICAgICAgLmZpbHRlcigoeCkgPT4geC5ub092ZXJyaWRlICE9PSB0cnVlKVxuICAgICAgICAubWFwKCh4KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHgubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogeC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IGY/Llt4Lm5hbWVdID8/IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG92ZXJyaWRlc0Rpc3BhdGNoKHsgdHlwZTogJ0RFX0lOSVQnIH0pO1xuICAgIH07XG4gIH0sIFtzdG9yYWdlXSk7XG5cbiAgLy8gSGFuZGxlIGFzeW5jIG9wZXJhdGlvbnMgZm9yIGZlYXR1cmVzIHdpdGggb25DaGFuZ2VEZWZhdWx0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRlZmF1bHRzU3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZmVhdHVyZXMgaW4gYXN5bmMgc3RhdGVzIGFuZCBoYW5kbGUgdGhlbVxuICAgIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRzU3RhdGUuY29udGV4dC5mZWF0dXJlcykuZm9yRWFjaChcbiAgICAgIChbbmFtZSwgZmVhdHVyZV0pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZlYXR1cmUudmFsdWUgPT09ICdhc3luY0VuYWJsZWQnIHx8XG4gICAgICAgICAgZmVhdHVyZS52YWx1ZSA9PT0gJ2FzeW5jRGlzYWJsZWQnIHx8XG4gICAgICAgICAgZmVhdHVyZS52YWx1ZSA9PT0gJ2FzeW5jVW5zcGVjaWZpZWQnXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID1cbiAgICAgICAgICAgIGZlYXR1cmUudmFsdWUgPT09ICdhc3luY0VuYWJsZWQnXG4gICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICA6IGZlYXR1cmUudmFsdWUgPT09ICdhc3luY0Rpc2FibGVkJ1xuICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGNvbnN0IG9uQ2hhbmdlRGVmYXVsdCA9IGZlYXR1cmUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdDtcbiAgICAgICAgICBpZiAob25DaGFuZ2VEZWZhdWx0ICE9IG51bGwgJiYgZmVhdHVyZS5mZWF0dXJlRGVzYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBvbkNoYW5nZURlZmF1bHQoZmVhdHVyZS5mZWF0dXJlRGVzYy5uYW1lLCB0YXJnZXRWYWx1ZSlcbiAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRzRGlzcGF0Y2goeyB0eXBlOiAnQVNZTkNfRE9ORScsIG5hbWUsIHZhbHVlOiByZXN1bHQgfSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdHNEaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnQVNZTkNfRE9ORScsXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH0sIFtkZWZhdWx0c1N0YXRlXSk7XG5cbiAgdXNlUGVyc2lzdChzdG9yYWdlLCBmZWF0dXJlc1JlZi5jdXJyZW50LCBvdmVycmlkZXNTdGF0ZSk7XG5cbiAgY29uc3QgdGVzdENhbGxiYWNrID0gdXNlVGVzdENhbGxiYWNrKG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlKTtcbiAgdXNlQ29uc29sZU92ZXJyaWRlKFxuICAgICFkaXNhYmxlQ29uc29sZSxcbiAgICBmZWF0dXJlc1JlZi5jdXJyZW50LFxuICAgIHRlc3RDYWxsYmFjayxcbiAgICBkZWZhdWx0c0Rpc3BhdGNoLFxuICApO1xuXG4gIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIG92ZXJyaWRlc1NlbmQ6IG92ZXJyaWRlc0Rpc3BhdGNoLFxuICAgICAgZGVmYXVsdHNTZW5kOiBkZWZhdWx0c0Rpc3BhdGNoLFxuICAgICAgZmVhdHVyZXNEZXNjcmlwdGlvbjogZmVhdHVyZXNSZWYuY3VycmVudCxcbiAgICAgIG92ZXJyaWRlc1N0YXRlLFxuICAgICAgZGVmYXVsdHNTdGF0ZSxcbiAgICAgIHRlc3Q6IHRlc3RDYWxsYmFjayxcbiAgICB9KSxcbiAgICBbb3ZlcnJpZGVzU3RhdGUsIGRlZmF1bHRzU3RhdGUsIHRlc3RDYWxsYmFja10sXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmVhdHVyZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ZlYXR1cmVWYWx1ZX0+XG4gICAgICA8RW5hYmxlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dGVzdENhbGxiYWNrfT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9FbmFibGVDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvRmVhdHVyZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVzRGlzcGF0Y2gsIEZlYXR1cmVzU3RhdGUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuXG5leHBvcnQgY29uc3QgRmVhdHVyZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEZlYXR1cmVDb250ZXh0VHlwZSB8IG51bGw+KG51bGwpO1xuXG4vLy8gR2l2ZSBhY2Nlc3MgdG8gdGhlIG92ZXJyaWRlcyBsYXllclxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlQ29udGV4dFR5cGUge1xuICAvLyBNYWtlIGNoYW5nZXMgdG8gdGhlIG92ZXJyaWRlc1xuICBvdmVycmlkZXNTZW5kOiBGZWF0dXJlc0Rpc3BhdGNoO1xuXG4gIC8vIE1ha2UgY2hhbmdlcyB0byBkZWZhdWx0c1xuICBkZWZhdWx0c1NlbmQ6IEZlYXR1cmVzRGlzcGF0Y2g7XG5cbiAgZmVhdHVyZXNEZXNjcmlwdGlvbjogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW107XG5cbiAgLy8gU3RhdGUgaXMgaW4gbGF5ZXJzOyBvdmVycmlkZXMgYW5kIGRlZmF1bHRzXG4gIG92ZXJyaWRlc1N0YXRlOiBGZWF0dXJlc1N0YXRlO1xuICBkZWZhdWx0c1N0YXRlOiBGZWF0dXJlc1N0YXRlO1xuXG4gIC8vLyBUZXN0IHdpdGggcHJvcGVyIGZhbGxiYWNrIGFuZCByZXNwZWN0aW5nIHRoZSB1c2VyJ3MgZm9yY2UgcHJlZmVyZW5jZVxuICB0ZXN0OiAoZmxhZzogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWU7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCB9IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBGZWF0dXJlIGlzIGVpdGhlciBvbiwgb2ZmLCBvciAndW5zZXQnLFxuICogd2hpY2ggbWVhbnMgaXQgd2lsbCBnbyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBvciB0aGUgbGVzcyBzcGVjaWZpYyB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZVZhbHVlID0gZmFsc2UgfCB0cnVlIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlU3RhdGVWYWx1ZSA9XG4gIHwgJ2luaXRpYWwnXG4gIHwgJ2VuYWJsZWQnXG4gIHwgJ2Rpc2FibGVkJ1xuICB8ICd1bnNwZWNpZmllZCdcbiAgfCAnYXN5bmNFbmFibGVkJ1xuICB8ICdhc3luY0Rpc2FibGVkJ1xuICB8ICdhc3luY1Vuc3BlY2lmaWVkJztcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlU3RhdGUge1xuICB2YWx1ZTogRmVhdHVyZVN0YXRlVmFsdWU7XG4gIGZlYXR1cmVEZXNjPzogRmVhdHVyZURlc2NyaXB0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBGZWF0dXJlRGlzcGF0Y2ggPSBEaXNwYXRjaDxGZWF0dXJlQWN0aW9uPjtcblxuLy8vIEdpdmVuIGEgZmVhdHVyZXN0YXRlLCBkZXRlcm1pbmUgdGhlIHZhbHVlIChvbiwgb2ZmLCBvciB1bnNldClcbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUZvclN0YXRlKFxuICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbik6IFtGZWF0dXJlVmFsdWUsIGJvb2xlYW5dIHtcbiAgcmV0dXJuIFtcbiAgICBmZWF0dXJlU3RhdGUudmFsdWUgPT09ICdlbmFibGVkJyB8fCBmZWF0dXJlU3RhdGUudmFsdWUgPT09ICdhc3luY0VuYWJsZWQnXG4gICAgICA/IHRydWVcbiAgICAgIDogZmVhdHVyZVN0YXRlLnZhbHVlID09PSAnZGlzYWJsZWQnIHx8XG4gICAgICAgICAgZmVhdHVyZVN0YXRlLnZhbHVlID09PSAnYXN5bmNEaXNhYmxlZCdcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICBmZWF0dXJlU3RhdGUuZmVhdHVyZURlc2M/LmZvcmNlID8/IGZhbHNlLFxuICBdO1xufVxuXG4vKipcbiAqIERlZmluaXRpb24gb2YgYSBmZWF0dXJlIHRoYXQgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gKiBLIGlzIHRoZSB0eXBlIG9mIHRoZSBrZXkgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBmZWF0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVEZXNjcmlwdGlvbjxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHJlYWRvbmx5IG5hbWU6IEs7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8vLyBJZiBzZXQsIHdpbGwgYmUgdXNlZCB0byB1cGRhdGUgdGhlIGZlYXR1cmUgZGVmYXVsdCBzdGF0ZSBpbnN0ZWFkIG9mIHNpbXBseSBvdmVycmlkaW5nLlxuICAvLy8gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB1c2UgdGhpcyB0byB1cGRhdGUgYSBmZWF0dXJlIGZsYWcgb24gYSBiYWNrZW5kIHNlcnZlci5cbiAgLy8vIHdoZW4gc2V0LCB0aGUgZmVhdHVyZSB3aWxsIGJlIHVwZGF0ZWQgb24gdGhlIGJhY2tlbmQgc2VydmVyLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNcbiAgLy8vIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGZpbmFsIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UuIHdoaWxlIGNoYW5naW5nLCB0aGUgZmVhdHVyZSB3aWxsIGJlXG4gIC8vLyBpbiB0aGUgJ2NoYW5naW5nJyBzdGF0ZS4gQWxzbyBub3RlIHRoYXQgdGhlIGZlYXR1cmUgd2lsbCBiZSBjaGFuZ2VkIGF0IHRoZSBcImRlZmF1bHRcIiBsYXllci5cbiAgcmVhZG9ubHkgb25DaGFuZ2VEZWZhdWx0PzogKFxuICAgIG5hbWU6IEssXG4gICAgbmV3VmFsdWU6IEZlYXR1cmVWYWx1ZSxcbiAgKSA9PiBQcm9taXNlPEZlYXR1cmVWYWx1ZT47XG5cbiAgLy8vIGlmIHNldCB0cnVlLCB3aWxsIGZvcmNlIHRoZSBmaWVsZCB0byB3aGF0IGl0IGlzIHNldCBoZXJlIHRocm91Z2ggbGF5ZXJzIG9mIHN0YXRlcy5cbiAgLy8vIHVzZWZ1bCB0byBpbnZlcnQgdGhlIGxheWVycywgc2ltaWxhciB0byAhaW1wb3J0YW50IGluIENTUy5cbiAgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuO1xuXG4gIC8vLyBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZlYXR1cmUgd2lsbCBub3QgYmUgb3ZlcnJpZGFibGUgYnkgdGhlIHVzZXIuXG4gIHJlYWRvbmx5IG5vT3ZlcnJpZGU/OiBib29sZWFuO1xuXG4gIC8vLyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHdoYXQgc2hvdWxkIGhhcHBlbiBpZiB0aGUgZmVhdHVyZSBpcyBub3Qgc2V0IHRvIGEgcGFydGljdWxhciB2YWx1ZS5cbiAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlPzogRmVhdHVyZVZhbHVlO1xufVxuXG4vKipcbiAqIEFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZUFjdGlvbiA9XG4gIHwgeyB0eXBlOiAnRElTQUJMRScgfVxuICB8IHsgdHlwZTogJ0VOQUJMRScgfVxuICB8IHsgdHlwZTogJ0lOSVQnOyBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb24gfVxuICB8IHsgdHlwZTogJ1NFVCc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRScgfVxuICB8IHsgdHlwZTogJ1VOU0VUJyB9XG4gIHwgeyB0eXBlOiAnQVNZTkNfRE9ORSc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfTtcblxuZXhwb3J0IGNvbnN0IGluaXRpYWxGZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSA9IHtcbiAgdmFsdWU6ICdpbml0aWFsJyxcbn07XG5cbi8qKlxuICogUmVkdWNlciBmb3IgbWFuYWdpbmcgaW5kaXZpZHVhbCBmZWF0dXJlIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlUmVkdWNlcihcbiAgc3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgYWN0aW9uOiBGZWF0dXJlQWN0aW9uLFxuKTogRmVhdHVyZVN0YXRlIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ0lOSVQnOiB7XG4gICAgICBjb25zdCB7IGZlYXR1cmUgfSA9IGFjdGlvbjtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgZmVhdHVyZS5kZWZhdWx0VmFsdWUgPT09IHRydWVcbiAgICAgICAgICA/ICdlbmFibGVkJ1xuICAgICAgICAgIDogZmVhdHVyZS5kZWZhdWx0VmFsdWUgPT09IGZhbHNlXG4gICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgIDogJ3Vuc3BlY2lmaWVkJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSBhcyBGZWF0dXJlU3RhdGVWYWx1ZSxcbiAgICAgICAgZmVhdHVyZURlc2M6IGZlYXR1cmUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0VOQUJMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNFbmFibGVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICB9XG5cbiAgICBjYXNlICdESVNBQkxFJzoge1xuICAgICAgaWYgKHN0YXRlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY0Rpc2FibGVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZGlzYWJsZWQnIH07XG4gICAgfVxuXG4gICAgY2FzZSAnVE9HR0xFJzoge1xuICAgICAgaWYgKHN0YXRlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY0VuYWJsZWQnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdlbmFibGVkJyB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1VOU0VUJzoge1xuICAgICAgaWYgKHN0YXRlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY1Vuc3BlY2lmaWVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAndW5zcGVjaWZpZWQnIH07XG4gICAgfVxuXG4gICAgY2FzZSAnU0VUJzoge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYWN0aW9uO1xuICAgICAgaWYgKHN0YXRlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY0VuYWJsZWQnIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2FzeW5jRGlzYWJsZWQnIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNVbnNwZWNpZmllZCcgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdlbmFibGVkJyB9O1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdkaXNhYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ3Vuc3BlY2lmaWVkJyB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0FTWU5DX0RPTkUnOiB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBhY3Rpb247XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZGlzYWJsZWQnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICd1bnNwZWNpZmllZCcgfTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHtcbiAgdHlwZSBGZWF0dXJlRGVzY3JpcHRpb24sXG4gIHR5cGUgRmVhdHVyZVN0YXRlLFxuICB0eXBlIEZlYXR1cmVWYWx1ZSxcbiAgdmFsdWVGb3JTdGF0ZSxcbn0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzQ29udGV4dCB7XG4gIC8vIGZlYXR1cmVzIGFyZSBsYXllcmVkOlxuICAvLyAgLSBkZWZhdWx0czogaWYgbm90aGluZyBlbHNlIG1hdGNoZXMsIHByb3ZpZGVkIGEgdmFsdWUgZm9yIGZlYXR1cmVcbiAgLy8gIC0gYnJvd3NlcjogYnJvd3Nlci1sb2NhbCB2YWx1ZXMgZm9yIGZlYXR1cmVzIChrZXB0IGluIGxvY2FsIHN0b3JhZ2UsIGV0YylcbiAgLy8gIC0gdXNlcjogdmFsdWVzIGZyb20gdGhlIHVzZXIncyBwcm9maWxlLCBpZiBhbnlcbiAgLy8gIC0gb3JnOiB2YWx1ZSBmcm9tIHRoZSBvcmcncyBwcm9maWxlLCBpZiBhbnlcbiAgZmVhdHVyZXM6IHsgW3g6IHN0cmluZ106IEZlYXR1cmVTdGF0ZSB9O1xufVxuXG5leHBvcnQgdHlwZSBGZWF0dXJlc0FjdGlvbiA9XG4gIHwgeyB0eXBlOiAnREVfSU5JVCcgfVxuICB8IHsgdHlwZTogJ0RJU0FCTEUnOyBuYW1lOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ0VOQUJMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnSU5JVCc7IGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSB9XG4gIHwgeyB0eXBlOiAnU0VUX0FMTCc7IGZlYXR1cmVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9IH1cbiAgfCB7IHR5cGU6ICdTRVQnOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnVU5TRVQnOyBuYW1lOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ0FTWU5DX0RPTkUnOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfTtcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlc1N0YXRlIHtcbiAgdmFsdWU6ICdpZGxlJyB8ICdyZWFkeSc7XG4gIGNvbnRleHQ6IEZlYXR1cmVzQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZXNEaXNwYXRjaCA9IERpc3BhdGNoPEZlYXR1cmVzQWN0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlT2ZGZWF0dXJlKFxuICBmZWF0dXJlc1N0YXRlOiBGZWF0dXJlc1N0YXRlLFxuICBmZWF0dXJlOiBzdHJpbmcsXG4pOiBbRmVhdHVyZVZhbHVlLCBib29sZWFuXSB7XG4gIGlmIChmZWF0dXJlc1N0YXRlLmNvbnRleHQuZmVhdHVyZXNbZmVhdHVyZV0gPT0gbnVsbCkge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCBmYWxzZV07XG4gIH1cbiAgY29uc3QgZmVhdHVyZVN0YXRlID0gZmVhdHVyZXNTdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2ZlYXR1cmVdO1xuICBpZiAoZmVhdHVyZVN0YXRlICE9IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWVGb3JTdGF0ZShmZWF0dXJlU3RhdGUpO1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCBmYWxzZV07XG59XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsRmVhdHVyZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZSA9IHtcbiAgdmFsdWU6ICdpZGxlJyxcbiAgY29udGV4dDoge1xuICAgIGZlYXR1cmVzOiB7fSxcbiAgfSxcbn07XG5cbi8qKlxuICogUmVkdWNlciBmb3IgbWFuYWdpbmcgYSBjb2xsZWN0aW9uIG9mIGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlc1JlZHVjZXIoXG4gIHN0YXRlOiBGZWF0dXJlc1N0YXRlLFxuICBhY3Rpb246IEZlYXR1cmVzQWN0aW9uLFxuKTogRmVhdHVyZXNTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdJTklUJzoge1xuICAgICAgaWYgKGFjdGlvbi5mZWF0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlczogeyBbeDogc3RyaW5nXTogRmVhdHVyZVN0YXRlIH0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBhY3Rpb24uZmVhdHVyZXMpIHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBlYWNoIGZlYXR1cmVcbiAgICAgICAgY29uc3QgZmVhdHVyZVN0YXRlID0ge1xuICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgZmVhdHVyZS5kZWZhdWx0VmFsdWUgPT09IHRydWVcbiAgICAgICAgICAgICAgPyAoJ2VuYWJsZWQnIGFzIGNvbnN0KVxuICAgICAgICAgICAgICA6IGZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSBmYWxzZVxuICAgICAgICAgICAgICAgID8gKCdkaXNhYmxlZCcgYXMgY29uc3QpXG4gICAgICAgICAgICAgICAgOiAoJ3Vuc3BlY2lmaWVkJyBhcyBjb25zdCksXG4gICAgICAgICAgZmVhdHVyZURlc2M6IGZlYXR1cmUsXG4gICAgICAgIH07XG4gICAgICAgIGZlYXR1cmVzW2ZlYXR1cmUubmFtZV0gPSBmZWF0dXJlU3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiAncmVhZHknLFxuICAgICAgICBjb250ZXh0OiB7IGZlYXR1cmVzIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0RFX0lOSVQnOiB7XG4gICAgICByZXR1cm4gaW5pdGlhbEZlYXR1cmVzU3RhdGU7XG4gICAgfVxuXG4gICAgY2FzZSAnU0VUX0FMTCc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmVzID0geyAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzIH07XG4gICAgICBPYmplY3Qua2V5cyhmZWF0dXJlcykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFjdGlvbi5mZWF0dXJlc1tuYW1lXSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGZWF0dXJlID0gZmVhdHVyZXNbbmFtZV07XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0gPSB7IC4uLmN1cnJlbnRGZWF0dXJlLCB2YWx1ZTogJ2FzeW5jRW5hYmxlZCcgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0gPSB7IC4uLmN1cnJlbnRGZWF0dXJlLCB2YWx1ZTogJ2FzeW5jRGlzYWJsZWQnIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICdhc3luY1Vuc3BlY2lmaWVkJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICdlbmFibGVkJyB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBmZWF0dXJlc1tuYW1lXSA9IHsgLi4uY3VycmVudEZlYXR1cmUsIHZhbHVlOiAnZGlzYWJsZWQnIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICd1bnNwZWNpZmllZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDogeyBmZWF0dXJlcyB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdTRVQnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYWN0aW9uO1xuICAgICAgbGV0IG5ld1ZhbHVlOiBGZWF0dXJlU3RhdGVbJ3ZhbHVlJ107XG5cbiAgICAgIGlmIChmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdhc3luY0VuYWJsZWQnO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gJ2FzeW5jRGlzYWJsZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1ZhbHVlID0gJ2FzeW5jVW5zcGVjaWZpZWQnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdlbmFibGVkJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdkaXNhYmxlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSAndW5zcGVjaWZpZWQnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1RPR0dMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBzdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2FjdGlvbi5uYW1lXTtcbiAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgICAgIGZlYXR1cmUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsXG4gICAgICAgICAgPyAnYXN5bmNFbmFibGVkJ1xuICAgICAgICAgIDogJ2VuYWJsZWQnO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZlYXR1cmVzOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzLFxuICAgICAgICAgICAgW2FjdGlvbi5uYW1lXTogeyAuLi5mZWF0dXJlLCB2YWx1ZTogbmV3VmFsdWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdFTkFCTEUnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3VmFsdWUgPVxuICAgICAgICBmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbFxuICAgICAgICAgID8gJ2FzeW5jRW5hYmxlZCdcbiAgICAgICAgICA6ICdlbmFibGVkJztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBmZWF0dXJlczoge1xuICAgICAgICAgICAgLi4uc3RhdGUuY29udGV4dC5mZWF0dXJlcyxcbiAgICAgICAgICAgIFthY3Rpb24ubmFtZV06IHsgLi4uZmVhdHVyZSwgdmFsdWU6IG5ld1ZhbHVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnRElTQUJMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBzdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2FjdGlvbi5uYW1lXTtcbiAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgICAgIGZlYXR1cmUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsXG4gICAgICAgICAgPyAnYXN5bmNEaXNhYmxlZCdcbiAgICAgICAgICA6ICdkaXNhYmxlZCc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1VOU0VUJzoge1xuICAgICAgaWYgKHN0YXRlLnZhbHVlICE9PSAncmVhZHknKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmVhdHVyZSA9IHN0YXRlLmNvbnRleHQuZmVhdHVyZXNbYWN0aW9uLm5hbWVdO1xuICAgICAgaWYgKGZlYXR1cmUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgZmVhdHVyZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGxcbiAgICAgICAgICA/ICdhc3luY1Vuc3BlY2lmaWVkJ1xuICAgICAgICAgIDogJ3Vuc3BlY2lmaWVkJztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBmZWF0dXJlczoge1xuICAgICAgICAgICAgLi4uc3RhdGUuY29udGV4dC5mZWF0dXJlcyxcbiAgICAgICAgICAgIFthY3Rpb24ubmFtZV06IHsgLi4uZmVhdHVyZSwgdmFsdWU6IG5ld1ZhbHVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnQVNZTkNfRE9ORSc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBzdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2FjdGlvbi5uYW1lXTtcbiAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBhY3Rpb247XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgICAgIHZhbHVlID09PSB0cnVlXG4gICAgICAgICAgPyAnZW5hYmxlZCdcbiAgICAgICAgICA6IHZhbHVlID09PSBmYWxzZVxuICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICA6ICd1bnNwZWNpZmllZCc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlc0Rpc3BhdGNoIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEdsb2JhbEVuYWJsZSB9IGZyb20gJy4vR2xvYmFsRW5hYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ29uc29sZU92ZXJyaWRlKFxuICBjb25zb2xlT3ZlcnJpZGU6IGJvb2xlYW4sXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2gsXG4pOiB2b2lkIHtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNvbnNvbGVPdmVycmlkZSkge1xuICAgICAgLy8gQ2xlYW4gdXAgd2luZG93LmZlYXR1cmUgaW1tZWRpYXRlbHkgaWYgY29uc29sZU92ZXJyaWRlIGlzIGRpc2FibGVkXG4gICAgICBpZiAod2luZG93LmZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuZmVhdHVyZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmICh3aW5kb3cuZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmZlYXR1cmUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5mZWF0dXJlID0gbmV3IEdsb2JhbEVuYWJsZShkaXNwYXRjaCwgdGVzdEZlYXR1cmUsIGZlYXR1cmVzKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgd2luZG93LmZlYXR1cmUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzLCBkaXNwYXRjaCwgY29uc29sZU92ZXJyaWRlLCB0ZXN0RmVhdHVyZV0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVzRGlzcGF0Y2ggfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsRW5hYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmZWF0dXJlRGVzYzogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2g7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdEZlYXR1cmU6ICh2YWx1ZTogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2gsXG4gICAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgICBmZWF0dXJlRGVzYzogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW10sXG4gICkge1xuICAgIHRoaXMuZmVhdHVyZURlc2MgPSBmZWF0dXJlRGVzYztcbiAgICB0aGlzLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG4gICAgdGhpcy50ZXN0RmVhdHVyZSA9IHRlc3RGZWF0dXJlO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1RPR0dMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgZW5hYmxlKGZlYXR1cmU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnRU5BQkxFJywgbmFtZTogZmVhdHVyZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bnNldChmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUJywgbmFtZTogZmVhdHVyZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKGZlYXR1cmU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnRElTQUJMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0QWxsKGZlYXR1cmVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9KTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdTRVRfQUxMJywgZmVhdHVyZXMgfSk7XG4gIH1cblxuICBwdWJsaWMgbGlzdEZlYXR1cmVzKCk6IHJlYWRvbmx5IFtzdHJpbmcsIEZlYXR1cmVWYWx1ZV1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmVhdHVyZURlc2MubWFwKChmKSA9PiBbZi5uYW1lLCB0aGlzLnRlc3RGZWF0dXJlKGYubmFtZSldKTtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBmZWF0dXJlPzogR2xvYmFsRW5hYmxlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IHR5cGUgRmVhdHVyZXNTdGF0ZSwgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuXG5leHBvcnQgY29uc3QgS0VZID0gJ3JlYWN0LWVuYWJsZTpmZWF0dXJlLXZhbHVlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVBlcnNpc3QoXG4gIHN0b3JhZ2U6IFN0b3JhZ2UgfCB1bmRlZmluZWQsXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgb3ZlcnJpZGVTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbik6IHZvaWQge1xuICBjb25zdCBvdmVycmlkZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBuZXdPdmVycmlkZXM6IHsgW2tleTogc3RyaW5nXTogRmVhdHVyZVZhbHVlIH0gPSB7fTtcbiAgICBpZiAob3ZlcnJpZGVTdGF0ZS52YWx1ZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZV0gPSB2YWx1ZU9mRmVhdHVyZShvdmVycmlkZVN0YXRlLCBmZWF0dXJlLm5hbWUpO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld092ZXJyaWRlc1tmZWF0dXJlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld092ZXJyaWRlcztcbiAgfSwgW2ZlYXR1cmVzLCBvdmVycmlkZVN0YXRlXSk7XG5cbiAgY29uc3Qgc3RyU3RhdGUgPVxuICAgIE9iamVjdC5rZXlzKG92ZXJyaWRlcykubGVuZ3RoID09PSAwIHx8IHN0b3JhZ2UgPT0gbnVsbFxuICAgICAgPyAne30nXG4gICAgICA6IEpTT04uc3RyaW5naWZ5KHsgb3ZlcnJpZGVzIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdG9yYWdlICE9IG51bGwgJiYgb3ZlcnJpZGVTdGF0ZS52YWx1ZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oS0VZLCBzdHJTdGF0ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQ2FuJ3Qgc2V0IGZvciBzb21lIHJlYXNvblxuICAgIH1cbiAgfSwgW292ZXJyaWRlU3RhdGUsIHN0b3JhZ2UsIHN0clN0YXRlXSk7XG59XG4iLCAiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB0eXBlIHsgRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgdGVzdEZlYXR1cmUgZnJvbSAnLi90ZXN0RmVhdHVyZSc7XG5cbi8vLyBBIGNhbGxiYWNrIHRoYXQgY2FuIGJlIGNhbGxlZCB0byB0ZXN0IGlmIGEgZmVhdHVyZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUZXN0Q2FsbGJhY2soXG4gIGRlZmF1bHRzU3RhdGU6IEZlYXR1cmVzU3RhdGUsXG4gIG92ZXJyaWRlc1N0YXRlOiBGZWF0dXJlc1N0YXRlLFxuKTogKGZlYXR1cmU6IHN0cmluZykgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB1c2VDYWxsYmFjayhcbiAgICAoZjogc3RyaW5nKSA9PiB0ZXN0RmVhdHVyZShmLCBbZGVmYXVsdHNTdGF0ZSwgb3ZlcnJpZGVzU3RhdGVdKSxcbiAgICBbZGVmYXVsdHNTdGF0ZSwgb3ZlcnJpZGVzU3RhdGVdLFxuICApO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHsgdHlwZSBGZWF0dXJlc1N0YXRlLCB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5cbi8qKiBEZXRlcm1pbmUgaWYgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCBpbiBvbmUgb2YgdGhlIHN0YXRlIG1hY2hpbmVzLCBpbiBvcmRlclxuICpcbiAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWFjaGluZVxuICogQHBhcmFtIGZlYXR1cmUgVGhlIGZlYXR1cmUgdG8gY2hlY2tcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0ZXN0RmVhdHVyZShcbiAgZmVhdHVyZTogc3RyaW5nLFxuICBzdGF0ZXM6IEZlYXR1cmVzU3RhdGVbXSxcbik6IEZlYXR1cmVWYWx1ZSB7XG4gIGNvbnN0IHZhbHVlcyA9IHN0YXRlcy5tYXAoKHN0YXRlKSA9PiB2YWx1ZU9mRmVhdHVyZShzdGF0ZSwgZmVhdHVyZSkpO1xuXG4gIC8vIGxvb2sgZm9yIGJlc3QgZm9yY2VkIG9wdGlvbiwgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBbZmVhdHVyZVZhbHVlLCBmZWF0dXJlRm9yY2VkXSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoZmVhdHVyZVZhbHVlICE9IG51bGwgJiYgZmVhdHVyZUZvcmNlZCkge1xuICAgICAgcmV0dXJuIGZlYXR1cmVWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBsb29rIGZvciBiZXN0IG5vbi1mb3JjZWQgb3B0aW9uLCBpbiBvcmRlclxuICBmb3IgKGNvbnN0IFtmZWF0dXJlVmFsdWVdIG9mIHZhbHVlcykge1xuICAgIGlmIChmZWF0dXJlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZlYXR1cmVWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyB1bnNldCBpZiBub3RoaW5nIGhpdFxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwgImltcG9ydCB7IFJhZGlvR3JvdXAgfSBmcm9tICdAaGVhZGxlc3N1aS9yZWFjdCc7XG5pbXBvcnQgUmVhY3QsIHtcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCB7IEZlYXR1cmVDb250ZXh0IH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbi8vIEB0cy1leHBlY3QtZXJyb3IgYnVuZGxlciB3aWxsIHRha2UgY2FyZSBvZiB0aGlzXG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vdGFpbHdpbmQuY3NzJztcblxuZnVuY3Rpb24gY2xhc3NOYW1lcyguLi5jbGFzc2VzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBjbGFzc2VzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIFRvZ2dsZUZlYXR1cmUoe1xuICBmZWF0dXJlLFxufToge1xuICBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb247XG59KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuICBjb25zdCBoYW5kbGVDaGFuZ2VTZWxlY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6ICdmYWxzZScgfCAndHJ1ZScgfCAndW5zZXQnKSA9PiB7XG4gICAgICBpZiAoY29udGV4dD8ub3ZlcnJpZGVzU2VuZCAhPSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICBjYXNlICd0cnVlJzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdmYWxzZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdESVNBQkxFJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3Vuc2V0Jzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ1VOU0VUJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmVhdHVyZS5uYW1lLCBjb250ZXh0XSxcbiAgKTtcblxuICBpZiAoY29udGV4dCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IG92ZXJyaWRlc1N0YXRlLCB0ZXN0OiB0ZXN0RmVhdHVyZSwgZGVmYXVsdHNTdGF0ZSB9ID0gY29udGV4dDtcblxuICBjb25zdCB2YWx1ZUluRGVmYXVsdHMgPSAoXG4gICAgdmFsdWVPZkZlYXR1cmUoZGVmYXVsdHNTdGF0ZSwgZmVhdHVyZS5uYW1lKVswXSA/PyAndW5zZXQnXG4gICkudG9TdHJpbmcoKSBhcyAnZmFsc2UnIHwgJ3RydWUnIHwgJ3Vuc2V0JztcblxuICBjb25zdCB2YWx1ZUluT3ZlcnJpZGVzID0gKFxuICAgIHZhbHVlT2ZGZWF0dXJlKG92ZXJyaWRlc1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCdcbiAgKS50b1N0cmluZygpIGFzICdmYWxzZScgfCAndHJ1ZScgfCAndW5zZXQnO1xuXG4gIGNvbnN0IGFjdHVhbENoZWNrZWQgPSB0ZXN0RmVhdHVyZShmZWF0dXJlLm5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPFJhZGlvR3JvdXBcbiAgICAgIGRpc2FibGVkPXtmZWF0dXJlLm5vT3ZlcnJpZGV9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlU2VsZWN0aW9ufVxuICAgICAgdmFsdWU9e3ZhbHVlSW5PdmVycmlkZXN9XG4gICAgPlxuICAgICAgPFJhZGlvR3JvdXAuTGFiZWw+XG4gICAgICAgIDxoNiBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktOTAwIGFsaWduLWNlbnRlciBmbGV4IGZsZXgtcm93IGZsZXgtbm93cmFwIGl0ZW1zLWNlbnRlciBnYXAtMiBsZzpnYXAtNCBoLTdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgRmVhdHVyZTogPGNvZGU+e2ZlYXR1cmUubmFtZX08L2NvZGU+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtmZWF0dXJlLm5vT3ZlcnJpZGUgPT09IHRydWUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1vcmFuZ2UtNTAwIHRleHQtb3JhbmdlLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTQgdy00IG1pbi13LTRcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICBkPVwiTTUgOVY3YTUgNSAwIDAxMTAgMHYyYTIgMiAwIDAxMiAydjVhMiAyIDAgMDEtMiAySDVhMiAyIDAgMDEtMi0ydi01YTIgMiAwIDAxMi0yem04LTJ2Mkg3VjdhMyAzIDAgMDE2IDB6XCJcbiAgICAgICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxkaXY+Tm8gT3ZlcnJpZGVzPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICB7YWN0dWFsQ2hlY2tlZCA9PT0gdHJ1ZSA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIHRleHQtZ3JlZW4tNTAwIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXItZ3JlZW4tNTAwIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTQgdy00IG1pbi13LTRcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICBkPVwiTTEwIDE4YTggOCAwIDEwMC0xNiA4IDggMCAwMDAgMTZ6bTMuNzA3LTkuMjkzYTEgMSAwIDAwLTEuNDE0LTEuNDE0TDkgMTAuNTg2IDcuNzA3IDkuMjkzYTEgMSAwIDAwLTEuNDE0IDEuNDE0bDIgMmExIDEgMCAwMDEuNDE0IDBsNC00elwiXG4gICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2PnthY3R1YWxDaGVja2VkID8gJ0VuYWJsZWQnIDogJ0Rpc2FibGVkJ308L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L2g2PlxuICAgICAgICB7ZmVhdHVyZS5kZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UgdGV4dC1ncmF5LTUwMCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICB7ZmVhdHVyZS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICA8L3A+XG4gICAgICAgICl9XG4gICAgICA8L1JhZGlvR3JvdXAuTGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgZ3JpZCBncmlkLWNvbHMtMSBnYXAteS02IHNtOmdyaWQtY29scy0zIHNtOmdhcC14LTRcIj5cbiAgICAgICAge1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ2ZhbHNlJyxcbiAgICAgICAgICAgIHRpdGxlOiBgRGlzYWJsZSAke2ZlYXR1cmUubmFtZX1gLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPdmVycmlkZSB0aGUgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3Vuc2V0JyxcbiAgICAgICAgICAgIHRpdGxlOiAnRGVmYXVsdCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0luaGVyaXQgZW5hYmxlZCBzdGF0ZSBmcm9tIGRlZmF1bHRzJyxcbiAgICAgICAgICAgIGRpc2FibGVkOiAoZmVhdHVyZS5ub092ZXJyaWRlID8/IGZhbHNlKSB8fCBmZWF0dXJlLmZvcmNlLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOlxuICAgICAgICAgICAgICB2YWx1ZUluRGVmYXVsdHMgPT09ICd0cnVlJyA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtZ3JlZW4tNTAwIGJvcmRlci1ncmVlbi01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkVuYWJsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXJlZC01MDAgYm9yZGVyLXJlZC01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkRpc2FibGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd0cnVlJyxcbiAgICAgICAgICAgIHRpdGxlOiBgRW5hYmxlICR7ZmVhdHVyZS5uYW1lfWAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ092ZXJyaWRlIHRoZSBmZWF0dXJlIHRvIGJlIGVuYWJsZWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0ubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICA8UmFkaW9Hcm91cC5PcHRpb25cbiAgICAgICAgICAgIGNsYXNzTmFtZT17KHsgY2hlY2tlZCwgYWN0aXZlLCBkaXNhYmxlZCB9KSA9PlxuICAgICAgICAgICAgICBjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgIGNoZWNrZWQgPyAnYm9yZGVyLXRyYW5zcGFyZW50JyA6ICdib3JkZXItZ3JheS0zMDAnLFxuICAgICAgICAgICAgICAgICFkaXNhYmxlZCAmJiBhY3RpdmVcbiAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci1ibHVlLTUwMCByaW5nLTIgcmluZy1ibHVlLTUwMCdcbiAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci10cmFuc3BhcmVudCByaW5nLWdyYXktNTAwIGN1cnNvci1ub3QtYWxsb3dlZCdcbiAgICAgICAgICAgICAgICAgIDogJ2N1cnNvci1wb2ludGVyJyxcbiAgICAgICAgICAgICAgICAncmVsYXRpdmUgYmctd2hpdGUgYm9yZGVyIHJvdW5kZWQtbGcgc2hhZG93LXNtIHAtMyBmbGV4IGZvY3VzOm91dGxpbmUtbm9uZScsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc2FibGVkPXtvcHRpb24uZGlzYWJsZWR9XG4gICAgICAgICAgICBrZXk9e29wdGlvbi5pZH1cbiAgICAgICAgICAgIHZhbHVlPXtvcHRpb24uaWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNoZWNrZWQsIGFjdGl2ZSwgZGlzYWJsZWQgfSkgPT4gKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBncm93XCI+XG4gICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5MYWJlbFxuICAgICAgICAgICAgICAgICAgICBhcz1cInNwYW5cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtbm93cmFwIGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwIGdyb3cgc2hyaW5rXCI+XG4gICAgICAgICAgICAgICAgICAgICAge29wdGlvbi50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmRlZmF1bHRWYWx1ZSAhPSBudWxsID8gb3B0aW9uLmRlZmF1bHRWYWx1ZSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja2VkID8gJ2ludmlzaWJsZScgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdoLTUgdy01IHRleHQtYmx1ZS01MDAgbWluLXctNCcsXG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5MYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwLkRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgIGFzPVwic3BhblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTEgZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5EZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgICAgICAhZGlzYWJsZWQgJiYgYWN0aXZlID8gJ2JvcmRlcicgOiAnYm9yZGVyLTInLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgPyBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnYm9yZGVyLWdyYXktNTAwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYm9yZGVyLWJsdWUtNTAwJ1xuICAgICAgICAgICAgICAgICAgICAgIDogJ2JvcmRlci10cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgICdhYnNvbHV0ZSAtaW5zZXQtcHggcm91bmRlZC1sZyBwb2ludGVyLWV2ZW50cy1ub25lJyxcbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvUmFkaW9Hcm91cC5PcHRpb24+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgPC9SYWRpb0dyb3VwPlxuICApO1xufVxuXG5mdW5jdGlvbiBTaGFkb3dDb250ZW50KHtcbiAgcm9vdCxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIHJvb3Q6IEVsZW1lbnQ7XG59KSB7XG4gIHJldHVybiBSZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHJvb3QpO1xufVxuXG4vLy8gUGVybWl0IHVzZXJzIHRvIG92ZXJyaWRlIGZlYXR1cmUgZmxhZ3MgdmlhIGEgR1VJLlxuLy8vIFJlbmRlcnMgYSBzbWFsbCBmbG9hdGluZyBidXR0b24gaW4gbG93ZXIgbGVmdCBvciByaWdodCwgcHJlc3NpbmcgaXQgYnJpbmdzIHVwXG4vLy8gYSBsaXN0IG9mIGZlYXR1cmVzIHRvIHRvZ2dsZSBhbmQgdGhlaXIgY3VycmVudCBvdmVycmlkZSBzdGF0ZS4geW91IGNhbiBvdmVycmlkZSBvbiBvciBvdmVycmlkZSBvZmYsXG4vLy8gb3IgdW5zZXQgdGhlIG92ZXJyaWRlIGFuZCBnbyBiYWNrIHRvIGRlZmF1bHQgdmFsdWUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbmV4cG9ydCBmdW5jdGlvbiBUb2dnbGVGZWF0dXJlcyh7XG4gIGRlZmF1bHRPcGVuID0gZmFsc2UsXG4gIGhpZGRlbiA9IGZhbHNlLFxufToge1xuICBkZWZhdWx0T3Blbj86IGJvb2xlYW47XG4gIGhpZGRlbj86IGJvb2xlYW47XG59KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgW3Jvb3QsIHNldENvcmVSb290XSA9IHVzZVN0YXRlPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3Qgc2V0Um9vdCA9IChob3N0OiBIVE1MRGl2RWxlbWVudCB8IG51bGwpID0+IHtcbiAgICBpZiAoaG9zdCA9PSBudWxsIHx8IHJvb3QgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaGFkb3dSb290ID0gaG9zdD8uYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBjb25zdCByZW5kZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IHN0eWxlcztcbiAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHJlbmRlckRpdik7XG4gICAgc2V0Q29yZVJvb3QocmVuZGVyRGl2KTtcbiAgfTtcblxuICBpZiAoaGlkZGVuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17c2V0Um9vdH1cbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHpJbmRleDogOTk5OTksXG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB3aWR0aDogJzAnLFxuICAgICAgICBoZWlnaHQ6ICcwJyxcbiAgICAgICAgYm90dG9tOiAwLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7cm9vdCAhPSBudWxsID8gKFxuICAgICAgICA8U2hhZG93Q29udGVudCByb290PXtyb290fT5cbiAgICAgICAgICA8VG9nZ2xlRmVhdHVyZVVud3JhcHBlZCBkZWZhdWx0T3Blbj17ZGVmYXVsdE9wZW59IC8+XG4gICAgICAgIDwvU2hhZG93Q29udGVudD5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLy8gTGlrZSBUb2dnbGVGZWF0dXJlcywgYnV0IGRvZXMgbm90IGluamVjdCBzdHlsZXMgaW50byBhIHNoYWRvdyBET00gcm9vdCBub2RlLlxuLy8vIHVzZWZ1bCBpZiB5b3UncmUgdXNpbmcgdGFpbHdpbmQuXG5leHBvcnQgZnVuY3Rpb24gVG9nZ2xlRmVhdHVyZVVud3JhcHBlZCh7XG4gIGRlZmF1bHRPcGVuID0gZmFsc2UsXG4gIGhpZGRlbiA9IGZhbHNlLFxufToge1xuICBkZWZhdWx0T3Blbj86IGJvb2xlYW47XG4gIGhpZGRlbj86IGJvb2xlYW47XG59KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZGVmYXVsdE9wZW4pO1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChGZWF0dXJlQ29udGV4dCk7XG5cbiAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGhpZGRlbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gV2Ugd2FudDogUmVhbCB2YWx1ZSBhZnRlciBhbGwgbmVzdGluZ3MsIHZhbHVlIG9mIHRoZSBvdmVycmlkZS4gd2UgdG9nZ2xlIG92ZXJyaWRlXG4gIGNvbnN0IHsgZmVhdHVyZXNEZXNjcmlwdGlvbiB9ID0gY29udGV4dDtcblxuICBpZiAoZmVhdHVyZXNEZXNjcmlwdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgbXgtNCBteS00XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSBwLTEgaC04IHctOCBhbGlnbi1taWRkbGUgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1mdWxsIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQganVzdGlmeS1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWJsdWUtNjAwIHNtOnRleHQtc21cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4odHJ1ZSl9XG4gICAgICAgICAgdGl0bGU9XCJUb2dnbGUgZmVhdHVyZXNcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy02IGgtNiBtaW4taC02IG1pbi13LTZcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgIGQ9XCJNMyA2YTMgMyAwIDAxMy0zaDEwYTEgMSAwIDAxLjggMS42TDE0LjI1IDhsMi41NSAzLjRBMSAxIDAgMDExNiAxM0g2YTEgMSAwIDAwLTEgMXYzYTEgMSAwIDExLTIgMFY2elwiXG4gICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFvcGVuID8gbnVsbCA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCB6LTEwIGluc2V0LTAgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWZsZXgtc3RhcnQgbXgtOCBteS00IG1pbi1oLXNjcmVlbiBwdC00IHB4LTQgcGItMTAgc206YmxvY2sgc206cC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGlubGluZS1ibG9jayBhbGlnbi1ib3R0b20gYmctd2hpdGUgcm91bmRlZC1sZyBweC00IHB0LTUgcGItNCB0ZXh0LWxlZnQgb3ZlcmZsb3ctaGlkZGVuIHNoYWRvdy14bCB0cmFuc2Zvcm0gdHJhbnNpdGlvbi1hbGwgc206bXktOCBzbTphbGlnbi1taWRkbGUgc206cC02IGxnOm1heC13LVs4MCVdIG1heC13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgc206bXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgZ2FwLTQgZmxleC1ub3dyYXAgaXRlbXMtY2VudGVyIHNwYWNlLWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncm93IHRleHQtbGcgbGVhZGluZy02IGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlIEZsYWcgT3ZlcnJpZGVzXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICBGZWF0dXJlcyBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCB1bmxlc3MgdGhleSBhcmUgZm9yY2VkXG4gICAgICAgICAgICAgICAgICAgIHVwc3RyZWFtLiBZb3UgY2FuIGFsc28gcmV2ZXJ0IHRvIGRlZmF1bHQuXG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzTmFtZT1cInNyLW9ubHlcIj5GZWF0dXJlIEZsYWdzPC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAge2ZlYXR1cmVzRGVzY3JpcHRpb24ubWFwKChmZWF0dXJlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8VG9nZ2xlRmVhdHVyZSBmZWF0dXJlPXtmZWF0dXJlfSBrZXk9e2ZlYXR1cmUubmFtZX0gLz5cbiAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBtdC01IHNtOm10LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIGZvbnQtbWVkaXVtIHB0LTAgcGItMCBwci00IHBsLTQgaC04IGxlYWRpbmctNyBhbGlnbi1taWRkbGUgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1zbSBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQganVzdGlmeS1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWJsdWUtNjAwIHNtOnRleHQtc21cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4oZmFsc2UpfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgRG9uZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7O0FDREE7OztBQ0FBO0FBU08sSUFBTSxnQkFBZ0IsY0FBaUMsQ0FBQyxPQUFPLEtBQUs7OztBREhwRSwyQkFDTCxPQUMrQjtBQUMvQixRQUFNLE9BQU8sV0FBVyxhQUFhO0FBR3JDLFFBQU0sWUFBWSxRQUNoQixNQUFPLFNBQVMsT0FBTyxDQUFDLElBQUksTUFBTSxRQUFRLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSyxHQUNqRSxDQUFDLEtBQUssQ0FD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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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 diff --git a/dist/esm/src/index.js.map b/dist/esm/src/index.js.map index 1c21f71..32db787 100644 --- a/dist/esm/src/index.js.map +++ b/dist/esm/src/index.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../../../src/FeaturesState.tsx", "../../../src/FeatureState.tsx", "../../../src/Features.tsx", "../../../src/EnableContext.tsx", "../../../src/FeatureContext.tsx", "../../../src/useConsoleOverride.tsx", "../../../src/GlobalEnable.tsx", "../../../src/usePersist.tsx", "../../../src/useTestCallback.tsx", "../../../src/testFeature.tsx", "../../../src/Enable.tsx", "../../../src/utils.ts", "../../../src/useAllEnabled.tsx", "../../../src/useEnabled.tsx", "../../../src/Disable.tsx", "../../../src/useAllDisabled.tsx", "../../../src/useDisabled.tsx", "../../../src/ToggleFeatures.tsx"], - "sourcesContent": ["import { ActorRefFrom, InterpreterFrom, StateFrom, assign, createMachine, spawn } from 'xstate';\n\nimport { FeatureMachine, FeatureDescription, FeatureValue, valueForState } from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: ActorRefFrom };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string };\n\nexport interface FeaturesTypeState {\n value: 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesState = StateFrom;\nexport type FeaturesDispatch = InterpreterFrom['send'];\n\nexport function valueOfFeature(featuresState: FeaturesState, feature: string): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature].getSnapshot();\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\n/// state machine that manages a set of features with user, org, and local overrides\nexport const FeaturesMachine = createMachine({\n id: 'features',\n initial: 'idle',\n predictableActionArguments: true,\n context: {\n features: {},\n },\n states: {\n idle: {\n on: {\n INIT: {\n target: 'ready',\n cond: (_, e) => e.features.length > 0,\n actions: assign({\n features: (context, event) => {\n const features: typeof context.features = {};\n\n for (const feature of event.features) {\n features[feature.name] = spawn(FeatureMachine, {\n name: feature.name,\n sync: true,\n });\n features[feature.name].send({ type: 'INIT', feature });\n }\n return features;\n },\n }),\n },\n },\n },\n\n // the features are loaded and ready to be used\n ready: {\n on: {\n DE_INIT: { target: 'idle', actions: assign({ features: (_, __) => ({}) }) },\n SET_ALL: {\n actions: assign({\n features: (ctx, e) => {\n const features = { ...ctx.features };\n // All configured features are set to on/off or undefined\n Object.keys(features).forEach((name) => {\n features[name].send({ type: 'SET', value: e.features[name] ?? undefined });\n });\n return features;\n },\n }),\n },\n\n // Set a feature to a value\n SET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'SET', value: e.value });\n }\n },\n },\n\n // toggle a feature\n TOGGLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'TOGGLE' });\n }\n },\n },\n\n // when a feature is enabled, send the enable message to the actor\n ENABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'ENABLE' });\n }\n },\n },\n\n // when a feature is disabled, send the disable message to the actor\n DISABLE: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'DISABLE' });\n }\n },\n },\n\n // when a feature is unset, send the unset message to the actor\n UNSET: {\n actions: (ctx, e) => {\n const feature = ctx.features[e.name];\n if (feature != null) {\n feature.send({ type: 'UNSET' });\n }\n },\n },\n },\n },\n },\n});\n", "import { assign, createMachine, DoneInvokeEvent, InterpreterFrom, StateFrom } from 'xstate';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureState = StateFrom;\nexport type FeatureDispatch = InterpreterFrom['send'];\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(featureState: FeatureState): [FeatureValue, boolean] {\n return [\n featureState.matches('enabled') ? true : featureState.matches('disabled') ? false : undefined,\n featureState.context.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (name: K, newValue: FeatureValue) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\ninterface FeatureContext {\n featureDesc?: FeatureDescription;\n}\n\ntype FeatureTypeState =\n | {\n value: 'asyncDenabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncDisabled';\n context: FeatureContext;\n }\n | {\n value: 'asyncUnspecied';\n context: FeatureContext;\n }\n | {\n value: 'disabled';\n context: FeatureContext;\n }\n | {\n value: 'enabled';\n context: FeatureContext;\n }\n | {\n value: 'initial';\n context: never;\n }\n | {\n value: 'unspecied';\n context: FeatureContext;\n };\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' };\n\n/**\n * Fully describe the states a feature can be in\n */\nexport const FeatureMachine = createMachine({\n id: 'feature',\n initial: 'initial',\n context: {},\n predictableActionArguments: true,\n on: {\n ENABLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n TOGGLE: [\n { target: 'asyncEnabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'enabled' },\n ],\n\n DISABLE: [\n { target: 'asyncDisabled', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'disabled' },\n ],\n\n UNSET: [\n { target: 'asyncUnspecied', cond: (ctx) => ctx.featureDesc?.onChangeDefault != null },\n { target: 'unspecified' },\n ],\n\n SET: [\n {\n target: 'asyncEnabled',\n cond: (ctx, e) => e.value === true && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncDisabled',\n cond: (ctx, e) => e.value === false && ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'asyncUnspecied',\n cond: (ctx, _e) => ctx.featureDesc?.onChangeDefault != null,\n },\n {\n target: 'enabled',\n cond: (_ctx, e) => e.value === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e) => e.value === false,\n },\n { target: 'unspecified' },\n ],\n },\n\n states: {\n initial: {\n on: {\n INIT: [\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'enabled',\n cond: (_, e) => e.feature.defaultValue === true,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'unspecified',\n cond: (_, e) => e.feature.defaultValue === undefined,\n },\n {\n actions: assign({ featureDesc: (_, e) => e.feature }),\n target: 'disabled',\n cond: (_, e) => e.feature.defaultValue === false,\n },\n ],\n },\n },\n\n unspecified: {},\n disabled: {},\n enabled: {},\n\n asyncDisabled: {\n invoke: {\n id: 'set-off-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, false);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncUnspecied: {\n invoke: {\n id: 'set-unset-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, undefined);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n\n asyncEnabled: {\n invoke: {\n id: 'set-on-upstream',\n src: async (ctx) => {\n const onchange = ctx.featureDesc?.onChangeDefault;\n if (onchange != null && ctx.featureDesc != null) {\n return onchange(ctx.featureDesc.name, true);\n }\n return undefined;\n },\n onDone: [\n {\n target: 'enabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === true,\n },\n {\n target: 'disabled',\n cond: (_ctx, e: DoneInvokeEvent) => e.data === false,\n },\n { target: 'unspecified' },\n ],\n onError: 'unspecified',\n },\n },\n },\n});\n", "import React, { useMemo, ReactNode, useEffect, useRef } from 'react';\n\nimport { useMachine } from '@xstate/react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport { FeaturesMachine } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesSend] = useMachine(FeaturesMachine);\n const [defaultsState, defaultsSend] = useMachine(FeaturesMachine);\n\n useEffect(() => {\n /// Load defaults\n defaultsSend({ type: 'INIT', features });\n return () => {\n defaultsSend({ type: 'DE_INIT' });\n };\n }, [defaultsSend, features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesSend({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({ name: x.name, description: x.description, defaultValue: f?.[x.name] ?? undefined })),\n });\n\n return () => {\n overridesSend({ type: 'DE_INIT' });\n };\n }, [featuresRef, overridesSend, storage]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsSend);\n\n const featureValue = useMemo(\n () => ({\n overridesSend,\n defaultsSend,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesSend, defaultsSend, overridesState, defaultsState, testCallback]\n );\n\n return (\n \n {children}\n \n );\n}\n", "import { createContext } from 'react';\n\nimport { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { createContext } from 'react';\n\nimport { FeaturesDispatch, FeaturesState } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import { useEffect } from 'react';\n\nimport { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n return () => {\n /* empty */\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n delete window.feature;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import { FeaturesDispatch } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[]\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useMemo, useEffect } from 'react';\n\nimport { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureDescription, FeatureValue } from './FeatureState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.matches('ready')) {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState = Object.keys(overrides).length === 0 || storage == null ? '{}' : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.matches('ready')) {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState\n): (feature: string) => boolean | undefined {\n return useCallback((f: string) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]);\n}\n", "import { FeaturesState, valueOfFeature } from './FeaturesState';\nimport { FeatureValue } from './FeatureState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(feature: string, states: FeaturesState[]): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({ feature = [], allFeatures = [], children }: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContextType, EnableContext } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(input?: string[] | string | null): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(() => (input == null ? [] : Array.isArray(input) ? input : [input]), [input]);\n\n return [test, converted];\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import * as React from \"react\";\n\nimport { EnableProps } from \"./Enable\";\nimport { useAllDisabled } from \"./useAllDisabled\";\nimport { useDisabled } from \"./useDisabled\";\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false));\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "import React, { useContext, useState, useCallback, ReactNode } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { RadioGroup } from '@headlessui/react';\n\nimport { FeatureContext } from './FeatureContext';\nimport { valueOfFeature } from './FeaturesState';\nimport { FeatureDescription } from './FeatureState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({ feature }: { feature: FeatureDescription }): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context]\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (valueOfFeature(defaultsState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const valueInOverrides = (valueOfFeature(overridesState, feature.name)[0] ?? 'unset').toString() as\n | 'false'\n | 'true'\n | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null :

{feature.description}

}\n
\n
\n {[\n { id: 'false', title: `Disable ${feature.name}`, description: 'Override the feature to be disabled' },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n { id: 'true', title: `Enable ${feature.name}`, description: 'Override the feature to be enabled' },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active ? 'border-blue-500 ring-2 ring-blue-500' : '',\n disabled ? 'border-transparent ring-gray-500 cursor-not-allowed' : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none'\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n {option.title}\n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n
\n );\n}\n\nfunction ShadowContent({ root, children }: { children: ReactNode; root: Element }) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({ defaultOpen = false, hidden = false }: { defaultOpen?: boolean; hidden?: boolean }): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n
\n {root != null ? (\n \n \n \n ) : null}\n
\n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({ defaultOpen = false, hidden = false }: { defaultOpen?: boolean; hidden?: boolean }): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
Feature Flag Overrides
\n

\n

\n Features can be enabled or disabled unless they are forced upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], - "mappings": "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", + "sources": ["../../../src/Disable.tsx", "../../../src/utils.ts", "../../../src/EnableContext.tsx", "../../../src/useAllDisabled.tsx", "../../../src/useDisabled.tsx", "../../../src/Enable.tsx", "../../../src/useAllEnabled.tsx", "../../../src/useEnabled.tsx", "../../../src/Features.tsx", "../../../src/FeatureContext.tsx", "../../../src/FeatureState.tsx", "../../../src/FeaturesState.tsx", "../../../src/useConsoleOverride.tsx", "../../../src/GlobalEnable.tsx", "../../../src/usePersist.tsx", "../../../src/useTestCallback.tsx", "../../../src/testFeature.tsx", "../../../src/ToggleFeatures.tsx"], + "sourcesContent": ["// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport type { EnableProps } from './Enable';\nimport { useAllDisabled } from './useAllDisabled';\nimport { useDisabled } from './useDisabled';\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children,\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContext, type EnableContextType } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(\n input?: string[] | string | null,\n): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(\n () => (input == null ? [] : Array.isArray(input) ? input : [input]),\n [input],\n );\n\n return [test, converted];\n}\n", "import { createContext } from 'react';\n\nimport type { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return (\n withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false))\n );\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({\n feature = [],\n allFeatures = [],\n children,\n}: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import React, {\n type ReactNode,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { featuresReducer, initialFeaturesState } from './FeaturesState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n const [defaultsState, defaultsDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n\n useEffect(() => {\n /// Load defaults\n defaultsDispatch({ type: 'INIT', features });\n return () => {\n defaultsDispatch({ type: 'DE_INIT' });\n };\n }, [features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesDispatch({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({\n name: x.name,\n description: x.description,\n defaultValue: f?.[x.name] ?? undefined,\n })),\n });\n\n return () => {\n overridesDispatch({ type: 'DE_INIT' });\n };\n }, [storage]);\n\n // Handle async operations for features with onChangeDefault\n useEffect(() => {\n if (defaultsState.value !== 'ready') {\n return;\n }\n\n // Check for features in async states and handle them\n Object.entries(defaultsState.context.features).forEach(\n ([name, feature]) => {\n if (\n feature.value === 'asyncEnabled' ||\n feature.value === 'asyncDisabled' ||\n feature.value === 'asyncUnspecified'\n ) {\n const targetValue =\n feature.value === 'asyncEnabled'\n ? true\n : feature.value === 'asyncDisabled'\n ? false\n : undefined;\n\n const onChangeDefault = feature.featureDesc?.onChangeDefault;\n if (onChangeDefault != null && feature.featureDesc != null) {\n onChangeDefault(feature.featureDesc.name, targetValue)\n .then((result) => {\n defaultsDispatch({ type: 'ASYNC_DONE', name, value: result });\n })\n .catch(() => {\n defaultsDispatch({\n type: 'ASYNC_DONE',\n name,\n value: undefined,\n });\n });\n }\n }\n },\n );\n }, [defaultsState]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(\n !disableConsole,\n featuresRef.current,\n testCallback,\n defaultsDispatch,\n );\n\n const featureValue = useMemo(\n () => ({\n overridesSend: overridesDispatch,\n defaultsSend: defaultsDispatch,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesState, defaultsState, testCallback],\n );\n\n return (\n \n \n {children}\n \n \n );\n}\n", "import { createContext } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch, FeaturesState } from './FeaturesState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import type { Dispatch } from 'react';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureStateValue =\n | 'initial'\n | 'enabled'\n | 'disabled'\n | 'unspecified'\n | 'asyncEnabled'\n | 'asyncDisabled'\n | 'asyncUnspecified';\n\nexport interface FeatureState {\n value: FeatureStateValue;\n featureDesc?: FeatureDescription;\n}\n\nexport type FeatureDispatch = Dispatch;\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(\n featureState: FeatureState,\n): [FeatureValue, boolean] {\n return [\n featureState.value === 'enabled' || featureState.value === 'asyncEnabled'\n ? true\n : featureState.value === 'disabled' ||\n featureState.value === 'asyncDisabled'\n ? false\n : undefined,\n featureState.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (\n name: K,\n newValue: FeatureValue,\n ) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' }\n | { type: 'ASYNC_DONE'; value: FeatureValue };\n\nexport const initialFeatureState: FeatureState = {\n value: 'initial',\n};\n\n/**\n * Reducer for managing individual feature state\n */\nexport function featureReducer(\n state: FeatureState,\n action: FeatureAction,\n): FeatureState {\n switch (action.type) {\n case 'INIT': {\n const { feature } = action;\n const value =\n feature.defaultValue === true\n ? 'enabled'\n : feature.defaultValue === false\n ? 'disabled'\n : 'unspecified';\n return {\n value: value as FeatureStateValue,\n featureDesc: feature,\n };\n }\n\n case 'ENABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'DISABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'disabled' };\n }\n\n case 'TOGGLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'UNSET': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncUnspecified' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'SET': {\n const { value } = action;\n if (state.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n return { ...state, value: 'asyncEnabled' };\n }\n if (value === false) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'asyncUnspecified' };\n }\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'ASYNC_DONE': {\n const { value } = action;\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n default:\n return state;\n }\n}\n", "import type { Dispatch } from 'react';\n\nimport {\n type FeatureDescription,\n type FeatureState,\n type FeatureValue,\n valueForState,\n} from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: FeatureState };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string }\n | { type: 'ASYNC_DONE'; name: string; value: FeatureValue };\n\nexport interface FeaturesState {\n value: 'idle' | 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesDispatch = Dispatch;\n\nexport function valueOfFeature(\n featuresState: FeaturesState,\n feature: string,\n): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature];\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\nexport const initialFeaturesState: FeaturesState = {\n value: 'idle',\n context: {\n features: {},\n },\n};\n\n/**\n * Reducer for managing a collection of features\n */\nexport function featuresReducer(\n state: FeaturesState,\n action: FeaturesAction,\n): FeaturesState {\n switch (action.type) {\n case 'INIT': {\n if (action.features.length === 0) {\n return state;\n }\n\n const features: { [x: string]: FeatureState } = {};\n for (const feature of action.features) {\n // Initialize each feature\n const featureState = {\n value:\n feature.defaultValue === true\n ? ('enabled' as const)\n : feature.defaultValue === false\n ? ('disabled' as const)\n : ('unspecified' as const),\n featureDesc: feature,\n };\n features[feature.name] = featureState;\n }\n\n return {\n value: 'ready',\n context: { features },\n };\n }\n\n case 'DE_INIT': {\n return initialFeaturesState;\n }\n\n case 'SET_ALL': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const features = { ...state.context.features };\n Object.keys(features).forEach((name) => {\n const value = action.features[name] ?? undefined;\n const currentFeature = features[name];\n\n if (currentFeature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'asyncEnabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'asyncDisabled' };\n } else {\n features[name] = { ...currentFeature, value: 'asyncUnspecified' };\n }\n } else {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'enabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'disabled' };\n } else {\n features[name] = { ...currentFeature, value: 'unspecified' };\n }\n }\n });\n\n return {\n ...state,\n context: { features },\n };\n }\n\n case 'SET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n let newValue: FeatureState['value'];\n\n if (feature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n newValue = 'asyncEnabled';\n } else if (value === false) {\n newValue = 'asyncDisabled';\n } else {\n newValue = 'asyncUnspecified';\n }\n } else {\n if (value === true) {\n newValue = 'enabled';\n } else if (value === false) {\n newValue = 'disabled';\n } else {\n newValue = 'unspecified';\n }\n }\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'TOGGLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ENABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'DISABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncDisabled'\n : 'disabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'UNSET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncUnspecified'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ASYNC_DONE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n const newValue =\n value === true\n ? 'enabled'\n : value === false\n ? 'disabled'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n default:\n return state;\n }\n}\n", "import { useEffect } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch,\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n // Clean up window.feature immediately if consoleOverride is disabled\n if (window.feature != null) {\n window.feature = undefined;\n }\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[],\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useEffect, useMemo } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState,\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.value === 'ready') {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState =\n Object.keys(overrides).length === 0 || storage == null\n ? '{}'\n : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.value === 'ready') {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport type { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState,\n): (feature: string) => boolean | undefined {\n return useCallback(\n (f: string) => testFeature(f, [defaultsState, overridesState]),\n [defaultsState, overridesState],\n );\n}\n", "import type { FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(\n feature: string,\n states: FeaturesState[],\n): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import { RadioGroup } from '@headlessui/react';\nimport React, {\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { valueOfFeature } from './FeaturesState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({\n feature,\n}: {\n feature: FeatureDescription;\n}): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context],\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (\n valueOfFeature(defaultsState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const valueInOverrides = (\n valueOfFeature(overridesState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null : (\n

\n {feature.description}\n

\n )}\n
\n
\n {[\n {\n id: 'false',\n title: `Disable ${feature.name}`,\n description: 'Override the feature to be disabled',\n },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n {\n id: 'true',\n title: `Enable ${feature.name}`,\n description: 'Override the feature to be enabled',\n },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active\n ? 'border-blue-500 ring-2 ring-blue-500'\n : '',\n disabled\n ? 'border-transparent ring-gray-500 cursor-not-allowed'\n : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none',\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n \n {option.title}\n \n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n \n );\n}\n\nfunction ShadowContent({\n root,\n children,\n}: {\n children: ReactNode;\n root: Element;\n}) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n \n {root != null ? (\n \n \n \n ) : null}\n \n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
\n Feature Flag Overrides\n
\n

\n

\n Features can be enabled or disabled unless they are forced\n upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;AACA;;;ACDA;;;ACAA;AASO,IAAM,gBAAgB,cAAiC,CAAC,OAAO,KAAK;;;ADHpE,2BACL,OAC+B;AAC/B,QAAM,OAAO,WAAW,aAAa;AAGrC,QAAM,YAAY,QAChB,MAAO,SAAS,OAAO,CAAC,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,GACjE,CAAC,KAAK,CACR;AAEA,SAAO,CAAC,MAAM,SAAS;AACzB;;;AEbO,wBAAwB,YAAwC;AACrE,QAAM,CAAC,MAAM,mBAAmB,kBAAkB,UAAU;AAC5D,SACE,WAAW,SAAS,KAAK,gBAAgB,MAAM,CAAC,MAAG;AARvD;AAQ0D,YAAE,YAAK,CAAC,MAAN,YAAW;AAAA,GAAM;AAE7E;;;ACLO,qBAAqB,SAAqC;AAC/D,QAAM,CAAC,MAAM,mBAAmB,kBAAkB,OAAO;AACzD,SAAO,gBAAgB,KAAK,CAAC,MAAG;AAPlC;AAOqC,YAAE,YAAK,CAAC,MAAN,YAAW;AAAA,GAAM;AACxD;;;AJEO,IAAM,UAAiC,CAAC;AAAA,EAC7C,UAAU,CAAC;AAAA,EACX,cAAc,CAAC;AAAA,EACf;AAAA,MACI;AACJ,QAAM,QAAQ,YAAY,OAAO;AACjC,QAAM,QAAQ,eAAe,WAAW;AAExC,MAAI,SAAS,OAAO;AAClB,WAAO,0DAAG,QAAS;AAAA,EACrB;AAEA,SAAO;AACT;;;AKtBA;;;ACIO,uBAAuB,aAAyC;AACrE,QAAM,CAAC,MAAM,mBAAmB,kBAAkB,WAAW;AAC7D,SAAO,gBAAgB,SAAS,KAAK,gBAAgB,MAAM,IAAI;AACjE;;;ACHO,oBAAoB,SAAqC;AAC9D,QAAM,CAAC,MAAM,mBAAmB,kBAAkB,OAAO;AACzD,SAAO,gBAAgB,KAAK,IAAI;AAClC;;;AFOO,gBAAgB;AAAA,EACrB,UAAU,CAAC;AAAA,EACX,cAAc,CAAC;AAAA,EACf;AAAA,GACkC;AAClC,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,QAAQ,cAAc,WAAW;AAEvC,MAAI,SAAS,OAAO;AAClB,WAAO,4DAAG,QAAS;AAAA,EACrB;AAEA,SAAO;AACT;;;AG5BA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAIO,IAAM,iBAAiB,eAAyC,IAAI;;;ACqBpE,uBACL,cACyB;AA3B3B;AA4BE,SAAO;AAAA,IACL,aAAa,UAAU,aAAa,aAAa,UAAU,iBACvD,OACA,aAAa,UAAU,cACrB,aAAa,UAAU,kBACvB,QACA;AAAA,IACN,yBAAa,gBAAb,mBAA0B,UAA1B,YAAmC;AAAA,EACrC;AACF;;;ACDO,wBACL,eACA,SACyB;AACzB,MAAI,cAAc,QAAQ,SAAS,YAAY,MAAM;AACnD,WAAO,CAAC,QAAW,KAAK;AAAA,EAC1B;AACA,QAAM,eAAe,cAAc,QAAQ,SAAS;AACpD,MAAI,gBAAgB,MAAM;AACxB,WAAO,cAAc,YAAY;AAAA,EACnC;AACA,SAAO,CAAC,QAAW,KAAK;AAC1B;AAEO,IAAM,uBAAsC;AAAA,EACjD,OAAO;AAAA,EACP,SAAS;AAAA,IACP,UAAU,CAAC;AAAA,EACb;AACF;AAKO,yBACL,OACA,QACe;AA/DjB;AAgEE,UAAQ,OAAO;AAAA,SACR,QAAQ;AACX,UAAI,OAAO,SAAS,WAAW,GAAG;AAChC,eAAO;AAAA,MACT;AAEA,YAAM,WAA0C,CAAC;AACjD,iBAAW,WAAW,OAAO,UAAU;AAErC,cAAM,eAAe;AAAA,UACnB,OACE,QAAQ,iBAAiB,OACpB,YACD,QAAQ,iBAAiB,QACtB,aACA;AAAA,UACT,aAAa;AAAA,QACf;AACA,iBAAS,QAAQ,QAAQ;AAAA,MAC3B;AAEA,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS,EAAE,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,SAEK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,SAEK,WAAW;AACd,UAAI,MAAM,UAAU,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,mBAAK,MAAM,QAAQ;AACpC,aAAO,KAAK,QAAQ,EAAE,QAAQ,CAAC,SAAS;AArG9C;AAsGQ,cAAM,QAAQ,cAAO,SAAS,UAAhB,aAAyB;AACvC,cAAM,iBAAiB,SAAS;AAEhC,YAAI,uBAAe,gBAAf,oBAA4B,oBAAmB,MAAM;AACvD,cAAI,UAAU,MAAM;AAClB,qBAAS,QAAQ,iCAAK,iBAAL,EAAqB,OAAO,eAAe;AAAA,UAC9D,WAAW,UAAU,OAAO;AAC1B,qBAAS,QAAQ,iCAAK,iBAAL,EAAqB,OAAO,gBAAgB;AAAA,UAC/D,OAAO;AACL,qBAAS,QAAQ,iCAAK,iBAAL,EAAqB,OAAO,mBAAmB;AAAA,UAClE;AAAA,QACF,OAAO;AACL,cAAI,UAAU,MAAM;AAClB,qBAAS,QAAQ,iCAAK,iBAAL,EAAqB,OAAO,UAAU;AAAA,UACzD,WAAW,UAAU,OAAO;AAC1B,qBAAS,QAAQ,iCAAK,iBAAL,EAAqB,OAAO,WAAW;AAAA,UAC1D,OAAO;AACL,qBAAS,QAAQ,iCAAK,iBAAL,EAAqB,OAAO,cAAc;AAAA,UAC7D;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,iCACF,QADE;AAAA,QAEL,SAAS,EAAE,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,SAEK,OAAO;AACV,UAAI,MAAM,UAAU,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,MAAM,QAAQ,SAAS,OAAO;AAC9C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAEA,YAAM,EAAE,UAAU;AAClB,UAAI;AAEJ,UAAI,eAAQ,gBAAR,mBAAqB,oBAAmB,MAAM;AAChD,YAAI,UAAU,MAAM;AAClB,qBAAW;AAAA,QACb,WAAW,UAAU,OAAO;AAC1B,qBAAW;AAAA,QACb,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,YAAI,UAAU,MAAM;AAClB,qBAAW;AAAA,QACb,WAAW,UAAU,OAAO;AAC1B,qBAAW;AAAA,QACb,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF;AAEA,aAAO,iCACF,QADE;AAAA,QAEL,SAAS;AAAA,UACP,UAAU,iCACL,MAAM,QAAQ,WADT;AAAA,aAEP,OAAO,OAAO,iCAAK,UAAL,EAAc,OAAO,SAAS;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,SAEK,UAAU;AACb,UAAI,MAAM,UAAU,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,MAAM,QAAQ,SAAS,OAAO;AAC9C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAEA,YAAM,WACJ,eAAQ,gBAAR,mBAAqB,oBAAmB,OACpC,iBACA;AAEN,aAAO,iCACF,QADE;AAAA,QAEL,SAAS;AAAA,UACP,UAAU,iCACL,MAAM,QAAQ,WADT;AAAA,aAEP,OAAO,OAAO,iCAAK,UAAL,EAAc,OAAO,SAAS;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,SAEK,UAAU;AACb,UAAI,MAAM,UAAU,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,MAAM,QAAQ,SAAS,OAAO;AAC9C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAEA,YAAM,WACJ,eAAQ,gBAAR,mBAAqB,oBAAmB,OACpC,iBACA;AAEN,aAAO,iCACF,QADE;AAAA,QAEL,SAAS;AAAA,UACP,UAAU,iCACL,MAAM,QAAQ,WADT;AAAA,aAEP,OAAO,OAAO,iCAAK,UAAL,EAAc,OAAO,SAAS;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,SAEK,WAAW;AACd,UAAI,MAAM,UAAU,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,MAAM,QAAQ,SAAS,OAAO;AAC9C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAEA,YAAM,WACJ,eAAQ,gBAAR,mBAAqB,oBAAmB,OACpC,kBACA;AAEN,aAAO,iCACF,QADE;AAAA,QAEL,SAAS;AAAA,UACP,UAAU,iCACL,MAAM,QAAQ,WADT;AAAA,aAEP,OAAO,OAAO,iCAAK,UAAL,EAAc,OAAO,SAAS;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,SAEK,SAAS;AACZ,UAAI,MAAM,UAAU,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,MAAM,QAAQ,SAAS,OAAO;AAC9C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAEA,YAAM,WACJ,eAAQ,gBAAR,mBAAqB,oBAAmB,OACpC,qBACA;AAEN,aAAO,iCACF,QADE;AAAA,QAEL,SAAS;AAAA,UACP,UAAU,iCACL,MAAM,QAAQ,WADT;AAAA,aAEP,OAAO,OAAO,iCAAK,UAAL,EAAc,OAAO,SAAS;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,SAEK,cAAc;AACjB,UAAI,MAAM,UAAU,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,MAAM,QAAQ,SAAS,OAAO;AAC9C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAEA,YAAM,EAAE,UAAU;AAClB,YAAM,WACJ,UAAU,OACN,YACA,UAAU,QACR,aACA;AAER,aAAO,iCACF,QADE;AAAA,QAEL,SAAS;AAAA,UACP,UAAU,iCACL,MAAM,QAAQ,WADT;AAAA,aAEP,OAAO,OAAO,iCAAK,UAAL,EAAc,OAAO,SAAS;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAGE,aAAO;AAAA;AAEb;;;ACpTA;;;ACGO,yBAAmB;AAAA,EAKxB,YACE,UACA,cACA,aACA;AACA,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEO,OAAO,SAAuB;AACnC,SAAK,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEO,OAAO,SAAuB;AACnC,SAAK,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEO,MAAM,SAAuB;AAClC,SAAK,SAAS,EAAE,MAAM,SAAS,MAAM,QAAQ,CAAC;AAAA,EAChD;AAAA,EAEO,QAAQ,SAAuB;AACpC,SAAK,SAAS,EAAE,MAAM,WAAW,MAAM,QAAQ,CAAC;AAAA,EAClD;AAAA,EAEO,OAAO,UAAiD;AAC7D,SAAK,SAAS,EAAE,MAAM,WAAW,SAAS,CAAC;AAAA,EAC7C;AAAA,EAEO,eAAkD;AACvD,WAAO,KAAK,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,YAAY,EAAE,IAAI,CAAC,CAAC;AAAA,EACvE;AACF;;;ADpCe,4BACb,iBACA,UACA,cACA,UACM;AACN,YAAU,MAAM;AACd,QAAI,CAAC,iBAAiB;AAEpB,UAAI,OAAO,WAAW,MAAM;AAC1B,eAAO,UAAU;AAAA,MACnB;AACA,aAAO,MAAM;AACX,YAAI,OAAO,WAAW,MAAM;AAC1B,iBAAO,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,WAAO,UAAU,IAAI,aAAa,UAAU,cAAa,QAAQ;AACjE,WAAO,MAAM;AACX,UAAI,OAAO,WAAW,MAAM;AAC1B,eAAO,UAAU;AAAA,MACnB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,UAAU,iBAAiB,YAAW,CAAC;AACvD;;;AE9BA;AAIO,IAAM,MAAM;AAEJ,oBACb,SACA,UACA,eACM;AACN,QAAM,YAAY,SAAQ,MAAM;AAC9B,UAAM,eAAgD,CAAC;AACvD,QAAI,cAAc,UAAU,SAAS;AACnC,iBAAW,WAAW,UAAU;AAC9B,cAAM,CAAC,SAAS,eAAe,eAAe,QAAQ,IAAI;AAC1D,YAAI,SAAS,MAAM;AACjB,uBAAa,QAAQ,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,UAAU,aAAa,CAAC;AAE5B,QAAM,WACJ,OAAO,KAAK,SAAS,EAAE,WAAW,KAAK,WAAW,OAC9C,OACA,KAAK,UAAU,EAAE,UAAU,CAAC;AAElC,aAAU,MAAM;AACd,QAAI;AACF,UAAI,WAAW,QAAQ,cAAc,UAAU,SAAS;AACtD,gBAAQ,QAAQ,KAAK,QAAQ;AAAA,MAC/B;AAAA,IACF,SAAS,GAAP;AAAA,IAEF;AAAA,EACF,GAAG,CAAC,eAAe,SAAS,QAAQ,CAAC;AACvC;;;ACtCA;;;ACSe,qBACb,SACA,QACc;AACd,QAAM,SAAS,OAAO,IAAI,CAAC,UAAU,eAAe,OAAO,OAAO,CAAC;AAGnE,aAAW,CAAC,cAAc,kBAAkB,QAAQ;AAClD,QAAI,gBAAgB,QAAQ,eAAe;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AAGA,aAAW,CAAC,iBAAiB,QAAQ;AACnC,QAAI,gBAAgB,MAAM;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AAGA,SAAO;AACT;;;ADzBe,yBACb,eACA,gBAC0C;AAC1C,SAAO,YACL,CAAC,MAAc,YAAY,GAAG,CAAC,eAAe,cAAc,CAAC,GAC7D,CAAC,eAAe,cAAc,CAChC;AACF;;;APeO,kBAAkB;AAAA,EACvB;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,UAAU,OAAO;AAAA,GACW;AAE5B,QAAM,cAAc,OAAO,QAAQ;AACnC,QAAM,CAAC,gBAAgB,qBAAqB,WAC1C,iBACA,oBACF;AACA,QAAM,CAAC,eAAe,oBAAoB,WACxC,iBACA,oBACF;AAEA,aAAU,MAAM;AAEd,qBAAiB,EAAE,MAAM,QAAQ,SAAS,CAAC;AAC3C,WAAO,MAAM;AACX,uBAAiB,EAAE,MAAM,UAAU,CAAC;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,aAAU,MAAM;AACd,QAAI,IAAyC,CAAC;AAC9C,QAAI,WAAW,MAAM;AACnB,UAAI;AACF,cAAM,eAAe,QAAQ,QAAQ,GAAG;AACxC,YAAI,gBAAgB,MAAM;AACxB,gBAAM,KAAK,KAAK,MAAM,YAAY;AAClC,cAAI,GAAG;AAAA,QACT;AAAA,MACF,SAAS,GAAP;AAEA,gBAAQ,MAAM,yBAAyB,CAAC;AAAA,MAC1C;AAAA,IACF;AAEA,sBAAkB;AAAA,MAChB,MAAM;AAAA,MACN,UAAU,YAAY,QACnB,OAAO,CAAC,MAAM,EAAE,eAAe,IAAI,EACnC,IAAI,CAAC,MAAG;AAzEjB;AAyEqB;AAAA,UACX,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,cAAc,6BAAI,EAAE,UAAN,YAAe;AAAA,QAC/B;AAAA,OAAE;AAAA,IACN,CAAC;AAED,WAAO,MAAM;AACX,wBAAkB,EAAE,MAAM,UAAU,CAAC;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAGZ,aAAU,MAAM;AACd,QAAI,cAAc,UAAU,SAAS;AACnC;AAAA,IACF;AAGA,WAAO,QAAQ,cAAc,QAAQ,QAAQ,EAAE,QAC7C,CAAC,CAAC,MAAM,aAAa;AA7F3B;AA8FQ,UACE,QAAQ,UAAU,kBAClB,QAAQ,UAAU,mBAClB,QAAQ,UAAU,oBAClB;AACA,cAAM,cACJ,QAAQ,UAAU,iBACd,OACA,QAAQ,UAAU,kBAChB,QACA;AAER,cAAM,kBAAkB,cAAQ,gBAAR,mBAAqB;AAC7C,YAAI,mBAAmB,QAAQ,QAAQ,eAAe,MAAM;AAC1D,0BAAgB,QAAQ,YAAY,MAAM,WAAW,EAClD,KAAK,CAAC,WAAW;AAChB,6BAAiB,EAAE,MAAM,cAAc,MAAM,OAAO,OAAO,CAAC;AAAA,UAC9D,CAAC,EACA,MAAM,MAAM;AACX,6BAAiB;AAAA,cACf,MAAM;AAAA,cACN;AAAA,cACA,OAAO;AAAA,YACT,CAAC;AAAA,UACH,CAAC;AAAA,QACL;AAAA,MACF;AAAA,IACF,CACF;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,aAAW,SAAS,YAAY,SAAS,cAAc;AAEvD,QAAM,eAAe,gBAAgB,gBAAgB,aAAa;AAClE,qBACE,CAAC,gBACD,YAAY,SACZ,cACA,gBACF;AAEA,QAAM,eAAe,SACnB,MAAO;AAAA,IACL,eAAe;AAAA,IACf,cAAc;AAAA,IACd,qBAAqB,YAAY;AAAA,IACjC;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR,IACA,CAAC,gBAAgB,eAAe,YAAY,CAC9C;AAEA,SACE,qCAAC,eAAe,UAAf;AAAA,IAAwB,OAAO;AAAA,KAC9B,qCAAC,cAAc,UAAd;AAAA,IAAuB,OAAO;AAAA,KAC5B,QACH,CACF;AAEJ;;;AS1JA;AACA;AAAA;AAAA;AAAA;AAAA;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,uBAAuB,SAA2B;AAChD,SAAO,QAAQ,OAAO,OAAO,EAAE,KAAK,GAAG;AACzC;AAEA,uBAAuB;AAAA,EACrB;AAAA,GAGqB;AAvBvB;AAwBE,QAAM,UAAU,YAAW,cAAc;AACzC,QAAM,wBAAwB,aAC5B,CAAC,UAAsC;AACrC,QAAI,oCAAS,kBAAiB,MAAM;AAClC,cAAQ;AAAA,aACD,QAAQ;AACX,kBAAQ,cAAc,EAAE,MAAM,UAAU,MAAM,QAAQ,KAAK,CAAC;AAC5D;AAAA,QACF;AAAA,aACK,SAAS;AACZ,kBAAQ,cAAc,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,CAAC;AAC7D;AAAA,QACF;AAAA,aACK,SAAS;AACZ,kBAAQ,cAAc,EAAE,MAAM,SAAS,MAAM,QAAQ,KAAK,CAAC;AAC3D;AAAA,QACF;AAAA;AAAA,IAEJ;AAAA,EACF,GACA,CAAC,QAAQ,MAAM,OAAO,CACxB;AAEA,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,gBAAgB,MAAM,cAAa,kBAAkB;AAE7D,QAAM,kBACJ,sBAAe,eAAe,QAAQ,IAAI,EAAE,OAA5C,YAAkD,SAClD,SAAS;AAEX,QAAM,mBACJ,sBAAe,gBAAgB,QAAQ,IAAI,EAAE,OAA7C,YAAmD,SACnD,SAAS;AAEX,QAAM,gBAAgB,aAAY,QAAQ,IAAI;AAE9C,SACE,qCAAC;AAAA,IACC,UAAU,QAAQ;AAAA,IAClB,UAAU;AAAA,IACV,OAAO;AAAA,KAEP,qCAAC,WAAW,OAAX,MACC,qCAAC;AAAA,IAAG,WAAU;AAAA,KACZ,qCAAC;AAAA,IAAK,WAAU;AAAA,KAAc,aACnB,qCAAC,cAAM,QAAQ,IAAK,CAC/B,GACC,QAAQ,eAAe,OACtB,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC;AAAA,IACC,eAAY;AAAA,IACZ,WAAU;AAAA,IACV,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,OAAM;AAAA,KAEN,qCAAC;AAAA,IACC,UAAS;AAAA,IACT,GAAE;AAAA,IACF,UAAS;AAAA,GACX,CACF,GACA,qCAAC,aAAI,cAAY,CACnB,IACE,MACH,kBAAkB,OACjB,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC;AAAA,IACC,eAAY;AAAA,IACZ,WAAU;AAAA,IACV,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,OAAM;AAAA,KAEN,qCAAC;AAAA,IACC,UAAS;AAAA,IACT,GAAE;AAAA,IACF,UAAS;AAAA,GACX,CACF,GACA,qCAAC,aAAK,gBAAgB,YAAY,UAAW,CAC/C,IACE,IACN,GACC,QAAQ,eAAe,OAAO,OAC7B,qCAAC;AAAA,IAAE,WAAU;AAAA,KACV,QAAQ,WACX,CAEJ,GACA,qCAAC;AAAA,IAAI,WAAU;AAAA,KACZ;AAAA,IACC;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,WAAW,QAAQ;AAAA,MAC1B,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,UAAW,eAAQ,eAAR,YAAsB,UAAU,QAAQ;AAAA,MACnD,cACE,oBAAoB,SAClB,qCAAC;AAAA,QAAI,WAAU;AAAA,SACb,qCAAC,cAAK,SAAO,CACf,IAEA,qCAAC;AAAA,QAAI,WAAU;AAAA,SACb,qCAAC,cAAK,UAAQ,CAChB;AAAA,IAEN;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,OAAO,UAAU,QAAQ;AAAA,MACzB,aAAa;AAAA,IACf;AAAA,EACF,EAAE,IAAI,CAAC,WACL,qCAAC,WAAW,QAAX;AAAA,IACC,WAAW,CAAC,EAAE,SAAS,QAAQ,eAC7B,WACE,UAAU,uBAAuB,mBACjC,CAAC,YAAY,SACT,yCACA,IACJ,WACI,wDACA,kBACJ,2EACF;AAAA,IAEF,UAAU,OAAO;AAAA,IACjB,KAAK,OAAO;AAAA,IACZ,OAAO,OAAO;AAAA,KAEb,CAAC,EAAE,SAAS,QAAQ,eACnB,4DACE,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC,WAAW,OAAX;AAAA,IACC,IAAG;AAAA,IACH,WAAU;AAAA,KAEV,qCAAC;AAAA,IAAK,WAAU;AAAA,KACb,OAAO,KACV,GACC,OAAO,gBAAgB,OAAO,OAAO,eAAe,MACrD,qCAAC;AAAA,IACC,eAAY;AAAA,IACZ,WAAW,WACT,CAAC,UAAU,cAAc,IACzB,+BACF;AAAA,IACA,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,OAAM;AAAA,KAEN,qCAAC;AAAA,IACC,UAAS;AAAA,IACT,GAAE;AAAA,IACF,UAAS;AAAA,GACX,CACF,CACF,GACA,qCAAC,WAAW,aAAX;AAAA,IACC,IAAG;AAAA,IACH,WAAU;AAAA,KAET,OAAO,WACV,CACF,GACA,qCAAC;AAAA,IACC,eAAY;AAAA,IACZ,WAAW,WACT,CAAC,YAAY,SAAS,WAAW,YACjC,UACI,WACE,oBACA,oBACF,sBACJ,mDACF;AAAA,GACF,CACF,CAEJ,CACD,CACH,CACF;AAEJ;AAEA,uBAAuB;AAAA,EACrB;AAAA,EACA;AAAA,GAIC;AACD,SAAO,SAAS,aAAa,UAAU,IAAI;AAC7C;AAOO,wBAAwB;AAAA,EAC7B,cAAc;AAAA,EACd,SAAS;AAAA,GAIY;AACrB,QAAM,CAAC,MAAM,eAAe,SAAgC,IAAI;AAEhE,QAAM,UAAU,CAAC,SAAgC;AAC/C,QAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC;AAAA,IACF;AACA,UAAM,aAAa,6BAAM,aAAa,EAAE,MAAM,OAAO;AACrD,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,UAAM,cAAc;AACpB,eAAW,YAAY,KAAK;AAC5B,eAAW,YAAY,SAAS;AAChC,gBAAY,SAAS;AAAA,EACvB;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,SACE,qCAAC;AAAA,IACC,KAAK;AAAA,IACL,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,KAEC,QAAQ,OACP,qCAAC;AAAA,IAAc;AAAA,KACb,qCAAC;AAAA,IAAuB;AAAA,GAA0B,CACpD,IACE,IACN;AAEJ;AAIO,gCAAgC;AAAA,EACrC,cAAc;AAAA,EACd,SAAS;AAAA,GAIY;AACrB,QAAM,CAAC,MAAM,WAAW,SAAS,WAAW;AAC5C,QAAM,UAAU,YAAW,cAAc;AAEzC,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAGA,QAAM,EAAE,wBAAwB;AAEhC,MAAI,oBAAoB,WAAW,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,SACE,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC;AAAA,IACC,WAAU;AAAA,IACV,SAAS,MAAM,QAAQ,IAAI;AAAA,IAC3B,OAAM;AAAA,IACN,MAAK;AAAA,KAEL,qCAAC;AAAA,IACC,WAAU;AAAA,IACV,MAAK;AAAA,IACL,SAAQ;AAAA,IACR,OAAM;AAAA,KAEN,qCAAC;AAAA,IACC,UAAS;AAAA,IACT,GAAE;AAAA,IACF,UAAS;AAAA,GACX,CACF,CACF,CACF,GACC,CAAC,OAAO,OACP,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC,aACC,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC;AAAA,IAAG,WAAU;AAAA,KACZ,qCAAC;AAAA,IAAI,WAAU;AAAA,KAAmD,wBAElE,CACF,GACA,qCAAC;AAAA,IAAE,WAAU;AAAA,KAAwB,sGAGrC,GACA,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC;AAAA,IAAS,WAAU;AAAA,KAClB,qCAAC;AAAA,IAAO,WAAU;AAAA,KAAU,eAAa,GACxC,oBAAoB,IAAI,CAAC,YACxB,qCAAC;AAAA,IAAc;AAAA,IAAkB,KAAK,QAAQ;AAAA,GAAM,CACrD,CACH,CACF,GACA,qCAAC;AAAA,IAAI,WAAU;AAAA,KACb,qCAAC;AAAA,IACC,WAAU;AAAA,IACV,SAAS,MAAM,QAAQ,KAAK;AAAA,IAC5B,MAAK;AAAA,KACN,MAED,CACF,CACF,CACF,CACF,CACF,CACF,CAEJ;AAEJ;", "names": [] } diff --git a/dist/index.d.ts b/dist/index.d.ts index 0b6858f..f56ffe3 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,13 +1,12 @@ -export { FeaturesMachine } from './FeaturesState'; -export { Features } from './Features'; -export { Enable } from './Enable'; export { Disable } from './Disable'; -export { useDisabled } from './useDisabled'; -export { useEnabled } from './useEnabled'; -export { useAllDisabled } from './useAllDisabled'; -export { useAllEnabled } from './useAllEnabled'; +export { Enable } from './Enable'; export type { EnableContextType } from './EnableContext'; -export type { FeatureContextType } from './FeatureContext'; -export type { FeatureValue, FeatureState, FeatureDescription, FeatureDispatch } from './FeatureState'; export { EnableContext } from './EnableContext'; +export type { FeatureContextType } from './FeatureContext'; +export type { FeatureDescription, FeatureDispatch, FeatureState, FeatureValue, } from './FeatureState'; +export { Features } from './Features'; export { ToggleFeatures } from './ToggleFeatures'; +export { useAllDisabled } from './useAllDisabled'; +export { useAllEnabled } from './useAllEnabled'; +export { useDisabled } from './useDisabled'; +export { useEnabled } from './useEnabled'; diff --git a/dist/setupTests.d.ts b/dist/setupTests.d.ts new file mode 100644 index 0000000..7b0828b --- /dev/null +++ b/dist/setupTests.d.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; diff --git a/dist/testFeature.d.ts b/dist/testFeature.d.ts index a519a0c..f2256d2 100644 --- a/dist/testFeature.d.ts +++ b/dist/testFeature.d.ts @@ -1,3 +1,3 @@ -import { FeaturesState } from './FeaturesState'; -import { FeatureValue } from './FeatureState'; +import type { FeatureValue } from './FeatureState'; +import { type FeaturesState } from './FeaturesState'; export default function testFeature(feature: string, states: FeaturesState[]): FeatureValue; diff --git a/dist/useConsoleOverride.d.ts b/dist/useConsoleOverride.d.ts index a5af51f..908e966 100644 --- a/dist/useConsoleOverride.d.ts +++ b/dist/useConsoleOverride.d.ts @@ -1,3 +1,3 @@ -import { FeaturesDispatch } from './FeaturesState'; -import { FeatureDescription, FeatureValue } from './FeatureState'; +import type { FeatureDescription, FeatureValue } from './FeatureState'; +import type { FeaturesDispatch } from './FeaturesState'; export default function useConsoleOverride(consoleOverride: boolean, features: readonly FeatureDescription[], testFeature: (_: string) => FeatureValue, dispatch: FeaturesDispatch): void; diff --git a/dist/usePersist.d.ts b/dist/usePersist.d.ts index 09b7dfa..b17e328 100644 --- a/dist/usePersist.d.ts +++ b/dist/usePersist.d.ts @@ -1,4 +1,4 @@ -import { FeaturesState } from './FeaturesState'; -import { FeatureDescription } from './FeatureState'; +import type { FeatureDescription } from './FeatureState'; +import { type FeaturesState } from './FeaturesState'; export declare const KEY = "react-enable:feature-values"; export default function usePersist(storage: Storage | undefined, features: readonly FeatureDescription[], overrideState: FeaturesState): void; diff --git a/dist/useTestCallback.d.ts b/dist/useTestCallback.d.ts index 08b4388..3a16f36 100644 --- a/dist/useTestCallback.d.ts +++ b/dist/useTestCallback.d.ts @@ -1,2 +1,2 @@ -import { FeaturesState } from './FeaturesState'; +import type { FeaturesState } from './FeaturesState'; export default function useTestCallback(defaultsState: FeaturesState, overridesState: FeaturesState): (feature: string) => boolean | undefined; diff --git a/dist/utils.d.ts b/dist/utils.d.ts index 50ab00d..c9cff30 100644 --- a/dist/utils.d.ts +++ b/dist/utils.d.ts @@ -1,2 +1,2 @@ -import { EnableContextType } from './EnableContext'; +import { type EnableContextType } from './EnableContext'; export declare function useTestAndConvert(input?: string[] | string | null): [EnableContextType, string[]]; diff --git a/package-lock.json b/package-lock.json index 91ce102..daeb879 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "react-enable", "version": "3.1.1", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -10,9 +10,7 @@ "license": "ISC", "dependencies": { "@headlessui/react": "^1.5.0", - "@xstate/react": "^3.2.1", - "tslib": "^1.14.1", - "xstate": "^4.37.0" + "tslib": "^1.14.1" }, "devDependencies": { "@biomejs/biome": "^1.9.4", @@ -1430,6 +1428,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, "node_modules/@testing-library/dom/node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -1741,28 +1749,6 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, - "node_modules/@xstate/react": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@xstate/react/-/react-3.2.1.tgz", - "integrity": "sha512-L/mqYRxyBWVdIdSaXBHacfvS8NKn3sTKbPb31aRADbE9spsJ1p+tXil0GVQHPlzrmjGeozquLrxuYGiXsFNU7g==", - "dependencies": { - "use-isomorphic-layout-effect": "^1.0.0", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@xstate/fsm": "^2.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "xstate": "^4.36.0" - }, - "peerDependenciesMeta": { - "@xstate/fsm": { - "optional": true - }, - "xstate": { - "optional": true - } - } - }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -1918,13 +1904,13 @@ "dev": true }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" + "engines": { + "node": ">= 0.4" } }, "node_modules/arr-diff": { @@ -3264,22 +3250,6 @@ "esbuild-windows-arm64": "0.14.36" } }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.36", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz", - "integrity": "sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild-node-externals": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/esbuild-node-externals/-/esbuild-node-externals-1.4.1.tgz", @@ -3867,20 +3837,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -9268,27 +9224,6 @@ "node": ">=0.10.0" } }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sync-external-store": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.0.0.tgz", - "integrity": "sha512-AFVsxg5GkFg8GDcxnl+Z0lMAz9rE8DGJCc28qnBuQF7lac57B5smLcT37aXpXIIPz75rW4g3eXHPjhHwdGskOw==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0-rc" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -9561,15 +9496,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "node_modules/xstate": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.37.0.tgz", - "integrity": "sha512-YC+JCerRclKS9ixQTuw8l3vs3iFqWzNzOGR0ID5XsSlieMXIV9nNPE43h9CGr7VdxA1QYhMwhCZA0EdpOd17Bg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/xstate" - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9651,7089 +9577,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@adobe/css-tools": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", - "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true - }, - "@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", - "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true - }, - "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" - } - }, - "@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", - "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", - "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.9", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@biomejs/biome": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz", - "integrity": "sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==", - "dev": true, - "requires": { - "@biomejs/cli-darwin-arm64": "1.9.4", - "@biomejs/cli-darwin-x64": "1.9.4", - "@biomejs/cli-linux-arm64": "1.9.4", - "@biomejs/cli-linux-arm64-musl": "1.9.4", - "@biomejs/cli-linux-x64": "1.9.4", - "@biomejs/cli-linux-x64-musl": "1.9.4", - "@biomejs/cli-win32-arm64": "1.9.4", - "@biomejs/cli-win32-x64": "1.9.4" - } - }, - "@biomejs/cli-darwin-arm64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz", - "integrity": "sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==", - "dev": true, - "optional": true - }, - "@biomejs/cli-darwin-x64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz", - "integrity": "sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==", - "dev": true, - "optional": true - }, - "@biomejs/cli-linux-arm64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz", - "integrity": "sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==", - "dev": true, - "optional": true - }, - "@biomejs/cli-linux-arm64-musl": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz", - "integrity": "sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==", - "dev": true, - "optional": true - }, - "@biomejs/cli-linux-x64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz", - "integrity": "sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==", - "dev": true, - "optional": true - }, - "@biomejs/cli-linux-x64-musl": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz", - "integrity": "sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==", - "dev": true, - "optional": true - }, - "@biomejs/cli-win32-arm64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz", - "integrity": "sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==", - "dev": true, - "optional": true - }, - "@biomejs/cli-win32-x64": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz", - "integrity": "sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==", - "dev": true, - "optional": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@csstools/postcss-color-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz", - "integrity": "sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", - "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", - "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", - "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz", - "integrity": "sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", - "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz", - "integrity": "sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@headlessui/react": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.5.0.tgz", - "integrity": "sha512-aaRnYxBb3MU2FNJf3Ut9RMTUqqU3as0aI1lQhgo2n9Fa67wRu14iOGqx93xB+uMNVfNwZ5B3y/Ndm7qZGuFeMQ==", - "requires": {} - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - } - }, - "@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - } - }, - "@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "node-notifier": "^8.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - } - }, - "@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - } - }, - "@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tailwindcss/forms": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.0.tgz", - "integrity": "sha512-KzWugryEBFkmoaYcBE18rs6gthWCFHHO7cAZm2/hv3hwD67AzwP7udSCa22E7R1+CEJL/FfhYsJWrc0b1aeSzw==", - "dev": true, - "requires": { - "mini-svg-data-uri": "^1.2.3" - } - }, - "@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - } - } - } - }, - "@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", - "dev": true, - "requires": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@testing-library/react": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz", - "integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.0.0", - "@types/react-dom": "<18.0.0" - }, - "dependencies": { - "@types/react-dom": { - "version": "17.0.26", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz", - "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==", - "dev": true, - "requires": {} - } - } - }, - "@testing-library/react-hooks": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.0.tgz", - "integrity": "sha512-uZqcgtcUUtw7Z9N32W13qQhVAD+Xki2hxbTR461MKax8T6Jr8nsUvZB+vcBTkzY2nFvsUet434CsgF0ncW2yFw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5", - "react-error-boundary": "^3.1.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.0.tgz", - "integrity": "sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, - "@types/node": { - "version": "17.0.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", - "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "@types/react": { - "version": "17.0.44", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.44.tgz", - "integrity": "sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==", - "dev": true, - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.1.tgz", - "integrity": "sha512-jCwTXvHtRLiyVvKm9aEdHXs8rflVOGd5Sl913JZrPshfXjn8NYsTNZOz70bCsA31IR0TOqwi3ad+X4tSCBoMTw==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/tailwindcss": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/tailwindcss/-/tailwindcss-3.0.10.tgz", - "integrity": "sha512-1UnZIHO0NOPyPlPFV0HuMjki2SHkvG9uBA1ZehWj/OQMSROk503nuNyyfmJSIT289yewxTbKoPG+KLxYRvfIIg==", - "dev": true - }, - "@types/testing-library__jest-dom": { - "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", - "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", - "dev": true, - "requires": { - "@types/jest": "*" - } - }, - "@types/yargs": { - "version": "15.0.14", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", - "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@xstate/react": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@xstate/react/-/react-3.2.1.tgz", - "integrity": "sha512-L/mqYRxyBWVdIdSaXBHacfvS8NKn3sTKbPb31aRADbE9spsJ1p+tXil0GVQHPlzrmjGeozquLrxuYGiXsFNU7g==", - "requires": { - "use-isomorphic-layout-effect": "^1.0.0", - "use-sync-external-store": "^1.0.0" - } - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", - "dev": true - }, - "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "requires": { - "deep-equal": "^2.0.5" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - } - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", - "dev": true, - "requires": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "requires": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "dependencies": { - "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - } - }, - "call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - } - }, - "call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concurrently": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.1.0.tgz", - "integrity": "sha512-Bz0tMlYKZRUDqJlNiF/OImojMB9ruKUz6GCfmhFnSapXgPe+3xzY4byqoKG9tUZ7L2PGEUjfLPOLfIX3labnmw==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.21", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - } - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "requires": {} - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true - }, - "cssdb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", - "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", - "dev": true - }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "date-fns": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", - "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", - "dev": true - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - } - }, - "electron-to-chromium": { - "version": "1.4.113", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.113.tgz", - "integrity": "sha512-s30WKxp27F3bBH6fA07FYL2Xm/FYnYrKpMjHr3XVCTUb9anAyZn/BeZfPWgTZGAbJeT4NxNwISSbLcYZvggPMA==", - "dev": true - }, - "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true - }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, - "es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0" - } - }, - "esbuild": { - "version": "0.14.36", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.36.tgz", - "integrity": "sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw==", - "dev": true, - "requires": { - "esbuild-android-64": "0.14.36", - "esbuild-android-arm64": "0.14.36", - "esbuild-darwin-64": "0.14.36", - "esbuild-darwin-arm64": "0.14.36", - "esbuild-freebsd-64": "0.14.36", - "esbuild-freebsd-arm64": "0.14.36", - "esbuild-linux-32": "0.14.36", - "esbuild-linux-64": "0.14.36", - "esbuild-linux-arm": "0.14.36", - "esbuild-linux-arm64": "0.14.36", - "esbuild-linux-mips64le": "0.14.36", - "esbuild-linux-ppc64le": "0.14.36", - "esbuild-linux-riscv64": "0.14.36", - "esbuild-linux-s390x": "0.14.36", - "esbuild-netbsd-64": "0.14.36", - "esbuild-openbsd-64": "0.14.36", - "esbuild-sunos-64": "0.14.36", - "esbuild-windows-32": "0.14.36", - "esbuild-windows-64": "0.14.36", - "esbuild-windows-arm64": "0.14.36" - } - }, - "esbuild-darwin-arm64": { - "version": "0.14.36", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz", - "integrity": "sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw==", - "dev": true, - "optional": true - }, - "esbuild-node-externals": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/esbuild-node-externals/-/esbuild-node-externals-1.4.1.tgz", - "integrity": "sha512-ZFNGa6w1kYzn4wx9ty4eaItaOTSe2hWQZ6WXa/8guKJCiXL3XpW2CZT4gkx2OhfBKxpqaqa7ZeGK54ScoLSUdw==", - "dev": true, - "requires": { - "find-up": "5.0.0", - "tslib": "2.3.1" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - } - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "requires": { - "is-callable": "^1.2.7" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "requires": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true - }, - "harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "dev": true, - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - } - }, - "is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true - }, - "is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "requires": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - } - }, - "jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - } - }, - "jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", - "dev": true, - "requires": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - } - }, - "jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" - } - }, - "jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" - } - }, - "jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - } - }, - "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", - "dev": true - }, - "jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" - } - }, - "jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - } - }, - "jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - } - }, - "jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", - "dev": true - }, - "jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - } - }, - "jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - } - }, - "jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - } - }, - "jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" - } - }, - "jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - } - }, - "jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "requires": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "peer": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "peer": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true - }, - "object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true - }, - "object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true - }, - "postcss": { - "version": "8.4.12", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz", - "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==", - "dev": true, - "requires": { - "nanoid": "^3.3.1", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-attribute-case-insensitive": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", - "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.2" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", - "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", - "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "dev": true, - "requires": {} - }, - "postcss-custom-properties": { - "version": "12.1.7", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz", - "integrity": "sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", - "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", - "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-double-position-gradients": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", - "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "dev": true, - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", - "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "requires": {} - }, - "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-lab-function": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", - "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "requires": {} - }, - "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.6" - } - }, - "postcss-nesting": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", - "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true - }, - "postcss-overflow-shorthand": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", - "dev": true, - "requires": {} - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "requires": {} - }, - "postcss-place": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", - "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", - "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", - "dev": true, - "requires": { - "@csstools/postcss-color-function": "^1.0.3", - "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.0", - "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.1", - "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.2", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "autoprefixer": "^10.4.4", - "browserslist": "^4.20.2", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.5.0", - "postcss-attribute-case-insensitive": "^5.0.0", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.2", - "postcss-color-hex-alpha": "^8.0.3", - "postcss-color-rebeccapurple": "^7.0.2", - "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.5", - "postcss-custom-selectors": "^6.0.0", - "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.1", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.3", - "postcss-image-set-function": "^4.0.6", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.2", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.3", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.3", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.1", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^5.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", - "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "requires": {} - }, - "postcss-reporter": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", - "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", - "dev": true, - "requires": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - } - }, - "postcss-selector-not": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", - "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-url": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", - "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", - "dev": true, - "requires": { - "make-dir": "~3.1.0", - "mime": "~2.5.2", - "minimatch": "~3.0.4", - "xxhashjs": "~0.2.2" - }, - "dependencies": { - "minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "requires": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "react-error-boundary": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", - "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.12.5" - } - }, - "react-hooks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-hooks/-/react-hooks-1.0.1.tgz", - "integrity": "sha1-5iGXw4zY0HAwYPeRI09/RpiqfEQ=", - "dev": true - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "requires": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true - }, - "side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - } - }, - "side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - } - }, - "side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - } - }, - "side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "requires": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "tailwindcss": { - "version": "3.0.24", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.24.tgz", - "integrity": "sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig==", - "dev": true, - "requires": { - "arg": "^5.0.1", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.12", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "thenby": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "ts-jest": { - "version": "26.5.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", - "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "requires": {} - }, - "use-sync-external-store": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.0.0.tgz", - "integrity": "sha512-AFVsxg5GkFg8GDcxnl+Z0lMAz9rE8DGJCc28qnBuQF7lac57B5smLcT37aXpXIIPz75rW4g3eXHPjhHwdGskOw==", - "requires": {} - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "optional": true - }, - "v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "requires": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xstate": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.37.0.tgz", - "integrity": "sha512-YC+JCerRclKS9ixQTuw8l3vs3iFqWzNzOGR0ID5XsSlieMXIV9nNPE43h9CGr7VdxA1QYhMwhCZA0EdpOd17Bg==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", - "dev": true, - "requires": { - "cuint": "^0.2.2" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/package.json b/package.json index 2acfffc..a9f234e 100644 --- a/package.json +++ b/package.json @@ -73,8 +73,6 @@ }, "dependencies": { "@headlessui/react": "^1.5.0", - "@xstate/react": "^3.2.1", - "tslib": "^1.14.1", - "xstate": "^4.37.0" + "tslib": "^1.14.1" } } diff --git a/src/FeatureState.tsx b/src/FeatureState.tsx index 679ce13..61e1900 100644 --- a/src/FeatureState.tsx +++ b/src/FeatureState.tsx @@ -1,10 +1,4 @@ -import { - type DoneInvokeEvent, - type InterpreterFrom, - type StateFrom, - assign, - createMachine, -} from 'xstate'; +import type { Dispatch } from 'react'; /** * Feature is either on, off, or 'unset', @@ -12,20 +6,34 @@ import { */ export type FeatureValue = false | true | undefined; -export type FeatureState = StateFrom; -export type FeatureDispatch = InterpreterFrom['send']; +export type FeatureStateValue = + | 'initial' + | 'enabled' + | 'disabled' + | 'unspecified' + | 'asyncEnabled' + | 'asyncDisabled' + | 'asyncUnspecified'; + +export interface FeatureState { + value: FeatureStateValue; + featureDesc?: FeatureDescription; +} + +export type FeatureDispatch = Dispatch; /// Given a featurestate, determine the value (on, off, or unset) export function valueForState( featureState: FeatureState, ): [FeatureValue, boolean] { return [ - featureState.matches('enabled') + featureState.value === 'enabled' || featureState.value === 'asyncEnabled' ? true - : featureState.matches('disabled') + : featureState.value === 'disabled' || + featureState.value === 'asyncDisabled' ? false : undefined, - featureState.context.featureDesc?.force ?? false, + featureState.featureDesc?.force ?? false, ]; } @@ -58,40 +66,6 @@ export interface FeatureDescription { readonly defaultValue?: FeatureValue; } -interface FeatureContext { - featureDesc?: FeatureDescription; -} - -type FeatureTypeState = - | { - value: 'asyncDenabled'; - context: FeatureContext; - } - | { - value: 'asyncDisabled'; - context: FeatureContext; - } - | { - value: 'asyncUnspecied'; - context: FeatureContext; - } - | { - value: 'disabled'; - context: FeatureContext; - } - | { - value: 'enabled'; - context: FeatureContext; - } - | { - value: 'initial'; - context: never; - } - | { - value: 'unspecied'; - context: FeatureContext; - }; - /** * Actions that can be performed on a feature. */ @@ -101,180 +75,95 @@ export type FeatureAction = | { type: 'INIT'; feature: FeatureDescription } | { type: 'SET'; value: FeatureValue } | { type: 'TOGGLE' } - | { type: 'UNSET' }; + | { type: 'UNSET' } + | { type: 'ASYNC_DONE'; value: FeatureValue }; + +export const initialFeatureState: FeatureState = { + value: 'initial', +}; /** - * Fully describe the states a feature can be in + * Reducer for managing individual feature state */ -export const FeatureMachine = createMachine< - FeatureContext, - FeatureAction, - FeatureTypeState ->({ - id: 'feature', - initial: 'initial', - context: {}, - predictableActionArguments: true, - on: { - ENABLE: [ - { - target: 'asyncEnabled', - cond: (ctx) => ctx.featureDesc?.onChangeDefault != null, - }, - { target: 'enabled' }, - ], - - TOGGLE: [ - { - target: 'asyncEnabled', - cond: (ctx) => ctx.featureDesc?.onChangeDefault != null, - }, - { target: 'enabled' }, - ], - - DISABLE: [ - { - target: 'asyncDisabled', - cond: (ctx) => ctx.featureDesc?.onChangeDefault != null, - }, - { target: 'disabled' }, - ], +export function featureReducer( + state: FeatureState, + action: FeatureAction, +): FeatureState { + switch (action.type) { + case 'INIT': { + const { feature } = action; + const value = + feature.defaultValue === true + ? 'enabled' + : feature.defaultValue === false + ? 'disabled' + : 'unspecified'; + return { + value: value as FeatureStateValue, + featureDesc: feature, + }; + } - UNSET: [ - { - target: 'asyncUnspecied', - cond: (ctx) => ctx.featureDesc?.onChangeDefault != null, - }, - { target: 'unspecified' }, - ], + case 'ENABLE': { + if (state.featureDesc?.onChangeDefault != null) { + return { ...state, value: 'asyncEnabled' }; + } + return { ...state, value: 'enabled' }; + } - SET: [ - { - target: 'asyncEnabled', - cond: (ctx, e) => - e.value === true && ctx.featureDesc?.onChangeDefault != null, - }, - { - target: 'asyncDisabled', - cond: (ctx, e) => - e.value === false && ctx.featureDesc?.onChangeDefault != null, - }, - { - target: 'asyncUnspecied', - cond: (ctx, _e) => ctx.featureDesc?.onChangeDefault != null, - }, - { - target: 'enabled', - cond: (_ctx, e) => e.value === true, - }, - { - target: 'disabled', - cond: (_ctx, e) => e.value === false, - }, - { target: 'unspecified' }, - ], - }, + case 'DISABLE': { + if (state.featureDesc?.onChangeDefault != null) { + return { ...state, value: 'asyncDisabled' }; + } + return { ...state, value: 'disabled' }; + } - states: { - initial: { - on: { - INIT: [ - { - actions: assign({ featureDesc: (_, e) => e.feature }), - target: 'enabled', - cond: (_, e) => e.feature.defaultValue === true, - }, - { - actions: assign({ featureDesc: (_, e) => e.feature }), - target: 'unspecified', - cond: (_, e) => e.feature.defaultValue === undefined, - }, - { - actions: assign({ featureDesc: (_, e) => e.feature }), - target: 'disabled', - cond: (_, e) => e.feature.defaultValue === false, - }, - ], - }, - }, + case 'TOGGLE': { + if (state.featureDesc?.onChangeDefault != null) { + return { ...state, value: 'asyncEnabled' }; + } + return { ...state, value: 'enabled' }; + } - unspecified: {}, - disabled: {}, - enabled: {}, + case 'UNSET': { + if (state.featureDesc?.onChangeDefault != null) { + return { ...state, value: 'asyncUnspecified' }; + } + return { ...state, value: 'unspecified' }; + } - asyncDisabled: { - invoke: { - id: 'set-off-upstream', - src: async (ctx) => { - const onchange = ctx.featureDesc?.onChangeDefault; - if (onchange != null && ctx.featureDesc != null) { - return onchange(ctx.featureDesc.name, false); - } - return undefined; - }, - onDone: [ - { - target: 'enabled', - cond: (_ctx, e: DoneInvokeEvent) => e.data === true, - }, - { - target: 'disabled', - cond: (_ctx, e: DoneInvokeEvent) => e.data === false, - }, - { target: 'unspecified' }, - ], - onError: 'unspecified', - }, - }, + case 'SET': { + const { value } = action; + if (state.featureDesc?.onChangeDefault != null) { + if (value === true) { + return { ...state, value: 'asyncEnabled' }; + } + if (value === false) { + return { ...state, value: 'asyncDisabled' }; + } + return { ...state, value: 'asyncUnspecified' }; + } + if (value === true) { + return { ...state, value: 'enabled' }; + } + if (value === false) { + return { ...state, value: 'disabled' }; + } + return { ...state, value: 'unspecified' }; + } - asyncUnspecied: { - invoke: { - id: 'set-unset-upstream', - src: async (ctx) => { - const onchange = ctx.featureDesc?.onChangeDefault; - if (onchange != null && ctx.featureDesc != null) { - return onchange(ctx.featureDesc.name, undefined); - } - return undefined; - }, - onDone: [ - { - target: 'enabled', - cond: (_ctx, e: DoneInvokeEvent) => e.data === true, - }, - { - target: 'disabled', - cond: (_ctx, e: DoneInvokeEvent) => e.data === false, - }, - { target: 'unspecified' }, - ], - onError: 'unspecified', - }, - }, + case 'ASYNC_DONE': { + const { value } = action; + if (value === true) { + return { ...state, value: 'enabled' }; + } + if (value === false) { + return { ...state, value: 'disabled' }; + } + return { ...state, value: 'unspecified' }; + } - asyncEnabled: { - invoke: { - id: 'set-on-upstream', - src: async (ctx) => { - const onchange = ctx.featureDesc?.onChangeDefault; - if (onchange != null && ctx.featureDesc != null) { - return onchange(ctx.featureDesc.name, true); - } - return undefined; - }, - onDone: [ - { - target: 'enabled', - cond: (_ctx, e: DoneInvokeEvent) => e.data === true, - }, - { - target: 'disabled', - cond: (_ctx, e: DoneInvokeEvent) => e.data === false, - }, - { target: 'unspecified' }, - ], - onError: 'unspecified', - }, - }, - }, -}); + default: + return state; + } +} diff --git a/src/Features.tsx b/src/Features.tsx index 664061e..69e0f0a 100644 --- a/src/Features.tsx +++ b/src/Features.tsx @@ -1,10 +1,15 @@ -import { useMachine } from '@xstate/react'; -import React, { type ReactNode, useEffect, useMemo, useRef } from 'react'; +import React, { + type ReactNode, + useEffect, + useMemo, + useReducer, + useRef, +} from 'react'; import { EnableContext } from './EnableContext'; import { FeatureContext } from './FeatureContext'; import type { FeatureDescription } from './FeatureState'; -import { FeaturesMachine } from './FeaturesState'; +import { featuresReducer, initialFeaturesState } from './FeaturesState'; import useConsoleOverride from './useConsoleOverride'; import usePersist, { KEY } from './usePersist'; import useTestCallback from './useTestCallback'; @@ -30,16 +35,22 @@ export function Features({ }: FeatureProps): JSX.Element { // Capture only first value; we don't care about future updates const featuresRef = useRef(features); - const [overridesState, overridesSend] = useMachine(FeaturesMachine); - const [defaultsState, defaultsSend] = useMachine(FeaturesMachine); + const [overridesState, overridesDispatch] = useReducer( + featuresReducer, + initialFeaturesState, + ); + const [defaultsState, defaultsDispatch] = useReducer( + featuresReducer, + initialFeaturesState, + ); useEffect(() => { /// Load defaults - defaultsSend({ type: 'INIT', features }); + defaultsDispatch({ type: 'INIT', features }); return () => { - defaultsSend({ type: 'DE_INIT' }); + defaultsDispatch({ type: 'DE_INIT' }); }; - }, [defaultsSend, features]); + }, [features]); useEffect(() => { let f: Record = {}; @@ -56,7 +67,7 @@ export function Features({ } } - overridesSend({ + overridesDispatch({ type: 'INIT', features: featuresRef.current .filter((x) => x.noOverride !== true) @@ -68,9 +79,49 @@ export function Features({ }); return () => { - overridesSend({ type: 'DE_INIT' }); + overridesDispatch({ type: 'DE_INIT' }); }; - }, [overridesSend, storage]); + }, [storage]); + + // Handle async operations for features with onChangeDefault + useEffect(() => { + if (defaultsState.value !== 'ready') { + return; + } + + // Check for features in async states and handle them + Object.entries(defaultsState.context.features).forEach( + ([name, feature]) => { + if ( + feature.value === 'asyncEnabled' || + feature.value === 'asyncDisabled' || + feature.value === 'asyncUnspecified' + ) { + const targetValue = + feature.value === 'asyncEnabled' + ? true + : feature.value === 'asyncDisabled' + ? false + : undefined; + + const onChangeDefault = feature.featureDesc?.onChangeDefault; + if (onChangeDefault != null && feature.featureDesc != null) { + onChangeDefault(feature.featureDesc.name, targetValue) + .then((result) => { + defaultsDispatch({ type: 'ASYNC_DONE', name, value: result }); + }) + .catch(() => { + defaultsDispatch({ + type: 'ASYNC_DONE', + name, + value: undefined, + }); + }); + } + } + }, + ); + }, [defaultsState]); usePersist(storage, featuresRef.current, overridesState); @@ -79,19 +130,19 @@ export function Features({ !disableConsole, featuresRef.current, testCallback, - defaultsSend, + defaultsDispatch, ); const featureValue = useMemo( () => ({ - overridesSend, - defaultsSend, + overridesSend: overridesDispatch, + defaultsSend: defaultsDispatch, featuresDescription: featuresRef.current, overridesState, defaultsState, test: testCallback, }), - [overridesSend, defaultsSend, overridesState, defaultsState, testCallback], + [overridesState, defaultsState, testCallback], ); return ( diff --git a/src/FeaturesState.tsx b/src/FeaturesState.tsx index eef5ea9..ac5f6f3 100644 --- a/src/FeaturesState.tsx +++ b/src/FeaturesState.tsx @@ -1,15 +1,8 @@ -import { - type ActorRefFrom, - type InterpreterFrom, - type StateFrom, - assign, - createMachine, - spawn, -} from 'xstate'; +import type { Dispatch } from 'react'; import { type FeatureDescription, - FeatureMachine, + type FeatureState, type FeatureValue, valueForState, } from './FeatureState'; @@ -20,7 +13,7 @@ export interface FeaturesContext { // - browser: browser-local values for features (kept in local storage, etc) // - user: values from the user's profile, if any // - org: value from the org's profile, if any - features: { [x: string]: ActorRefFrom }; + features: { [x: string]: FeatureState }; } export type FeaturesAction = @@ -31,15 +24,15 @@ export type FeaturesAction = | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } } | { type: 'SET'; name: string; value: FeatureValue } | { type: 'TOGGLE'; name: string } - | { type: 'UNSET'; name: string }; + | { type: 'UNSET'; name: string } + | { type: 'ASYNC_DONE'; name: string; value: FeatureValue }; -export interface FeaturesTypeState { - value: 'ready'; +export interface FeaturesState { + value: 'idle' | 'ready'; context: FeaturesContext; } -export type FeaturesState = StateFrom; -export type FeaturesDispatch = InterpreterFrom['send']; +export type FeaturesDispatch = Dispatch; export function valueOfFeature( featuresState: FeaturesState, @@ -48,122 +41,269 @@ export function valueOfFeature( if (featuresState.context.features[feature] == null) { return [undefined, false]; } - const featureState = featuresState.context.features[feature].getSnapshot(); + const featureState = featuresState.context.features[feature]; if (featureState != null) { return valueForState(featureState); } return [undefined, false]; } -/// state machine that manages a set of features with user, org, and local overrides -export const FeaturesMachine = createMachine< - FeaturesContext, - FeaturesAction, - FeaturesTypeState ->({ - id: 'features', - initial: 'idle', - predictableActionArguments: true, +export const initialFeaturesState: FeaturesState = { + value: 'idle', context: { features: {}, }, - states: { - idle: { - on: { - INIT: { - target: 'ready', - cond: (_, e) => e.features.length > 0, - actions: assign({ - features: (context, event) => { - const features: typeof context.features = {}; - - for (const feature of event.features) { - features[feature.name] = spawn(FeatureMachine, { - name: feature.name, - sync: true, - }); - features[feature.name].send({ type: 'INIT', feature }); - } - return features; - }, - }), - }, - }, - }, - - // the features are loaded and ready to be used - ready: { - on: { - DE_INIT: { - target: 'idle', - actions: assign({ features: (_, __) => ({}) }), - }, - SET_ALL: { - actions: assign({ - features: (ctx, e) => { - const features = { ...ctx.features }; - // All configured features are set to on/off or undefined - Object.keys(features).forEach((name) => { - features[name].send({ - type: 'SET', - value: e.features[name] ?? undefined, - }); - }); - return features; - }, - }), +}; + +/** + * Reducer for managing a collection of features + */ +export function featuresReducer( + state: FeaturesState, + action: FeaturesAction, +): FeaturesState { + switch (action.type) { + case 'INIT': { + if (action.features.length === 0) { + return state; + } + + const features: { [x: string]: FeatureState } = {}; + for (const feature of action.features) { + // Initialize each feature + const featureState = { + value: + feature.defaultValue === true + ? ('enabled' as const) + : feature.defaultValue === false + ? ('disabled' as const) + : ('unspecified' as const), + featureDesc: feature, + }; + features[feature.name] = featureState; + } + + return { + value: 'ready', + context: { features }, + }; + } + + case 'DE_INIT': { + return initialFeaturesState; + } + + case 'SET_ALL': { + if (state.value !== 'ready') { + return state; + } + + const features = { ...state.context.features }; + Object.keys(features).forEach((name) => { + const value = action.features[name] ?? undefined; + const currentFeature = features[name]; + + if (currentFeature.featureDesc?.onChangeDefault != null) { + if (value === true) { + features[name] = { ...currentFeature, value: 'asyncEnabled' }; + } else if (value === false) { + features[name] = { ...currentFeature, value: 'asyncDisabled' }; + } else { + features[name] = { ...currentFeature, value: 'asyncUnspecified' }; + } + } else { + if (value === true) { + features[name] = { ...currentFeature, value: 'enabled' }; + } else if (value === false) { + features[name] = { ...currentFeature, value: 'disabled' }; + } else { + features[name] = { ...currentFeature, value: 'unspecified' }; + } + } + }); + + return { + ...state, + context: { features }, + }; + } + + case 'SET': { + if (state.value !== 'ready') { + return state; + } + + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + + const { value } = action; + let newValue: FeatureState['value']; + + if (feature.featureDesc?.onChangeDefault != null) { + if (value === true) { + newValue = 'asyncEnabled'; + } else if (value === false) { + newValue = 'asyncDisabled'; + } else { + newValue = 'asyncUnspecified'; + } + } else { + if (value === true) { + newValue = 'enabled'; + } else if (value === false) { + newValue = 'disabled'; + } else { + newValue = 'unspecified'; + } + } + + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue }, + }, }, + }; + } + + case 'TOGGLE': { + if (state.value !== 'ready') { + return state; + } - // Set a feature to a value - SET: { - actions: (ctx, e) => { - const feature = ctx.features[e.name]; - if (feature != null) { - feature.send({ type: 'SET', value: e.value }); - } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + + const newValue = + feature.featureDesc?.onChangeDefault != null + ? 'asyncEnabled' + : 'enabled'; + + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue }, }, }, + }; + } + + case 'ENABLE': { + if (state.value !== 'ready') { + return state; + } + + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + + const newValue = + feature.featureDesc?.onChangeDefault != null + ? 'asyncEnabled' + : 'enabled'; - // toggle a feature - TOGGLE: { - actions: (ctx, e) => { - const feature = ctx.features[e.name]; - if (feature != null) { - feature.send({ type: 'TOGGLE' }); - } + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue }, }, }, + }; + } - // when a feature is enabled, send the enable message to the actor - ENABLE: { - actions: (ctx, e) => { - const feature = ctx.features[e.name]; - if (feature != null) { - feature.send({ type: 'ENABLE' }); - } + case 'DISABLE': { + if (state.value !== 'ready') { + return state; + } + + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + + const newValue = + feature.featureDesc?.onChangeDefault != null + ? 'asyncDisabled' + : 'disabled'; + + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue }, }, }, + }; + } + + case 'UNSET': { + if (state.value !== 'ready') { + return state; + } - // when a feature is disabled, send the disable message to the actor - DISABLE: { - actions: (ctx, e) => { - const feature = ctx.features[e.name]; - if (feature != null) { - feature.send({ type: 'DISABLE' }); - } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + + const newValue = + feature.featureDesc?.onChangeDefault != null + ? 'asyncUnspecified' + : 'unspecified'; + + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue }, }, }, + }; + } + + case 'ASYNC_DONE': { + if (state.value !== 'ready') { + return state; + } + + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + + const { value } = action; + const newValue = + value === true + ? 'enabled' + : value === false + ? 'disabled' + : 'unspecified'; - // when a feature is unset, send the unset message to the actor - UNSET: { - actions: (ctx, e) => { - const feature = ctx.features[e.name]; - if (feature != null) { - feature.send({ type: 'UNSET' }); - } + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue }, }, }, - }, - }, - }, -}); + }; + } + + default: + return state; + } +} diff --git a/src/index.tsx b/src/index.tsx index c78f082..b416427 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -10,7 +10,6 @@ export type { FeatureValue, } from './FeatureState'; export { Features } from './Features'; -export { FeaturesMachine } from './FeaturesState'; export { ToggleFeatures } from './ToggleFeatures'; export { useAllDisabled } from './useAllDisabled'; export { useAllEnabled } from './useAllEnabled'; diff --git a/src/tailwind.css b/src/tailwind.css index 412ed6c..b504475 100644 --- a/src/tailwind.css +++ b/src/tailwind.css @@ -639,6 +639,40 @@ select { --tw-backdrop-sepia: ; } +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + .sr-only { position: absolute; width: 1px; @@ -922,14 +956,14 @@ select { border-color: rgb(107 114 128 / var(--tw-border-opacity)); } -.bg-white { +.bg-blue-600 { --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); } -.bg-blue-600 { +.bg-white { --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } .p-3 { @@ -1031,6 +1065,11 @@ select { line-height: 1.75rem; } +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + .text-gray-900 { --tw-text-opacity: 1; color: rgb(17 24 39 / var(--tw-text-opacity)); @@ -1046,11 +1085,6 @@ select { color: rgb(34 197 94 / var(--tw-text-opacity)); } -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - .text-red-500 { --tw-text-opacity: 1; color: rgb(239 68 68 / var(--tw-text-opacity)); diff --git a/src/testFeature.spec.tsx b/src/testFeature.spec.tsx index 2320e03..18d349b 100644 --- a/src/testFeature.spec.tsx +++ b/src/testFeature.spec.tsx @@ -1,15 +1,15 @@ -import { interpret } from 'xstate'; - -import { FeaturesMachine, type FeaturesState } from './FeaturesState'; +import { + type FeaturesState, + featuresReducer, + initialFeaturesState, +} from './FeaturesState'; import testFeature from './testFeature'; // Helper function to create a features state with specific feature values function createFeaturesState( features: Array<{ name: string; defaultValue?: boolean; force?: boolean }>, ): FeaturesState { - const service = interpret(FeaturesMachine); - service.start(); - service.send({ + return featuresReducer(initialFeaturesState, { type: 'INIT', features: features.map((f) => ({ name: f.name, @@ -18,7 +18,6 @@ function createFeaturesState( force: f.force ?? false, })), }); - return service.getSnapshot(); } // Helper to set feature values in a state @@ -27,9 +26,7 @@ function setFeatureValue( name: string, value: boolean | undefined, ): FeaturesState { - const service = interpret(FeaturesMachine).start(state); - service.send({ type: 'SET', name, value }); - return service.getSnapshot(); + return featuresReducer(state, { type: 'SET', name, value }); } describe('testFeature', () => { @@ -144,9 +141,7 @@ describe('testFeature', () => { describe('forced values', () => { it('should prioritize forced value over non-forced value', () => { // Create state with force=true and value=true - const service1 = interpret(FeaturesMachine); - service1.start(); - service1.send({ + let state1 = featuresReducer(initialFeaturesState, { type: 'INIT', features: [ { @@ -157,7 +152,6 @@ describe('testFeature', () => { }, ], }); - let state1 = service1.getSnapshot(); state1 = setFeatureValue(state1, 'Feature1', true); // Create state with force=false and value=false @@ -173,9 +167,7 @@ describe('testFeature', () => { it('should use first forced value when multiple forced values exist', () => { // Create first state with force=true and value=true - const service1 = interpret(FeaturesMachine); - service1.start(); - service1.send({ + let state1 = featuresReducer(initialFeaturesState, { type: 'INIT', features: [ { @@ -186,13 +178,10 @@ describe('testFeature', () => { }, ], }); - let state1 = service1.getSnapshot(); state1 = setFeatureValue(state1, 'Feature1', true); // Create second state with force=true and value=false - const service2 = interpret(FeaturesMachine); - service2.start(); - service2.send({ + let state2 = featuresReducer(initialFeaturesState, { type: 'INIT', features: [ { @@ -203,7 +192,6 @@ describe('testFeature', () => { }, ], }); - let state2 = service2.getSnapshot(); state2 = setFeatureValue(state2, 'Feature1', false); // First forced value should win diff --git a/src/usePersist.spec.tsx b/src/usePersist.spec.tsx index c04ec24..4503edb 100644 --- a/src/usePersist.spec.tsx +++ b/src/usePersist.spec.tsx @@ -1,7 +1,11 @@ import { renderHook } from '@testing-library/react-hooks'; -import { interpret } from 'xstate'; + import type { FeatureDescription } from './FeatureState'; -import { FeaturesMachine, type FeaturesState } from './FeaturesState'; +import { + type FeaturesState, + featuresReducer, + initialFeaturesState, +} from './FeaturesState'; import usePersist, { KEY } from './usePersist'; class LocalStorageMock { @@ -35,11 +39,9 @@ class LocalStorageMock { } function createReadyState(features: FeatureDescription[]): FeaturesState { - const service = interpret(FeaturesMachine); - service.start(); // Simulate overrides state: initialize with defaultValue: undefined for all features // (this represents "no overrides set yet") - service.send({ + return featuresReducer(initialFeaturesState, { type: 'INIT', features: features.map((f) => ({ name: f.name, @@ -47,7 +49,6 @@ function createReadyState(features: FeatureDescription[]): FeaturesState { defaultValue: undefined, })), }); - return service.getSnapshot(); } function setFeatureInState( @@ -55,9 +56,7 @@ function setFeatureInState( name: string, value: boolean | undefined, ): FeaturesState { - const service = interpret(FeaturesMachine).start(state); - service.send({ type: 'SET', name, value }); - return service.getSnapshot(); + return featuresReducer(state, { type: 'SET', name, value }); } describe('usePersist', () => { @@ -150,9 +149,7 @@ describe('usePersist', () => { it('should not persist if state is not ready', () => { const storage = new LocalStorageMock(); - const service = interpret(FeaturesMachine); - service.start(); - const state = service.getSnapshot(); // idle state + const state = initialFeaturesState; // idle state renderHook(() => usePersist(storage, testFeatures, state)); diff --git a/src/usePersist.tsx b/src/usePersist.tsx index 5120019..4985968 100644 --- a/src/usePersist.tsx +++ b/src/usePersist.tsx @@ -11,7 +11,7 @@ export default function usePersist( ): void { const overrides = useMemo(() => { const newOverrides: { [key: string]: FeatureValue } = {}; - if (overrideState.matches('ready')) { + if (overrideState.value === 'ready') { for (const feature of features) { const [value] = valueOfFeature(overrideState, feature.name); if (value != null) { @@ -29,7 +29,7 @@ export default function usePersist( useEffect(() => { try { - if (storage != null && overrideState.matches('ready')) { + if (storage != null && overrideState.value === 'ready') { storage.setItem(KEY, strState); } } catch (e) {