@nlabs/arkhamjs 3.28.7 → 3.29.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +218 -1
- package/lib/Flux/Flux.d.ts +42 -0
- package/lib/Flux/Flux.js +5 -0
- package/lib/Flux/Flux.types.d.ts +47 -0
- package/lib/Flux/Flux.types.js +3 -0
- package/lib/constants/ArkhamConstants.d.ts +8 -0
- package/lib/constants/ArkhamConstants.js +4 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +4 -0
- package/package.json +37 -13
package/README.md
CHANGED
@@ -16,11 +16,20 @@
|
|
16
16
|
|
17
17
|
ArkhamJS is a lightweight framework that can accommodate a project of any size, small or large. From small start-up ideas to large enterprise projects. A simple, flexible framework. Consisting of a singular state tree with a unidirectional data flow.
|
18
18
|
|
19
|
+
### Universal Compatibility
|
20
|
+
|
21
|
+
ArkhamJS works seamlessly across all JavaScript environments:
|
22
|
+
|
23
|
+
- **React Web Applications** - Full React integration with hooks
|
24
|
+
- **React Native Applications** - Mobile state management with AsyncStorage
|
25
|
+
- **Node.js Applications** - Server-side state management
|
26
|
+
- **Vanilla JavaScript** - Works in any JavaScript environment
|
27
|
+
|
19
28
|
### Lightweight
|
20
29
|
|
21
30
|
The framework is small. The bulk of your app should lay within your code, not the framework. While larger frameworks come with lots of "magic", they become very limited when new features arise within your project.
|
22
31
|
|
23
|
-
###
|
32
|
+
### TypeScript
|
24
33
|
|
25
34
|
Compatible with typescript. Definitions are included to support your Typescript project.
|
26
35
|
|
@@ -46,6 +55,214 @@ If you plan to persist data, you will need to add a storage to the framework:
|
|
46
55
|
- React Native [@nlabs/arkhamjs-storage-native](https://github.com/nitrogenlabs/arkhamjs-storage-native)
|
47
56
|
- NodeJS [@nlabs/arkhamjs-storage-node](https://github.com/nitrogenlabs/arkhamjs-storage-node)
|
48
57
|
|
58
|
+
## Why Choose ArkhamJS?
|
59
|
+
|
60
|
+
### 🎯 **The Perfect Middle Ground**
|
61
|
+
|
62
|
+
ArkhamJS bridges the gap between **simplicity** and **power**. Unlike other state management solutions that force you to choose between ease-of-use and functionality, ArkhamJS delivers both.
|
63
|
+
|
64
|
+
### 📊 **Bundle Size Comparison**
|
65
|
+
|
66
|
+
| Library | Gzipped Size | Minified Size | Notes |
|
67
|
+
|---------|-------------|---------------|-------|
|
68
|
+
| **ArkhamJS** | **13.4 KB** | **40 KB** | Full-featured Flux implementation |
|
69
|
+
| Zustand | ~3.2 KB | ~8.5 KB | Minimal, no provider needed |
|
70
|
+
| Jotai | ~4.1 KB | ~11 KB | Atomic model, fine-grained |
|
71
|
+
| Redux Toolkit | ~14 KB | ~41 KB | Includes Redux core |
|
72
|
+
| MobX | ~7.5 KB | ~23 KB | Core only |
|
73
|
+
| Recoil | ~8.5 KB | ~25 KB | Facebook, atomic |
|
74
|
+
|
75
|
+
**ArkhamJS is competitively sized** while providing a complete Flux implementation with middleware support, devtools, and storage integration.
|
76
|
+
|
77
|
+
### 🏗️ **State Management Patterns**
|
78
|
+
|
79
|
+
| Pattern | ArkhamJS | Redux Toolkit | Zustand | Jotai | Valtio |
|
80
|
+
|---------|----------|---------------|---------|-------|--------|
|
81
|
+
| **Immutable Updates** | ✅ Full | ✅ Full | ✅ Partial | ✅ Full | ❌ Mutable |
|
82
|
+
| **Event-Driven** | ✅ Native | ❌ Actions | ❌ Direct | ❌ Atoms | ❌ Proxy |
|
83
|
+
| **Middleware Support** | ✅ Built-in | ✅ Extensive | ⚠️ Limited | ❌ No | ❌ No |
|
84
|
+
| **DevTools** | ✅ Plugin | ✅ Built-in | ✅ Basic | ❌ No | ❌ No |
|
85
|
+
| **Storage Integration** | ✅ Built-in | ❌ External | ✅ Plugin | ❌ No | ❌ No |
|
86
|
+
| **TypeScript** | ✅ First-class | ✅ Excellent | ✅ Good | ✅ Built-in | ✅ Good |
|
87
|
+
| **Multi-Platform** | ✅ Universal | ❌ Web-only | ❌ Web-only | ❌ Web-only | ❌ Web-only |
|
88
|
+
|
89
|
+
### 🚀 **Key Advantages**
|
90
|
+
|
91
|
+
#### **1. Event-Driven Architecture**
|
92
|
+
|
93
|
+
```typescript
|
94
|
+
// ArkhamJS: Natural event-driven updates
|
95
|
+
Flux.dispatch({ type: 'ADD_USER', user });
|
96
|
+
Flux.on('ADD_USER', (action: { type: string; user: User }) => {
|
97
|
+
// Reactive component updates
|
98
|
+
});
|
99
|
+
|
100
|
+
// vs. Redux: Action/reducer pattern
|
101
|
+
dispatch(addUser(user));
|
102
|
+
// Components must manually subscribe to state changes
|
103
|
+
```
|
104
|
+
|
105
|
+
**Why it matters:** Event-driven architecture makes your app more reactive and easier to debug. Components can listen to specific events rather than watching the entire state tree.
|
106
|
+
|
107
|
+
#### **2. Zero Boilerplate**
|
108
|
+
|
109
|
+
```typescript
|
110
|
+
// ArkhamJS: Simple and direct
|
111
|
+
Flux.setState('user.name', 'John');
|
112
|
+
const userName: string = Flux.getState('user.name');
|
113
|
+
|
114
|
+
// vs. Redux Toolkit: More setup required
|
115
|
+
const userSlice = createSlice({
|
116
|
+
name: 'user',
|
117
|
+
initialState: { name: '' },
|
118
|
+
reducers: { setName: (state, action) => { state.name = action.payload; } }
|
119
|
+
});
|
120
|
+
dispatch(setName('John'));
|
121
|
+
const userName = useSelector((state: RootState) => state.user.name);
|
122
|
+
```
|
123
|
+
|
124
|
+
**Why it matters:** Less code means faster development, fewer bugs, and easier maintenance.
|
125
|
+
|
126
|
+
#### **3. Built-in Middleware System**
|
127
|
+
|
128
|
+
```typescript
|
129
|
+
// ArkhamJS: Plug-and-play middleware
|
130
|
+
Flux.addMiddleware([loggerMiddleware, devToolsMiddleware]);
|
131
|
+
|
132
|
+
// vs. Other libraries: Manual integration or external packages
|
133
|
+
```
|
134
|
+
|
135
|
+
**Why it matters:** Middleware provides powerful extensibility for logging, debugging, persistence, and custom functionality without bloating your core bundle.
|
136
|
+
|
137
|
+
#### **4. Familiar Flux Pattern**
|
138
|
+
|
139
|
+
```typescript
|
140
|
+
// ArkhamJS: Familiar Flux architecture with TypeScript
|
141
|
+
interface UserState {
|
142
|
+
users: User[];
|
143
|
+
}
|
144
|
+
|
145
|
+
const UserStore = {
|
146
|
+
name: 'user',
|
147
|
+
action: (type: string, data: any, state: UserState): UserState => {
|
148
|
+
switch (type) {
|
149
|
+
case 'ADD_USER':
|
150
|
+
return { ...state, users: [...state.users, data] };
|
151
|
+
default:
|
152
|
+
return state;
|
153
|
+
}
|
154
|
+
}
|
155
|
+
};
|
156
|
+
```
|
157
|
+
|
158
|
+
**Why it matters:** Teams familiar with Redux/Flux can adopt ArkhamJS immediately without learning new patterns.
|
159
|
+
|
160
|
+
#### **5. Optimized Performance**
|
161
|
+
|
162
|
+
- **Tree-shaking enabled** for minimal bundle size
|
163
|
+
- **Selective re-renders** with state path subscriptions
|
164
|
+
- **Immutable updates** prevent unnecessary re-renders
|
165
|
+
- **Event-driven updates** only trigger relevant components
|
166
|
+
|
167
|
+
**Why it matters:** Better performance means faster apps and better user experience.
|
168
|
+
|
169
|
+
### 🎯 **When to Choose ArkhamJS**
|
170
|
+
|
171
|
+
#### **✅ Perfect for:**
|
172
|
+
|
173
|
+
- **Teams familiar with Flux/Redux** - Same patterns, simpler API
|
174
|
+
- **Applications needing event-driven architecture** - Built-in pub/sub
|
175
|
+
- **Projects requiring middleware** - Logging, devtools, persistence
|
176
|
+
- **Teams wanting TypeScript support** - First-class TypeScript
|
177
|
+
- **Applications with complex state interactions** - Centralized state management
|
178
|
+
- **Projects needing storage integration** - Built-in browser/Node/native support
|
179
|
+
- **Multi-platform applications** - Same code across React, React Native, Node.js
|
180
|
+
|
181
|
+
#### **❌ Consider alternatives for:**
|
182
|
+
|
183
|
+
- **Applications needing atomic state** - Consider Jotai/Recoil
|
184
|
+
- **Teams wanting mutable state** - Consider Valtio
|
185
|
+
- **Applications requiring state machines** - Consider XState
|
186
|
+
- **Projects needing minimal bundle size** - Consider Zustand
|
187
|
+
|
188
|
+
### 🔧 **Migration Benefits**
|
189
|
+
|
190
|
+
#### **From Redux:**
|
191
|
+
|
192
|
+
- **70% less boilerplate** code
|
193
|
+
- **Same familiar patterns** (actions, stores, middleware)
|
194
|
+
- **Better performance** with event-driven updates
|
195
|
+
- **Smaller bundle size** (13.4KB vs 14KB for Redux Toolkit)
|
196
|
+
|
197
|
+
#### **From Zustand:**
|
198
|
+
|
199
|
+
- **Built-in middleware support** (logging, devtools, persistence)
|
200
|
+
- **Event-driven architecture** for better reactivity
|
201
|
+
- **Familiar Flux patterns** for team consistency
|
202
|
+
- **Storage integration** out of the box
|
203
|
+
|
204
|
+
#### **From Context API:**
|
205
|
+
|
206
|
+
- **Better performance** with selective updates
|
207
|
+
- **Middleware support** for debugging and persistence
|
208
|
+
- **Predictable state management** with immutable updates
|
209
|
+
- **Event-driven architecture** for complex interactions
|
210
|
+
|
211
|
+
### 📈 **Performance Comparison**
|
212
|
+
|
213
|
+
| Metric | ArkhamJS | Redux Toolkit | Zustand | Jotai |
|
214
|
+
|--------|----------|---------------|---------|-------|
|
215
|
+
| **Bundle Size** | 13.4 KB | 14 KB | 3.2 KB | 4.1 KB |
|
216
|
+
| **Setup Complexity** | Low | Medium | Very Low | Low |
|
217
|
+
| **Learning Curve** | Low | Medium | Very Low | Medium |
|
218
|
+
| **Middleware Support** | Excellent | Excellent | Limited | None |
|
219
|
+
| **Event-Driven** | Native | Manual | Manual | Manual |
|
220
|
+
| **TypeScript Support** | Excellent | Excellent | Good | Excellent |
|
221
|
+
| **Multi-Platform** | Universal | Web-only | Web-only | Web-only |
|
222
|
+
|
223
|
+
### 🎉 **Getting Started**
|
224
|
+
|
225
|
+
```typescript
|
226
|
+
import { Flux } from '@nlabs/arkhamjs';
|
227
|
+
|
228
|
+
// Type-safe store definition
|
229
|
+
interface UserState {
|
230
|
+
users: User[];
|
231
|
+
}
|
232
|
+
|
233
|
+
const UserStore = {
|
234
|
+
name: 'user',
|
235
|
+
action: (type: string, data: any, state: UserState): UserState => {
|
236
|
+
switch (type) {
|
237
|
+
case 'ADD_USER':
|
238
|
+
return { ...state, users: [...state.users, data] };
|
239
|
+
default:
|
240
|
+
return state;
|
241
|
+
}
|
242
|
+
}
|
243
|
+
};
|
244
|
+
|
245
|
+
// Simple setup
|
246
|
+
Flux.init({
|
247
|
+
name: 'my-app',
|
248
|
+
stores: [UserStore],
|
249
|
+
middleware: [loggerMiddleware]
|
250
|
+
});
|
251
|
+
|
252
|
+
// Dispatch actions
|
253
|
+
Flux.dispatch({ type: 'ADD_USER', user: { name: 'John' } });
|
254
|
+
|
255
|
+
// Listen to events
|
256
|
+
Flux.on('ADD_USER', (action: { type: string; user: User }) => {
|
257
|
+
console.log('User added:', action.user);
|
258
|
+
});
|
259
|
+
|
260
|
+
// Get state
|
261
|
+
const userName: string = Flux.getState('user.name');
|
262
|
+
```
|
263
|
+
|
264
|
+
**Start building with ArkhamJS today and experience the perfect balance of simplicity and power!** 🚀
|
265
|
+
|
49
266
|
## Installation
|
50
267
|
|
51
268
|
Using [npm](https://www.npmjs.com/):
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { EventEmitter } from 'events';
|
2
|
+
import { FluxAction, FluxMiddlewareType, FluxOptions, FluxStore } from './Flux.types';
|
3
|
+
export declare class FluxFramework extends EventEmitter {
|
4
|
+
static initFlux: boolean;
|
5
|
+
isInit: boolean;
|
6
|
+
readonly pluginTypes: readonly string[];
|
7
|
+
private state;
|
8
|
+
private storeActions;
|
9
|
+
private readonly defaultOptions;
|
10
|
+
private middleware;
|
11
|
+
private options;
|
12
|
+
private stateCache;
|
13
|
+
private updateStorage;
|
14
|
+
private stateChanged;
|
15
|
+
constructor();
|
16
|
+
addMiddleware(middleware: FluxMiddlewareType[]): void;
|
17
|
+
clearAppData(): Promise<boolean>;
|
18
|
+
clearMiddleware(): boolean;
|
19
|
+
removeStores(storeNames: string[]): void;
|
20
|
+
dispatch(action: FluxAction, silent?: boolean): Promise<FluxAction>;
|
21
|
+
getOptions(): FluxOptions;
|
22
|
+
getState(path?: string | string[], defaultValue?: any): any;
|
23
|
+
getStore(name?: string): FluxStore | undefined;
|
24
|
+
init(options?: FluxOptions, reset?: boolean): Promise<FluxFramework>;
|
25
|
+
onInit(listener: (...args: any[]) => void): void;
|
26
|
+
offInit(listener: (...args: any[]) => void): void;
|
27
|
+
off(eventType: string, listener: (...args: any[]) => void): this;
|
28
|
+
on(eventType: string, listener: (...args: any[]) => void): this;
|
29
|
+
addStores(stores: FluxStore[]): Promise<FluxStore[]>;
|
30
|
+
removeMiddleware(names: string[]): void;
|
31
|
+
reset(clearStorage?: boolean): Promise<void>;
|
32
|
+
setState(path: string | string[], value: any): Promise<boolean>;
|
33
|
+
private processMiddleware;
|
34
|
+
private updateStoresState;
|
35
|
+
private getCachedStack;
|
36
|
+
private addPlugin;
|
37
|
+
private deregister;
|
38
|
+
private register;
|
39
|
+
private removePlugin;
|
40
|
+
private useStorage;
|
41
|
+
}
|
42
|
+
export declare const Flux: FluxFramework;
|
package/lib/Flux/Flux.js
ADDED
@@ -0,0 +1,5 @@
|
|
1
|
+
/* ArkhamJS - Optimized Build */
|
2
|
+
var y=Object.defineProperty;var S=(c,h,t)=>h in c?y(c,h,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[h]=t;var o=(c,h,t)=>S(c,typeof h!="symbol"?h+"":h,t);import{isEmpty as x}from"@nlabs/utils/checks/isEmpty";import{cloneDeep as l}from"@nlabs/utils/objects/clone";import{debounceCompact as v}from"@nlabs/utils/objects/debounce-compact";import{get as F}from"@nlabs/utils/objects/get";import{merge as A}from"@nlabs/utils/objects/merge";import{set as b}from"@nlabs/utils/objects/set";import{parseStack as E}from"@nlabs/utils/objects/stack-parser";import{EventEmitter as P}from"events";import{ArkhamConstants as g}from"../constants/ArkhamConstants";const u=new Map,T=100;class m extends P{constructor(){super();o(this,"isInit",!1);o(this,"pluginTypes",["preDispatch","postDispatch"]);o(this,"state",{});o(this,"storeActions",{});o(this,"defaultOptions",{name:"arkhamjs",routerType:"browser",scrollToTop:!0,state:null,storage:null,storageWait:300,stores:[],title:"ArkhamJS"});o(this,"middleware",{});o(this,"options",this.defaultOptions);o(this,"stateCache",new Map);o(this,"updateStorage",()=>Promise.resolve(!1));o(this,"stateChanged",!1);this.addMiddleware=this.addMiddleware.bind(this),this.addStores=this.addStores.bind(this),this.clearAppData=this.clearAppData.bind(this),this.clearMiddleware=this.clearMiddleware.bind(this),this.deregister=this.deregister.bind(this),this.dispatch=this.dispatch.bind(this),this.getOptions=this.getOptions.bind(this),this.getState=this.getState.bind(this),this.getStore=this.getStore.bind(this),this.init=this.init.bind(this),this.off=this.off.bind(this),this.register=this.register.bind(this),this.removeMiddleware=this.removeMiddleware.bind(this),this.removeStores=this.removeStores.bind(this),this.reset=this.reset.bind(this),this.setState=this.setState.bind(this),this.pluginTypes.forEach(t=>this.middleware[`${t}List`]=[])}addMiddleware(t){t.forEach(e=>{if(!e||typeof e!="function"&&typeof e!="object")throw Error("Unknown middleware is not configured properly. Cannot add to Flux.");const s=e.name||"";if(!s)throw Error("Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.");this.middleware.preDispatchList?.find(r=>r.name===s)||this.middleware.postDispatchList?.find(r=>r.name===s)||this.pluginTypes.forEach(r=>{const a=e[r];if(a){const n={method:a,name:s};this.middleware[`${r}List`]=this.addPlugin(r,n)}})})}clearAppData(){Object.keys(this.storeActions).forEach(s=>{const i=this.storeActions[s];this.state[i.name]=i.initialState}),this.stateCache.clear(),this.stateChanged=!0;const{name:t,storage:e}=this.options;return e?.setStorageData?e.setStorageData(t,this.state):Promise.resolve(!0)}clearMiddleware(){return Object.keys(this.middleware).forEach(t=>{this.middleware[t]=[]}),!0}removeStores(t){t.forEach(e=>this.deregister(e))}async dispatch(t,e=!1){if(!t)throw new Error("ArkhamJS Error: Flux.dispatch requires an action.");const s=Date.now();let i=l(t),r=[];this.options.debug&&(r=this.getCachedStack());const a={duration:0,options:this.options,stack:r},{postDispatchList:n=[],preDispatchList:p=[]}=this.middleware;p.length&&(i=await this.processMiddleware(p,i,a));const{type:d,...f}=i;if(!d||d==="")return Promise.resolve(i);if(this.updateStoresState(d,f),this.stateChanged&&this.options.storage&&this.updateStorage)try{await this.updateStorage(),this.stateChanged=!1}catch{}const w=Date.now()-s;return a.duration=w,n.length&&(i=await this.processMiddleware(n,i,a)),e||(this.emit(d,i),this.emit("arkhamjs",this.state)),Promise.resolve(i)}getOptions(){return this.options}getState(t="",e){const s=Array.isArray(t)?t.join("."):t;if(this.stateCache.has(s))return this.stateCache.get(s);let i;t?i=F(this.state,t):i=this.state||{};const r=i&&l(i),a=r===void 0?e:r;return this.stateCache.set(s,a),a}getStore(t=""){return this.storeActions[t]}async init(t={},e=!1){e&&(this.isInit=!1,await this.reset(!1));const s={...t};this.isInit&&(s.name=this.options.name),this.options={...this.defaultOptions,...s};const{debug:i,middleware:r,name:a,stores:n}=this.options;try{await this.useStorage(a)}catch(d){throw d}if(n?.length)try{await this.addStores(n)}catch(d){throw d}r?.length&&this.addMiddleware(r);const p="arkhamjs";return i?window[p]=this:delete window[p],this.isInit=!0,this.emit(g.INIT),this}onInit(t){this.on(g.INIT,t),this.isInit&&t()}offInit(t){this.off(g.INIT,t)}off(t,e){return this.removeListener(t,e)}on(t,e){return this.addListener(t,e)}async addStores(t){const e=t.map(r=>this.register(r)),{name:s,storage:i}=this.options;if(i?.setStorageData)try{await i.setStorageData(s,this.state)}catch(r){throw r}return e}removeMiddleware(t){t.forEach(e=>{this.pluginTypes.forEach(s=>{this.middleware[`${s}List`]=this.removePlugin(s,e)})})}async reset(t=!0){const{name:e,storage:s}=this.options;if(s&&t)try{await s.setStorageData(e,{})}catch(i){throw i}this.middleware={},this.options={...this.defaultOptions},this.state={},this.storeActions={},this.stateCache.clear(),this.stateChanged=!1,this.isInit=!1,this.pluginTypes.forEach(i=>this.middleware[`${i}List`]=[])}setState(t="",e){if(t){this.state=b(t,l(e),this.state),this.stateChanged=!0;const s=Array.isArray(t)?t.join("."):t;this.stateCache.delete(s)}return this.options.storage&&this.updateStorage?this.updateStorage():Promise.resolve(!1)}async processMiddleware(t,e,s){return Promise.all(t.map(i=>i.method(l(e),l(this.state),s))).then(i=>i.reduce((r,a)=>A(r,a),e)).catch(i=>{throw i})}updateStoresState(t,e){Object.keys(this.storeActions).forEach(s=>{const i=this.storeActions[s],r=this.state[s]||i.initialState||{},a=i.action(t,e,r);a!==r&&(this.state[s]=l(a)||r,this.stateChanged=!0)})}getCachedStack(){const t=new Error().stack?.split(`
|
3
|
+
`)[2]||"";if(u.has(t))return u.get(t);let e=[];try{const s="stackTraceLimit",{stackTraceLimit:i}=Error;if(Error[s]=1/0,e=E(new Error),Error[s]=i,u.size>=T){const r=u.keys().next().value;u.delete(r)}u.set(t,e)}catch{}return e}addPlugin(t,e){const s=this.middleware[`${t}List`]||[],{method:i,name:r}=e;if(i&&typeof i=="function")s.some(n=>n.name===r)||s.push({method:i,name:r});else if(i!==void 0)throw Error(`${e.name} middleware is not configured properly. Method is not a function.`);return s}deregister(t=""){delete this.storeActions[t],delete this.state[t],this.stateCache.clear()}register(t){if(!t)throw Error("Store is undefined. Cannot register with Flux.");if(typeof t!="function")throw Error(`${t} is not a store function. Cannot register with Flux.`);const{name:e}=t,s=t(),i={action:t,initialState:s,name:e};return!x(e)&&!this.storeActions[e]&&(this.storeActions[e]=i,this.state[e]||(this.state[e]=s?l(s):{})),this.storeActions[e]}removePlugin(t,e){return(this.middleware[`${t}List`]||[]).filter(i=>i.name!==e)}async useStorage(t){const{storage:e,state:s,storageWait:i}=this.options;if(e)try{this.state=s||await e.getStorageData(t)||{},this.updateStorage=v(()=>e.setStorageData(t,this.state),i)}catch(r){throw r}else this.state=s||{}}}o(m,"initFlux",!1);const R=new m;export{R as Flux,m as FluxFramework};
|
4
|
+
/* End ArkhamJS */
|
5
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7aXNFbXB0eX0gZnJvbSAnQG5sYWJzL3V0aWxzL2NoZWNrcy9pc0VtcHR5JztcbmltcG9ydCB7Y2xvbmVEZWVwfSBmcm9tICdAbmxhYnMvdXRpbHMvb2JqZWN0cy9jbG9uZSc7XG5pbXBvcnQge2RlYm91bmNlQ29tcGFjdH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvZGVib3VuY2UtY29tcGFjdCc7XG5pbXBvcnQge2dldH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvZ2V0JztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJ0BubGFicy91dGlscy9vYmplY3RzL21lcmdlJztcbmltcG9ydCB7c2V0fSBmcm9tICdAbmxhYnMvdXRpbHMvb2JqZWN0cy9zZXQnO1xuaW1wb3J0IHtwYXJzZVN0YWNrfSBmcm9tICdAbmxhYnMvdXRpbHMvb2JqZWN0cy9zdGFjay1wYXJzZXInO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ2V2ZW50cyc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcbmltcG9ydCB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuY29uc3QgU1RBQ0tfQ0FDSEUgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG5jb25zdCBTVEFDS19DQUNIRV9TSVpFID0gMTAwO1xuXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByZWFkb25seSBwbHVnaW5UeXBlczogcmVhZG9ubHkgc3RyaW5nW10gPSBbJ3ByZURpc3BhdGNoJywgJ3Bvc3REaXNwYXRjaCddIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgc3RhdGU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgcHJpdmF0ZSBzdG9yZUFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEZsdXhTdG9yZT4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0T3B0aW9uczogRmx1eE9wdGlvbnMgPSB7XG4gICAgbmFtZTogJ2Fya2hhbWpzJyxcbiAgICByb3V0ZXJUeXBlOiAnYnJvd3NlcicsXG4gICAgc2Nyb2xsVG9Ub3A6IHRydWUsXG4gICAgc3RhdGU6IG51bGwsXG4gICAgc3RvcmFnZTogbnVsbCxcbiAgICBzdG9yYWdlV2FpdDogMzAwLFxuICAgIHN0b3JlczogW10sXG4gICAgdGl0bGU6ICdBcmtoYW1KUydcbiAgfTtcbiAgcHJpdmF0ZSBtaWRkbGV3YXJlOiBSZWNvcmQ8c3RyaW5nLCBGbHV4UGx1Z2luVHlwZVtdPiA9IHt9O1xuICBwcml2YXRlIG9wdGlvbnM6IEZsdXhPcHRpb25zID0gdGhpcy5kZWZhdWx0T3B0aW9ucztcblxuICBwcml2YXRlIHN0YXRlQ2FjaGU6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yYWdlOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+ID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblxuICBwcml2YXRlIHN0YXRlQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBCaW5kIG1ldGhvZHMgb25jZSBpbiBjb25zdHJ1Y3RvciBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgdGhpcy5hZGRNaWRkbGV3YXJlID0gdGhpcy5hZGRNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRTdG9yZXMgPSB0aGlzLmFkZFN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2xlYXJBcHBEYXRhID0gdGhpcy5jbGVhckFwcERhdGEuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyTWlkZGxld2FyZSA9IHRoaXMuY2xlYXJNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kZXJlZ2lzdGVyID0gdGhpcy5kZXJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0YXRlID0gdGhpcy5nZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0U3RvcmUgPSB0aGlzLmdldFN0b3JlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pbml0ID0gdGhpcy5pbml0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5vZmYgPSB0aGlzLm9mZi5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXIgPSB0aGlzLnJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVNaWRkbGV3YXJlID0gdGhpcy5yZW1vdmVNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVTdG9yZXMgPSB0aGlzLnJlbW92ZVN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVzZXQgPSB0aGlzLnJlc2V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRTdGF0ZSA9IHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKTtcblxuICAgIC8vIEluaXRpYWxpemUgbWlkZGxld2FyZSBsaXN0c1xuICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG1pZGRsZXdhcmUgdG8gZnJhbWV3b3JrIHdpdGggZHVwbGljYXRlIHByZXZlbnRpb25cbiAgICovXG4gIGFkZE1pZGRsZXdhcmUobWlkZGxld2FyZTogRmx1eE1pZGRsZXdhcmVUeXBlW10pOiB2b2lkIHtcbiAgICBtaWRkbGV3YXJlLmZvckVhY2goKG1pZGRsZU9iajogRmx1eE1pZGRsZXdhcmVUeXBlKSA9PiB7XG4gICAgICBpZiAoIW1pZGRsZU9iaiB8fCAodHlwZW9mIG1pZGRsZU9iaiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWlkZGxlT2JqICE9PSAnb2JqZWN0JykpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gbWlkZGxld2FyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gQ2Fubm90IGFkZCB0byBGbHV4LicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtaWRkbGVOYW1lOiBzdHJpbmcgPSBtaWRkbGVPYmoubmFtZSB8fCAnJztcbiAgICAgIGlmICghbWlkZGxlTmFtZSkge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBleGlzdGluZyBtaWRkbGV3YXJlIHRvIHByZXZlbnQgZHVwbGljYXRlc1xuICAgICAgY29uc3QgZXhpc3RpbmdNaWRkbGV3YXJlID0gdGhpcy5taWRkbGV3YXJlLnByZURpc3BhdGNoTGlzdD8uZmluZChtID0+IG0ubmFtZSA9PT0gbWlkZGxlTmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taWRkbGV3YXJlLnBvc3REaXNwYXRjaExpc3Q/LmZpbmQobSA9PiBtLm5hbWUgPT09IG1pZGRsZU5hbWUpO1xuXG4gICAgICBpZiAoZXhpc3RpbmdNaWRkbGV3YXJlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgTWlkZGxld2FyZSBcIiR7bWlkZGxlTmFtZX1cIiBhbHJlYWR5IGV4aXN0cy4gU2tpcHBpbmcgZHVwbGljYXRlLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlXTtcbiAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgIGNvbnN0IHBsdWdpbjogRmx1eFBsdWdpblR5cGUgPSB7bWV0aG9kLCBuYW1lOiBtaWRkbGVOYW1lfTtcbiAgICAgICAgICB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSB0aGlzLmFkZFBsdWdpbih0eXBlLCBwbHVnaW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGFwcCBkYXRhIGZyb20gc3RvcmFnZSB3aXRoIG9wdGltaXplZCBzdGF0ZSByZXNldFxuICAgKi9cbiAgY2xlYXJBcHBEYXRhKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFJlc2V0IHN0YXRlIHRvIGluaXRpYWwgdmFsdWVzIHdpdGhvdXQgY2xvbmluZ1xuICAgIE9iamVjdC5rZXlzKHRoaXMuc3RvcmVBY3Rpb25zKS5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICB0aGlzLnN0YXRlW3N0b3JlRm4ubmFtZV0gPSBzdG9yZUZuLmluaXRpYWxTdGF0ZTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIHN0YXRlIGNhY2hlXG4gICAgdGhpcy5zdGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSB0cnVlO1xuXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuICAgIGlmIChzdG9yYWdlPy5zZXRTdG9yYWdlRGF0YSkge1xuICAgICAgcmV0dXJuIHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIG1pZGRsZXdhcmUgd2l0aCBwcm9wZXIgY2xlYW51cFxuICAgKi9cbiAgY2xlYXJNaWRkbGV3YXJlKCk6IGJvb2xlYW4ge1xuICAgIE9iamVjdC5rZXlzKHRoaXMubWlkZGxld2FyZSkuZm9yRWFjaCgocGx1Z2luVHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLm1pZGRsZXdhcmVbcGx1Z2luVHlwZV0gPSBbXTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZS1yZWdpc3RlcnMgbmFtZWQgc3RvcmVzIHdpdGggY2xlYW51cFxuICAgKi9cbiAgcmVtb3ZlU3RvcmVzKHN0b3JlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgc3RvcmVOYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuZGVyZWdpc3RlcihuYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW1pemVkIGRpc3BhdGNoIG1ldGhvZCB3aXRoIHJlZHVjZWQgY2xvbmluZyBhbmQgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAqL1xuICBhc3luYyBkaXNwYXRjaChhY3Rpb246IEZsdXhBY3Rpb24sIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiB7XG4gICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJraGFtSlMgRXJyb3I6IEZsdXguZGlzcGF0Y2ggcmVxdWlyZXMgYW4gYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogT25seSBjbG9uZSBhY3Rpb24gb25jZVxuICAgIGxldCBjbG9uZWRBY3Rpb246IEZsdXhBY3Rpb24gPSBjbG9uZURlZXAoYWN0aW9uKTtcblxuICAgIC8vIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogT25seSBnZXQgc3RhY2sgdHJhY2UgaW4gZGVidWcgbW9kZVxuICAgIGxldCBzdGFjazogYW55W10gPSBbXTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICBzdGFjayA9IHRoaXMuZ2V0Q2FjaGVkU3RhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJbmZvID0ge1xuICAgICAgZHVyYXRpb246IDAsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICBzdGFja1xuICAgIH07XG5cbiAgICAvLyBBcHBseSBwcmUtZGlzcGF0Y2ggbWlkZGxld2FyZSB3aXRoIG9wdGltaXplZCBjbG9uaW5nXG4gICAgY29uc3Qge3Bvc3REaXNwYXRjaExpc3QgPSBbXSwgcHJlRGlzcGF0Y2hMaXN0ID0gW119ID0gdGhpcy5taWRkbGV3YXJlO1xuXG4gICAgaWYgKHByZURpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IHRoaXMucHJvY2Vzc01pZGRsZXdhcmUocHJlRGlzcGF0Y2hMaXN0LCBjbG9uZWRBY3Rpb24sIGFwcEluZm8pO1xuICAgIH1cblxuICAgIGNvbnN0IHt0eXBlLCAuLi5kYXRhfSA9IGNsb25lZEFjdGlvbjtcblxuICAgIGlmICghdHlwZSB8fCB0eXBlID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKCdBcmtoYW1KUyBXYXJuaW5nOiBGbHV4LmRpc3BhdGNoIGlzIG1pc3NpbmcgYW4gYWN0aW9uIHR5cGUgZm9yIHRoZSBwYXlsb2FkOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIE9wdGltaXplZCBzdGF0ZSB1cGRhdGVzIC0gb25seSBjbG9uZSB3aGVuIG5lY2Vzc2FyeVxuICAgIHRoaXMudXBkYXRlU3RvcmVzU3RhdGUodHlwZSwgZGF0YSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHN0b3JhZ2Ugb25seSBpZiBzdGF0ZSBjaGFuZ2VkXG4gICAgaWYgKHRoaXMuc3RhdGVDaGFuZ2VkICYmIHRoaXMub3B0aW9ucy5zdG9yYWdlICYmIHRoaXMudXBkYXRlU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTdG9yYWdlIHVwZGF0ZSBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uOiBudW1iZXIgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgIGFwcEluZm8uZHVyYXRpb24gPSBkdXJhdGlvbjtcblxuICAgIC8vIEFwcGx5IHBvc3QtZGlzcGF0Y2ggbWlkZGxld2FyZVxuICAgIGlmIChwb3N0RGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgdGhpcy5wcm9jZXNzTWlkZGxld2FyZShwb3N0RGlzcGF0Y2hMaXN0LCBjbG9uZWRBY3Rpb24sIGFwcEluZm8pO1xuICAgIH1cblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmVtaXQodHlwZSwgY2xvbmVkQWN0aW9uKTtcbiAgICAgIHRoaXMuZW1pdCgnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZsdXggb3B0aW9uc1xuICAgKi9cbiAgZ2V0T3B0aW9ucygpOiBGbHV4T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpbWl6ZWQgZ2V0U3RhdGUgd2l0aCBjYWNoaW5nXG4gICAqL1xuICBnZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHBhdGhLZXkgPSBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aC5qb2luKCcuJykgOiBwYXRoO1xuXG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBpZiAodGhpcy5zdGF0ZUNhY2hlLmhhcyhwYXRoS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGVDYWNoZS5nZXQocGF0aEtleSk7XG4gICAgfVxuXG4gICAgbGV0IHN0b3JlVmFsdWU6IGFueTtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHN0b3JlVmFsdWUgPSB0aGlzLnN0YXRlIHx8IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZVZhbHVlID0gZ2V0KHRoaXMuc3RhdGUsIHBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gc3RvcmVWYWx1ZSA/IGNsb25lRGVlcChzdG9yZVZhbHVlKSA6IHN0b3JlVmFsdWU7XG4gICAgY29uc3QgcmVzdWx0ID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQocGF0aEtleSwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RvcmUgb2JqZWN0IHJlZ2lzdGVyZWQgd2l0aCBGbHV4XG4gICAqL1xuICBnZXRTdG9yZShuYW1lOiBzdHJpbmcgPSAnJyk6IEZsdXhTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW5kIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2l0aCB2YWxpZGF0aW9uXG4gICAqL1xuICBhc3luYyBpbml0KG9wdGlvbnM6IEZsdXhPcHRpb25zID0ge30sIHJlc2V0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhGcmFtZXdvcms+IHtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHsuLi5vcHRpb25zfTtcbiAgICBpZiAodGhpcy5pc0luaXQpIHtcbiAgICAgIHVwZGF0ZWRPcHRpb25zLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4udXBkYXRlZE9wdGlvbnN9O1xuICAgIGNvbnN0IHtkZWJ1ZywgbWlkZGxld2FyZSwgbmFtZSwgc3RvcmVzfSA9IHRoaXMub3B0aW9ucztcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVzZVN0b3JhZ2UobmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Fya2hhbSBFcnJvcjogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHVzaW5nIHN0b3JhZ2UuJywgbmFtZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmVzPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkU3RvcmVzKHN0b3Jlcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBhZGRpbmcgc3RvcmVzLicsIHN0b3Jlcyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtaWRkbGV3YXJlPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dQcm9wZXJ0eTogc3RyaW5nID0gJ2Fya2hhbWpzJztcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KVt3aW5kb3dQcm9wZXJ0eV0gPSB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgKHdpbmRvdyBhcyBhbnkpW3dpbmRvd1Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KEFya2hhbUNvbnN0YW50cy5JTklUKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW5pdGlhbGl6YXRpb24gbGlzdGVuZXIgd2l0aCBpbW1lZGlhdGUgZXhlY3V0aW9uIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICovXG4gIG9uSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0KSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpbml0aWFsaXphdGlvbiBsaXN0ZW5lclxuICAgKi9cbiAgb2ZmSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vZmYoQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqL1xuICBvZmYoZXZlbnRUeXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqL1xuICBvbihldmVudFR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBuZXcgU3RvcmVzIHdpdGggdmFsaWRhdGlvblxuICAgKi9cbiAgYXN5bmMgYWRkU3RvcmVzKHN0b3JlczogRmx1eFN0b3JlW10pOiBQcm9taXNlPEZsdXhTdG9yZVtdPiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZFN0b3JlczogRmx1eFN0b3JlW10gPSBzdG9yZXMubWFwKChzdG9yZTogRmx1eFN0b3JlKSA9PiB0aGlzLnJlZ2lzdGVyKHN0b3JlKSk7XG5cbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHN0b3JhZ2U/LnNldFN0b3JhZ2VEYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1pZGRsZXdhcmUgZnJvbSBmcmFtZXdvcmtcbiAgICovXG4gIHJlbW92ZU1pZGRsZXdhcmUobmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgbmFtZXMuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSB0aGlzLnJlbW92ZVBsdWdpbih0eXBlLCBuYW1lKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGZyYW1ld29yayB3aXRoIHByb3BlciBjbGVhbnVwXG4gICAqL1xuICBhc3luYyByZXNldChjbGVhclN0b3JhZ2U6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKHN0b3JhZ2UgJiYgY2xlYXJTdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHt9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIGFsbCBwcm9wZXJ0aWVzIGFuZCBjYWNoZXNcbiAgICB0aGlzLm1pZGRsZXdhcmUgPSB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9uc307XG4gICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgIHRoaXMuc3RvcmVBY3Rpb25zID0ge307XG4gICAgdGhpcy5zdGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuXG4gICAgLy8gUmVpbml0aWFsaXplIG1pZGRsZXdhcmUgbGlzdHNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGltaXplZCBzZXRTdGF0ZSB3aXRoIGNoYW5nZSB0cmFja2luZ1xuICAgKi9cbiAgc2V0U3RhdGUocGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSAnJywgdmFsdWU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChwYXRoKSB7XG4gICAgICB0aGlzLnN0YXRlID0gc2V0KHBhdGgsIGNsb25lRGVlcCh2YWx1ZSksIHRoaXMuc3RhdGUpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAvLyBDbGVhciByZWxldmFudCBjYWNoZSBlbnRyaWVzXG4gICAgICBjb25zdCBwYXRoS2V5ID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGguam9pbignLicpIDogcGF0aDtcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5kZWxldGUocGF0aEtleSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdG9yYWdlICYmIHRoaXMudXBkYXRlU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU3RvcmFnZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzIG1pZGRsZXdhcmUgd2l0aCBvcHRpbWl6ZWQgY2xvbmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWlkZGxld2FyZShcbiAgICBtaWRkbGV3YXJlTGlzdDogRmx1eFBsdWdpblR5cGVbXSxcbiAgICBhY3Rpb246IEZsdXhBY3Rpb24sXG4gICAgYXBwSW5mbzogYW55XG4gICk6IFByb21pc2U8Rmx1eEFjdGlvbj4ge1xuICAgIHJldHVybiBQcm9taXNlXG4gICAgICAuYWxsKFxuICAgICAgICBtaWRkbGV3YXJlTGlzdC5tYXAoKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+XG4gICAgICAgICAgcGx1Z2luLm1ldGhvZChjbG9uZURlZXAoYWN0aW9uKSwgY2xvbmVEZWVwKHRoaXMuc3RhdGUpLCBhcHBJbmZvKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAudGhlbihcbiAgICAgICAgKGFjdGlvbnMpID0+IGFjdGlvbnMucmVkdWNlKCh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pID0+XG4gICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgYWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHN0b3JlcyBzdGF0ZSB3aXRoIG9wdGltaXplZCBjbG9uaW5nXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVN0b3Jlc1N0YXRlKHR5cGU6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModGhpcy5zdG9yZUFjdGlvbnMpLmZvckVhY2goKHN0b3JlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuc3RhdGVbc3RvcmVOYW1lXSB8fCBzdG9yZUZuLmluaXRpYWxTdGF0ZSB8fCB7fTtcblxuICAgICAgLy8gT25seSBjbG9uZSBpZiB0aGUgc3RhdGUgYWN0dWFsbHkgY2hhbmdlc1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSBzdG9yZUZuLmFjdGlvbih0eXBlLCBkYXRhLCBjdXJyZW50U3RhdGUpO1xuICAgICAgaWYgKG5ld1N0YXRlICE9PSBjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVtzdG9yZU5hbWVdID0gY2xvbmVEZWVwKG5ld1N0YXRlKSB8fCBjdXJyZW50U3RhdGU7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGVkIHN0YWNrIHRyYWNlIGZvciBwZXJmb3JtYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDYWNoZWRTdGFjaygpOiBhbnlbXSB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBuZXcgRXJyb3IoKS5zdGFjaz8uc3BsaXQoJ1xcbicpWzJdIHx8ICcnO1xuXG4gICAgaWYgKFNUQUNLX0NBQ0hFLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiBTVEFDS19DQUNIRS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICBsZXQgc3RhY2s6IGFueVtdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWNrUHJvcGVydHk6IHN0cmluZyA9ICdzdGFja1RyYWNlTGltaXQnO1xuICAgICAgY29uc3Qge3N0YWNrVHJhY2VMaW1pdH06IGFueSA9IEVycm9yO1xuICAgICAgRXJyb3Jbc3RhY2tQcm9wZXJ0eV0gPSBJbmZpbml0eTtcbiAgICAgIHN0YWNrID0gcGFyc2VTdGFjayhuZXcgRXJyb3IoKSk7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IHN0YWNrVHJhY2VMaW1pdDtcblxuICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgICAgaWYgKFNUQUNLX0NBQ0hFLnNpemUgPj0gU1RBQ0tfQ0FDSEVfU0laRSkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IFNUQUNLX0NBQ0hFLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIFNUQUNLX0NBQ0hFLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgICB9XG4gICAgICBTVEFDS19DQUNIRS5zZXQoY2FjaGVLZXksIHN0YWNrKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZW1wdHkgc3RhY2tcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH1cblxuICBwcml2YXRlIGFkZFBsdWdpbih0eXBlOiBzdHJpbmcsIHBsdWdpbjogRmx1eFBsdWdpblR5cGUpOiBGbHV4UGx1Z2luVHlwZVtdIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdIHx8IFtdO1xuICAgIGNvbnN0IHttZXRob2QsIG5hbWV9ID0gcGx1Z2luO1xuXG4gICAgaWYgKG1ldGhvZCAmJiB0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBleGlzdHM6IGJvb2xlYW4gPSBsaXN0LnNvbWUoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGxpc3QucHVzaCh7bWV0aG9kLCBuYW1lfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYCR7cGx1Z2luLm5hbWV9IG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIE1ldGhvZCBpcyBub3QgYSBmdW5jdGlvbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgZGVyZWdpc3RlcihuYW1lOiBzdHJpbmcgPSAnJyk6IHZvaWQge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgICBkZWxldGUgdGhpcy5zdGF0ZVtuYW1lXTtcbiAgICB0aGlzLnN0YXRlQ2FjaGUuY2xlYXIoKTsgLy8gQ2xlYXIgY2FjaGUgd2hlbiBzdG9yZXMgY2hhbmdlXG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyKHN0b3JlRm46IGFueSk6IEZsdXhTdG9yZSB7XG4gICAgaWYgKCFzdG9yZUZuKSB7XG4gICAgICB0aHJvdyBFcnJvcignU3RvcmUgaXMgdW5kZWZpbmVkLiBDYW5ub3QgcmVnaXN0ZXIgd2l0aCBGbHV4LicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc3RvcmVGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgRXJyb3IoYCR7c3RvcmVGbn0gaXMgbm90IGEgc3RvcmUgZnVuY3Rpb24uIENhbm5vdCByZWdpc3RlciB3aXRoIEZsdXguYCk7XG4gICAgfVxuXG4gICAgY29uc3Qge25hbWV9ID0gc3RvcmVGbjtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IGFueSA9IHN0b3JlRm4oKTtcbiAgICBjb25zdCBzdG9yZUFjdGlvbjogRmx1eFN0b3JlID0ge1xuICAgICAgYWN0aW9uOiBzdG9yZUZuLFxuICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgbmFtZVxuICAgIH07XG5cbiAgICBpZiAoIWlzRW1wdHkobmFtZSkgJiYgIXRoaXMuc3RvcmVBY3Rpb25zW25hbWVdKSB7XG4gICAgICB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSA9IHN0b3JlQWN0aW9uO1xuXG4gICAgICBpZiAoIXRoaXMuc3RhdGVbbmFtZV0pIHtcbiAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IGluaXRpYWxTdGF0ZSA/IGNsb25lRGVlcChpbml0aWFsU3RhdGUpIDoge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQbHVnaW4odHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBGbHV4UGx1Z2luVHlwZVtdIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdIHx8IFtdO1xuICAgIHJldHVybiBsaXN0LmZpbHRlcigob2JqOiBGbHV4UGx1Z2luVHlwZSkgPT4gb2JqLm5hbWUgIT09IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1c2VTdG9yYWdlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtzdG9yYWdlLCBzdGF0ZSwgc3RvcmFnZVdhaXR9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCBhd2FpdCBzdG9yYWdlLmdldFN0b3JhZ2VEYXRhKG5hbWUpIHx8IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZVN0b3JhZ2UgPSBkZWJvdW5jZUNvbXBhY3QoXG4gICAgICAgICAgKCkgPT4gc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICBzdG9yYWdlV2FpdFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQXJraGFtSlMgRXJyb3I6IFVzaW5nIHN0b3JhZ2UsIFwiJHtuYW1lfVwiLmApO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIHx8IHt9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmx1eDogRmx1eEZyYW1ld29yayA9IG5ldyBGbHV4RnJhbWV3b3JrKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiO29LQUlBLE9BQVEsV0FBQUEsTUFBYyw4QkFDdEIsT0FBUSxhQUFBQyxNQUFnQiw2QkFDeEIsT0FBUSxtQkFBQUMsTUFBc0Isd0NBQzlCLE9BQVEsT0FBQUMsTUFBVSwyQkFDbEIsT0FBUSxTQUFBQyxNQUFZLDZCQUNwQixPQUFRLE9BQUFDLE1BQVUsMkJBQ2xCLE9BQVEsY0FBQUMsTUFBaUIsb0NBQ3pCLE9BQVEsZ0JBQUFDLE1BQW1CLFNBRTNCLE9BQVEsbUJBQUFDLE1BQXNCLCtCQUc5QixNQUFNQyxFQUFjLElBQUksSUFDbEJDLEVBQW1CLElBRWxCLE1BQU1DLFVBQXNCQyxDQUFhLENBMkI5QyxhQUFjLENBQ1osTUFBTSxFQTFCUkMsRUFBQSxjQUFrQixJQUVsQkEsRUFBQSxLQUFTLGNBQWlDLENBQUMsY0FBZSxjQUFjLEdBRXhFQSxFQUFBLEtBQVEsUUFBNkIsQ0FBQyxHQUN0Q0EsRUFBQSxLQUFRLGVBQTBDLENBQUMsR0FDbkRBLEVBQUEsS0FBaUIsaUJBQThCLENBQzdDLEtBQU0sV0FDTixXQUFZLFVB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TXRELEVBQVEsZUFBZUQsRUFBTSxLQUFLLEtBQUssRUFDN0NzRCxDQUNGLENBQ0YsT0FBUzNCLEVBQU8sQ0FFZCxNQUFNQSxDQUNSLE1BRUEsS0FBSyxNQUFRMEIsR0FBUyxDQUFDLENBRTNCLENBQ0YsQ0F4aEJFL0QsRUFEV0YsRUFDSixXQUFvQixJQTBoQnRCLE1BQU1vRSxFQUFzQixJQUFJcEUiLAogICJuYW1lcyI6IFsiaXNFbXB0eSIsICJjbG9uZURlZXAiLCAiZGVib3VuY2VDb21wYWN0IiwgImdldCIsICJtZXJnZSIsICJzZXQiLCAicGFyc2VTdGFjayIsICJFdmVudEVtaXR0ZXIiLCAiQXJraGFtQ29uc3RhbnRzIiwgIlNUQUNLX0NBQ0hFIiwgIlNUQUNLX0NBQ0hFX1NJWkUiLCAiRmx1eEZyYW1ld29yayIsICJFdmVudEVtaXR0ZXIiLCAiX19wdWJsaWNGaWVsZCIsICJ0eXBlIiwgIm1pZGRsZXdhcmUiLCAibWlkZGxlT2JqIiwgIm1pZGRsZU5hbWUiLCAibSIsICJtZXRob2QiLCAicGx1Z2luIiwgInN0b3JlTmFtZSIsICJzdG9yZUZuIiwgIm5hbWUiLCAic3RvcmFnZSIsICJwbHVnaW5UeXBlIiwgInN0b3JlTmFtZXMiLCAiYWN0aW9uIiwgInNpbGVudCIsICJzdGFydFRpbWUiLCAiY2xvbmVkQWN0aW9uIiwgImNsb25lRGVlcCIsICJzdGFjayIsICJhcHBJbmZvIiwgInBvc3REaXNwYXRjaExpc3QiLCAicHJlRGlzcGF0Y2hMaXN0IiwgImRhdGEiLCAiZHVyYXRpb24iLCAicGF0aCIsICJkZWZhdWx0VmFsdWUiLCAicGF0aEtleSIsICJzdG9yZVZhbHVlIiwgImdldCIsICJ2YWx1ZSIsICJyZXN1bHQiLCAib3B0aW9ucyIsICJyZXNldCIsICJ1cGRhdGVkT3B0aW9ucyIsICJkZWJ1ZyIsICJzdG9yZXMiLCAiZXJyb3IiLCAid2luZG93UHJvcGVydHkiLCAiQXJraGFtQ29uc3RhbnRzIiwgImxpc3RlbmVyIiwgImV2ZW50VHlwZSIsICJyZWdpc3RlcmVkU3RvcmVzIiwgInN0b3JlIiwgIm5hbWVzIiwgImNsZWFyU3RvcmFnZSIsICJzZXQiLCAibWlkZGxld2FyZUxpc3QiLCAiYWN0aW9ucyIsICJ1cGRhdGVkQWN0aW9uIiwgIm1lcmdlIiwgImN1cnJlbnRTdGF0ZSIsICJuZXdTdGF0ZSIsICJjYWNoZUtleSIsICJzdGFja1Byb3BlcnR5IiwgInN0YWNrVHJhY2VMaW1pdCIsICJwYXJzZVN0YWNrIiwgImZpcnN0S2V5IiwgImxpc3QiLCAib2JqIiwgImluaXRpYWxTdGF0ZSIsICJzdG9yZUFjdGlvbiIsICJpc0VtcHR5IiwgInN0YXRlIiwgInN0b3JhZ2VXYWl0IiwgImRlYm91bmNlQ29tcGFjdCIsICJGbHV4Il0KfQo=
|
@@ -0,0 +1,47 @@
|
|
1
|
+
export interface FluxOptions {
|
2
|
+
readonly basename?: string;
|
3
|
+
readonly context?: object;
|
4
|
+
readonly debug?: boolean;
|
5
|
+
readonly getUserConfirmation?: () => void;
|
6
|
+
readonly hashType?: 'slash' | 'noslash' | 'hashbang';
|
7
|
+
readonly history?: object;
|
8
|
+
readonly initialEntries?: any[];
|
9
|
+
readonly initialIndex?: number;
|
10
|
+
readonly keyLength?: number;
|
11
|
+
readonly location?: string | object;
|
12
|
+
readonly middleware?: FluxMiddlewareType[];
|
13
|
+
readonly name?: string;
|
14
|
+
readonly routerType?: string;
|
15
|
+
readonly scrollToTop?: boolean;
|
16
|
+
readonly state?: any;
|
17
|
+
readonly storage?: FluxStorageType;
|
18
|
+
readonly storageWait?: number;
|
19
|
+
readonly stores?: any[];
|
20
|
+
readonly title?: string;
|
21
|
+
}
|
22
|
+
export interface FluxAction {
|
23
|
+
readonly [key: string]: any;
|
24
|
+
readonly type: string;
|
25
|
+
}
|
26
|
+
export interface FluxStorageType {
|
27
|
+
readonly getStorageData: (key: string) => Promise<any>;
|
28
|
+
readonly setStorageData: (key: string, value: any) => Promise<boolean>;
|
29
|
+
}
|
30
|
+
export interface FluxStore {
|
31
|
+
readonly action: (type: string, data: any, state: any) => any;
|
32
|
+
readonly name: string;
|
33
|
+
readonly initialState: any;
|
34
|
+
}
|
35
|
+
export type FluxPluginMethodType = (action: FluxAction, store: object, appData?: object) => Promise<FluxAction>;
|
36
|
+
export interface FluxMiddlewareType {
|
37
|
+
readonly name: string;
|
38
|
+
readonly preDispatch?: FluxPluginMethodType;
|
39
|
+
readonly postDispatch?: FluxPluginMethodType;
|
40
|
+
}
|
41
|
+
export interface FluxPluginType {
|
42
|
+
readonly name: string;
|
43
|
+
readonly method: FluxPluginMethodType;
|
44
|
+
}
|
45
|
+
export interface ErrorConstructor {
|
46
|
+
captureStackTrace(thisArg: any, func: any): void;
|
47
|
+
}
|
@@ -0,0 +1,4 @@
|
|
1
|
+
/* ArkhamJS - Optimized Build */
|
2
|
+
var t=Object.defineProperty;var r=(i,A,T)=>A in i?t(i,A,{enumerable:!0,configurable:!0,writable:!0,value:T}):i[A]=T;var _=(i,A,T)=>r(i,typeof A!="symbol"?A+"":A,T);class E{}_(E,"GO_BACK","ARKHAM_GO_BACK"),_(E,"GO_REPLACE","ARKHAM_GO_REPLACE"),_(E,"GOTO","ARKHAM_GOTO"),_(E,"INIT","ARKHAM_INIT"),_(E,"UPDATE_TITLE","ARKHAM_UPDATE_TITLE"),_(E,"UPDATE_VIEW","ARKHAM_UPDATE_VIEW");export{E as ArkhamConstants};
|
3
|
+
/* End ArkhamJS */
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmV4cG9ydCBjbGFzcyBBcmtoYW1Db25zdGFudHMge1xuICBzdGF0aWMgcmVhZG9ubHkgR09fQkFDSzogc3RyaW5nID0gJ0FSS0hBTV9HT19CQUNLJztcbiAgc3RhdGljIHJlYWRvbmx5IEdPX1JFUExBQ0U6IHN0cmluZyA9ICdBUktIQU1fR09fUkVQTEFDRSc7XG4gIHN0YXRpYyByZWFkb25seSBHT1RPOiBzdHJpbmcgPSAnQVJLSEFNX0dPVE8nO1xuICBzdGF0aWMgcmVhZG9ubHkgSU5JVDogc3RyaW5nID0gJ0FSS0hBTV9JTklUJztcbiAgc3RhdGljIHJlYWRvbmx5IFVQREFURV9USVRMRTogc3RyaW5nID0gJ0FSS0hBTV9VUERBVEVfVElUTEUnO1xuICBzdGF0aWMgcmVhZG9ubHkgVVBEQVRFX1ZJRVc6IHN0cmluZyA9ICdBUktIQU1fVVBEQVRFX1ZJRVcnO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtvS0FLTyxNQUFNQSxDQUFnQixDQU83QixDQU5FQyxFQURXRCxFQUNLLFVBQWtCLGtCQUNsQ0MsRUFGV0QsRUFFSyxhQUFxQixxQkFDckNDLEVBSFdELEVBR0ssT0FBZSxlQUMvQkMsRUFKV0QsRUFJSyxPQUFlLGVBQy9CQyxFQUxXRCxFQUtLLGVBQXVCLHVCQUN2Q0MsRUFOV0QsRUFNSyxjQUFzQiIsCiAgIm5hbWVzIjogWyJBcmtoYW1Db25zdGFudHMiLCAiX19wdWJsaWNGaWVsZCJdCn0K
|
package/lib/index.d.ts
ADDED
package/lib/index.js
ADDED
@@ -0,0 +1,4 @@
|
|
1
|
+
/* ArkhamJS - Optimized Build */
|
2
|
+
import{ArkhamConstants as o}from"./constants/ArkhamConstants";import{Flux as t,FluxFramework as p}from"./Flux/Flux";export*from"./Flux/Flux.types";export{o as ArkhamConstants,t as Flux,p as FluxFramework};
|
3
|
+
/* End ArkhamJS */
|
4
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4vY29uc3RhbnRzL0Fya2hhbUNvbnN0YW50cyc7XG5pbXBvcnQge0ZsdXgsIEZsdXhGcmFtZXdvcmt9IGZyb20gJy4vRmx1eC9GbHV4JztcblxuZXhwb3J0ICogZnJvbSAnLi9GbHV4L0ZsdXgudHlwZXMnO1xuZXhwb3J0IHtBcmtoYW1Db25zdGFudHMsIEZsdXgsIEZsdXhGcmFtZXdvcmt9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUlBLE9BQVEsbUJBQUFBLE1BQXNCLDhCQUM5QixPQUFRLFFBQUFDLEVBQU0saUJBQUFDLE1BQW9CLGNBRWxDLFdBQWMiLAogICJuYW1lcyI6IFsiQXJraGFtQ29uc3RhbnRzIiwgIkZsdXgiLCAiRmx1eEZyYW1ld29yayJdCn0K
|
package/package.json
CHANGED
@@ -1,15 +1,34 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nlabs/arkhamjs",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.29.0",
|
4
4
|
"publishConfig": {
|
5
5
|
"access": "public"
|
6
6
|
},
|
7
7
|
"description": "Javascript Flux Library",
|
8
|
+
"type": "module",
|
9
|
+
"sideEffects": false,
|
8
10
|
"license": "MIT",
|
9
11
|
"main": "./index.js",
|
10
12
|
"module": "./index.js",
|
11
13
|
"browser": "./index.js",
|
12
14
|
"types": "./lib/index.d.js",
|
15
|
+
"exports": {
|
16
|
+
".": {
|
17
|
+
"import": "./index.js",
|
18
|
+
"require": "./index.js",
|
19
|
+
"types": "./lib/index.d.js"
|
20
|
+
},
|
21
|
+
"./Flux": {
|
22
|
+
"import": "./lib/Flux/Flux.js",
|
23
|
+
"require": "./lib/Flux/Flux.js",
|
24
|
+
"types": "./lib/Flux/Flux.d.ts"
|
25
|
+
},
|
26
|
+
"./constants": {
|
27
|
+
"import": "./lib/constants/ArkhamConstants.js",
|
28
|
+
"require": "./lib/constants/ArkhamConstants.js",
|
29
|
+
"types": "./lib/constants/ArkhamConstants.d.ts"
|
30
|
+
}
|
31
|
+
},
|
13
32
|
"keywords": [
|
14
33
|
"arkhamjs",
|
15
34
|
"flux",
|
@@ -33,30 +52,35 @@
|
|
33
52
|
"url": "https://github.com/nitrogenlabs/arkhamjs/issues"
|
34
53
|
},
|
35
54
|
"scripts": {
|
36
|
-
"build": "lex compile",
|
55
|
+
"build": "lex compile --remove",
|
37
56
|
"clean": "lex clean",
|
38
|
-
"lint": "
|
57
|
+
"lint": "lex lint --fix",
|
39
58
|
"prepublishOnly": "npm run build",
|
40
59
|
"publish:major": "npm version major && npm publish",
|
41
60
|
"publish:minor": "npm version minor && npm publish",
|
42
61
|
"publish:patch": "npm version patch && npm publish",
|
43
62
|
"pretest": "npm run lint",
|
44
63
|
"test": "lex test",
|
45
|
-
"update": "
|
64
|
+
"update": "lex update --interactive"
|
46
65
|
},
|
47
66
|
"dependencies": {
|
48
|
-
"
|
49
|
-
"events": "^3.3.0"
|
50
|
-
"lodash": "^4.17.21"
|
67
|
+
"@nlabs/utils": "2.0.0",
|
68
|
+
"events": "^3.3.0"
|
51
69
|
},
|
52
70
|
"devDependencies": {
|
53
71
|
"@types/events": "^3.0.3",
|
54
|
-
"@types/jest": "^
|
55
|
-
"@types/
|
56
|
-
"
|
57
|
-
"
|
58
|
-
"eslint-config-styleguidejs": "^3.2.1",
|
59
|
-
"typescript": "^5.7.3"
|
72
|
+
"@types/jest": "^30.0.0",
|
73
|
+
"@types/node": "^24.0.10",
|
74
|
+
"esbuild": "^0.25.5",
|
75
|
+
"typescript": "^5.8.3"
|
60
76
|
},
|
77
|
+
"files": [
|
78
|
+
"lib",
|
79
|
+
"index.js",
|
80
|
+
"index.d.ts",
|
81
|
+
"LICENSE",
|
82
|
+
"package.json",
|
83
|
+
"README.md"
|
84
|
+
],
|
61
85
|
"gitHead": "fc371e1e28fe0ae35d40d29a217d5f0e990ec32a"
|
62
86
|
}
|