├── .editorconfig
├── .gitignore
├── .jshintignore
├── .jshintrc
├── CHANGELOG.md
├── LICENSE
├── README.md
├── bower.json
├── dist
├── dominus.js
└── dominus.min.js
├── package.json
├── resources
└── dominus.png
└── src
├── Dominus.ctor.js
├── Dominus.prototype.js
├── apply.js
├── cast.js
├── classes.js
├── custom.js
├── dom.js
├── dominus.js
├── flatten.js
├── null.js
├── public.js
├── test.js
└── text.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | # editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | [*.md]
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/.jshintignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 |
--------------------------------------------------------------------------------
/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "curly": true,
3 | "eqeqeq": true,
4 | "newcap": true,
5 | "noarg": true,
6 | "noempty": true,
7 | "nonew": true,
8 | "sub": true,
9 | "validthis": true,
10 | "undef": true,
11 | "trailing": true,
12 | "boss": true,
13 | "eqnull": true,
14 | "strict": true,
15 | "immed": true,
16 | "expr": true,
17 | "latedef": "nofunc",
18 | "quotmark": "single",
19 | "indent": 2,
20 | "node": true,
21 | "browser": true
22 | }
23 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # v6.0.0 Ampersbutt
2 |
3 | - `.but` and `.and` now return copies rather than modifying the original object
4 |
5 | # v5.0.6 Cross Breed
6 |
7 | - Updated `crossvent` to `1.5.4`
8 | - Updated `sektor` to `1.1.4`
9 |
10 | # v5.0.3 Cross Breed
11 |
12 | - Updated `sektor` to `1.1.3`
13 |
14 | # v5.0.2 Cross Breed
15 |
16 | - Updated `crossvent` to `1.5.0`
17 |
18 | # v5.0.0 Hide and Seek
19 |
20 | - Removed `.show` and `.hide` methods
21 |
22 | # v4.0.0 Table of Contents
23 |
24 | - Changed `$('div').i(index)` so that if the index is out of bounds the returned Dominus collection is empty rather than have an `undefined` element in it
25 |
26 | # v3.3.0 North Pole
27 |
28 | - Added `.once` method to bind disposable event listeners
29 |
30 | # v.3.2.4 Cross Polinize
31 |
32 | - Updated `crossvent` to `1.3.1`
33 |
34 | # v3.2.3 Interdependant Polinization
35 |
36 | - Extracted `./events` into its own module, `crossvent`
37 |
38 | # v3.2.1 Proper Attribution
39 |
40 | - Fixed a bug where calling `.attr(name, null)` wouldn't remove the `name` attribute from DOM elements
41 |
42 | # v3.2.0 Event Emission
43 |
44 | - Added `.emit` method to fabricate and raise DOM events
45 |
46 | # v3.1.0 Sanity Check
47 |
48 | - Fixed behavior of `Array.prototype.slice` on Dominus arrays
49 | - Introduced ability to interact with `Window` object in `$(window)`
50 | - The dynamic versions of `.show` and `.hide` now receive an element as a parameter
51 | - Fixed a bug where DOM manipulation events would throw native browser errors
52 |
53 | # v3.0.1 Custom Events
54 |
55 | - Introduced custom events
56 |
57 | # v2.5.2 Zen Focus
58 |
59 | - Added `.focus` method on Dominus objects
60 |
61 | # v2.5.1 Attribute Master
62 |
63 | - Allows you to use `.attr(attributes)` with an object map and many attributes
64 |
65 | # v2.4.4 Brothers and Sisters
66 |
67 | - Introduced `.css(prop, value)` method that also allows `.css({ prop: value })`
68 | - Fixed issues with `prev` and `next` where they would've incorrectly return an empty set
69 |
70 | # v2.3.7 Set Interpeter
71 |
72 | - Introduced ability to pass classes as a single string to `.setClass()`
73 |
74 | # v2.3.5 Fat Trimmer
75 |
76 | - Removed dependency on `lodash.find`
77 |
78 | # v2.3.4 Haystack
79 |
80 | - Added `.i(index)` method
81 |
82 | # v2.3.4 Parallel Processing
83 |
84 | - Override `.map` and `.filter` so that they always return a Dominus array
85 |
86 | # v2.3.0 Energy Flux
87 |
88 | - Fixed a bug where mapping and filtering resulted in Dominus arrays being demoted to regular arrays in mobile browsers
89 |
90 | # v2.2.2 Feet Flight
91 |
92 | - Fix issue where removing events failed in old browsers
93 |
94 | # v2.2.1 Cupboard
95 |
96 | - Bumped `poser` to `1.2.0`
97 |
98 | # v2.1.3 Switchboard
99 |
100 | - Use Node implementation of `poser`
101 |
102 | # v2.1.1 Campus Lantern
103 |
104 | - Bumped `poser` to `1.1.5`
105 |
106 | # v2.1.0 Keen Listener
107 |
108 | - Delegated events now match the event target as well as any parents that are also children of the delegate root
109 |
110 | # v2.0.11 Relatives
111 |
112 | - Improved `.children` and `.parents`, now able to filter by other collections or DOM elements
113 |
114 | # v2.0.10 Class Hierarchy
115 |
116 | - Fixed a bug where `.addClass` would replace the existing `className` values with the newer ones
117 |
118 | # v2.0.9 Show and Tell
119 |
120 | - Included `.hide` and `.show` methods with a rich API
121 |
122 | # v2.0.8 Questionable Tactics
123 |
124 | - Fixed a bug where `.and`, `.but` API methods weren't chaining
125 |
126 | # v2.0.7 Parental Advise
127 |
128 | - Replaced internal instances of `.parentNode` with `.parentElement` to avoid hitting the `#document` node
129 |
130 | # v2.0.6 Context King
131 |
132 | - You can now pass a context by using a selector, a Dominus object, or a DOM element
133 |
134 | # v2.0.5 Bumpy Road
135 |
136 | - Bumped `sektor` to 1.1.1, see [its changelog][1] for fixes
137 | - Improved internal build process, automated footprint comparison
138 |
139 | # v2.0.0 Mortal Kombat
140 |
141 | - Dropped `Sizzle` in favor of `sektor`, which is much smaller
142 |
143 | # v1.6.0 Beat the Bush
144 |
145 | - Introduced `.prev`, `.next`, `.parent`, `.parents`, and `.children` methods
146 | - Introduced `.and` and `.but` API methods
147 | - Fixed an issue where you could potentially get duplicate nodes in a Dominus collection
148 |
149 | # v1.5.0 Venture Beat
150 |
151 | - Introduced event delegation
152 | - Introduced event removal
153 | - Named releases!
154 |
155 | # v1.4.0 Right Round
156 |
157 | - Implemented `.addClass`, `.removeClass`, `.setClass`, and `.hasClass` methods
158 | - Introduced ability to create elements using the `$('
')` API
159 | - Added `.remove` method to remove elements from the DOM
160 | - Included DOM manipulation methods `.append`, `.appendTo`, `.prepend`, `.prependTo`, `.after`, `.afterOf`, `.before`, and `.beforeOf`.
161 | - Added `.clone` method
162 |
163 | # v1.3.2 `throw up;`
164 |
165 | - Fixed an issue where `.findOne` would throw.
166 |
167 | # v1.3.1 Box Office
168 |
169 | - Fixed an issue where inputs would be assumed to be checkboxes
170 |
171 | # v1.3.0 Where Is Wally?
172 |
173 | - Added `.where` instance method
174 | - Added `.is` instance method
175 | - Fixed issues when passing in an array to `$()`
176 | - Resolved issues when using the `.attr` getter
177 |
178 | # v1.2.0 _cough_ IE _cough_
179 |
180 | - Events now have cross-browser support
181 | - Introduced `.attr` method
182 | - `.text` now sets or gets the value text found on check elements if asked directly
183 | - `.value` now sets or gets the boolean checked property for check elements
184 |
185 | # v1.1.5 Bounty Hunter
186 |
187 | - Reverted `v1.1.4`
188 |
189 | # v1.1.4 Bouncy Castle
190 |
191 | - Added `debounce` option to `.on`
192 |
193 | # v1.1.0 All The Small Things
194 |
195 | - Introduced `.text`, and `.value`
196 | - Improved `.on` to support multi-event binding
197 |
198 | # v1.0.0 IPO
199 |
200 | - Initial Public Release
201 |
202 | [1]: https://github.com/bevacqua/sektor/blob/master/CHANGELOG.md#111-short-circuit
203 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright © 2014 Nicolas Bevacqua
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of
6 | this software and associated documentation files (the "Software"), to deal in
7 | the Software without restriction, including without limitation the rights to
8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 | the Software, and to permit persons to whom the Software is furnished to do so,
10 | subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ![dominus.png][5]
2 |
3 | > Lean DOM Manipulation
4 |
5 | This isn't a drop-in replacement for jQuery, but rather a different implementation. Dominus is **jQuery minus the cruft**, with a footprint of **~4kB** minified and gzipped, vs the **~33kB** in jQuery. Dominus uses [`sektor`][1] as its selector engine of choice, which is a drop-in replacement for [Sizzle][4], but tens of times smaller in exchange for a more limited feature-set.
6 |
7 | Just like with jQuery, Dominus exposes a rich API that's chainable to the best of its ability. The biggest difference with jQuery at this level is that the `Dominus` wrapper is a real array. These arrays have been modified to include a few other properties in their prototype, but they don't change the native DOM array. [See `poser` for more details on that one.][3] All of this means you can `.map`, `.forEach`, `.filter`, and all of that good stuff that you're used to when dealing with JavaScript collections, and at the same time you get some extra methods just like with jQuery.
8 |
9 | # Install
10 |
11 | Using Bower
12 |
13 | ```shell
14 | bower install -S dominus
15 | ```
16 |
17 | Using `npm`
18 |
19 | ```shell
20 | npm install -S dominus
21 | ```
22 |
23 | # API
24 |
25 | The API in Dominus begins with the methods listed below, which allow you to grab an object instance.
26 |
27 | ## Static Methods
28 |
29 | These are the static methods provided by Dominus. Consider these _the entry point_, just like the methods exposed by jQuery on `$`.
30 |
31 | ### `dominus()`
32 |
33 | Returns an empty `Dominus` collection.
34 |
35 | ### `dominus(HTMLElement)`
36 |
37 | Wraps the [`HTMLElement`][2] object in a `Dominus` collection.
38 |
39 | ### `dominus(Dominus)`
40 |
41 | Returns the `Dominus` collection, as-is.
42 |
43 | ### `dominus(Array)`
44 |
45 | Returns a `Dominus` collection with the [`HTMLElement`][2] objects found in the provided array.
46 |
47 | ### `dominus('<{tag-name}>')`
48 |
49 | Returns a `Dominus` collection after creating an element of the provided tag type name.
50 |
51 | ### `dominus(selector, context?)`
52 |
53 | See `dominus.find` below.
54 |
55 | ### `dominus.find(selector, context?)`
56 |
57 | Queries the DOM for the provided selector, using [`sektor`][1]. Returns a `Dominus` collection with [`HTMLElement`][2] objects. If `context` is provided then the search is restricted to children of `context`. The `context` can be either a DOM element, a selector string, or a Dominus object (the first DOM element in the group is used).
58 |
59 | ### `dominus.findOne(selector, context?)`
60 |
61 | Queries the DOM for the provided selector, using [`sektor`][1]. Returns the first matching [`HTMLElement`][2] object, if any. If `context` is provided then the search is restricted to children of `context`. The `context` can be either a DOM element, a selector string, or a Dominus object (the first DOM element in the group is used).
62 |
63 | ### `dominus.custom(name, type, filter)`
64 |
65 | See [Custom Event Filters](#custom-event-filters) below.
66 |
67 | ## Instance Methods
68 |
69 | Once you've gotten yourself a `Dominus` collection, there's a few more methods you'll get access to. I'll denote array instances as `a`, where possible.
70 |
71 | _First off, there's the selection methods._
72 |
73 | ## Navigation API
74 |
75 | These methods let you search the DOM for the nodes that you want to manipulate.
76 |
77 | ### `a.prev(selector?)`
78 |
79 | Returns the previous sibling, optionally filtered by a `selector`.
80 |
81 | ### `a.next(selector?)`
82 |
83 | Returns the next sibling, optionally filtered by a `selector`.
84 |
85 | ### `a.parent(selector?)`
86 |
87 | Returns the first parent element, optionally filtered by a `selector`.
88 |
89 | ### `a.parents(value?)`
90 |
91 | Returns all parent elements, optionally filtered by another Dominus collection, a DOM element, or a selector.
92 |
93 | ### `a.children(value?)`
94 |
95 | Like `.find`, but only one level deep. Optionally filtered by another Dominus collection, a DOM element, or a selector.
96 |
97 | ### `a.find(selector)`
98 |
99 | Queries the DOM for children of the elements in the array, using the provided selector. Returns a single `Dominus` collection containing all of the results.
100 |
101 | ### `a.findOne(selector)`
102 |
103 | Queries the DOM for children of the elements in the array, using the provided selector. Returns the first matching [`HTMLElement`][2] object, if any.
104 |
105 | ### `a.where(selector)`
106 |
107 | Returns a subset of the elements in the array that match the provided selector.
108 |
109 | ### `a.is(selector)`
110 |
111 | Returns whether at least one of the elements in the array match the provided selector.
112 |
113 | _Then there's also the attribute manipulation API._
114 |
115 | ## Attribute Methods
116 |
117 | These methods let you modify DOM element attributes or properties.
118 |
119 | ### `a.html(value?)`
120 |
121 | If a `value` is provided then every element in the `Dominus` collection gets assigned that HTML `value`, then `a` is returned for chaining. If you don't provide a `value`, you get the HTML contents of the first node in the `Dominus` collection back.
122 |
123 | ### `a.text(value?)`
124 |
125 | If a `value` is provided then every element in the `Dominus` collection gets assigned that plain text `value`, then `a` is returned for chaining. If you don't provide a `value`, you get the plain text contents of the first node in the `Dominus` collection back. In the case of elements that can be `checked`, the native `value` property is used instead.
126 |
127 | ### `a.value(value?)`
128 |
129 | If a `value` is provided then every element in the `Dominus` collection gets assigned that input `value`, then `a` is returned for chaining. If you don't provide a `value`, you get the input value of the first node in the `Dominus` collection back. In the case of elements that can be `checked`, the native `checked` property is used instead.
130 |
131 | ### `a.attr(name)`
132 |
133 | The `name` attribute's value is returned, for the first element in the collection.
134 |
135 | ### `a.attr(name, value)`
136 |
137 | Every element in the collection gets assigned `value` to the attribute property `name`. Passing `null` or `undefined` as the `value` will remove the attribute from the DOM element entirely.
138 |
139 | ### `a.attr(attributes)`
140 |
141 | The `attributes` map is used to assign every property-value pair to the attributes in every element.
142 |
143 | ### `a.addClass(value)`
144 |
145 | Adds `value` to every element in the collection. `value` can either be a space-separated class list or an array.
146 |
147 | ### `a.removeClass(value)`
148 |
149 | Removes `value` from every element in the collection. `value` can either be a space-separated class list or an array.
150 |
151 | ### `a.setClass(value)`
152 |
153 | Sets `value` for every element in the collection. `value` can either be a space-separated class list or an array.
154 |
155 | ### `a.hasClass(value)`
156 |
157 | Returns `true` if at least one of the elements in the collection matches every class in `value`. `value` can either be a space-separated class list or an array.
158 |
159 | ### `a.css(prop)`
160 |
161 | Gets the CSS property value for `prop` from the first element in the set of matched elements. `camelCase` gets converted into `hyphen-case`.
162 |
163 | ### `a.css(prop, value)`
164 |
165 | Sets the CSS property value for `prop` to `value` for every element in the set of matched elements. `camelCase` gets converted into `hyphen-case`.
166 |
167 | ### `a.css(props)`
168 |
169 | Sets the CSS property values for every element in the set of matched elements using the provided `props` map. `camelCase` gets converted into `hyphen-case`.
170 |
171 | Example:
172 |
173 | ```js
174 | dominus('body').css({ color: 'blue', width: 600 });
175 | ```
176 |
177 | _You can physically alter the DOM, using the methods listed in the next category._
178 |
179 | ## DOM Manipulation
180 |
181 | ### `a.on(type, filter?, fn)`
182 |
183 | Attaches the event handler `fn` for events of type `type` on every element in the `Dominus` collection. You can also pass in a list of event types, such as `click dragstart`, and both events get the event listener attached to them.
184 |
185 | The `filter?` argument is optional, and you can use it to provide a selector that will filter inputs. This is known as event delegation. The example below will bind a single event listener that will fire only when child nodes matching the `.remove` selector are clicked.
186 |
187 | ```js
188 | dominus('.products').on('click', '.remove', removeProduct);
189 | ```
190 |
191 | ### `a.once(type, filter?, fn)`
192 |
193 | Meant for when you want to listen for an event only once. This method is identical to `a.on(type, filter?, fn)`, except the event listener will be removed right before your `fn` callback is executed.
194 |
195 | ### `a.off(type, filter?, fn)`
196 |
197 | Turns off event listeners matching the event `type`, the `filter` selector _(if any)_, and the event handler.
198 |
199 | ### `a.emit(type)`
200 |
201 | Fabricates a synthetic event of type `type` and dispatches it for each element in the collection. Note that these events are even accessible outside of Dominus.
202 |
203 | ```js
204 | var el = document.getElementById('dollars');
205 | el.addEventListener('dollarsigns', function () {
206 | alert('$$$');
207 | });
208 | $(el).emit('dollarsigns');
209 | ```
210 |
211 | ### Custom Event Filters
212 |
213 | Dominus allows you to create custom sub-events. For example, you could have a custom click sub-event that only triggers on left clicks; or a custom key press event that only triggers when certain keys are pressed.
214 |
215 | Dominus ships with the following custom events.
216 |
217 | Event | Description
218 | ---------------|-----------------------------------------------------------
219 | `'left-click'` | Only triggers when a left click happens while no meta keys are pressed (Command, Control)
220 |
221 | You can register your own custom events using `dominus.custom`.
222 |
223 | #### `dominus.custom(name, type, filter)`
224 |
225 | Register a custom event named `name`. This event will trigger whenever a `type` event triggers, but only if `filter(e)` returns `true`.
226 |
227 | As an illustrative example, here's how the `left-click` custom event is registered.
228 |
229 | ```js
230 | dominus.custom('left-click', 'click', function (e) {
231 | return e.which === 1 && !e.metaKey && !e.ctrlKey;
232 | });
233 | ```
234 |
235 | Adding or removing event listeners to custom event filters is no different from adding or removing regular event listeners.
236 |
237 | ```js
238 | $('#home').on('left-click', navigateHome);
239 | ```
240 |
241 | ### `a.focus()`
242 |
243 | Invokes [`HTMLElement.focus()`][6] on the first DOM element in the collection.
244 |
245 | ### `a.clone()`
246 |
247 | Returns a deep clone of the DOM elements in the collection.
248 |
249 | ### `a.remove()`
250 |
251 | Removes the selected elements from the DOM.
252 |
253 | ### `a.append(elem)`
254 |
255 | Inserts the provided `elem` as the last child of each element in the collection.
256 |
257 | ### `a.appendTo(elem)`
258 |
259 | Inserts every element in the collection as the last children of the provided `elem`.
260 |
261 | ### `a.prepend(elem)`
262 |
263 | Inserts the provided `elem` as the first child of each element in the collection.
264 |
265 | ### `a.prependTo(elem)`
266 |
267 | Inserts every element in the collection as the first children of the provided `elem`.
268 |
269 | ### `a.before(elem)`
270 |
271 | Inserts the provided `elem` as the previous sibling of each element in the collection.
272 |
273 | ### `a.after(elem)`
274 |
275 | Inserts the provided `elem` as the next sibling of each element in the collection.
276 |
277 | ### `a.beforeOf(elem)`
278 |
279 | Inserts every element in the collection as the previous siblings of the provided `elem`.
280 |
281 | ### `a.afterOf(elem)`
282 |
283 | Inserts every element in the collection as the next siblings of the provided `elem`.
284 |
285 | The methods listed below affect the collection itself
286 |
287 | ## Dominus Collection Methods
288 |
289 | Besides the fact that `Dominus` is an [out-of-context `Array` object][3], meaning you can do all the fun functional programming you're used to, there's a few more methods to manipulate the collection itself.
290 |
291 | ### `a.and(...)`
292 |
293 | Returns a copy of `a`, adding the result of calling [`dominus()`](#dominus-1) with the arguments you provided to the current collection.
294 |
295 | This means that you can use `.and` with selectors, a DOM element, an array of DOM elements, or another Dominus collection.
296 |
297 | ### `a.but(...)`
298 |
299 | Returns a copy of `a`, removing the result of calling [`dominus()`](#dominus-1) with the arguments you provided from the current collection.
300 |
301 | This means that you can use `.but` with selectors, a DOM element, an array of DOM elements, or another Dominus collection.
302 |
303 | ### `a.i(index)`
304 |
305 | Returns the element at index `index`, wrapped in a Dominus object. If the `index` is out of bounds then an empty Dominus collection will be returned.
306 |
307 | # License
308 |
309 | MIT
310 |
311 | [1]: https://github.com/bevacqua/sektor
312 | [2]: https://developer.mozilla.org/en/docs/Web/API/HTMLElement
313 | [3]: https://github.com/bevacqua/poser
314 | [4]: https://github.com/jquery/sizzle
315 | [5]: https://raw.githubusercontent.com/bevacqua/dominus/master/resources/dominus.png
316 | [6]: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.focus
317 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dominus",
3 | "description": "Lean DOM Manipulation",
4 | "version": "6.0.0",
5 | "homepage": "https://github.com/bevacqua/dominus",
6 | "author": {
7 | "name": "Nicolas Bevacqua",
8 | "email": "ng@bevacqua.io",
9 | "url": "http://bevacqua.io"
10 | },
11 | "license": "MIT",
12 | "repository": {
13 | "type": "git",
14 | "url": "git://github.com/bevacqua/dominus.git"
15 | },
16 | "main": "dist/dominus.js",
17 | "ignore": [
18 | ".*",
19 | "package.json",
20 | "node_modules",
21 | "src",
22 | "test",
23 | "gulpfile.js"
24 | ],
25 | "dependencies": {}
26 | }
27 |
--------------------------------------------------------------------------------
/dist/dominus.js:
--------------------------------------------------------------------------------
1 | (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.dominus = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 9
150 | 'function' === typeof document.createEvent ? function CustomEvent (type, params) {
151 | var e = document.createEvent('CustomEvent');
152 | if (params) {
153 | e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);
154 | } else {
155 | e.initCustomEvent(type, false, false, void 0);
156 | }
157 | return e;
158 | } :
159 |
160 | // IE <= 8
161 | function CustomEvent (type, params) {
162 | var e = document.createEventObject();
163 | e.type = type;
164 | if (params) {
165 | e.bubbles = Boolean(params.bubbles);
166 | e.cancelable = Boolean(params.cancelable);
167 | e.detail = params.detail;
168 | } else {
169 | e.bubbles = false;
170 | e.cancelable = false;
171 | e.detail = void 0;
172 | }
173 | return e;
174 | }
175 |
176 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
177 |
178 | },{}],4:[function(require,module,exports){
179 | var poser = require('./src/node');
180 |
181 | module.exports = poser;
182 |
183 | ['Array', 'Function', 'Object', 'Date', 'String'].forEach(pose);
184 |
185 | function pose (type) {
186 | poser[type] = function poseComputedType () { return poser(type); };
187 | }
188 |
189 | },{"./src/node":5}],5:[function(require,module,exports){
190 | (function (global){
191 | 'use strict';
192 |
193 | var d = global.document;
194 |
195 | function poser (type) {
196 | var iframe = d.createElement('iframe');
197 |
198 | iframe.style.display = 'none';
199 | d.body.appendChild(iframe);
200 |
201 | return map(type, iframe.contentWindow);
202 | }
203 |
204 | function map (type, source) { // forward polyfills to the stolen reference!
205 | var original = window[type].prototype;
206 | var value = source[type];
207 | var prop;
208 |
209 | for (prop in original) {
210 | value.prototype[prop] = original[prop];
211 | }
212 |
213 | return value;
214 | }
215 |
216 | module.exports = poser;
217 |
218 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
219 |
220 | },{}],6:[function(require,module,exports){
221 | (function (global){
222 | 'use strict';
223 |
224 | var expando = 'sektor-' + Date.now();
225 | var rsiblings = /[+~]/;
226 | var document = global.document;
227 | var del = document.documentElement || {};
228 | var match = (
229 | del.matches ||
230 | del.webkitMatchesSelector ||
231 | del.mozMatchesSelector ||
232 | del.oMatchesSelector ||
233 | del.msMatchesSelector ||
234 | never
235 | );
236 |
237 | module.exports = sektor;
238 |
239 | sektor.matches = matches;
240 | sektor.matchesSelector = matchesSelector;
241 |
242 | function qsa (selector, context) {
243 | var existed, id, prefix, prefixed, adapter, hack = context !== document;
244 | if (hack) { // id hack for context-rooted queries
245 | existed = context.getAttribute('id');
246 | id = existed || expando;
247 | prefix = '#' + id + ' ';
248 | prefixed = prefix + selector.replace(/,/g, ',' + prefix);
249 | adapter = rsiblings.test(selector) && context.parentNode;
250 | if (!existed) { context.setAttribute('id', id); }
251 | }
252 | try {
253 | return (adapter || context).querySelectorAll(prefixed || selector);
254 | } catch (e) {
255 | return [];
256 | } finally {
257 | if (existed === null) { context.removeAttribute('id'); }
258 | }
259 | }
260 |
261 | function sektor (selector, ctx, collection, seed) {
262 | var element;
263 | var context = ctx || document;
264 | var results = collection || [];
265 | var i = 0;
266 | if (typeof selector !== 'string') {
267 | return results;
268 | }
269 | if (context.nodeType !== 1 && context.nodeType !== 9) {
270 | return []; // bail if context is not an element or document
271 | }
272 | if (seed) {
273 | while ((element = seed[i++])) {
274 | if (matchesSelector(element, selector)) {
275 | results.push(element);
276 | }
277 | }
278 | } else {
279 | results.push.apply(results, qsa(selector, context));
280 | }
281 | return results;
282 | }
283 |
284 | function matches (selector, elements) {
285 | return sektor(selector, null, null, elements);
286 | }
287 |
288 | function matchesSelector (element, selector) {
289 | return match.call(element, selector);
290 | }
291 |
292 | function never () { return false; }
293 |
294 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
295 |
296 | },{}],7:[function(require,module,exports){
297 | 'use strict';
298 |
299 | var poser = require('poser');
300 | var Dominus = poser.Array();
301 |
302 | module.exports = Dominus;
303 |
304 | },{"poser":4}],8:[function(require,module,exports){
305 | 'use strict';
306 |
307 | var $ = require('./public');
308 | var flatten = require('./flatten');
309 | var dom = require('./dom');
310 | var apply = require('./apply');
311 | var custom = require('./custom');
312 | var classes = require('./classes');
313 | var Dominus = require('./Dominus.ctor');
314 |
315 | function equals (selector) {
316 | return function equals (elem) {
317 | return dom.matches(elem, selector);
318 | };
319 | }
320 |
321 | function straight (prop, one) {
322 | return function domMapping (selector) {
323 | var result = this.map(function (elem) {
324 | return dom[prop](elem, selector);
325 | });
326 | var results = flatten(result);
327 | return one ? results[0] : results;
328 | };
329 | }
330 |
331 | Dominus.prototype.prev = straight('prev');
332 | Dominus.prototype.next = straight('next');
333 | Dominus.prototype.parent = straight('parent');
334 | Dominus.prototype.parents = straight('parents');
335 | Dominus.prototype.children = straight('children');
336 | Dominus.prototype.find = straight('qsa');
337 | Dominus.prototype.findOne = straight('qs', true);
338 |
339 | Dominus.prototype.where = function (selector) {
340 | return this.filter(equals(selector));
341 | };
342 |
343 | Dominus.prototype.is = function (selector) {
344 | return this.some(equals(selector));
345 | };
346 |
347 | Dominus.prototype.i = function (index) {
348 | return this[index] ? new Dominus(this[index]) : new Dominus();
349 | };
350 |
351 | function compareFactory (fn) {
352 | return function compare () {
353 | var copy = apply(this);
354 | $.apply(null, arguments).forEach(fn, copy);
355 | return copy;
356 | };
357 | }
358 |
359 | Dominus.prototype.and = compareFactory(function addOne (elem) {
360 | if (this.indexOf(elem) === -1) {
361 | this.push(elem);
362 | }
363 | return this;
364 | });
365 |
366 | Dominus.prototype.but = compareFactory(function addOne (elem) {
367 | var index = this.indexOf(elem);
368 | if (index !== -1) {
369 | this.splice(index, 1);
370 | }
371 | return this;
372 | });
373 |
374 | Dominus.prototype.css = function (name, value) {
375 | var props;
376 | var many = name && typeof name === 'object';
377 | var getter = !many && !value;
378 | if (getter) {
379 | return this.length ? dom.getCss(this[0], name) : null;
380 | }
381 | if (many) {
382 | props = name;
383 | } else {
384 | props = {};
385 | props[name] = value;
386 | }
387 | this.forEach(dom.setCss(props));
388 | return this;
389 | };
390 |
391 | function eventer (method) {
392 | return function (types, filter, fn) {
393 | var typelist = types.split(' ');
394 | if (typeof fn !== 'function') {
395 | fn = filter;
396 | filter = null;
397 | }
398 | this.forEach(function (elem) {
399 | typelist.forEach(function (type) {
400 | var handler = custom.handlers[type];
401 | if (handler) {
402 | dom[method](elem, handler.event, filter, handler.wrap(fn));
403 | } else {
404 | dom[method](elem, type, filter, fn);
405 | }
406 | });
407 | });
408 | return this;
409 | };
410 | }
411 |
412 | Dominus.prototype.once = eventer('once');
413 | Dominus.prototype.on = eventer('on');
414 | Dominus.prototype.off = eventer('off');
415 | Dominus.prototype.emit = eventer('emit');
416 |
417 | [
418 | ['addClass', classes.add],
419 | ['removeClass', classes.remove],
420 | ['setClass', classes.set],
421 | ['removeClass', classes.remove],
422 | ['remove', dom.remove]
423 | ].forEach(mapMethods);
424 |
425 | function mapMethods (data) {
426 | Dominus.prototype[data[0]] = function (value) {
427 | this.forEach(function (elem) {
428 | data[1](elem, value);
429 | });
430 | return this;
431 | };
432 | }
433 |
434 | [
435 | 'append',
436 | 'appendTo',
437 | 'prepend',
438 | 'prependTo',
439 | 'before',
440 | 'beforeOf',
441 | 'after',
442 | 'afterOf'
443 | ].forEach(mapManipulation);
444 |
445 | function mapManipulation (method) {
446 | Dominus.prototype[method] = function (value) {
447 | dom[method](this, value);
448 | return this;
449 | };
450 | }
451 |
452 | Dominus.prototype.hasClass = function (value) {
453 | return this.some(function (elem) {
454 | return classes.contains(elem, value);
455 | });
456 | };
457 |
458 | Dominus.prototype.attr = function (name, value) {
459 | var hash = name && typeof name === 'object';
460 | var set = hash ? setMany : setSingle;
461 | var setter = hash || arguments.length > 1;
462 | if (setter) {
463 | this.forEach(set);
464 | return this;
465 | } else {
466 | return this.length ? dom.getAttr(this[0], name) : null;
467 | }
468 | function setMany (elem) {
469 | dom.manyAttr(elem, name);
470 | }
471 | function setSingle (elem) {
472 | dom.attr(elem, name, value);
473 | }
474 | };
475 |
476 | function keyValue (key, value) {
477 | var getter = arguments.length < 2;
478 | if (getter) {
479 | return this.length ? dom[key](this[0]) : '';
480 | }
481 | this.forEach(function (elem) {
482 | dom[key](elem, value);
483 | });
484 | return this;
485 | }
486 |
487 | function keyValueProperty (prop) {
488 | Dominus.prototype[prop] = function accessor (value) {
489 | var getter = arguments.length < 1;
490 | if (getter) {
491 | return keyValue.call(this, prop);
492 | }
493 | return keyValue.call(this, prop, value);
494 | };
495 | }
496 |
497 | ['html', 'text', 'value'].forEach(keyValueProperty);
498 |
499 | Dominus.prototype.clone = function () {
500 | return this.map(function (elem) {
501 | return dom.clone(elem);
502 | });
503 | };
504 |
505 | Dominus.prototype.focus = function () {
506 | if (this.length) {
507 | this[0].focus();
508 | }
509 | return this;
510 | };
511 |
512 | module.exports = require('./public');
513 |
514 | },{"./Dominus.ctor":7,"./apply":9,"./classes":11,"./custom":12,"./dom":13,"./flatten":15,"./public":16}],9:[function(require,module,exports){
515 | 'use strict';
516 |
517 | var Dominus = require('./Dominus.ctor');
518 | var proto = Dominus.prototype;
519 |
520 | function Applied (args) {
521 | return Dominus.apply(this, args);
522 | }
523 |
524 | Applied.prototype = proto;
525 |
526 | function apply (a) {
527 | return new Applied(a);
528 | }
529 |
530 | ['map', 'filter', 'concat', 'slice'].forEach(ensure);
531 |
532 | function ensure (key) {
533 | var original = proto[key];
534 | proto[key] = function applied () {
535 | return apply(original.apply(this, arguments));
536 | };
537 | }
538 |
539 | module.exports = apply;
540 |
541 | },{"./Dominus.ctor":7}],10:[function(require,module,exports){
542 | (function (global){
543 | 'use strict';
544 |
545 | var test = require('./test');
546 | var apply = require('./apply');
547 | var Dominus = require('./Dominus.ctor');
548 |
549 | function cast (a) {
550 | if (a === global) {
551 | return new Dominus(a);
552 | }
553 | if (a instanceof Dominus) {
554 | return a;
555 | }
556 | if (!a) {
557 | return new Dominus();
558 | }
559 | if (test.isElement(a)) {
560 | return new Dominus(a);
561 | }
562 | if (!test.isArray(a)) {
563 | return new Dominus();
564 | }
565 | return apply(a).filter(function (i) {
566 | return test.isElement(i);
567 | });
568 | }
569 |
570 | module.exports = cast;
571 |
572 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
573 |
574 | },{"./Dominus.ctor":7,"./apply":9,"./test":17}],11:[function(require,module,exports){
575 | 'use strict';
576 |
577 | var trim = /^\s+|\s+$/g;
578 | var whitespace = /\s+/g;
579 | var test = require('./test');
580 |
581 | function interpret (input) {
582 | return typeof input === 'string' ? input.replace(trim, '').split(whitespace) : input;
583 | }
584 |
585 | function classes (el) {
586 | if (test.isElement(el)) {
587 | return el.className.replace(trim, '').split(whitespace);
588 | }
589 | return [];
590 | }
591 |
592 | function set (el, input) {
593 | if (test.isElement(el)) {
594 | el.className = interpret(input).join(' ');
595 | }
596 | }
597 |
598 | function add (el, input) {
599 | var current = remove(el, input);
600 | var values = interpret(input);
601 | current.push.apply(current, values);
602 | set(el, current);
603 | return current;
604 | }
605 |
606 | function remove (el, input) {
607 | var current = classes(el);
608 | var values = interpret(input);
609 | values.forEach(function (value) {
610 | var i = current.indexOf(value);
611 | if (i !== -1) {
612 | current.splice(i, 1);
613 | }
614 | });
615 | set(el, current);
616 | return current;
617 | }
618 |
619 | function contains (el, input) {
620 | var current = classes(el);
621 | var values = interpret(input);
622 |
623 | return values.every(function (value) {
624 | return current.indexOf(value) !== -1;
625 | });
626 | }
627 |
628 | module.exports = {
629 | add: add,
630 | remove: remove,
631 | contains: contains,
632 | set: set,
633 | get: classes
634 | };
635 |
636 | },{"./test":17}],12:[function(require,module,exports){
637 | 'use strict';
638 |
639 | var handlers = {};
640 |
641 | function register (name, type, filter) {
642 | handlers[name] = {
643 | event: type,
644 | filter: filter,
645 | wrap: wrap
646 | };
647 |
648 | function wrap (fn) {
649 | return wrapper(name, fn);
650 | }
651 | }
652 |
653 | function wrapper (name, fn) {
654 | if (!fn) {
655 | return fn;
656 | }
657 | var key = '__dce_' + name;
658 | if (fn[key]) {
659 | return fn[key];
660 | }
661 | fn[key] = function customEvent (e) {
662 | var match = handlers[name].filter(e);
663 | if (match) {
664 | return fn.apply(this, arguments);
665 | }
666 | };
667 | return fn[key];
668 | }
669 |
670 | register('left-click', 'click', function (e) {
671 | return e.which === 1 && !e.metaKey && !e.ctrlKey;
672 | });
673 |
674 | module.exports = {
675 | register: register,
676 | wrapper: wrapper,
677 | handlers: handlers
678 | };
679 |
680 | },{}],13:[function(require,module,exports){
681 | (function (global){
682 | 'use strict';
683 |
684 | var sektor = require('sektor');
685 | var crossvent = require('crossvent');
686 | var Dominus = require('./Dominus.ctor');
687 | var cast = require('./cast');
688 | var apply = require('./apply');
689 | var text = require('./text');
690 | var test = require('./test');
691 | var api = module.exports = {};
692 | var delegates = {};
693 |
694 | function castContext (context) {
695 | if (typeof context === 'string') {
696 | return api.qs(null, context);
697 | }
698 | if (test.isElement(context)) {
699 | return context;
700 | }
701 | if (context instanceof Dominus) {
702 | return context[0];
703 | }
704 | return null;
705 | }
706 |
707 | api.qsa = function (el, selector) {
708 | var results = new Dominus();
709 | return sektor(selector, castContext(el), results);
710 | };
711 |
712 | api.qs = function (el, selector) {
713 | return api.qsa(el, selector)[0];
714 | };
715 |
716 | api.matches = function (el, selector) {
717 | return test.isElement(el) && sektor.matchesSelector(el, selector);
718 | };
719 |
720 | function relatedFactory (prop) {
721 | return function related (el, selector) {
722 | var relative = el[prop];
723 | if (relative) {
724 | if (!selector || api.matches(relative, selector)) {
725 | return cast(relative);
726 | }
727 | }
728 | return new Dominus();
729 | };
730 | }
731 |
732 | api.prev = relatedFactory('previousElementSibling');
733 | api.next = relatedFactory('nextElementSibling');
734 | api.parent = relatedFactory('parentElement');
735 |
736 | function matches (el, value) {
737 | if (!value) {
738 | return true;
739 | }
740 | if (value instanceof Dominus) {
741 | return value.indexOf(el) !== -1;
742 | }
743 | if (test.isElement(value)) {
744 | return el === value;
745 | }
746 | return api.matches(el, value);
747 | }
748 |
749 | api.parents = function (el, value) {
750 | var elements = [];
751 | var current = el;
752 | while (current.parentElement) {
753 | if (matches(current.parentElement, value)) {
754 | elements.push(current.parentElement);
755 | }
756 | current = current.parentElement;
757 | }
758 | return apply(elements);
759 | };
760 |
761 | api.children = function (el, value) {
762 | var elements = [];
763 | var children = el.children;
764 | var child;
765 | var i;
766 | for (i = 0; children && i < children.length; i++) {
767 | child = children[i];
768 | if (matches(child, value)) {
769 | elements.push(child);
770 | }
771 | }
772 | return apply(elements);
773 | };
774 |
775 | // this method caches delegates so that .off() works seamlessly
776 | function delegate (root, filter, fn) {
777 | if (delegates[fn._dd]) {
778 | return delegates[fn._dd];
779 | }
780 | fn._dd = Date.now();
781 | delegates[fn._dd] = delegator;
782 | function delegator (e) {
783 | var el = e.target;
784 | while (el && el !== root) {
785 | if (api.matches(el, filter)) {
786 | fn.apply(this, arguments); return;
787 | }
788 | el = el.parentElement;
789 | }
790 | }
791 | return delegator;
792 | }
793 |
794 | function evented (method, el, type, filter, fn) {
795 | if (filter === null) {
796 | crossvent[method](el, type, fn);
797 | } else {
798 | crossvent[method](el, type, delegate(el, filter, fn));
799 | }
800 | }
801 |
802 | function once (el, type, filter, fn) {
803 | var things = [el, type, filter, disposable];
804 | api.on.apply(api, things);
805 | function disposable () {
806 | api.off.apply(api, things);
807 | return fn.apply(this, arguments);
808 | }
809 | }
810 |
811 | api.once = once;
812 | api.on = evented.bind(null, 'add');
813 | api.off = evented.bind(null, 'remove');
814 | api.emit = evented.bind(null, 'fabricate');
815 |
816 | api.html = function (elem, html) {
817 | var getter = arguments.length < 2;
818 | if (getter) {
819 | return elem.innerHTML;
820 | } else {
821 | elem.innerHTML = html;
822 | }
823 | };
824 |
825 | api.text = function (elem, text) {
826 | var checkable = test.isCheckable(elem);
827 | var getter = arguments.length < 2;
828 | if (getter) {
829 | return checkable ? elem.value : elem.innerText || elem.textContent;
830 | } else if (checkable) {
831 | elem.value = text;
832 | } else {
833 | elem.innerText = elem.textContent = text;
834 | }
835 | };
836 |
837 | api.value = function (el, value) {
838 | var checkable = test.isCheckable(el);
839 | var getter = arguments.length < 2;
840 | if (getter) {
841 | return checkable ? el.checked : el.value;
842 | } else if (checkable) {
843 | el.checked = value;
844 | } else {
845 | el.value = value;
846 | }
847 | };
848 |
849 | api.attr = function (el, name, value) {
850 | if (!test.isElement(el)) {
851 | return;
852 | }
853 | if (value === null || value === void 0) {
854 | el.removeAttribute(name); return;
855 | }
856 | var camel = text.hyphenToCamel(name);
857 | if (camel in el) {
858 | el[camel] = value;
859 | } else {
860 | el.setAttribute(name, value);
861 | }
862 | };
863 |
864 | api.getAttr = function (el, name) {
865 | var camel = text.hyphenToCamel(name);
866 | if (camel in el) {
867 | return el[camel];
868 | } else if (el.getAttribute) {
869 | return el.getAttribute(name);
870 | }
871 | return null;
872 | };
873 |
874 | api.manyAttr = function (elem, attrs) {
875 | Object.keys(attrs).forEach(function (attr) {
876 | api.attr(elem, attr, attrs[attr]);
877 | });
878 | };
879 |
880 | api.make = function (type) {
881 | return new Dominus(document.createElement(type));
882 | };
883 |
884 | api.clone = function (el) {
885 | if (el.cloneNode) {
886 | return el.cloneNode(true);
887 | }
888 | return el;
889 | };
890 |
891 | api.remove = function (el) {
892 | if (el.parentElement) {
893 | el.parentElement.removeChild(el);
894 | }
895 | };
896 |
897 | api.append = function (el, target) {
898 | if (manipulationGuard(el, target, api.append)) {
899 | return;
900 | }
901 | if (el.appendChild) {
902 | el.appendChild(target);
903 | }
904 | };
905 |
906 | api.prepend = function (el, target) {
907 | if (manipulationGuard(el, target, api.prepend)) {
908 | return;
909 | }
910 | if (el.insertBefore) {
911 | el.insertBefore(target, el.firstChild);
912 | }
913 | };
914 |
915 | api.before = function (el, target) {
916 | if (manipulationGuard(el, target, api.before)) {
917 | return;
918 | }
919 | if (el.parentElement) {
920 | el.parentElement.insertBefore(target, el);
921 | }
922 | };
923 |
924 | api.after = function (el, target) {
925 | if (manipulationGuard(el, target, api.after)) {
926 | return;
927 | }
928 | if (el.parentElement) {
929 | el.parentElement.insertBefore(target, el.nextSibling);
930 | }
931 | };
932 |
933 | function manipulationGuard (el, target, fn) {
934 | var right = target instanceof Dominus;
935 | var left = el instanceof Dominus;
936 | if (left) {
937 | el.forEach(manipulateMany);
938 | } else if (right) {
939 | manipulate(el, true);
940 | }
941 | return !el || !target || left || right;
942 |
943 | function manipulate (el, precondition) {
944 | if (right) {
945 | target.forEach(function (target, j) {
946 | fn(el, cloneUnless(target, precondition && j === 0));
947 | });
948 | } else {
949 | fn(el, cloneUnless(target, precondition));
950 | }
951 | }
952 |
953 | function manipulateMany (el, i) {
954 | manipulate(el, i === 0);
955 | }
956 | }
957 |
958 | function cloneUnless (target, condition) {
959 | return condition ? target : api.clone(target);
960 | }
961 |
962 | ['appendTo', 'prependTo', 'beforeOf', 'afterOf'].forEach(flip);
963 |
964 | function flip (key) {
965 | var original = key.split(/[A-Z]/)[0];
966 | api[key] = function (el, target) {
967 | api[original](target, el);
968 | };
969 | }
970 |
971 | var numericCssProperties = {
972 | 'column-count': true,
973 | 'fill-opacity': true,
974 | 'flex-grow': true,
975 | 'flex-shrink': true,
976 | 'font-weight': true,
977 | 'line-height': true,
978 | 'opacity': true,
979 | 'order': true,
980 | 'orphans': true,
981 | 'widows': true,
982 | 'z-index': true,
983 | 'zoom': true
984 | };
985 | var numeric = /^\d+$/;
986 | var canFloat = 'float' in document.body.style;
987 |
988 | api.getCss = function (el, prop) {
989 | if (!test.isElement(el)) {
990 | return null;
991 | }
992 | var hprop = text.hyphenate(prop);
993 | var fprop = !canFloat && hprop === 'float' ? 'cssFloat' : hprop;
994 | var result = global.getComputedStyle(el)[hprop];
995 | if (prop === 'opacity' && result === '') {
996 | return 1;
997 | }
998 | if (result.substr(-2) === 'px' || numeric.test(result)) {
999 | return parseFloat(result, 10);
1000 | }
1001 | return result;
1002 | };
1003 |
1004 | api.setCss = function (props) {
1005 | var mapped = Object.keys(props).filter(bad).map(expand);
1006 | function bad (prop) {
1007 | var value = props[prop];
1008 | return value !== null && value === value;
1009 | }
1010 | function expand (prop) {
1011 | var hprop = text.hyphenate(prop);
1012 | var value = props[prop];
1013 | if (typeof value === 'number' && !numericCssProperties[hprop]) {
1014 | value += 'px';
1015 | }
1016 | return {
1017 | name: hprop, value: value
1018 | };
1019 | }
1020 | return function (el) {
1021 | if (!test.isElement(el)) {
1022 | return;
1023 | }
1024 | mapped.forEach(function (prop) {
1025 | el.style[prop.name] = prop.value;
1026 | });
1027 | };
1028 | };
1029 |
1030 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
1031 |
1032 | },{"./Dominus.ctor":7,"./apply":9,"./cast":10,"./test":17,"./text":18,"crossvent":1,"sektor":6}],14:[function(require,module,exports){
1033 | 'use strict';
1034 |
1035 | module.exports = require('./Dominus.prototype');
1036 |
1037 | },{"./Dominus.prototype":8}],15:[function(require,module,exports){
1038 | 'use strict';
1039 |
1040 | var Dominus = require('./Dominus.ctor');
1041 |
1042 | function flatten (a, cache) {
1043 | return a.reduce(function (current, item) {
1044 | if (Dominus.isArray(item)) {
1045 | return flatten(item, current);
1046 | } else if (current.indexOf(item) === -1) {
1047 | return current.concat(item);
1048 | }
1049 | return current;
1050 | }, cache || new Dominus());
1051 | }
1052 |
1053 | module.exports = flatten;
1054 |
1055 | },{"./Dominus.ctor":7}],16:[function(require,module,exports){
1056 | 'use strict';
1057 |
1058 | var dom = require('./dom');
1059 | var cast = require('./cast');
1060 | var custom = require('./custom');
1061 | var Dominus = require('./Dominus.ctor');
1062 | var tag = /^\s*<([a-z]+(?:-[a-z]+)?)\s*\/?>\s*$/i;
1063 |
1064 | function api (selector, context) {
1065 | var notText = typeof selector !== 'string';
1066 | if (notText && arguments.length < 2) {
1067 | return cast(selector);
1068 | }
1069 | if (notText) {
1070 | return new Dominus();
1071 | }
1072 | var matches = selector.match(tag);
1073 | if (matches) {
1074 | return dom.make(matches[1]);
1075 | }
1076 | return api.find(selector, context);
1077 | }
1078 |
1079 | api.find = function (selector, context) {
1080 | return dom.qsa(context, selector);
1081 | };
1082 |
1083 | api.findOne = function (selector, context) {
1084 | return dom.qs(context, selector);
1085 | };
1086 |
1087 | api.custom = custom.register;
1088 |
1089 | module.exports = api;
1090 |
1091 | },{"./Dominus.ctor":7,"./cast":10,"./custom":12,"./dom":13}],17:[function(require,module,exports){
1092 | 'use strict';
1093 |
1094 | var elementObjects = typeof HTMLElement === 'object';
1095 |
1096 | function isElement (o) {
1097 | return elementObjects ? o instanceof HTMLElement : isElementObject(o);
1098 | }
1099 |
1100 | function isElementObject (o) {
1101 | return o &&
1102 | typeof o === 'object' &&
1103 | typeof o.nodeName === 'string' &&
1104 | o.nodeType === 1;
1105 | }
1106 |
1107 | function isArray (a) {
1108 | return Object.prototype.toString.call(a) === '[object Array]';
1109 | }
1110 |
1111 | function isCheckable (elem) {
1112 | return 'checked' in elem && elem.type === 'radio' || elem.type === 'checkbox';
1113 | }
1114 |
1115 | module.exports = {
1116 | isElement: isElement,
1117 | isArray: isArray,
1118 | isCheckable: isCheckable
1119 | };
1120 |
1121 | },{}],18:[function(require,module,exports){
1122 | 'use strict';
1123 |
1124 | function hyphenToCamel (hyphens) {
1125 | var part = /-([a-z])/g;
1126 | return hyphens.replace(part, function (g, m) {
1127 | return m.toUpperCase();
1128 | });
1129 | }
1130 |
1131 | function hyphenate (text) {
1132 | var camel = /([a-z])([A-Z])/g;
1133 | return text.replace(camel, '$1-$2').toLowerCase();
1134 | }
1135 |
1136 | module.exports = {
1137 | hyphenToCamel: hyphenToCamel,
1138 | hyphenate: hyphenate
1139 | };
1140 |
1141 | },{}]},{},[14])(14)
1142 | });
1143 | //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvY3Jvc3N2ZW50L3NyYy9jcm9zc3ZlbnQuanMiLCJub2RlX21vZHVsZXMvY3Jvc3N2ZW50L3NyYy9ldmVudG1hcC5qcyIsIm5vZGVfbW9kdWxlcy9jdXN0b20tZXZlbnQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9zZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9zZXIvc3JjL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvc2VrdG9yL3NyYy9zZWt0b3IuanMiLCJzcmMvRG9taW51cy5jdG9yLmpzIiwic3JjL0RvbWludXMucHJvdG90eXBlLmpzIiwic3JjL2FwcGx5LmpzIiwic3JjL2Nhc3QuanMiLCJzcmMvY2xhc3Nlcy5qcyIsInNyYy9jdXN0b20uanMiLCJzcmMvZG9tLmpzIiwic3JjL2RvbWludXMuanMiLCJzcmMvZmxhdHRlbi5qcyIsInNyYy9wdWJsaWMuanMiLCJzcmMvdGVzdC5qcyIsInNyYy90ZXh0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNyR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM1ZBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIid1c2Ugc3RyaWN0JztcblxudmFyIGN1c3RvbUV2ZW50ID0gcmVxdWlyZSgnY3VzdG9tLWV2ZW50Jyk7XG52YXIgZXZlbnRtYXAgPSByZXF1aXJlKCcuL2V2ZW50bWFwJyk7XG52YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xudmFyIGFkZEV2ZW50ID0gYWRkRXZlbnRFYXN5O1xudmFyIHJlbW92ZUV2ZW50ID0gcmVtb3ZlRXZlbnRFYXN5O1xudmFyIGhhcmRDYWNoZSA9IFtdO1xuXG5pZiAoIWdsb2JhbC5hZGRFdmVudExpc3RlbmVyKSB7XG4gIGFkZEV2ZW50ID0gYWRkRXZlbnRIYXJkO1xuICByZW1vdmVFdmVudCA9IHJlbW92ZUV2ZW50SGFyZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFkZDogYWRkRXZlbnQsXG4gIHJlbW92ZTogcmVtb3ZlRXZlbnQsXG4gIGZhYnJpY2F0ZTogZmFicmljYXRlRXZlbnRcbn07XG5cbmZ1bmN0aW9uIGFkZEV2ZW50RWFzeSAoZWwsIHR5cGUsIGZuLCBjYXB0dXJpbmcpIHtcbiAgcmV0dXJuIGVsLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZm4sIGNhcHR1cmluZyk7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50SGFyZCAoZWwsIHR5cGUsIGZuKSB7XG4gIHJldHVybiBlbC5hdHRhY2hFdmVudCgnb24nICsgdHlwZSwgd3JhcChlbCwgdHlwZSwgZm4pKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRFYXN5IChlbCwgdHlwZSwgZm4sIGNhcHR1cmluZykge1xuICByZXR1cm4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBmbiwgY2FwdHVyaW5nKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRIYXJkIChlbCwgdHlwZSwgZm4pIHtcbiAgdmFyIGxpc3RlbmVyID0gdW53cmFwKGVsLCB0eXBlLCBmbik7XG4gIGlmIChsaXN0ZW5lcikge1xuICAgIHJldHVybiBlbC5kZXRhY2hFdmVudCgnb24nICsgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZhYnJpY2F0ZUV2ZW50IChlbCwgdHlwZSwgbW9kZWwpIHtcbiAgdmFyIGUgPSBldmVudG1hcC5pbmRleE9mKHR5cGUpID09PSAtMSA/IG1ha2VDdXN0b21FdmVudCgpIDogbWFrZUNsYXNzaWNFdmVudCgpO1xuICBpZiAoZWwuZGlzcGF0Y2hFdmVudCkge1xuICAgIGVsLmRpc3BhdGNoRXZlbnQoZSk7XG4gIH0gZWxzZSB7XG4gICAgZWwuZmlyZUV2ZW50KCdvbicgKyB0eXBlLCBlKTtcbiAgfVxuICBmdW5jdGlvbiBtYWtlQ2xhc3NpY0V2ZW50ICgpIHtcbiAgICB2YXIgZTtcbiAgICBpZiAoZG9jLmNyZWF0ZUV2ZW50KSB7XG4gICAgICBlID0gZG9jLmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgZS5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChkb2MuY3JlYXRlRXZlbnRPYmplY3QpIHtcbiAgICAgIGUgPSBkb2MuY3JlYXRlRXZlbnRPYmplY3QoKTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgZnVuY3Rpb24gbWFrZUN1c3RvbUV2ZW50ICgpIHtcbiAgICByZXR1cm4gbmV3IGN1c3RvbUV2ZW50KHR5cGUsIHsgZGV0YWlsOiBtb2RlbCB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3cmFwcGVyRmFjdG9yeSAoZWwsIHR5cGUsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiB3cmFwcGVyIChvcmlnaW5hbEV2ZW50KSB7XG4gICAgdmFyIGUgPSBvcmlnaW5hbEV2ZW50IHx8IGdsb2JhbC5ldmVudDtcbiAgICBlLnRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICBlLnByZXZlbnREZWZhdWx0ID0gZS5wcmV2ZW50RGVmYXVsdCB8fCBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCAoKSB7IGUucmV0dXJuVmFsdWUgPSBmYWxzZTsgfTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbiA9IGUuc3RvcFByb3BhZ2F0aW9uIHx8IGZ1bmN0aW9uIHN0b3BQcm9wYWdhdGlvbiAoKSB7IGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsgfTtcbiAgICBlLndoaWNoID0gZS53aGljaCB8fCBlLmtleUNvZGU7XG4gICAgZm4uY2FsbChlbCwgZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHdyYXAgKGVsLCB0eXBlLCBmbikge1xuICB2YXIgd3JhcHBlciA9IHVud3JhcChlbCwgdHlwZSwgZm4pIHx8IHdyYXBwZXJGYWN0b3J5KGVsLCB0eXBlLCBmbik7XG4gIGhhcmRDYWNoZS5wdXNoKHtcbiAgICB3cmFwcGVyOiB3cmFwcGVyLFxuICAgIGVsZW1lbnQ6IGVsLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgZm46IGZuXG4gIH0pO1xuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZnVuY3Rpb24gdW53cmFwIChlbCwgdHlwZSwgZm4pIHtcbiAgdmFyIGkgPSBmaW5kKGVsLCB0eXBlLCBmbik7XG4gIGlmIChpKSB7XG4gICAgdmFyIHdyYXBwZXIgPSBoYXJkQ2FjaGVbaV0ud3JhcHBlcjtcbiAgICBoYXJkQ2FjaGUuc3BsaWNlKGksIDEpOyAvLyBmcmVlIHVwIGEgdGFkIG9mIG1lbW9yeVxuICAgIHJldHVybiB3cmFwcGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmQgKGVsLCB0eXBlLCBmbikge1xuICB2YXIgaSwgaXRlbTtcbiAgZm9yIChpID0gMDsgaSA8IGhhcmRDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgIGl0ZW0gPSBoYXJkQ2FjaGVbaV07XG4gICAgaWYgKGl0ZW0uZWxlbWVudCA9PT0gZWwgJiYgaXRlbS50eXBlID09PSB0eXBlICYmIGl0ZW0uZm4gPT09IGZuKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGV2ZW50bWFwID0gW107XG52YXIgZXZlbnRuYW1lID0gJyc7XG52YXIgcm9uID0gL15vbi87XG5cbmZvciAoZXZlbnRuYW1lIGluIGdsb2JhbCkge1xuICBpZiAocm9uLnRlc3QoZXZlbnRuYW1lKSkge1xuICAgIGV2ZW50bWFwLnB1c2goZXZlbnRuYW1lLnNsaWNlKDIpKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV2ZW50bWFwO1xuIiwiXG52YXIgTmF0aXZlQ3VzdG9tRXZlbnQgPSBnbG9iYWwuQ3VzdG9tRXZlbnQ7XG5cbmZ1bmN0aW9uIHVzZU5hdGl2ZSAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHAgPSBuZXcgTmF0aXZlQ3VzdG9tRXZlbnQoJ2NhdCcsIHsgZGV0YWlsOiB7IGZvbzogJ2JhcicgfSB9KTtcbiAgICByZXR1cm4gICdjYXQnID09PSBwLnR5cGUgJiYgJ2JhcicgPT09IHAuZGV0YWlsLmZvbztcbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcm9zcy1icm93c2VyIGBDdXN0b21FdmVudGAgY29uc3RydWN0b3IuXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50LkN1c3RvbUV2ZW50XG4gKlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXNlTmF0aXZlKCkgPyBOYXRpdmVDdXN0b21FdmVudCA6XG5cbi8vIElFID49IDlcbidmdW5jdGlvbicgPT09IHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA/IGZ1bmN0aW9uIEN1c3RvbUV2ZW50ICh0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgaWYgKHBhcmFtcykge1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gIH0gZWxzZSB7XG4gICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCB2b2lkIDApO1xuICB9XG4gIHJldHVybiBlO1xufSA6XG5cbi8vIElFIDw9IDhcbmZ1bmN0aW9uIEN1c3RvbUV2ZW50ICh0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xuICBlLnR5cGUgPSB0eXBlO1xuICBpZiAocGFyYW1zKSB7XG4gICAgZS5idWJibGVzID0gQm9vbGVhbihwYXJhbXMuYnViYmxlcyk7XG4gICAgZS5jYW5jZWxhYmxlID0gQm9vbGVhbihwYXJhbXMuY2FuY2VsYWJsZSk7XG4gICAgZS5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICB9IGVsc2Uge1xuICAgIGUuYnViYmxlcyA9IGZhbHNlO1xuICAgIGUuY2FuY2VsYWJsZSA9IGZhbHNlO1xuICAgIGUuZGV0YWlsID0gdm9pZCAwO1xuICB9XG4gIHJldHVybiBlO1xufVxuIiwidmFyIHBvc2VyID0gcmVxdWlyZSgnLi9zcmMvbm9kZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBvc2VyO1xuXG5bJ0FycmF5JywgJ0Z1bmN0aW9uJywgJ09iamVjdCcsICdEYXRlJywgJ1N0cmluZyddLmZvckVhY2gocG9zZSk7XG5cbmZ1bmN0aW9uIHBvc2UgKHR5cGUpIHtcbiAgcG9zZXJbdHlwZV0gPSBmdW5jdGlvbiBwb3NlQ29tcHV0ZWRUeXBlICgpIHsgcmV0dXJuIHBvc2VyKHR5cGUpOyB9O1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZCA9IGdsb2JhbC5kb2N1bWVudDtcblxuZnVuY3Rpb24gcG9zZXIgKHR5cGUpIHtcbiAgdmFyIGlmcmFtZSA9IGQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuXG4gIHJldHVybiBtYXAodHlwZSwgaWZyYW1lLmNvbnRlbnRXaW5kb3cpO1xufVxuXG5mdW5jdGlvbiBtYXAgKHR5cGUsIHNvdXJjZSkgeyAvLyBmb3J3YXJkIHBvbHlmaWxscyB0byB0aGUgc3RvbGVuIHJlZmVyZW5jZSFcbiAgdmFyIG9yaWdpbmFsID0gd2luZG93W3R5cGVdLnByb3RvdHlwZTtcbiAgdmFyIHZhbHVlID0gc291cmNlW3R5cGVdO1xuICB2YXIgcHJvcDtcblxuICBmb3IgKHByb3AgaW4gb3JpZ2luYWwpIHtcbiAgICB2YWx1ZS5wcm90b3R5cGVbcHJvcF0gPSBvcmlnaW5hbFtwcm9wXTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwb3NlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGV4cGFuZG8gPSAnc2VrdG9yLScgKyBEYXRlLm5vdygpO1xudmFyIHJzaWJsaW5ncyA9IC9bK35dLztcbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBkZWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwge307XG52YXIgbWF0Y2ggPSAoXG4gIGRlbC5tYXRjaGVzIHx8XG4gIGRlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcbiAgZGVsLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuICBkZWwub01hdGNoZXNTZWxlY3RvciB8fFxuICBkZWwubXNNYXRjaGVzU2VsZWN0b3IgfHxcbiAgbmV2ZXJcbik7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VrdG9yO1xuXG5zZWt0b3IubWF0Y2hlcyA9IG1hdGNoZXM7XG5zZWt0b3IubWF0Y2hlc1NlbGVjdG9yID0gbWF0Y2hlc1NlbGVjdG9yO1xuXG5mdW5jdGlvbiBxc2EgKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gIHZhciBleGlzdGVkLCBpZCwgcHJlZml4LCBwcmVmaXhlZCwgYWRhcHRlciwgaGFjayA9IGNvbnRleHQgIT09IGRvY3VtZW50O1xuICBpZiAoaGFjaykgeyAvLyBpZCBoYWNrIGZvciBjb250ZXh0LXJvb3RlZCBxdWVyaWVzXG4gICAgZXhpc3RlZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgIGlkID0gZXhpc3RlZCB8fCBleHBhbmRvO1xuICAgIHByZWZpeCA9ICcjJyArIGlkICsgJyAnO1xuICAgIHByZWZpeGVkID0gcHJlZml4ICsgc2VsZWN0b3IucmVwbGFjZSgvLC9nLCAnLCcgKyBwcmVmaXgpO1xuICAgIGFkYXB0ZXIgPSByc2libGluZ3MudGVzdChzZWxlY3RvcikgJiYgY29udGV4dC5wYXJlbnROb2RlO1xuICAgIGlmICghZXhpc3RlZCkgeyBjb250ZXh0LnNldEF0dHJpYnV0ZSgnaWQnLCBpZCk7IH1cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiAoYWRhcHRlciB8fCBjb250ZXh0KS5xdWVyeVNlbGVjdG9yQWxsKHByZWZpeGVkIHx8IHNlbGVjdG9yKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZXhpc3RlZCA9PT0gbnVsbCkgeyBjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNla3RvciAoc2VsZWN0b3IsIGN0eCwgY29sbGVjdGlvbiwgc2VlZCkge1xuICB2YXIgZWxlbWVudDtcbiAgdmFyIGNvbnRleHQgPSBjdHggfHwgZG9jdW1lbnQ7XG4gIHZhciByZXN1bHRzID0gY29sbGVjdGlvbiB8fCBbXTtcbiAgdmFyIGkgPSAwO1xuICBpZiAodHlwZW9mIHNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIGlmIChjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkpIHtcbiAgICByZXR1cm4gW107IC8vIGJhaWwgaWYgY29udGV4dCBpcyBub3QgYW4gZWxlbWVudCBvciBkb2N1bWVudFxuICB9XG4gIGlmIChzZWVkKSB7XG4gICAgd2hpbGUgKChlbGVtZW50ID0gc2VlZFtpKytdKSkge1xuICAgICAgaWYgKG1hdGNoZXNTZWxlY3RvcihlbGVtZW50LCBzZWxlY3RvcikpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHRzLnB1c2guYXBwbHkocmVzdWx0cywgcXNhKHNlbGVjdG9yLCBjb250ZXh0KSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMgKHNlbGVjdG9yLCBlbGVtZW50cykge1xuICByZXR1cm4gc2VrdG9yKHNlbGVjdG9yLCBudWxsLCBudWxsLCBlbGVtZW50cyk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvciAoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgcmV0dXJuIG1hdGNoLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpO1xufVxuXG5mdW5jdGlvbiBuZXZlciAoKSB7IHJldHVybiBmYWxzZTsgfVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcG9zZXIgPSByZXF1aXJlKCdwb3NlcicpO1xudmFyIERvbWludXMgPSBwb3Nlci5BcnJheSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERvbWludXM7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciAkID0gcmVxdWlyZSgnLi9wdWJsaWMnKTtcbnZhciBmbGF0dGVuID0gcmVxdWlyZSgnLi9mbGF0dGVuJyk7XG52YXIgZG9tID0gcmVxdWlyZSgnLi9kb20nKTtcbnZhciBhcHBseSA9IHJlcXVpcmUoJy4vYXBwbHknKTtcbnZhciBjdXN0b20gPSByZXF1aXJlKCcuL2N1c3RvbScpO1xudmFyIGNsYXNzZXMgPSByZXF1aXJlKCcuL2NsYXNzZXMnKTtcbnZhciBEb21pbnVzID0gcmVxdWlyZSgnLi9Eb21pbnVzLmN0b3InKTtcblxuZnVuY3Rpb24gZXF1YWxzIChzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24gZXF1YWxzIChlbGVtKSB7XG4gICAgcmV0dXJuIGRvbS5tYXRjaGVzKGVsZW0sIHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3RyYWlnaHQgKHByb3AsIG9uZSkge1xuICByZXR1cm4gZnVuY3Rpb24gZG9tTWFwcGluZyAoc2VsZWN0b3IpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5tYXAoZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgIHJldHVybiBkb21bcHJvcF0oZWxlbSwgc2VsZWN0b3IpO1xuICAgIH0pO1xuICAgIHZhciByZXN1bHRzID0gZmxhdHRlbihyZXN1bHQpO1xuICAgIHJldHVybiBvbmUgPyByZXN1bHRzWzBdIDogcmVzdWx0cztcbiAgfTtcbn1cblxuRG9taW51cy5wcm90b3R5cGUucHJldiA9IHN0cmFpZ2h0KCdwcmV2Jyk7XG5Eb21pbnVzLnByb3RvdHlwZS5uZXh0ID0gc3RyYWlnaHQoJ25leHQnKTtcbkRvbWludXMucHJvdG90eXBlLnBhcmVudCA9IHN0cmFpZ2h0KCdwYXJlbnQnKTtcbkRvbWludXMucHJvdG90eXBlLnBhcmVudHMgPSBzdHJhaWdodCgncGFyZW50cycpO1xuRG9taW51cy5wcm90b3R5cGUuY2hpbGRyZW4gPSBzdHJhaWdodCgnY2hpbGRyZW4nKTtcbkRvbWludXMucHJvdG90eXBlLmZpbmQgPSBzdHJhaWdodCgncXNhJyk7XG5Eb21pbnVzLnByb3RvdHlwZS5maW5kT25lID0gc3RyYWlnaHQoJ3FzJywgdHJ1ZSk7XG5cbkRvbWludXMucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLmZpbHRlcihlcXVhbHMoc2VsZWN0b3IpKTtcbn07XG5cbkRvbWludXMucHJvdG90eXBlLmlzID0gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG4gIHJldHVybiB0aGlzLnNvbWUoZXF1YWxzKHNlbGVjdG9yKSk7XG59O1xuXG5Eb21pbnVzLnByb3RvdHlwZS5pID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gIHJldHVybiB0aGlzW2luZGV4XSA/IG5ldyBEb21pbnVzKHRoaXNbaW5kZXhdKSA6IG5ldyBEb21pbnVzKCk7XG59O1xuXG5mdW5jdGlvbiBjb21wYXJlRmFjdG9yeSAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXBhcmUgKCkge1xuICAgIHZhciBjb3B5ID0gYXBwbHkodGhpcyk7XG4gICAgJC5hcHBseShudWxsLCBhcmd1bWVudHMpLmZvckVhY2goZm4sIGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9O1xufVxuXG5Eb21pbnVzLnByb3RvdHlwZS5hbmQgPSBjb21wYXJlRmFjdG9yeShmdW5jdGlvbiBhZGRPbmUgKGVsZW0pIHtcbiAgaWYgKHRoaXMuaW5kZXhPZihlbGVtKSA9PT0gLTEpIHtcbiAgICB0aGlzLnB1c2goZWxlbSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59KTtcblxuRG9taW51cy5wcm90b3R5cGUuYnV0ID0gY29tcGFyZUZhY3RvcnkoZnVuY3Rpb24gYWRkT25lIChlbGVtKSB7XG4gIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihlbGVtKTtcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIHRoaXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn0pO1xuXG5Eb21pbnVzLnByb3RvdHlwZS5jc3MgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgdmFyIHByb3BzO1xuICB2YXIgbWFueSA9IG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnO1xuICB2YXIgZ2V0dGVyID0gIW1hbnkgJiYgIXZhbHVlO1xuICBpZiAoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID8gZG9tLmdldENzcyh0aGlzWzBdLCBuYW1lKSA6IG51bGw7XG4gIH1cbiAgaWYgKG1hbnkpIHtcbiAgICBwcm9wcyA9IG5hbWU7XG4gIH0gZWxzZSB7XG4gICAgcHJvcHMgPSB7fTtcbiAgICBwcm9wc1tuYW1lXSA9IHZhbHVlO1xuICB9XG4gIHRoaXMuZm9yRWFjaChkb20uc2V0Q3NzKHByb3BzKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gZXZlbnRlciAobWV0aG9kKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodHlwZXMsIGZpbHRlciwgZm4pIHtcbiAgICB2YXIgdHlwZWxpc3QgPSB0eXBlcy5zcGxpdCgnICcpO1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZuID0gZmlsdGVyO1xuICAgICAgZmlsdGVyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICB0eXBlbGlzdC5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHZhciBoYW5kbGVyID0gY3VzdG9tLmhhbmRsZXJzW3R5cGVdO1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGRvbVttZXRob2RdKGVsZW0sIGhhbmRsZXIuZXZlbnQsIGZpbHRlciwgaGFuZGxlci53cmFwKGZuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9tW21ldGhvZF0oZWxlbSwgdHlwZSwgZmlsdGVyLCBmbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5Eb21pbnVzLnByb3RvdHlwZS5vbmNlID0gZXZlbnRlcignb25jZScpO1xuRG9taW51cy5wcm90b3R5cGUub24gPSBldmVudGVyKCdvbicpO1xuRG9taW51cy5wcm90b3R5cGUub2ZmID0gZXZlbnRlcignb2ZmJyk7XG5Eb21pbnVzLnByb3RvdHlwZS5lbWl0ID0gZXZlbnRlcignZW1pdCcpO1xuXG5bXG4gIFsnYWRkQ2xhc3MnLCBjbGFzc2VzLmFkZF0sXG4gIFsncmVtb3ZlQ2xhc3MnLCBjbGFzc2VzLnJlbW92ZV0sXG4gIFsnc2V0Q2xhc3MnLCBjbGFzc2VzLnNldF0sXG4gIFsncmVtb3ZlQ2xhc3MnLCBjbGFzc2VzLnJlbW92ZV0sXG4gIFsncmVtb3ZlJywgZG9tLnJlbW92ZV1cbl0uZm9yRWFjaChtYXBNZXRob2RzKTtcblxuZnVuY3Rpb24gbWFwTWV0aG9kcyAoZGF0YSkge1xuICBEb21pbnVzLnByb3RvdHlwZVtkYXRhWzBdXSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbSkge1xuICAgICAgZGF0YVsxXShlbGVtLCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbltcbiAgJ2FwcGVuZCcsXG4gICdhcHBlbmRUbycsXG4gICdwcmVwZW5kJyxcbiAgJ3ByZXBlbmRUbycsXG4gICdiZWZvcmUnLFxuICAnYmVmb3JlT2YnLFxuICAnYWZ0ZXInLFxuICAnYWZ0ZXJPZidcbl0uZm9yRWFjaChtYXBNYW5pcHVsYXRpb24pO1xuXG5mdW5jdGlvbiBtYXBNYW5pcHVsYXRpb24gKG1ldGhvZCkge1xuICBEb21pbnVzLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgZG9tW21ldGhvZF0odGhpcywgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5Eb21pbnVzLnByb3RvdHlwZS5oYXNDbGFzcyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5zb21lKGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMuY29udGFpbnMoZWxlbSwgdmFsdWUpO1xuICB9KTtcbn07XG5cbkRvbWludXMucHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgdmFyIGhhc2ggPSBuYW1lICYmIHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JztcbiAgdmFyIHNldCA9IGhhc2ggPyBzZXRNYW55IDogc2V0U2luZ2xlO1xuICB2YXIgc2V0dGVyID0gaGFzaCB8fCBhcmd1bWVudHMubGVuZ3RoID4gMTtcbiAgaWYgKHNldHRlcikge1xuICAgIHRoaXMuZm9yRWFjaChzZXQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA/IGRvbS5nZXRBdHRyKHRoaXNbMF0sIG5hbWUpIDogbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBzZXRNYW55IChlbGVtKSB7XG4gICAgZG9tLm1hbnlBdHRyKGVsZW0sIG5hbWUpO1xuICB9XG4gIGZ1bmN0aW9uIHNldFNpbmdsZSAoZWxlbSkge1xuICAgIGRvbS5hdHRyKGVsZW0sIG5hbWUsIHZhbHVlKTtcbiAgfVxufTtcblxuZnVuY3Rpb24ga2V5VmFsdWUgKGtleSwgdmFsdWUpIHtcbiAgdmFyIGdldHRlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAyO1xuICBpZiAoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID8gZG9tW2tleV0odGhpc1swXSkgOiAnJztcbiAgfVxuICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGVsZW0pIHtcbiAgICBkb21ba2V5XShlbGVtLCB2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn1cblxuZnVuY3Rpb24ga2V5VmFsdWVQcm9wZXJ0eSAocHJvcCkge1xuICBEb21pbnVzLnByb3RvdHlwZVtwcm9wXSA9IGZ1bmN0aW9uIGFjY2Vzc29yICh2YWx1ZSkge1xuICAgIHZhciBnZXR0ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMTtcbiAgICBpZiAoZ2V0dGVyKSB7XG4gICAgICByZXR1cm4ga2V5VmFsdWUuY2FsbCh0aGlzLCBwcm9wKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleVZhbHVlLmNhbGwodGhpcywgcHJvcCwgdmFsdWUpO1xuICB9O1xufVxuXG5bJ2h0bWwnLCAndGV4dCcsICd2YWx1ZSddLmZvckVhY2goa2V5VmFsdWVQcm9wZXJ0eSk7XG5cbkRvbWludXMucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGVsZW0pIHtcbiAgICByZXR1cm4gZG9tLmNsb25lKGVsZW0pO1xuICB9KTtcbn07XG5cbkRvbWludXMucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5sZW5ndGgpIHtcbiAgICB0aGlzWzBdLmZvY3VzKCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vcHVibGljJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBEb21pbnVzID0gcmVxdWlyZSgnLi9Eb21pbnVzLmN0b3InKTtcbnZhciBwcm90byA9IERvbWludXMucHJvdG90eXBlO1xuXG5mdW5jdGlvbiBBcHBsaWVkIChhcmdzKSB7XG4gIHJldHVybiBEb21pbnVzLmFwcGx5KHRoaXMsIGFyZ3MpO1xufVxuXG5BcHBsaWVkLnByb3RvdHlwZSA9IHByb3RvO1xuXG5mdW5jdGlvbiBhcHBseSAoYSkge1xuICByZXR1cm4gbmV3IEFwcGxpZWQoYSk7XG59XG5cblsnbWFwJywgJ2ZpbHRlcicsICdjb25jYXQnLCAnc2xpY2UnXS5mb3JFYWNoKGVuc3VyZSk7XG5cbmZ1bmN0aW9uIGVuc3VyZSAoa2V5KSB7XG4gIHZhciBvcmlnaW5hbCA9IHByb3RvW2tleV07XG4gIHByb3RvW2tleV0gPSBmdW5jdGlvbiBhcHBsaWVkICgpIHtcbiAgICByZXR1cm4gYXBwbHkob3JpZ2luYWwuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYXBwbHk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB0ZXN0ID0gcmVxdWlyZSgnLi90ZXN0Jyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuL2FwcGx5Jyk7XG52YXIgRG9taW51cyA9IHJlcXVpcmUoJy4vRG9taW51cy5jdG9yJyk7XG5cbmZ1bmN0aW9uIGNhc3QgKGEpIHtcbiAgaWYgKGEgPT09IGdsb2JhbCkge1xuICAgIHJldHVybiBuZXcgRG9taW51cyhhKTtcbiAgfVxuICBpZiAoYSBpbnN0YW5jZW9mIERvbWludXMpIHtcbiAgICByZXR1cm4gYTtcbiAgfVxuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gbmV3IERvbWludXMoKTtcbiAgfVxuICBpZiAodGVzdC5pc0VsZW1lbnQoYSkpIHtcbiAgICByZXR1cm4gbmV3IERvbWludXMoYSk7XG4gIH1cbiAgaWYgKCF0ZXN0LmlzQXJyYXkoYSkpIHtcbiAgICByZXR1cm4gbmV3IERvbWludXMoKTtcbiAgfVxuICByZXR1cm4gYXBwbHkoYSkuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIHRlc3QuaXNFbGVtZW50KGkpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYXN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xudmFyIHdoaXRlc3BhY2UgPSAvXFxzKy9nO1xudmFyIHRlc3QgPSByZXF1aXJlKCcuL3Rlc3QnKTtcblxuZnVuY3Rpb24gaW50ZXJwcmV0IChpbnB1dCkge1xuICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IGlucHV0LnJlcGxhY2UodHJpbSwgJycpLnNwbGl0KHdoaXRlc3BhY2UpIDogaW5wdXQ7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXMgKGVsKSB7XG4gIGlmICh0ZXN0LmlzRWxlbWVudChlbCkpIHtcbiAgICByZXR1cm4gZWwuY2xhc3NOYW1lLnJlcGxhY2UodHJpbSwgJycpLnNwbGl0KHdoaXRlc3BhY2UpO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gc2V0IChlbCwgaW5wdXQpIHtcbiAgaWYgKHRlc3QuaXNFbGVtZW50KGVsKSkge1xuICAgIGVsLmNsYXNzTmFtZSA9IGludGVycHJldChpbnB1dCkuam9pbignICcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZCAoZWwsIGlucHV0KSB7XG4gIHZhciBjdXJyZW50ID0gcmVtb3ZlKGVsLCBpbnB1dCk7XG4gIHZhciB2YWx1ZXMgPSBpbnRlcnByZXQoaW5wdXQpO1xuICBjdXJyZW50LnB1c2guYXBwbHkoY3VycmVudCwgdmFsdWVzKTtcbiAgc2V0KGVsLCBjdXJyZW50KTtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSAoZWwsIGlucHV0KSB7XG4gIHZhciBjdXJyZW50ID0gY2xhc3NlcyhlbCk7XG4gIHZhciB2YWx1ZXMgPSBpbnRlcnByZXQoaW5wdXQpO1xuICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgaSA9IGN1cnJlbnQuaW5kZXhPZih2YWx1ZSk7XG4gICAgaWYgKGkgIT09IC0xKSB7XG4gICAgICBjdXJyZW50LnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH0pO1xuICBzZXQoZWwsIGN1cnJlbnQpO1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gY29udGFpbnMgKGVsLCBpbnB1dCkge1xuICB2YXIgY3VycmVudCA9IGNsYXNzZXMoZWwpO1xuICB2YXIgdmFsdWVzID0gaW50ZXJwcmV0KGlucHV0KTtcblxuICByZXR1cm4gdmFsdWVzLmV2ZXJ5KGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBjdXJyZW50LmluZGV4T2YodmFsdWUpICE9PSAtMTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGQ6IGFkZCxcbiAgcmVtb3ZlOiByZW1vdmUsXG4gIGNvbnRhaW5zOiBjb250YWlucyxcbiAgc2V0OiBzZXQsXG4gIGdldDogY2xhc3Nlc1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhbmRsZXJzID0ge307XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyIChuYW1lLCB0eXBlLCBmaWx0ZXIpIHtcbiAgaGFuZGxlcnNbbmFtZV0gPSB7XG4gICAgZXZlbnQ6IHR5cGUsXG4gICAgZmlsdGVyOiBmaWx0ZXIsXG4gICAgd3JhcDogd3JhcFxuICB9O1xuXG4gIGZ1bmN0aW9uIHdyYXAgKGZuKSB7XG4gICAgcmV0dXJuIHdyYXBwZXIobmFtZSwgZm4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdyYXBwZXIgKG5hbWUsIGZuKSB7XG4gIGlmICghZm4pIHtcbiAgICByZXR1cm4gZm47XG4gIH1cbiAgdmFyIGtleSA9ICdfX2RjZV8nICsgbmFtZTtcbiAgaWYgKGZuW2tleV0pIHtcbiAgICByZXR1cm4gZm5ba2V5XTtcbiAgfVxuICBmbltrZXldID0gZnVuY3Rpb24gY3VzdG9tRXZlbnQgKGUpIHtcbiAgICB2YXIgbWF0Y2ggPSBoYW5kbGVyc1tuYW1lXS5maWx0ZXIoZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBmbltrZXldO1xufVxuXG5yZWdpc3RlcignbGVmdC1jbGljaycsICdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBlLndoaWNoID09PSAxICYmICFlLm1ldGFLZXkgJiYgIWUuY3RybEtleTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmVnaXN0ZXI6IHJlZ2lzdGVyLFxuICB3cmFwcGVyOiB3cmFwcGVyLFxuICBoYW5kbGVyczogaGFuZGxlcnNcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzZWt0b3IgPSByZXF1aXJlKCdzZWt0b3InKTtcbnZhciBjcm9zc3ZlbnQgPSByZXF1aXJlKCdjcm9zc3ZlbnQnKTtcbnZhciBEb21pbnVzID0gcmVxdWlyZSgnLi9Eb21pbnVzLmN0b3InKTtcbnZhciBjYXN0ID0gcmVxdWlyZSgnLi9jYXN0Jyk7XG52YXIgYXBwbHkgPSByZXF1aXJlKCcuL2FwcGx5Jyk7XG52YXIgdGV4dCA9IHJlcXVpcmUoJy4vdGV4dCcpO1xudmFyIHRlc3QgPSByZXF1aXJlKCcuL3Rlc3QnKTtcbnZhciBhcGkgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xudmFyIGRlbGVnYXRlcyA9IHt9O1xuXG5mdW5jdGlvbiBjYXN0Q29udGV4dCAoY29udGV4dCkge1xuICBpZiAodHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGFwaS5xcyhudWxsLCBjb250ZXh0KTtcbiAgfVxuICBpZiAodGVzdC5pc0VsZW1lbnQoY29udGV4dCkpIHtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIERvbWludXMpIHtcbiAgICByZXR1cm4gY29udGV4dFswXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuYXBpLnFzYSA9IGZ1bmN0aW9uIChlbCwgc2VsZWN0b3IpIHtcbiAgdmFyIHJlc3VsdHMgPSBuZXcgRG9taW51cygpO1xuICByZXR1cm4gc2VrdG9yKHNlbGVjdG9yLCBjYXN0Q29udGV4dChlbCksIHJlc3VsdHMpO1xufTtcblxuYXBpLnFzID0gZnVuY3Rpb24gKGVsLCBzZWxlY3Rvcikge1xuICByZXR1cm4gYXBpLnFzYShlbCwgc2VsZWN0b3IpWzBdO1xufTtcblxuYXBpLm1hdGNoZXMgPSBmdW5jdGlvbiAoZWwsIHNlbGVjdG9yKSB7XG4gIHJldHVybiB0ZXN0LmlzRWxlbWVudChlbCkgJiYgc2VrdG9yLm1hdGNoZXNTZWxlY3RvcihlbCwgc2VsZWN0b3IpO1xufTtcblxuZnVuY3Rpb24gcmVsYXRlZEZhY3RvcnkgKHByb3ApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHJlbGF0ZWQgKGVsLCBzZWxlY3Rvcikge1xuICAgIHZhciByZWxhdGl2ZSA9IGVsW3Byb3BdO1xuICAgIGlmIChyZWxhdGl2ZSkge1xuICAgICAgaWYgKCFzZWxlY3RvciB8fCBhcGkubWF0Y2hlcyhyZWxhdGl2ZSwgc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBjYXN0KHJlbGF0aXZlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEb21pbnVzKCk7XG4gIH07XG59XG5cbmFwaS5wcmV2ID0gcmVsYXRlZEZhY3RvcnkoJ3ByZXZpb3VzRWxlbWVudFNpYmxpbmcnKTtcbmFwaS5uZXh0ID0gcmVsYXRlZEZhY3RvcnkoJ25leHRFbGVtZW50U2libGluZycpO1xuYXBpLnBhcmVudCA9IHJlbGF0ZWRGYWN0b3J5KCdwYXJlbnRFbGVtZW50Jyk7XG5cbmZ1bmN0aW9uIG1hdGNoZXMgKGVsLCB2YWx1ZSkge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG9taW51cykge1xuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKGVsKSAhPT0gLTE7XG4gIH1cbiAgaWYgKHRlc3QuaXNFbGVtZW50KHZhbHVlKSkge1xuICAgIHJldHVybiBlbCA9PT0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGFwaS5tYXRjaGVzKGVsLCB2YWx1ZSk7XG59XG5cbmFwaS5wYXJlbnRzID0gZnVuY3Rpb24gKGVsLCB2YWx1ZSkge1xuICB2YXIgZWxlbWVudHMgPSBbXTtcbiAgdmFyIGN1cnJlbnQgPSBlbDtcbiAgd2hpbGUgKGN1cnJlbnQucGFyZW50RWxlbWVudCkge1xuICAgIGlmIChtYXRjaGVzKGN1cnJlbnQucGFyZW50RWxlbWVudCwgdmFsdWUpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGN1cnJlbnQucGFyZW50RWxlbWVudCk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGFwcGx5KGVsZW1lbnRzKTtcbn07XG5cbmFwaS5jaGlsZHJlbiA9IGZ1bmN0aW9uIChlbCwgdmFsdWUpIHtcbiAgdmFyIGVsZW1lbnRzID0gW107XG4gIHZhciBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuICB2YXIgY2hpbGQ7XG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBjaGlsZHJlbiAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChtYXRjaGVzKGNoaWxkLCB2YWx1ZSkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goY2hpbGQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXBwbHkoZWxlbWVudHMpO1xufTtcblxuLy8gdGhpcyBtZXRob2QgY2FjaGVzIGRlbGVnYXRlcyBzbyB0aGF0IC5vZmYoKSB3b3JrcyBzZWFtbGVzc2x5XG5mdW5jdGlvbiBkZWxlZ2F0ZSAocm9vdCwgZmlsdGVyLCBmbikge1xuICBpZiAoZGVsZWdhdGVzW2ZuLl9kZF0pIHtcbiAgICByZXR1cm4gZGVsZWdhdGVzW2ZuLl9kZF07XG4gIH1cbiAgZm4uX2RkID0gRGF0ZS5ub3coKTtcbiAgZGVsZWdhdGVzW2ZuLl9kZF0gPSBkZWxlZ2F0b3I7XG4gIGZ1bmN0aW9uIGRlbGVnYXRvciAoZSkge1xuICAgIHZhciBlbCA9IGUudGFyZ2V0O1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gcm9vdCkge1xuICAgICAgaWYgKGFwaS5tYXRjaGVzKGVsLCBmaWx0ZXIpKSB7XG4gICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsID0gZWwucGFyZW50RWxlbWVudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlbGVnYXRvcjtcbn1cblxuZnVuY3Rpb24gZXZlbnRlZCAobWV0aG9kLCBlbCwgdHlwZSwgZmlsdGVyLCBmbikge1xuICBpZiAoZmlsdGVyID09PSBudWxsKSB7XG4gICAgY3Jvc3N2ZW50W21ldGhvZF0oZWwsIHR5cGUsIGZuKTtcbiAgfSBlbHNlIHtcbiAgICBjcm9zc3ZlbnRbbWV0aG9kXShlbCwgdHlwZSwgZGVsZWdhdGUoZWwsIGZpbHRlciwgZm4pKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbmNlIChlbCwgdHlwZSwgZmlsdGVyLCBmbikge1xuICB2YXIgdGhpbmdzID0gW2VsLCB0eXBlLCBmaWx0ZXIsIGRpc3Bvc2FibGVdO1xuICBhcGkub24uYXBwbHkoYXBpLCB0aGluZ3MpO1xuICBmdW5jdGlvbiBkaXNwb3NhYmxlICgpIHtcbiAgICBhcGkub2ZmLmFwcGx5KGFwaSwgdGhpbmdzKTtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxufVxuXG5hcGkub25jZSA9IG9uY2U7XG5hcGkub24gPSBldmVudGVkLmJpbmQobnVsbCwgJ2FkZCcpO1xuYXBpLm9mZiA9IGV2ZW50ZWQuYmluZChudWxsLCAncmVtb3ZlJyk7XG5hcGkuZW1pdCA9IGV2ZW50ZWQuYmluZChudWxsLCAnZmFicmljYXRlJyk7XG5cbmFwaS5odG1sID0gZnVuY3Rpb24gKGVsZW0sIGh0bWwpIHtcbiAgdmFyIGdldHRlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAyO1xuICBpZiAoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIGVsZW0uaW5uZXJIVE1MO1xuICB9IGVsc2Uge1xuICAgIGVsZW0uaW5uZXJIVE1MID0gaHRtbDtcbiAgfVxufTtcblxuYXBpLnRleHQgPSBmdW5jdGlvbiAoZWxlbSwgdGV4dCkge1xuICB2YXIgY2hlY2thYmxlID0gdGVzdC5pc0NoZWNrYWJsZShlbGVtKTtcbiAgdmFyIGdldHRlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAyO1xuICBpZiAoZ2V0dGVyKSB7XG4gICAgcmV0dXJuIGNoZWNrYWJsZSA/IGVsZW0udmFsdWUgOiBlbGVtLmlubmVyVGV4dCB8fCBlbGVtLnRleHRDb250ZW50O1xuICB9IGVsc2UgaWYgKGNoZWNrYWJsZSkge1xuICAgIGVsZW0udmFsdWUgPSB0ZXh0O1xuICB9IGVsc2Uge1xuICAgIGVsZW0uaW5uZXJUZXh0ID0gZWxlbS50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cbn07XG5cbmFwaS52YWx1ZSA9IGZ1bmN0aW9uIChlbCwgdmFsdWUpIHtcbiAgdmFyIGNoZWNrYWJsZSA9IHRlc3QuaXNDaGVja2FibGUoZWwpO1xuICB2YXIgZ2V0dGVyID0gYXJndW1lbnRzLmxlbmd0aCA8IDI7XG4gIGlmIChnZXR0ZXIpIHtcbiAgICByZXR1cm4gY2hlY2thYmxlID8gZWwuY2hlY2tlZCA6IGVsLnZhbHVlO1xuICB9IGVsc2UgaWYgKGNoZWNrYWJsZSkge1xuICAgIGVsLmNoZWNrZWQgPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBlbC52YWx1ZSA9IHZhbHVlO1xuICB9XG59O1xuXG5hcGkuYXR0ciA9IGZ1bmN0aW9uIChlbCwgbmFtZSwgdmFsdWUpIHtcbiAgaWYgKCF0ZXN0LmlzRWxlbWVudChlbCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB2b2lkIDApIHtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7IHJldHVybjtcbiAgfVxuICB2YXIgY2FtZWwgPSB0ZXh0Lmh5cGhlblRvQ2FtZWwobmFtZSk7XG4gIGlmIChjYW1lbCBpbiBlbCkge1xuICAgIGVsW2NhbWVsXSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH1cbn07XG5cbmFwaS5nZXRBdHRyID0gZnVuY3Rpb24gKGVsLCBuYW1lKSB7XG4gIHZhciBjYW1lbCA9IHRleHQuaHlwaGVuVG9DYW1lbChuYW1lKTtcbiAgaWYgKGNhbWVsIGluIGVsKSB7XG4gICAgcmV0dXJuIGVsW2NhbWVsXTtcbiAgfSBlbHNlIGlmIChlbC5nZXRBdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuYXBpLm1hbnlBdHRyID0gZnVuY3Rpb24gKGVsZW0sIGF0dHJzKSB7XG4gIE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyKSB7XG4gICAgYXBpLmF0dHIoZWxlbSwgYXR0ciwgYXR0cnNbYXR0cl0pO1xuICB9KTtcbn07XG5cbmFwaS5tYWtlID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgcmV0dXJuIG5ldyBEb21pbnVzKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSkpO1xufTtcblxuYXBpLmNsb25lID0gZnVuY3Rpb24gKGVsKSB7XG4gIGlmIChlbC5jbG9uZU5vZGUpIHtcbiAgICByZXR1cm4gZWwuY2xvbmVOb2RlKHRydWUpO1xuICB9XG4gIHJldHVybiBlbDtcbn07XG5cbmFwaS5yZW1vdmUgPSBmdW5jdGlvbiAoZWwpIHtcbiAgaWYgKGVsLnBhcmVudEVsZW1lbnQpIHtcbiAgICBlbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGVsKTtcbiAgfVxufTtcblxuYXBpLmFwcGVuZCA9IGZ1bmN0aW9uIChlbCwgdGFyZ2V0KSB7XG4gIGlmIChtYW5pcHVsYXRpb25HdWFyZChlbCwgdGFyZ2V0LCBhcGkuYXBwZW5kKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWwuYXBwZW5kQ2hpbGQpIHtcbiAgICBlbC5hcHBlbmRDaGlsZCh0YXJnZXQpO1xuICB9XG59O1xuXG5hcGkucHJlcGVuZCA9IGZ1bmN0aW9uIChlbCwgdGFyZ2V0KSB7XG4gIGlmIChtYW5pcHVsYXRpb25HdWFyZChlbCwgdGFyZ2V0LCBhcGkucHJlcGVuZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsLmluc2VydEJlZm9yZSkge1xuICAgIGVsLmluc2VydEJlZm9yZSh0YXJnZXQsIGVsLmZpcnN0Q2hpbGQpO1xuICB9XG59O1xuXG5hcGkuYmVmb3JlID0gZnVuY3Rpb24gKGVsLCB0YXJnZXQpIHtcbiAgaWYgKG1hbmlwdWxhdGlvbkd1YXJkKGVsLCB0YXJnZXQsIGFwaS5iZWZvcmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGFyZ2V0LCBlbCk7XG4gIH1cbn07XG5cbmFwaS5hZnRlciA9IGZ1bmN0aW9uIChlbCwgdGFyZ2V0KSB7XG4gIGlmIChtYW5pcHVsYXRpb25HdWFyZChlbCwgdGFyZ2V0LCBhcGkuYWZ0ZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgZWwucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGFyZ2V0LCBlbC5uZXh0U2libGluZyk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIG1hbmlwdWxhdGlvbkd1YXJkIChlbCwgdGFyZ2V0LCBmbikge1xuICB2YXIgcmlnaHQgPSB0YXJnZXQgaW5zdGFuY2VvZiBEb21pbnVzO1xuICB2YXIgbGVmdCA9IGVsIGluc3RhbmNlb2YgRG9taW51cztcbiAgaWYgKGxlZnQpIHtcbiAgICBlbC5mb3JFYWNoKG1hbmlwdWxhdGVNYW55KTtcbiAgfSBlbHNlIGlmIChyaWdodCkge1xuICAgIG1hbmlwdWxhdGUoZWwsIHRydWUpO1xuICB9XG4gIHJldHVybiAhZWwgfHwgIXRhcmdldCB8fCBsZWZ0IHx8IHJpZ2h0O1xuXG4gIGZ1bmN0aW9uIG1hbmlwdWxhdGUgKGVsLCBwcmVjb25kaXRpb24pIHtcbiAgICBpZiAocmlnaHQpIHtcbiAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uICh0YXJnZXQsIGopIHtcbiAgICAgICAgZm4oZWwsIGNsb25lVW5sZXNzKHRhcmdldCwgcHJlY29uZGl0aW9uICYmIGogPT09IDApKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbihlbCwgY2xvbmVVbmxlc3ModGFyZ2V0LCBwcmVjb25kaXRpb24pKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYW5pcHVsYXRlTWFueSAoZWwsIGkpIHtcbiAgICBtYW5pcHVsYXRlKGVsLCBpID09PSAwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9uZVVubGVzcyAodGFyZ2V0LCBjb25kaXRpb24pIHtcbiAgcmV0dXJuIGNvbmRpdGlvbiA/IHRhcmdldCA6IGFwaS5jbG9uZSh0YXJnZXQpO1xufVxuXG5bJ2FwcGVuZFRvJywgJ3ByZXBlbmRUbycsICdiZWZvcmVPZicsICdhZnRlck9mJ10uZm9yRWFjaChmbGlwKTtcblxuZnVuY3Rpb24gZmxpcCAoa2V5KSB7XG4gIHZhciBvcmlnaW5hbCA9IGtleS5zcGxpdCgvW0EtWl0vKVswXTtcbiAgYXBpW2tleV0gPSBmdW5jdGlvbiAoZWwsIHRhcmdldCkge1xuICAgIGFwaVtvcmlnaW5hbF0odGFyZ2V0LCBlbCk7XG4gIH07XG59XG5cbnZhciBudW1lcmljQ3NzUHJvcGVydGllcyA9IHtcbiAgJ2NvbHVtbi1jb3VudCc6IHRydWUsXG4gICdmaWxsLW9wYWNpdHknOiB0cnVlLFxuICAnZmxleC1ncm93JzogdHJ1ZSxcbiAgJ2ZsZXgtc2hyaW5rJzogdHJ1ZSxcbiAgJ2ZvbnQtd2VpZ2h0JzogdHJ1ZSxcbiAgJ2xpbmUtaGVpZ2h0JzogdHJ1ZSxcbiAgJ29wYWNpdHknOiB0cnVlLFxuICAnb3JkZXInOiB0cnVlLFxuICAnb3JwaGFucyc6IHRydWUsXG4gICd3aWRvd3MnOiB0cnVlLFxuICAnei1pbmRleCc6IHRydWUsXG4gICd6b29tJzogdHJ1ZVxufTtcbnZhciBudW1lcmljID0gL15cXGQrJC87XG52YXIgY2FuRmxvYXQgPSAnZmxvYXQnIGluIGRvY3VtZW50LmJvZHkuc3R5bGU7XG5cbmFwaS5nZXRDc3MgPSBmdW5jdGlvbiAoZWwsIHByb3ApIHtcbiAgaWYgKCF0ZXN0LmlzRWxlbWVudChlbCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgaHByb3AgPSB0ZXh0Lmh5cGhlbmF0ZShwcm9wKTtcbiAgdmFyIGZwcm9wID0gIWNhbkZsb2F0ICYmIGhwcm9wID09PSAnZmxvYXQnID8gJ2Nzc0Zsb2F0JyA6IGhwcm9wO1xuICB2YXIgcmVzdWx0ID0gZ2xvYmFsLmdldENvbXB1dGVkU3R5bGUoZWwpW2hwcm9wXTtcbiAgaWYgKHByb3AgPT09ICdvcGFjaXR5JyAmJiByZXN1bHQgPT09ICcnKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgaWYgKHJlc3VsdC5zdWJzdHIoLTIpID09PSAncHgnIHx8IG51bWVyaWMudGVzdChyZXN1bHQpKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQocmVzdWx0LCAxMCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmFwaS5zZXRDc3MgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgdmFyIG1hcHBlZCA9IE9iamVjdC5rZXlzKHByb3BzKS5maWx0ZXIoYmFkKS5tYXAoZXhwYW5kKTtcbiAgZnVuY3Rpb24gYmFkIChwcm9wKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvcHNbcHJvcF07XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlID09PSB2YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBleHBhbmQgKHByb3ApIHtcbiAgICB2YXIgaHByb3AgPSB0ZXh0Lmh5cGhlbmF0ZShwcm9wKTtcbiAgICB2YXIgdmFsdWUgPSBwcm9wc1twcm9wXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhbnVtZXJpY0Nzc1Byb3BlcnRpZXNbaHByb3BdKSB7XG4gICAgICB2YWx1ZSArPSAncHgnO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogaHByb3AsIHZhbHVlOiB2YWx1ZVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIChlbCkge1xuICAgIGlmICghdGVzdC5pc0VsZW1lbnQoZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1hcHBlZC5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICBlbC5zdHlsZVtwcm9wLm5hbWVdID0gcHJvcC52YWx1ZTtcbiAgICB9KTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9Eb21pbnVzLnByb3RvdHlwZScpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgRG9taW51cyA9IHJlcXVpcmUoJy4vRG9taW51cy5jdG9yJyk7XG5cbmZ1bmN0aW9uIGZsYXR0ZW4gKGEsIGNhY2hlKSB7XG4gIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbiAoY3VycmVudCwgaXRlbSkge1xuICAgIGlmIChEb21pbnVzLmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIHJldHVybiBmbGF0dGVuKGl0ZW0sIGN1cnJlbnQpO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudC5pbmRleE9mKGl0ZW0pID09PSAtMSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQuY29uY2F0KGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfSwgY2FjaGUgfHwgbmV3IERvbWludXMoKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGRvbSA9IHJlcXVpcmUoJy4vZG9tJyk7XG52YXIgY2FzdCA9IHJlcXVpcmUoJy4vY2FzdCcpO1xudmFyIGN1c3RvbSA9IHJlcXVpcmUoJy4vY3VzdG9tJyk7XG52YXIgRG9taW51cyA9IHJlcXVpcmUoJy4vRG9taW51cy5jdG9yJyk7XG52YXIgdGFnID0gL15cXHMqPChbYS16XSsoPzotW2Etel0rKT8pXFxzKlxcLz8+XFxzKiQvaTtcblxuZnVuY3Rpb24gYXBpIChzZWxlY3RvciwgY29udGV4dCkge1xuICB2YXIgbm90VGV4dCA9IHR5cGVvZiBzZWxlY3RvciAhPT0gJ3N0cmluZyc7XG4gIGlmIChub3RUZXh0ICYmIGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIGNhc3Qoc2VsZWN0b3IpO1xuICB9XG4gIGlmIChub3RUZXh0KSB7XG4gICAgcmV0dXJuIG5ldyBEb21pbnVzKCk7XG4gIH1cbiAgdmFyIG1hdGNoZXMgPSBzZWxlY3Rvci5tYXRjaCh0YWcpO1xuICBpZiAobWF0Y2hlcykge1xuICAgIHJldHVybiBkb20ubWFrZShtYXRjaGVzWzFdKTtcbiAgfVxuICByZXR1cm4gYXBpLmZpbmQoc2VsZWN0b3IsIGNvbnRleHQpO1xufVxuXG5hcGkuZmluZCA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICByZXR1cm4gZG9tLnFzYShjb250ZXh0LCBzZWxlY3Rvcik7XG59O1xuXG5hcGkuZmluZE9uZSA9IGZ1bmN0aW9uIChzZWxlY3RvciwgY29udGV4dCkge1xuICByZXR1cm4gZG9tLnFzKGNvbnRleHQsIHNlbGVjdG9yKTtcbn07XG5cbmFwaS5jdXN0b20gPSBjdXN0b20ucmVnaXN0ZXI7XG5cbm1vZHVsZS5leHBvcnRzID0gYXBpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZWxlbWVudE9iamVjdHMgPSB0eXBlb2YgSFRNTEVsZW1lbnQgPT09ICdvYmplY3QnO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQgKG8pIHtcbiAgcmV0dXJuIGVsZW1lbnRPYmplY3RzID8gbyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IDogaXNFbGVtZW50T2JqZWN0KG8pO1xufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnRPYmplY3QgKG8pIHtcbiAgcmV0dXJuIG8gJiZcbiAgICB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2Ygby5ub2RlTmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICBvLm5vZGVUeXBlID09PSAxO1xufVxuXG5mdW5jdGlvbiBpc0FycmF5IChhKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYSkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbmZ1bmN0aW9uIGlzQ2hlY2thYmxlIChlbGVtKSB7XG4gIHJldHVybiAnY2hlY2tlZCcgaW4gZWxlbSAmJiBlbGVtLnR5cGUgPT09ICdyYWRpbycgfHwgZWxlbS50eXBlID09PSAnY2hlY2tib3gnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNFbGVtZW50OiBpc0VsZW1lbnQsXG4gIGlzQXJyYXk6IGlzQXJyYXksXG4gIGlzQ2hlY2thYmxlOiBpc0NoZWNrYWJsZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gaHlwaGVuVG9DYW1lbCAoaHlwaGVucykge1xuICB2YXIgcGFydCA9IC8tKFthLXpdKS9nO1xuICByZXR1cm4gaHlwaGVucy5yZXBsYWNlKHBhcnQsIGZ1bmN0aW9uIChnLCBtKSB7XG4gICAgcmV0dXJuIG0udG9VcHBlckNhc2UoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZSAodGV4dCkge1xuICB2YXIgY2FtZWwgPSAvKFthLXpdKShbQS1aXSkvZztcbiAgcmV0dXJuIHRleHQucmVwbGFjZShjYW1lbCwgJyQxLSQyJykudG9Mb3dlckNhc2UoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGh5cGhlblRvQ2FtZWw6IGh5cGhlblRvQ2FtZWwsXG4gIGh5cGhlbmF0ZTogaHlwaGVuYXRlXG59O1xuIl19
1144 |
--------------------------------------------------------------------------------
/dist/dominus.min.js:
--------------------------------------------------------------------------------
1 | !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.dominus=t()}}(function(){return function t(e,n,r){function o(u,c){if(!n[u]){if(!e[u]){var f="function"==typeof require&&require;if(!c&&f)return f(u,!0);if(i)return i(u,!0);var a=new Error("Cannot find module '"+u+"'");throw a.code="MODULE_NOT_FOUND",a}var s=n[u]={exports:{}};e[u][0].call(s.exports,function(t){var n=e[u][1][t];return o(n?n:t)},s,s.exports,t,e,n,r)}return n[u].exports}for(var i="function"==typeof require&&require,u=0;u1;return u?(this.forEach(i),this):this.length?d.getAttr(this[0],t):null},["html","text","value"].forEach(s),y.prototype.clone=function(){return this.map(function(t){return d.clone(t)})},y.prototype.focus=function(){return this.length&&this[0].focus(),this},e.exports=t("./public")},{"./Dominus.ctor":7,"./apply":9,"./classes":11,"./custom":12,"./dom":13,"./flatten":15,"./public":16}],9:[function(t,e,n){"use strict";function r(t){return u.apply(this,t)}function o(t){return new r(t)}function i(t){var e=c[t];c[t]=function(){return o(e.apply(this,arguments))}}var u=t("./Dominus.ctor"),c=u.prototype;r.prototype=c,["map","filter","concat","slice"].forEach(i),e.exports=o},{"./Dominus.ctor":7}],10:[function(t,e,n){(function(n){"use strict";function r(t){return t===n?new u(t):t instanceof u?t:t?o.isElement(t)?new u(t):o.isArray(t)?i(t).filter(function(t){return o.isElement(t)}):new u:new u}var o=t("./test"),i=t("./apply"),u=t("./Dominus.ctor");e.exports=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./Dominus.ctor":7,"./apply":9,"./test":17}],11:[function(t,e,n){"use strict";function r(t){return"string"==typeof t?t.replace(a,"").split(s):t}function o(t){return l.isElement(t)?t.className.replace(a,"").split(s):[]}function i(t,e){l.isElement(t)&&(t.className=r(e).join(" "))}function u(t,e){var n=c(t,e),o=r(e);return n.push.apply(n,o),i(t,n),n}function c(t,e){var n=o(t),u=r(e);return u.forEach(function(t){var e=n.indexOf(t);-1!==e&&n.splice(e,1)}),i(t,n),n}function f(t,e){var n=o(t),i=r(e);return i.every(function(t){return-1!==n.indexOf(t)})}var a=/^\s+|\s+$/g,s=/\s+/g,l=t("./test");e.exports={add:u,remove:c,contains:f,set:i,get:o}},{"./test":17}],12:[function(t,e,n){"use strict";function r(t,e,n){function r(e){return o(t,e)}i[t]={event:e,filter:n,wrap:r}}function o(t,e){if(!e)return e;var n="__dce_"+t;return e[n]?e[n]:(e[n]=function(n){var r=i[t].filter(n);return r?e.apply(this,arguments):void 0},e[n])}var i={};r("left-click","click",function(t){return 1===t.which&&!t.metaKey&&!t.ctrlKey}),e.exports={register:r,wrapper:o,handlers:i}},{}],13:[function(t,e,n){(function(n){"use strict";function r(t){return"string"==typeof t?g.qs(null,t):b.isElement(t)?t:t instanceof h?t[0]:null}function o(t){return function(e,n){var r=e[t];return!r||n&&!g.matches(r,n)?new h:m(r)}}function i(t,e){return e?e instanceof h?-1!==e.indexOf(t):b.isElement(e)?t===e:g.matches(t,e):!0}function u(t,e,n){function r(r){for(var o=r.target;o&&o!==t;){if(g.matches(o,e))return void n.apply(this,arguments);o=o.parentElement}}return E[n._dd]?E[n._dd]:(n._dd=Date.now(),E[n._dd]=r,r)}function c(t,e,n,r,o){null===r?d[t](e,n,o):d[t](e,n,u(e,r,o))}function f(t,e,n,r){function o(){return g.off.apply(g,i),r.apply(this,arguments)}var i=[t,e,n,o];g.on.apply(g,i)}function a(t,e,n){function r(t,r){i?e.forEach(function(e,o){n(t,s(e,r&&0===o))}):n(t,s(e,r))}function o(t,e){r(t,0===e)}var i=e instanceof h,u=t instanceof h;return u?t.forEach(o):i&&r(t,!0),!t||!e||u||i}function s(t,e){return e?t:g.clone(t)}function l(t){var e=t.split(/[A-Z]/)[0];g[t]=function(t,n){g[e](n,t)}}var p=t("sektor"),d=t("crossvent"),h=t("./Dominus.ctor"),m=t("./cast"),v=t("./apply"),y=t("./text"),b=t("./test"),g=e.exports={},E={};g.qsa=function(t,e){var n=new h;return p(e,r(t),n)},g.qs=function(t,e){return g.qsa(t,e)[0]},g.matches=function(t,e){return b.isElement(t)&&p.matchesSelector(t,e)},g.prev=o("previousElementSibling"),g.next=o("nextElementSibling"),g.parent=o("parentElement"),g.parents=function(t,e){for(var n=[],r=t;r.parentElement;)i(r.parentElement,e)&&n.push(r.parentElement),r=r.parentElement;return v(n)},g.children=function(t,e){var n,r,o=[],u=t.children;for(r=0;u&&r\s*$/i;r.find=function(t,e){return o.qsa(e,t)},r.findOne=function(t,e){return o.qs(e,t)},r.custom=u.register,e.exports=r},{"./Dominus.ctor":7,"./cast":10,"./custom":12,"./dom":13}],17:[function(t,e,n){"use strict";function r(t){return c?t instanceof HTMLElement:o(t)}function o(t){return t&&"object"==typeof t&&"string"==typeof t.nodeName&&1===t.nodeType}function i(t){return"[object Array]"===Object.prototype.toString.call(t)}function u(t){return"checked"in t&&"radio"===t.type||"checkbox"===t.type}var c="object"==typeof HTMLElement;e.exports={isElement:r,isArray:i,isCheckable:u}},{}],18:[function(t,e,n){"use strict";function r(t){var e=/-([a-z])/g;return t.replace(e,function(t,e){return e.toUpperCase()})}function o(t){var e=/([a-z])([A-Z])/g;return t.replace(e,"$1-$2").toLowerCase()}e.exports={hyphenToCamel:r,hyphenate:o}},{}]},{},[14])(14)});
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dominus",
3 | "description": "Lean DOM Manipulation",
4 | "version": "6.0.2",
5 | "homepage": "https://github.com/bevacqua/dominus",
6 | "author": {
7 | "email": "ng@bevacqua.io",
8 | "name": "Nicolas Bevacqua",
9 | "url": "http://bevacqua.io"
10 | },
11 | "license": "MIT",
12 | "repository": {
13 | "type": "git",
14 | "url": "git://github.com/bevacqua/dominus.git"
15 | },
16 | "main": "src/null.js",
17 | "browser": "src/dominus.js",
18 | "scripts": {
19 | "build": "jshint . && browserify -s dominus -do dist/dominus.js src/dominus.js && uglifyjs -m -c -o dist/dominus.min.js dist/dominus.js",
20 | "deploy": "npm run build && npm run deployment",
21 | "deployment": "git add dist && npm version ${BUMP:-\"patch\"} --no-git-tag-version && git add package.json && git commit -am \"Autogenerated pre-deployment commit\" && bower version ${BUMP:-\"patch\"} && git reset HEAD~2 && git add . && git commit -am \"Release $(cat package.json | jq -r .version)\" && git push --tags && npm publish && git push"
22 | },
23 | "devDependencies": {
24 | "browserify": "11.0.1",
25 | "jshint": "2.8.0",
26 | "uglify-js": "2.4.24"
27 | },
28 | "dependencies": {
29 | "crossvent": "1.5.4",
30 | "poser": "1.2.0",
31 | "sektor": "1.1.5"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/resources/dominus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/bevacqua/dominus/6a132b1da2a393d1d7c52c2e37a273e641f157a4/resources/dominus.png
--------------------------------------------------------------------------------
/src/Dominus.ctor.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var poser = require('poser');
4 | var Dominus = poser.Array();
5 |
6 | module.exports = Dominus;
7 |
--------------------------------------------------------------------------------
/src/Dominus.prototype.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var $ = require('./public');
4 | var flatten = require('./flatten');
5 | var dom = require('./dom');
6 | var apply = require('./apply');
7 | var custom = require('./custom');
8 | var classes = require('./classes');
9 | var Dominus = require('./Dominus.ctor');
10 |
11 | function equals (selector) {
12 | return function equals (elem) {
13 | return dom.matches(elem, selector);
14 | };
15 | }
16 |
17 | function straight (prop, one) {
18 | return function domMapping (selector) {
19 | var result = this.map(function (elem) {
20 | return dom[prop](elem, selector);
21 | });
22 | var results = flatten(result);
23 | return one ? results[0] : results;
24 | };
25 | }
26 |
27 | Dominus.prototype.prev = straight('prev');
28 | Dominus.prototype.next = straight('next');
29 | Dominus.prototype.parent = straight('parent');
30 | Dominus.prototype.parents = straight('parents');
31 | Dominus.prototype.children = straight('children');
32 | Dominus.prototype.find = straight('qsa');
33 | Dominus.prototype.findOne = straight('qs', true);
34 |
35 | Dominus.prototype.where = function (selector) {
36 | return this.filter(equals(selector));
37 | };
38 |
39 | Dominus.prototype.is = function (selector) {
40 | return this.some(equals(selector));
41 | };
42 |
43 | Dominus.prototype.i = function (index) {
44 | return this[index] ? new Dominus(this[index]) : new Dominus();
45 | };
46 |
47 | function compareFactory (fn) {
48 | return function compare () {
49 | var copy = apply(this);
50 | $.apply(null, arguments).forEach(fn, copy);
51 | return copy;
52 | };
53 | }
54 |
55 | Dominus.prototype.and = compareFactory(function addOne (elem) {
56 | if (this.indexOf(elem) === -1) {
57 | this.push(elem);
58 | }
59 | return this;
60 | });
61 |
62 | Dominus.prototype.but = compareFactory(function addOne (elem) {
63 | var index = this.indexOf(elem);
64 | if (index !== -1) {
65 | this.splice(index, 1);
66 | }
67 | return this;
68 | });
69 |
70 | Dominus.prototype.css = function (name, value) {
71 | var props;
72 | var many = name && typeof name === 'object';
73 | var getter = !many && !value;
74 | if (getter) {
75 | return this.length ? dom.getCss(this[0], name) : null;
76 | }
77 | if (many) {
78 | props = name;
79 | } else {
80 | props = {};
81 | props[name] = value;
82 | }
83 | this.forEach(dom.setCss(props));
84 | return this;
85 | };
86 |
87 | function eventer (method) {
88 | return function (types, filter, fn) {
89 | var typelist = types.split(' ');
90 | if (typeof fn !== 'function') {
91 | fn = filter;
92 | filter = null;
93 | }
94 | this.forEach(function (elem) {
95 | typelist.forEach(function (type) {
96 | var handler = custom.handlers[type];
97 | if (handler) {
98 | dom[method](elem, handler.event, filter, handler.wrap(fn));
99 | } else {
100 | dom[method](elem, type, filter, fn);
101 | }
102 | });
103 | });
104 | return this;
105 | };
106 | }
107 |
108 | Dominus.prototype.once = eventer('once');
109 | Dominus.prototype.on = eventer('on');
110 | Dominus.prototype.off = eventer('off');
111 | Dominus.prototype.emit = eventer('emit');
112 |
113 | [
114 | ['addClass', classes.add],
115 | ['removeClass', classes.remove],
116 | ['setClass', classes.set],
117 | ['removeClass', classes.remove],
118 | ['remove', dom.remove]
119 | ].forEach(mapMethods);
120 |
121 | function mapMethods (data) {
122 | Dominus.prototype[data[0]] = function (value) {
123 | this.forEach(function (elem) {
124 | data[1](elem, value);
125 | });
126 | return this;
127 | };
128 | }
129 |
130 | [
131 | 'append',
132 | 'appendTo',
133 | 'prepend',
134 | 'prependTo',
135 | 'before',
136 | 'beforeOf',
137 | 'after',
138 | 'afterOf'
139 | ].forEach(mapManipulation);
140 |
141 | function mapManipulation (method) {
142 | Dominus.prototype[method] = function (value) {
143 | dom[method](this, value);
144 | return this;
145 | };
146 | }
147 |
148 | Dominus.prototype.hasClass = function (value) {
149 | return this.some(function (elem) {
150 | return classes.contains(elem, value);
151 | });
152 | };
153 |
154 | Dominus.prototype.attr = function (name, value) {
155 | var hash = name && typeof name === 'object';
156 | var set = hash ? setMany : setSingle;
157 | var setter = hash || arguments.length > 1;
158 | if (setter) {
159 | this.forEach(set);
160 | return this;
161 | } else {
162 | return this.length ? dom.getAttr(this[0], name) : null;
163 | }
164 | function setMany (elem) {
165 | dom.manyAttr(elem, name);
166 | }
167 | function setSingle (elem) {
168 | dom.attr(elem, name, value);
169 | }
170 | };
171 |
172 | function keyValue (key, value) {
173 | var getter = arguments.length < 2;
174 | if (getter) {
175 | return this.length ? dom[key](this[0]) : '';
176 | }
177 | this.forEach(function (elem) {
178 | dom[key](elem, value);
179 | });
180 | return this;
181 | }
182 |
183 | function keyValueProperty (prop) {
184 | Dominus.prototype[prop] = function accessor (value) {
185 | var getter = arguments.length < 1;
186 | if (getter) {
187 | return keyValue.call(this, prop);
188 | }
189 | return keyValue.call(this, prop, value);
190 | };
191 | }
192 |
193 | ['html', 'text', 'value'].forEach(keyValueProperty);
194 |
195 | Dominus.prototype.clone = function () {
196 | return this.map(function (elem) {
197 | return dom.clone(elem);
198 | });
199 | };
200 |
201 | Dominus.prototype.focus = function () {
202 | if (this.length) {
203 | this[0].focus();
204 | }
205 | return this;
206 | };
207 |
208 | module.exports = require('./public');
209 |
--------------------------------------------------------------------------------
/src/apply.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var Dominus = require('./Dominus.ctor');
4 | var proto = Dominus.prototype;
5 |
6 | function Applied (args) {
7 | return Dominus.apply(this, args);
8 | }
9 |
10 | Applied.prototype = proto;
11 |
12 | function apply (a) {
13 | return new Applied(a);
14 | }
15 |
16 | ['map', 'filter', 'concat', 'slice'].forEach(ensure);
17 |
18 | function ensure (key) {
19 | var original = proto[key];
20 | proto[key] = function applied () {
21 | return apply(original.apply(this, arguments));
22 | };
23 | }
24 |
25 | module.exports = apply;
26 |
--------------------------------------------------------------------------------
/src/cast.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var test = require('./test');
4 | var apply = require('./apply');
5 | var Dominus = require('./Dominus.ctor');
6 |
7 | function cast (a) {
8 | if (a === global) {
9 | return new Dominus(a);
10 | }
11 | if (a instanceof Dominus) {
12 | return a;
13 | }
14 | if (!a) {
15 | return new Dominus();
16 | }
17 | if (test.isElement(a)) {
18 | return new Dominus(a);
19 | }
20 | if (!test.isArray(a)) {
21 | return new Dominus();
22 | }
23 | return apply(a).filter(function (i) {
24 | return test.isElement(i);
25 | });
26 | }
27 |
28 | module.exports = cast;
29 |
--------------------------------------------------------------------------------
/src/classes.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var trim = /^\s+|\s+$/g;
4 | var whitespace = /\s+/g;
5 | var test = require('./test');
6 |
7 | function interpret (input) {
8 | return typeof input === 'string' ? input.replace(trim, '').split(whitespace) : input;
9 | }
10 |
11 | function classes (el) {
12 | if (test.isElement(el)) {
13 | return el.className.replace(trim, '').split(whitespace);
14 | }
15 | return [];
16 | }
17 |
18 | function set (el, input) {
19 | if (test.isElement(el)) {
20 | el.className = interpret(input).join(' ');
21 | }
22 | }
23 |
24 | function add (el, input) {
25 | var current = remove(el, input);
26 | var values = interpret(input);
27 | current.push.apply(current, values);
28 | set(el, current);
29 | return current;
30 | }
31 |
32 | function remove (el, input) {
33 | var current = classes(el);
34 | var values = interpret(input);
35 | values.forEach(function (value) {
36 | var i = current.indexOf(value);
37 | if (i !== -1) {
38 | current.splice(i, 1);
39 | }
40 | });
41 | set(el, current);
42 | return current;
43 | }
44 |
45 | function contains (el, input) {
46 | var current = classes(el);
47 | var values = interpret(input);
48 |
49 | return values.every(function (value) {
50 | return current.indexOf(value) !== -1;
51 | });
52 | }
53 |
54 | module.exports = {
55 | add: add,
56 | remove: remove,
57 | contains: contains,
58 | set: set,
59 | get: classes
60 | };
61 |
--------------------------------------------------------------------------------
/src/custom.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var handlers = {};
4 |
5 | function register (name, type, filter) {
6 | handlers[name] = {
7 | event: type,
8 | filter: filter,
9 | wrap: wrap
10 | };
11 |
12 | function wrap (fn) {
13 | return wrapper(name, fn);
14 | }
15 | }
16 |
17 | function wrapper (name, fn) {
18 | if (!fn) {
19 | return fn;
20 | }
21 | var key = '__dce_' + name;
22 | if (fn[key]) {
23 | return fn[key];
24 | }
25 | fn[key] = function customEvent (e) {
26 | var match = handlers[name].filter(e);
27 | if (match) {
28 | return fn.apply(this, arguments);
29 | }
30 | };
31 | return fn[key];
32 | }
33 |
34 | register('left-click', 'click', function (e) {
35 | return e.which === 1 && !e.metaKey && !e.ctrlKey;
36 | });
37 |
38 | module.exports = {
39 | register: register,
40 | wrapper: wrapper,
41 | handlers: handlers
42 | };
43 |
--------------------------------------------------------------------------------
/src/dom.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var sektor = require('sektor');
4 | var crossvent = require('crossvent');
5 | var Dominus = require('./Dominus.ctor');
6 | var cast = require('./cast');
7 | var apply = require('./apply');
8 | var text = require('./text');
9 | var test = require('./test');
10 | var api = module.exports = {};
11 | var delegates = {};
12 |
13 | function castContext (context) {
14 | if (typeof context === 'string') {
15 | return api.qs(null, context);
16 | }
17 | if (test.isElement(context)) {
18 | return context;
19 | }
20 | if (context instanceof Dominus) {
21 | return context[0];
22 | }
23 | return null;
24 | }
25 |
26 | api.qsa = function (el, selector) {
27 | var results = new Dominus();
28 | return sektor(selector, castContext(el), results);
29 | };
30 |
31 | api.qs = function (el, selector) {
32 | return api.qsa(el, selector)[0];
33 | };
34 |
35 | api.matches = function (el, selector) {
36 | return test.isElement(el) && sektor.matchesSelector(el, selector);
37 | };
38 |
39 | function relatedFactory (prop) {
40 | return function related (el, selector) {
41 | var relative = el[prop];
42 | if (relative) {
43 | if (!selector || api.matches(relative, selector)) {
44 | return cast(relative);
45 | }
46 | }
47 | return new Dominus();
48 | };
49 | }
50 |
51 | api.prev = relatedFactory('previousElementSibling');
52 | api.next = relatedFactory('nextElementSibling');
53 | api.parent = relatedFactory('parentElement');
54 |
55 | function matches (el, value) {
56 | if (!value) {
57 | return true;
58 | }
59 | if (value instanceof Dominus) {
60 | return value.indexOf(el) !== -1;
61 | }
62 | if (test.isElement(value)) {
63 | return el === value;
64 | }
65 | return api.matches(el, value);
66 | }
67 |
68 | api.parents = function (el, value) {
69 | var elements = [];
70 | var current = el;
71 | while (current.parentElement) {
72 | if (matches(current.parentElement, value)) {
73 | elements.push(current.parentElement);
74 | }
75 | current = current.parentElement;
76 | }
77 | return apply(elements);
78 | };
79 |
80 | api.children = function (el, value) {
81 | var elements = [];
82 | var children = el.children;
83 | var child;
84 | var i;
85 | for (i = 0; children && i < children.length; i++) {
86 | child = children[i];
87 | if (matches(child, value)) {
88 | elements.push(child);
89 | }
90 | }
91 | return apply(elements);
92 | };
93 |
94 | // this method caches delegates so that .off() works seamlessly
95 | function delegate (root, filter, fn) {
96 | if (delegates[fn._dd]) {
97 | return delegates[fn._dd];
98 | }
99 | fn._dd = Date.now();
100 | delegates[fn._dd] = delegator;
101 | function delegator (e) {
102 | var el = e.target;
103 | while (el && el !== root) {
104 | if (api.matches(el, filter)) {
105 | fn.apply(this, arguments); return;
106 | }
107 | el = el.parentElement;
108 | }
109 | }
110 | return delegator;
111 | }
112 |
113 | function evented (method, el, type, filter, fn) {
114 | if (filter === null) {
115 | crossvent[method](el, type, fn);
116 | } else {
117 | crossvent[method](el, type, delegate(el, filter, fn));
118 | }
119 | }
120 |
121 | function once (el, type, filter, fn) {
122 | var things = [el, type, filter, disposable];
123 | api.on.apply(api, things);
124 | function disposable () {
125 | api.off.apply(api, things);
126 | return fn.apply(this, arguments);
127 | }
128 | }
129 |
130 | api.once = once;
131 | api.on = evented.bind(null, 'add');
132 | api.off = evented.bind(null, 'remove');
133 | api.emit = evented.bind(null, 'fabricate');
134 |
135 | api.html = function (elem, html) {
136 | var getter = arguments.length < 2;
137 | if (getter) {
138 | return elem.innerHTML;
139 | } else {
140 | elem.innerHTML = html;
141 | }
142 | };
143 |
144 | api.text = function (elem, text) {
145 | var checkable = test.isCheckable(elem);
146 | var getter = arguments.length < 2;
147 | if (getter) {
148 | return checkable ? elem.value : elem.innerText || elem.textContent;
149 | } else if (checkable) {
150 | elem.value = text;
151 | } else {
152 | elem.innerText = elem.textContent = text;
153 | }
154 | };
155 |
156 | api.value = function (el, value) {
157 | var checkable = test.isCheckable(el);
158 | var getter = arguments.length < 2;
159 | if (getter) {
160 | return checkable ? el.checked : el.value;
161 | } else if (checkable) {
162 | el.checked = value;
163 | } else {
164 | el.value = value;
165 | }
166 | };
167 |
168 | api.attr = function (el, name, value) {
169 | if (!test.isElement(el)) {
170 | return;
171 | }
172 | if (value === null || value === void 0) {
173 | el.removeAttribute(name); return;
174 | }
175 | var camel = text.hyphenToCamel(name);
176 | if (camel in el) {
177 | el[camel] = value;
178 | } else {
179 | el.setAttribute(name, value);
180 | }
181 | };
182 |
183 | api.getAttr = function (el, name) {
184 | var camel = text.hyphenToCamel(name);
185 | if (camel in el) {
186 | return el[camel];
187 | } else if (el.getAttribute) {
188 | return el.getAttribute(name);
189 | }
190 | return null;
191 | };
192 |
193 | api.manyAttr = function (elem, attrs) {
194 | Object.keys(attrs).forEach(function (attr) {
195 | api.attr(elem, attr, attrs[attr]);
196 | });
197 | };
198 |
199 | api.make = function (type) {
200 | return new Dominus(document.createElement(type));
201 | };
202 |
203 | api.clone = function (el) {
204 | if (el.cloneNode) {
205 | return el.cloneNode(true);
206 | }
207 | return el;
208 | };
209 |
210 | api.remove = function (el) {
211 | if (el.parentElement) {
212 | el.parentElement.removeChild(el);
213 | }
214 | };
215 |
216 | api.append = function (el, target) {
217 | if (manipulationGuard(el, target, api.append)) {
218 | return;
219 | }
220 | if (el.appendChild) {
221 | el.appendChild(target);
222 | }
223 | };
224 |
225 | api.prepend = function (el, target) {
226 | if (manipulationGuard(el, target, api.prepend)) {
227 | return;
228 | }
229 | if (el.insertBefore) {
230 | el.insertBefore(target, el.firstChild);
231 | }
232 | };
233 |
234 | api.before = function (el, target) {
235 | if (manipulationGuard(el, target, api.before)) {
236 | return;
237 | }
238 | if (el.parentElement) {
239 | el.parentElement.insertBefore(target, el);
240 | }
241 | };
242 |
243 | api.after = function (el, target) {
244 | if (manipulationGuard(el, target, api.after)) {
245 | return;
246 | }
247 | if (el.parentElement) {
248 | el.parentElement.insertBefore(target, el.nextSibling);
249 | }
250 | };
251 |
252 | function manipulationGuard (el, target, fn) {
253 | var right = target instanceof Dominus;
254 | var left = el instanceof Dominus;
255 | if (left) {
256 | el.forEach(manipulateMany);
257 | } else if (right) {
258 | manipulate(el, true);
259 | }
260 | return !el || !target || left || right;
261 |
262 | function manipulate (el, precondition) {
263 | if (right) {
264 | target.forEach(function (target, j) {
265 | fn(el, cloneUnless(target, precondition && j === 0));
266 | });
267 | } else {
268 | fn(el, cloneUnless(target, precondition));
269 | }
270 | }
271 |
272 | function manipulateMany (el, i) {
273 | manipulate(el, i === 0);
274 | }
275 | }
276 |
277 | function cloneUnless (target, condition) {
278 | return condition ? target : api.clone(target);
279 | }
280 |
281 | ['appendTo', 'prependTo', 'beforeOf', 'afterOf'].forEach(flip);
282 |
283 | function flip (key) {
284 | var original = key.split(/[A-Z]/)[0];
285 | api[key] = function (el, target) {
286 | api[original](target, el);
287 | };
288 | }
289 |
290 | var numericCssProperties = {
291 | 'column-count': true,
292 | 'fill-opacity': true,
293 | 'flex-grow': true,
294 | 'flex-shrink': true,
295 | 'font-weight': true,
296 | 'line-height': true,
297 | 'opacity': true,
298 | 'order': true,
299 | 'orphans': true,
300 | 'widows': true,
301 | 'z-index': true,
302 | 'zoom': true
303 | };
304 | var numeric = /^\d+$/;
305 | var canFloat = 'float' in document.body.style;
306 |
307 | api.getCss = function (el, prop) {
308 | if (!test.isElement(el)) {
309 | return null;
310 | }
311 | var hprop = text.hyphenate(prop);
312 | var fprop = !canFloat && hprop === 'float' ? 'cssFloat' : hprop;
313 | var result = global.getComputedStyle(el)[hprop];
314 | if (prop === 'opacity' && result === '') {
315 | return 1;
316 | }
317 | if (result.substr(-2) === 'px' || numeric.test(result)) {
318 | return parseFloat(result, 10);
319 | }
320 | return result;
321 | };
322 |
323 | api.setCss = function (props) {
324 | var mapped = Object.keys(props).filter(bad).map(expand);
325 | function bad (prop) {
326 | var value = props[prop];
327 | return value !== null && value === value;
328 | }
329 | function expand (prop) {
330 | var hprop = text.hyphenate(prop);
331 | var value = props[prop];
332 | if (typeof value === 'number' && !numericCssProperties[hprop]) {
333 | value += 'px';
334 | }
335 | return {
336 | name: hprop, value: value
337 | };
338 | }
339 | return function (el) {
340 | if (!test.isElement(el)) {
341 | return;
342 | }
343 | mapped.forEach(function (prop) {
344 | el.style[prop.name] = prop.value;
345 | });
346 | };
347 | };
348 |
--------------------------------------------------------------------------------
/src/dominus.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = require('./Dominus.prototype');
4 |
--------------------------------------------------------------------------------
/src/flatten.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var Dominus = require('./Dominus.ctor');
4 |
5 | function flatten (a, cache) {
6 | return a.reduce(function (current, item) {
7 | if (Dominus.isArray(item)) {
8 | return flatten(item, current);
9 | } else if (current.indexOf(item) === -1) {
10 | return current.concat(item);
11 | }
12 | return current;
13 | }, cache || new Dominus());
14 | }
15 |
16 | module.exports = flatten;
17 |
--------------------------------------------------------------------------------
/src/null.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = function nullOp () { return []; };
4 |
--------------------------------------------------------------------------------
/src/public.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var dom = require('./dom');
4 | var cast = require('./cast');
5 | var custom = require('./custom');
6 | var Dominus = require('./Dominus.ctor');
7 | var tag = /^\s*<([a-z]+(?:-[a-z]+)?)\s*\/?>\s*$/i;
8 |
9 | function api (selector, context) {
10 | var notText = typeof selector !== 'string';
11 | if (notText && arguments.length < 2) {
12 | return cast(selector);
13 | }
14 | if (notText) {
15 | return new Dominus();
16 | }
17 | var matches = selector.match(tag);
18 | if (matches) {
19 | return dom.make(matches[1]);
20 | }
21 | return api.find(selector, context);
22 | }
23 |
24 | api.find = function (selector, context) {
25 | return dom.qsa(context, selector);
26 | };
27 |
28 | api.findOne = function (selector, context) {
29 | return dom.qs(context, selector);
30 | };
31 |
32 | api.custom = custom.register;
33 |
34 | module.exports = api;
35 |
--------------------------------------------------------------------------------
/src/test.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var elementObjects = typeof HTMLElement === 'object';
4 |
5 | function isElement (o) {
6 | return elementObjects ? o instanceof HTMLElement : isElementObject(o);
7 | }
8 |
9 | function isElementObject (o) {
10 | return o &&
11 | typeof o === 'object' &&
12 | typeof o.nodeName === 'string' &&
13 | o.nodeType === 1;
14 | }
15 |
16 | function isArray (a) {
17 | return Object.prototype.toString.call(a) === '[object Array]';
18 | }
19 |
20 | function isCheckable (elem) {
21 | return 'checked' in elem && elem.type === 'radio' || elem.type === 'checkbox';
22 | }
23 |
24 | module.exports = {
25 | isElement: isElement,
26 | isArray: isArray,
27 | isCheckable: isCheckable
28 | };
29 |
--------------------------------------------------------------------------------
/src/text.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | function hyphenToCamel (hyphens) {
4 | var part = /-([a-z])/g;
5 | return hyphens.replace(part, function (g, m) {
6 | return m.toUpperCase();
7 | });
8 | }
9 |
10 | function hyphenate (text) {
11 | var camel = /([a-z])([A-Z])/g;
12 | return text.replace(camel, '$1-$2').toLowerCase();
13 | }
14 |
15 | module.exports = {
16 | hyphenToCamel: hyphenToCamel,
17 | hyphenate: hyphenate
18 | };
19 |
--------------------------------------------------------------------------------