snabberb 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +1 -1
- data/build.js +20 -0
- data/examples/rack/Gemfile.lock +4 -4
- data/examples/roda/Gemfile.lock +10 -10
- data/lib/snabberb/version.rb +1 -1
- data/opal/snabberb.rb +0 -6
- data/opal/snabberb/component.rb +5 -5
- data/opal/vendor/snabbdom.js +934 -420
- metadata +6 -11
- data/opal/vendor/snabbdom-attributes.js +0 -71
- data/opal/vendor/snabbdom-class.js +0 -29
- data/opal/vendor/snabbdom-eventlisteners.js +0 -99
- data/opal/vendor/snabbdom-props.js +0 -30
- data/opal/vendor/snabbdom-style.js +0 -90
- data/opal/vendor/tovnode.js +0 -126
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cedc3e54bfcb4b628750f8a7779975624cb72226c46ca0c2e7ea787d5b31e9f2
|
4
|
+
data.tar.gz: e0d593a26c2058022d6e6c3df9dc200c235aedf2524a9c774ebcabbfa8df7d3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0d1c3b840a0f0475204cdcdf8a603441bbbcc5f7fb1b3653081e4b8e25690663116ba639775b4ae8f7c045f904207225fa6d7bee27931a778c441c76e8385d9
|
7
|
+
data.tar.gz: f32c2619a9c422fe33cf7fdeddd97b968c7a68002865619f1077c63349e66caa24c820aad00fa66bf60de623d5e8e7f46f7a16ba374f9836cd9ce653badffddc
|
data/.gitignore
CHANGED
data/README.md
CHANGED
data/build.js
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
// browserify deps.js -p esmify -s snabbdom > opal/vendor/snabbdom.js
|
2
|
+
import { init } from './node_modules/snabbdom/build/package/init'
|
3
|
+
import { h } from './node_modules/snabbdom/build/package/h'
|
4
|
+
import { toVNode } from './node_modules/snabbdom/build/package/tovnode'
|
5
|
+
|
6
|
+
import { attributesModule } from './node_modules/snabbdom/build/package/modules/attributes'
|
7
|
+
import { classModule } from './node_modules/snabbdom/build/package/modules/class'
|
8
|
+
import { eventListenersModule } from './node_modules/snabbdom/build/package/modules/eventlisteners'
|
9
|
+
import { propsModule } from './node_modules/snabbdom/build/package/modules/props'
|
10
|
+
import { styleModule } from './node_modules/snabbdom/build/package/modules/style'
|
11
|
+
|
12
|
+
module.exports.init = init
|
13
|
+
module.exports.h = h
|
14
|
+
module.exports.toVNode = toVNode
|
15
|
+
|
16
|
+
module.exports.attributesModule = attributesModule
|
17
|
+
module.exports.classModule = classModule
|
18
|
+
module.exports.eventListenersModule = eventListenersModule
|
19
|
+
module.exports.propsModule = propsModule
|
20
|
+
module.exports.styleModule = styleModule
|
data/examples/rack/Gemfile.lock
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../..
|
3
3
|
specs:
|
4
|
-
snabberb (0.2
|
4
|
+
snabberb (0.4.2)
|
5
5
|
opal (~> 1.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
ast (2.4.
|
10
|
+
ast (2.4.1)
|
11
11
|
c_lexer (2.6.4.1.1)
|
12
12
|
ast (~> 2.4.0)
|
13
13
|
parser (= 2.6.4.1)
|
@@ -16,7 +16,7 @@ GEM
|
|
16
16
|
parser (~> 2.6)
|
17
17
|
parser (2.6.4.1)
|
18
18
|
ast (~> 2.4.0)
|
19
|
-
rack (2.2.
|
19
|
+
rack (2.2.3)
|
20
20
|
|
21
21
|
PLATFORMS
|
22
22
|
ruby
|
@@ -28,4 +28,4 @@ DEPENDENCIES
|
|
28
28
|
snabberb!
|
29
29
|
|
30
30
|
BUNDLED WITH
|
31
|
-
2.1.
|
31
|
+
2.1.4
|
data/examples/roda/Gemfile.lock
CHANGED
@@ -1,32 +1,32 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../..
|
3
3
|
specs:
|
4
|
-
snabberb (0.2
|
4
|
+
snabberb (0.4.2)
|
5
5
|
opal (~> 1.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
ast (2.4.
|
10
|
+
ast (2.4.1)
|
11
11
|
c_lexer (2.6.4.1.1)
|
12
12
|
ast (~> 2.4.0)
|
13
13
|
parser (= 2.6.4.1)
|
14
|
-
concurrent-ruby (1.1.
|
14
|
+
concurrent-ruby (1.1.7)
|
15
15
|
execjs (2.7.0)
|
16
|
-
libv8 (
|
17
|
-
mini_racer (0.
|
18
|
-
libv8 (
|
16
|
+
libv8 (8.4.255.0)
|
17
|
+
mini_racer (0.3.1)
|
18
|
+
libv8 (~> 8.4.255)
|
19
19
|
opal (1.0.3)
|
20
20
|
ast (>= 2.3.0)
|
21
21
|
parser (~> 2.6)
|
22
|
-
opal-sprockets (0.4.
|
22
|
+
opal-sprockets (0.4.9.1.0.3.7)
|
23
23
|
opal (~> 1.0.0)
|
24
24
|
sprockets (~> 3.7)
|
25
25
|
tilt (>= 1.4)
|
26
26
|
parser (2.6.4.1)
|
27
27
|
ast (~> 2.4.0)
|
28
|
-
rack (2.2.
|
29
|
-
roda (3.
|
28
|
+
rack (2.2.3)
|
29
|
+
roda (3.36.0)
|
30
30
|
rack
|
31
31
|
sprockets (3.7.2)
|
32
32
|
concurrent-ruby (~> 1.0)
|
@@ -46,4 +46,4 @@ DEPENDENCIES
|
|
46
46
|
snabberb!
|
47
47
|
|
48
48
|
BUNDLED WITH
|
49
|
-
2.1.
|
49
|
+
2.1.4
|
data/lib/snabberb/version.rb
CHANGED
data/opal/snabberb.rb
CHANGED
@@ -3,13 +3,7 @@
|
|
3
3
|
require 'native'
|
4
4
|
|
5
5
|
require 'vendor/snabbdom'
|
6
|
-
require 'vendor/snabbdom-attributes'
|
7
|
-
require 'vendor/snabbdom-class'
|
8
|
-
require 'vendor/snabbdom-eventlisteners'
|
9
|
-
require 'vendor/snabbdom-props'
|
10
|
-
require 'vendor/snabbdom-style'
|
11
6
|
require 'vendor/snabbdom-to-html'
|
12
|
-
require 'vendor/tovnode'
|
13
7
|
|
14
8
|
require 'snabberb/component'
|
15
9
|
|
data/opal/snabberb/component.rb
CHANGED
@@ -96,11 +96,11 @@ module Snabberb
|
|
96
96
|
return unless request_ids.empty?
|
97
97
|
|
98
98
|
@@patcher ||= %x{snabbdom.init([
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
99
|
+
snabbdom.attributesModule,
|
100
|
+
snabbdom.classModule,
|
101
|
+
snabbdom.eventListenersModule,
|
102
|
+
snabbdom.propsModule,
|
103
|
+
snabbdom.styleModule,
|
104
104
|
])}
|
105
105
|
node = @root.render
|
106
106
|
@@patcher.call(@root.node, node)
|
data/opal/vendor/snabbdom.js
CHANGED
@@ -1,506 +1,1020 @@
|
|
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.snabbdom = f()}})(function(){var define,module,exports;return (function e
|
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.snabbdom = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
2
2
|
"use strict";
|
3
|
-
|
4
|
-
var
|
5
|
-
|
3
|
+
|
4
|
+
var _init = require("./node_modules/snabbdom/build/package/init");
|
5
|
+
|
6
|
+
var _h = require("./node_modules/snabbdom/build/package/h");
|
7
|
+
|
8
|
+
var _tovnode = require("./node_modules/snabbdom/build/package/tovnode");
|
9
|
+
|
10
|
+
var _attributes = require("./node_modules/snabbdom/build/package/modules/attributes");
|
11
|
+
|
12
|
+
var _class = require("./node_modules/snabbdom/build/package/modules/class");
|
13
|
+
|
14
|
+
var _eventlisteners = require("./node_modules/snabbdom/build/package/modules/eventlisteners");
|
15
|
+
|
16
|
+
var _props = require("./node_modules/snabbdom/build/package/modules/props");
|
17
|
+
|
18
|
+
var _style = require("./node_modules/snabbdom/build/package/modules/style");
|
19
|
+
|
20
|
+
module.exports.init = _init.init;
|
21
|
+
module.exports.h = _h.h;
|
22
|
+
module.exports.toVNode = _tovnode.toVNode;
|
23
|
+
module.exports.attributesModule = _attributes.attributesModule;
|
24
|
+
module.exports.classModule = _class.classModule;
|
25
|
+
module.exports.eventListenersModule = _eventlisteners.eventListenersModule;
|
26
|
+
module.exports.propsModule = _props.propsModule;
|
27
|
+
module.exports.styleModule = _style.styleModule;
|
28
|
+
|
29
|
+
},{"./node_modules/snabbdom/build/package/h":2,"./node_modules/snabbdom/build/package/init":4,"./node_modules/snabbdom/build/package/modules/attributes":6,"./node_modules/snabbdom/build/package/modules/class":7,"./node_modules/snabbdom/build/package/modules/eventlisteners":8,"./node_modules/snabbdom/build/package/modules/props":9,"./node_modules/snabbdom/build/package/modules/style":10,"./node_modules/snabbdom/build/package/tovnode":11}],2:[function(require,module,exports){
|
30
|
+
"use strict";
|
31
|
+
|
32
|
+
Object.defineProperty(exports, "__esModule", {
|
33
|
+
value: true
|
34
|
+
});
|
35
|
+
exports.h = h;
|
36
|
+
|
37
|
+
var _vnode = require("./vnode.js");
|
38
|
+
|
39
|
+
var is = _interopRequireWildcard(require("./is.js"));
|
40
|
+
|
41
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
42
|
+
|
43
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
44
|
+
|
6
45
|
function addNS(data, children, sel) {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
46
|
+
data.ns = 'http://www.w3.org/2000/svg';
|
47
|
+
|
48
|
+
if (sel !== 'foreignObject' && children !== undefined) {
|
49
|
+
for (let i = 0; i < children.length; ++i) {
|
50
|
+
const childData = children[i].data;
|
51
|
+
|
52
|
+
if (childData !== undefined) {
|
53
|
+
addNS(childData, children[i].children, children[i].sel);
|
54
|
+
}
|
15
55
|
}
|
56
|
+
}
|
16
57
|
}
|
58
|
+
|
17
59
|
function h(sel, b, c) {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
}
|
27
|
-
else if (c && c.sel) {
|
28
|
-
children = [c];
|
29
|
-
}
|
60
|
+
var data = {};
|
61
|
+
var children;
|
62
|
+
var text;
|
63
|
+
var i;
|
64
|
+
|
65
|
+
if (c !== undefined) {
|
66
|
+
if (b !== null) {
|
67
|
+
data = b;
|
30
68
|
}
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
else if (b && b.sel) {
|
39
|
-
children = [b];
|
40
|
-
}
|
41
|
-
else {
|
42
|
-
data = b;
|
43
|
-
}
|
69
|
+
|
70
|
+
if (is.array(c)) {
|
71
|
+
children = c;
|
72
|
+
} else if (is.primitive(c)) {
|
73
|
+
text = c;
|
74
|
+
} else if (c && c.sel) {
|
75
|
+
children = [c];
|
44
76
|
}
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
77
|
+
} else if (b !== undefined && b !== null) {
|
78
|
+
if (is.array(b)) {
|
79
|
+
children = b;
|
80
|
+
} else if (is.primitive(b)) {
|
81
|
+
text = b;
|
82
|
+
} else if (b && b.sel) {
|
83
|
+
children = [b];
|
84
|
+
} else {
|
85
|
+
data = b;
|
50
86
|
}
|
51
|
-
|
52
|
-
|
53
|
-
|
87
|
+
}
|
88
|
+
|
89
|
+
if (children !== undefined) {
|
90
|
+
for (i = 0; i < children.length; ++i) {
|
91
|
+
if (is.primitive(children[i])) children[i] = (0, _vnode.vnode)(undefined, undefined, undefined, children[i], undefined);
|
54
92
|
}
|
55
|
-
|
93
|
+
}
|
94
|
+
|
95
|
+
if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' && (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
|
96
|
+
addNS(data, children, sel);
|
97
|
+
}
|
98
|
+
|
99
|
+
return (0, _vnode.vnode)(sel, data, children, text, undefined);
|
56
100
|
}
|
57
|
-
|
101
|
+
|
58
102
|
;
|
59
|
-
exports.default = h;
|
60
103
|
|
61
|
-
},{"./is":
|
104
|
+
},{"./is.js":5,"./vnode.js":12}],3:[function(require,module,exports){
|
62
105
|
"use strict";
|
63
|
-
|
106
|
+
|
107
|
+
Object.defineProperty(exports, "__esModule", {
|
108
|
+
value: true
|
109
|
+
});
|
110
|
+
exports.htmlDomApi = void 0;
|
111
|
+
|
64
112
|
function createElement(tagName) {
|
65
|
-
|
113
|
+
return document.createElement(tagName);
|
66
114
|
}
|
115
|
+
|
67
116
|
function createElementNS(namespaceURI, qualifiedName) {
|
68
|
-
|
117
|
+
return document.createElementNS(namespaceURI, qualifiedName);
|
69
118
|
}
|
119
|
+
|
70
120
|
function createTextNode(text) {
|
71
|
-
|
121
|
+
return document.createTextNode(text);
|
72
122
|
}
|
123
|
+
|
73
124
|
function createComment(text) {
|
74
|
-
|
125
|
+
return document.createComment(text);
|
75
126
|
}
|
127
|
+
|
76
128
|
function insertBefore(parentNode, newNode, referenceNode) {
|
77
|
-
|
129
|
+
parentNode.insertBefore(newNode, referenceNode);
|
78
130
|
}
|
131
|
+
|
79
132
|
function removeChild(node, child) {
|
80
|
-
|
133
|
+
node.removeChild(child);
|
81
134
|
}
|
135
|
+
|
82
136
|
function appendChild(node, child) {
|
83
|
-
|
137
|
+
node.appendChild(child);
|
84
138
|
}
|
139
|
+
|
85
140
|
function parentNode(node) {
|
86
|
-
|
141
|
+
return node.parentNode;
|
87
142
|
}
|
143
|
+
|
88
144
|
function nextSibling(node) {
|
89
|
-
|
145
|
+
return node.nextSibling;
|
90
146
|
}
|
147
|
+
|
91
148
|
function tagName(elm) {
|
92
|
-
|
149
|
+
return elm.tagName;
|
93
150
|
}
|
151
|
+
|
94
152
|
function setTextContent(node, text) {
|
95
|
-
|
153
|
+
node.textContent = text;
|
96
154
|
}
|
155
|
+
|
97
156
|
function getTextContent(node) {
|
98
|
-
|
157
|
+
return node.textContent;
|
99
158
|
}
|
159
|
+
|
100
160
|
function isElement(node) {
|
101
|
-
|
161
|
+
return node.nodeType === 1;
|
102
162
|
}
|
163
|
+
|
103
164
|
function isText(node) {
|
104
|
-
|
165
|
+
return node.nodeType === 3;
|
105
166
|
}
|
167
|
+
|
106
168
|
function isComment(node) {
|
107
|
-
|
108
|
-
}
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
169
|
+
return node.nodeType === 8;
|
170
|
+
}
|
171
|
+
|
172
|
+
const htmlDomApi = {
|
173
|
+
createElement,
|
174
|
+
createElementNS,
|
175
|
+
createTextNode,
|
176
|
+
createComment,
|
177
|
+
insertBefore,
|
178
|
+
removeChild,
|
179
|
+
appendChild,
|
180
|
+
parentNode,
|
181
|
+
nextSibling,
|
182
|
+
tagName,
|
183
|
+
setTextContent,
|
184
|
+
getTextContent,
|
185
|
+
isElement,
|
186
|
+
isText,
|
187
|
+
isComment
|
125
188
|
};
|
126
|
-
exports.
|
189
|
+
exports.htmlDomApi = htmlDomApi;
|
127
190
|
|
128
|
-
},{}],
|
191
|
+
},{}],4:[function(require,module,exports){
|
129
192
|
"use strict";
|
130
|
-
|
131
|
-
exports
|
132
|
-
|
133
|
-
|
193
|
+
|
194
|
+
Object.defineProperty(exports, "__esModule", {
|
195
|
+
value: true
|
196
|
+
});
|
197
|
+
exports.init = init;
|
198
|
+
|
199
|
+
var _vnode = require("./vnode.js");
|
200
|
+
|
201
|
+
var is = _interopRequireWildcard(require("./is.js"));
|
202
|
+
|
203
|
+
var _htmldomapi = require("./htmldomapi.js");
|
204
|
+
|
205
|
+
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
206
|
+
|
207
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
208
|
+
|
209
|
+
function isUndef(s) {
|
210
|
+
return s === undefined;
|
134
211
|
}
|
135
|
-
exports.primitive = primitive;
|
136
212
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
function isUndef(s) { return s === undefined; }
|
144
|
-
function isDef(s) { return s !== undefined; }
|
145
|
-
var emptyNode = vnode_1.default('', {}, [], undefined, undefined);
|
213
|
+
function isDef(s) {
|
214
|
+
return s !== undefined;
|
215
|
+
}
|
216
|
+
|
217
|
+
const emptyNode = (0, _vnode.vnode)('', {}, [], undefined, undefined);
|
218
|
+
|
146
219
|
function sameVnode(vnode1, vnode2) {
|
147
|
-
|
220
|
+
return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
|
148
221
|
}
|
222
|
+
|
149
223
|
function isVnode(vnode) {
|
150
|
-
|
224
|
+
return vnode.sel !== undefined;
|
151
225
|
}
|
226
|
+
|
152
227
|
function createKeyToOldIdx(children, beginIdx, endIdx) {
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
228
|
+
var _a;
|
229
|
+
|
230
|
+
const map = {};
|
231
|
+
|
232
|
+
for (let i = beginIdx; i <= endIdx; ++i) {
|
233
|
+
const key = (_a = children[i]) === null || _a === void 0 ? void 0 : _a.key;
|
234
|
+
|
235
|
+
if (key !== undefined) {
|
236
|
+
map[key] = i;
|
161
237
|
}
|
162
|
-
|
238
|
+
}
|
239
|
+
|
240
|
+
return map;
|
163
241
|
}
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
var thunk_1 = require("./thunk");
|
168
|
-
exports.thunk = thunk_1.thunk;
|
242
|
+
|
243
|
+
const hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
|
244
|
+
|
169
245
|
function init(modules, domApi) {
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
246
|
+
let i;
|
247
|
+
let j;
|
248
|
+
const cbs = {
|
249
|
+
create: [],
|
250
|
+
update: [],
|
251
|
+
remove: [],
|
252
|
+
destroy: [],
|
253
|
+
pre: [],
|
254
|
+
post: []
|
255
|
+
};
|
256
|
+
const api = domApi !== undefined ? domApi : _htmldomapi.htmlDomApi;
|
257
|
+
|
258
|
+
for (i = 0; i < hooks.length; ++i) {
|
259
|
+
cbs[hooks[i]] = [];
|
260
|
+
|
261
|
+
for (j = 0; j < modules.length; ++j) {
|
262
|
+
const hook = modules[j][hooks[i]];
|
263
|
+
|
264
|
+
if (hook !== undefined) {
|
265
|
+
cbs[hooks[i]].push(hook);
|
266
|
+
}
|
185
267
|
}
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
268
|
+
}
|
269
|
+
|
270
|
+
function emptyNodeAt(elm) {
|
271
|
+
const id = elm.id ? '#' + elm.id : '';
|
272
|
+
const c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
|
273
|
+
return (0, _vnode.vnode)(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
|
274
|
+
}
|
275
|
+
|
276
|
+
function createRmCb(childElm, listeners) {
|
277
|
+
return function rmCb() {
|
278
|
+
if (--listeners === 0) {
|
279
|
+
const parent = api.parentNode(childElm);
|
280
|
+
api.removeChild(parent, childElm);
|
281
|
+
}
|
282
|
+
};
|
283
|
+
}
|
284
|
+
|
285
|
+
function createElm(vnode, insertedVnodeQueue) {
|
286
|
+
var _a, _b;
|
287
|
+
|
288
|
+
let i;
|
289
|
+
let data = vnode.data;
|
290
|
+
|
291
|
+
if (data !== undefined) {
|
292
|
+
const init = (_a = data.hook) === null || _a === void 0 ? void 0 : _a.init;
|
293
|
+
|
294
|
+
if (isDef(init)) {
|
295
|
+
init(vnode);
|
296
|
+
data = vnode.data;
|
297
|
+
}
|
193
298
|
}
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
if (is.array(children)) {
|
225
|
-
for (i = 0; i < children.length; ++i) {
|
226
|
-
var ch = children[i];
|
227
|
-
if (ch != null) {
|
228
|
-
api.appendChild(elm, createElm(ch, insertedVnodeQueue));
|
229
|
-
}
|
230
|
-
}
|
231
|
-
}
|
232
|
-
else if (is.primitive(vnode.text)) {
|
233
|
-
api.appendChild(elm, api.createTextNode(vnode.text));
|
234
|
-
}
|
235
|
-
i = vnode.data.hook; // Reuse variable
|
236
|
-
if (isDef(i)) {
|
237
|
-
if (i.create)
|
238
|
-
i.create(emptyNode, vnode);
|
239
|
-
if (i.insert)
|
240
|
-
insertedVnodeQueue.push(vnode);
|
241
|
-
}
|
299
|
+
|
300
|
+
const children = vnode.children;
|
301
|
+
const sel = vnode.sel;
|
302
|
+
|
303
|
+
if (sel === '!') {
|
304
|
+
if (isUndef(vnode.text)) {
|
305
|
+
vnode.text = '';
|
306
|
+
}
|
307
|
+
|
308
|
+
vnode.elm = api.createComment(vnode.text);
|
309
|
+
} else if (sel !== undefined) {
|
310
|
+
// Parse selector
|
311
|
+
const hashIdx = sel.indexOf('#');
|
312
|
+
const dotIdx = sel.indexOf('.', hashIdx);
|
313
|
+
const hash = hashIdx > 0 ? hashIdx : sel.length;
|
314
|
+
const dot = dotIdx > 0 ? dotIdx : sel.length;
|
315
|
+
const tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
|
316
|
+
const elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag) : api.createElement(tag);
|
317
|
+
if (hash < dot) elm.setAttribute('id', sel.slice(hash + 1, dot));
|
318
|
+
if (dotIdx > 0) elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' '));
|
319
|
+
|
320
|
+
for (i = 0; i < cbs.create.length; ++i) cbs.create[i](emptyNode, vnode);
|
321
|
+
|
322
|
+
if (is.array(children)) {
|
323
|
+
for (i = 0; i < children.length; ++i) {
|
324
|
+
const ch = children[i];
|
325
|
+
|
326
|
+
if (ch != null) {
|
327
|
+
api.appendChild(elm, createElm(ch, insertedVnodeQueue));
|
328
|
+
}
|
242
329
|
}
|
243
|
-
|
244
|
-
|
330
|
+
} else if (is.primitive(vnode.text)) {
|
331
|
+
api.appendChild(elm, api.createTextNode(vnode.text));
|
332
|
+
}
|
333
|
+
|
334
|
+
const hook = vnode.data.hook;
|
335
|
+
|
336
|
+
if (isDef(hook)) {
|
337
|
+
(_b = hook.create) === null || _b === void 0 ? void 0 : _b.call(hook, emptyNode, vnode);
|
338
|
+
|
339
|
+
if (hook.insert) {
|
340
|
+
insertedVnodeQueue.push(vnode);
|
245
341
|
}
|
246
|
-
|
342
|
+
}
|
343
|
+
} else {
|
344
|
+
vnode.elm = api.createTextNode(vnode.text);
|
247
345
|
}
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
346
|
+
|
347
|
+
return vnode.elm;
|
348
|
+
}
|
349
|
+
|
350
|
+
function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
|
351
|
+
for (; startIdx <= endIdx; ++startIdx) {
|
352
|
+
const ch = vnodes[startIdx];
|
353
|
+
|
354
|
+
if (ch != null) {
|
355
|
+
api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
|
356
|
+
}
|
255
357
|
}
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
358
|
+
}
|
359
|
+
|
360
|
+
function invokeDestroyHook(vnode) {
|
361
|
+
var _a, _b;
|
362
|
+
|
363
|
+
const data = vnode.data;
|
364
|
+
|
365
|
+
if (data !== undefined) {
|
366
|
+
(_b = (_a = data === null || data === void 0 ? void 0 : data.hook) === null || _a === void 0 ? void 0 : _a.destroy) === null || _b === void 0 ? void 0 : _b.call(_a, vnode);
|
367
|
+
|
368
|
+
for (let i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode);
|
369
|
+
|
370
|
+
if (vnode.children !== undefined) {
|
371
|
+
for (let j = 0; j < vnode.children.length; ++j) {
|
372
|
+
const child = vnode.children[j];
|
373
|
+
|
374
|
+
if (child != null && typeof child !== 'string') {
|
375
|
+
invokeDestroyHook(child);
|
376
|
+
}
|
271
377
|
}
|
378
|
+
}
|
272
379
|
}
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
380
|
+
}
|
381
|
+
|
382
|
+
function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
|
383
|
+
var _a, _b;
|
384
|
+
|
385
|
+
for (; startIdx <= endIdx; ++startIdx) {
|
386
|
+
let listeners;
|
387
|
+
let rm;
|
388
|
+
const ch = vnodes[startIdx];
|
389
|
+
|
390
|
+
if (ch != null) {
|
391
|
+
if (isDef(ch.sel)) {
|
392
|
+
invokeDestroyHook(ch);
|
393
|
+
listeners = cbs.remove.length + 1;
|
394
|
+
rm = createRmCb(ch.elm, listeners);
|
395
|
+
|
396
|
+
for (let i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm);
|
397
|
+
|
398
|
+
const removeHook = (_b = (_a = ch === null || ch === void 0 ? void 0 : ch.data) === null || _a === void 0 ? void 0 : _a.hook) === null || _b === void 0 ? void 0 : _b.remove;
|
399
|
+
|
400
|
+
if (isDef(removeHook)) {
|
401
|
+
removeHook(ch, rm);
|
402
|
+
} else {
|
403
|
+
rm();
|
404
|
+
}
|
405
|
+
} else {
|
406
|
+
// Text node
|
407
|
+
api.removeChild(parentElm, ch.elm);
|
294
408
|
}
|
409
|
+
}
|
295
410
|
}
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
if (oldKeyToIdx === undefined) {
|
345
|
-
oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
|
346
|
-
}
|
347
|
-
idxInOld = oldKeyToIdx[newStartVnode.key];
|
348
|
-
if (isUndef(idxInOld)) {
|
349
|
-
api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
|
350
|
-
newStartVnode = newCh[++newStartIdx];
|
351
|
-
}
|
352
|
-
else {
|
353
|
-
elmToMove = oldCh[idxInOld];
|
354
|
-
if (elmToMove.sel !== newStartVnode.sel) {
|
355
|
-
api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
|
356
|
-
}
|
357
|
-
else {
|
358
|
-
patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
|
359
|
-
oldCh[idxInOld] = undefined;
|
360
|
-
api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
|
361
|
-
}
|
362
|
-
newStartVnode = newCh[++newStartIdx];
|
363
|
-
}
|
364
|
-
}
|
365
|
-
}
|
366
|
-
if (oldStartIdx > oldEndIdx) {
|
367
|
-
before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
|
368
|
-
addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
|
411
|
+
}
|
412
|
+
|
413
|
+
function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
|
414
|
+
let oldStartIdx = 0;
|
415
|
+
let newStartIdx = 0;
|
416
|
+
let oldEndIdx = oldCh.length - 1;
|
417
|
+
let oldStartVnode = oldCh[0];
|
418
|
+
let oldEndVnode = oldCh[oldEndIdx];
|
419
|
+
let newEndIdx = newCh.length - 1;
|
420
|
+
let newStartVnode = newCh[0];
|
421
|
+
let newEndVnode = newCh[newEndIdx];
|
422
|
+
let oldKeyToIdx;
|
423
|
+
let idxInOld;
|
424
|
+
let elmToMove;
|
425
|
+
let before;
|
426
|
+
|
427
|
+
while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
|
428
|
+
if (oldStartVnode == null) {
|
429
|
+
oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
|
430
|
+
} else if (oldEndVnode == null) {
|
431
|
+
oldEndVnode = oldCh[--oldEndIdx];
|
432
|
+
} else if (newStartVnode == null) {
|
433
|
+
newStartVnode = newCh[++newStartIdx];
|
434
|
+
} else if (newEndVnode == null) {
|
435
|
+
newEndVnode = newCh[--newEndIdx];
|
436
|
+
} else if (sameVnode(oldStartVnode, newStartVnode)) {
|
437
|
+
patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
|
438
|
+
oldStartVnode = oldCh[++oldStartIdx];
|
439
|
+
newStartVnode = newCh[++newStartIdx];
|
440
|
+
} else if (sameVnode(oldEndVnode, newEndVnode)) {
|
441
|
+
patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
|
442
|
+
oldEndVnode = oldCh[--oldEndIdx];
|
443
|
+
newEndVnode = newCh[--newEndIdx];
|
444
|
+
} else if (sameVnode(oldStartVnode, newEndVnode)) {
|
445
|
+
// Vnode moved right
|
446
|
+
patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
|
447
|
+
api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
|
448
|
+
oldStartVnode = oldCh[++oldStartIdx];
|
449
|
+
newEndVnode = newCh[--newEndIdx];
|
450
|
+
} else if (sameVnode(oldEndVnode, newStartVnode)) {
|
451
|
+
// Vnode moved left
|
452
|
+
patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
|
453
|
+
api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
|
454
|
+
oldEndVnode = oldCh[--oldEndIdx];
|
455
|
+
newStartVnode = newCh[++newStartIdx];
|
456
|
+
} else {
|
457
|
+
if (oldKeyToIdx === undefined) {
|
458
|
+
oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
|
369
459
|
}
|
370
|
-
|
371
|
-
|
460
|
+
|
461
|
+
idxInOld = oldKeyToIdx[newStartVnode.key];
|
462
|
+
|
463
|
+
if (isUndef(idxInOld)) {
|
464
|
+
// New element
|
465
|
+
api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
|
466
|
+
} else {
|
467
|
+
elmToMove = oldCh[idxInOld];
|
468
|
+
|
469
|
+
if (elmToMove.sel !== newStartVnode.sel) {
|
470
|
+
api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
|
471
|
+
} else {
|
472
|
+
patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
|
473
|
+
oldCh[idxInOld] = undefined;
|
474
|
+
api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
|
475
|
+
}
|
372
476
|
}
|
477
|
+
|
478
|
+
newStartVnode = newCh[++newStartIdx];
|
479
|
+
}
|
373
480
|
}
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
if (oldVnode === vnode)
|
383
|
-
return;
|
384
|
-
if (vnode.data !== undefined) {
|
385
|
-
for (i = 0; i < cbs.update.length; ++i)
|
386
|
-
cbs.update[i](oldVnode, vnode);
|
387
|
-
i = vnode.data.hook;
|
388
|
-
if (isDef(i) && isDef(i = i.update))
|
389
|
-
i(oldVnode, vnode);
|
390
|
-
}
|
391
|
-
if (isUndef(vnode.text)) {
|
392
|
-
if (isDef(oldCh) && isDef(ch)) {
|
393
|
-
if (oldCh !== ch)
|
394
|
-
updateChildren(elm, oldCh, ch, insertedVnodeQueue);
|
395
|
-
}
|
396
|
-
else if (isDef(ch)) {
|
397
|
-
if (isDef(oldVnode.text))
|
398
|
-
api.setTextContent(elm, '');
|
399
|
-
addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
|
400
|
-
}
|
401
|
-
else if (isDef(oldCh)) {
|
402
|
-
removeVnodes(elm, oldCh, 0, oldCh.length - 1);
|
403
|
-
}
|
404
|
-
else if (isDef(oldVnode.text)) {
|
405
|
-
api.setTextContent(elm, '');
|
406
|
-
}
|
407
|
-
}
|
408
|
-
else if (oldVnode.text !== vnode.text) {
|
409
|
-
api.setTextContent(elm, vnode.text);
|
410
|
-
}
|
411
|
-
if (isDef(hook) && isDef(i = hook.postpatch)) {
|
412
|
-
i(oldVnode, vnode);
|
413
|
-
}
|
481
|
+
|
482
|
+
if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
|
483
|
+
if (oldStartIdx > oldEndIdx) {
|
484
|
+
before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
|
485
|
+
addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
|
486
|
+
} else {
|
487
|
+
removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
|
488
|
+
}
|
414
489
|
}
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
490
|
+
}
|
491
|
+
|
492
|
+
function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
|
493
|
+
var _a, _b, _c, _d, _e;
|
494
|
+
|
495
|
+
const hook = (_a = vnode.data) === null || _a === void 0 ? void 0 : _a.hook;
|
496
|
+
(_b = hook === null || hook === void 0 ? void 0 : hook.prepatch) === null || _b === void 0 ? void 0 : _b.call(hook, oldVnode, vnode);
|
497
|
+
const elm = vnode.elm = oldVnode.elm;
|
498
|
+
const oldCh = oldVnode.children;
|
499
|
+
const ch = vnode.children;
|
500
|
+
if (oldVnode === vnode) return;
|
501
|
+
|
502
|
+
if (vnode.data !== undefined) {
|
503
|
+
for (let i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode);
|
504
|
+
|
505
|
+
(_d = (_c = vnode.data.hook) === null || _c === void 0 ? void 0 : _c.update) === null || _d === void 0 ? void 0 : _d.call(_c, oldVnode, vnode);
|
506
|
+
}
|
507
|
+
|
508
|
+
if (isUndef(vnode.text)) {
|
509
|
+
if (isDef(oldCh) && isDef(ch)) {
|
510
|
+
if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue);
|
511
|
+
} else if (isDef(ch)) {
|
512
|
+
if (isDef(oldVnode.text)) api.setTextContent(elm, '');
|
513
|
+
addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
|
514
|
+
} else if (isDef(oldCh)) {
|
515
|
+
removeVnodes(elm, oldCh, 0, oldCh.length - 1);
|
516
|
+
} else if (isDef(oldVnode.text)) {
|
517
|
+
api.setTextContent(elm, '');
|
518
|
+
}
|
519
|
+
} else if (oldVnode.text !== vnode.text) {
|
520
|
+
if (isDef(oldCh)) {
|
521
|
+
removeVnodes(elm, oldCh, 0, oldCh.length - 1);
|
522
|
+
}
|
523
|
+
|
524
|
+
api.setTextContent(elm, vnode.text);
|
525
|
+
}
|
526
|
+
|
527
|
+
(_e = hook === null || hook === void 0 ? void 0 : hook.postpatch) === null || _e === void 0 ? void 0 : _e.call(hook, oldVnode, vnode);
|
528
|
+
}
|
529
|
+
|
530
|
+
return function patch(oldVnode, vnode) {
|
531
|
+
let i, elm, parent;
|
532
|
+
const insertedVnodeQueue = [];
|
533
|
+
|
534
|
+
for (i = 0; i < cbs.pre.length; ++i) cbs.pre[i]();
|
535
|
+
|
536
|
+
if (!isVnode(oldVnode)) {
|
537
|
+
oldVnode = emptyNodeAt(oldVnode);
|
538
|
+
}
|
539
|
+
|
540
|
+
if (sameVnode(oldVnode, vnode)) {
|
541
|
+
patchVnode(oldVnode, vnode, insertedVnodeQueue);
|
542
|
+
} else {
|
543
|
+
elm = oldVnode.elm;
|
544
|
+
parent = api.parentNode(elm);
|
545
|
+
createElm(vnode, insertedVnodeQueue);
|
546
|
+
|
547
|
+
if (parent !== null) {
|
548
|
+
api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
|
549
|
+
removeVnodes(parent, [oldVnode], 0, 0);
|
550
|
+
}
|
551
|
+
}
|
552
|
+
|
553
|
+
for (i = 0; i < insertedVnodeQueue.length; ++i) {
|
554
|
+
insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
|
555
|
+
}
|
556
|
+
|
557
|
+
for (i = 0; i < cbs.post.length; ++i) cbs.post[i]();
|
558
|
+
|
559
|
+
return vnode;
|
560
|
+
};
|
561
|
+
}
|
562
|
+
|
563
|
+
},{"./htmldomapi.js":3,"./is.js":5,"./vnode.js":12}],5:[function(require,module,exports){
|
564
|
+
"use strict";
|
565
|
+
|
566
|
+
Object.defineProperty(exports, "__esModule", {
|
567
|
+
value: true
|
568
|
+
});
|
569
|
+
exports.primitive = primitive;
|
570
|
+
exports.array = void 0;
|
571
|
+
const array = Array.isArray;
|
572
|
+
exports.array = array;
|
573
|
+
|
574
|
+
function primitive(s) {
|
575
|
+
return typeof s === 'string' || typeof s === 'number';
|
576
|
+
}
|
577
|
+
|
578
|
+
},{}],6:[function(require,module,exports){
|
579
|
+
"use strict";
|
580
|
+
|
581
|
+
Object.defineProperty(exports, "__esModule", {
|
582
|
+
value: true
|
583
|
+
});
|
584
|
+
exports.attributesModule = void 0;
|
585
|
+
const xlinkNS = 'http://www.w3.org/1999/xlink';
|
586
|
+
const xmlNS = 'http://www.w3.org/XML/1998/namespace';
|
587
|
+
const colonChar = 58;
|
588
|
+
const xChar = 120;
|
589
|
+
|
590
|
+
function updateAttrs(oldVnode, vnode) {
|
591
|
+
var key;
|
592
|
+
var elm = vnode.elm;
|
593
|
+
var oldAttrs = oldVnode.data.attrs;
|
594
|
+
var attrs = vnode.data.attrs;
|
595
|
+
if (!oldAttrs && !attrs) return;
|
596
|
+
if (oldAttrs === attrs) return;
|
597
|
+
oldAttrs = oldAttrs || {};
|
598
|
+
attrs = attrs || {}; // update modified attributes, add new attributes
|
599
|
+
|
600
|
+
for (key in attrs) {
|
601
|
+
const cur = attrs[key];
|
602
|
+
const old = oldAttrs[key];
|
603
|
+
|
604
|
+
if (old !== cur) {
|
605
|
+
if (cur === true) {
|
606
|
+
elm.setAttribute(key, '');
|
607
|
+
} else if (cur === false) {
|
608
|
+
elm.removeAttribute(key);
|
609
|
+
} else {
|
610
|
+
if (key.charCodeAt(0) !== xChar) {
|
611
|
+
elm.setAttribute(key, cur);
|
612
|
+
} else if (key.charCodeAt(3) === colonChar) {
|
613
|
+
// Assume xml namespace
|
614
|
+
elm.setAttributeNS(xmlNS, key, cur);
|
615
|
+
} else if (key.charCodeAt(5) === colonChar) {
|
616
|
+
// Assume xlink namespace
|
617
|
+
elm.setAttributeNS(xlinkNS, key, cur);
|
618
|
+
} else {
|
619
|
+
elm.setAttribute(key, cur);
|
425
620
|
}
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
621
|
+
}
|
622
|
+
}
|
623
|
+
} // remove removed attributes
|
624
|
+
// use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
|
625
|
+
// the other option is to remove all attributes with value == undefined
|
626
|
+
|
627
|
+
|
628
|
+
for (key in oldAttrs) {
|
629
|
+
if (!(key in attrs)) {
|
630
|
+
elm.removeAttribute(key);
|
631
|
+
}
|
632
|
+
}
|
633
|
+
}
|
634
|
+
|
635
|
+
const attributesModule = {
|
636
|
+
create: updateAttrs,
|
637
|
+
update: updateAttrs
|
638
|
+
};
|
639
|
+
exports.attributesModule = attributesModule;
|
640
|
+
|
641
|
+
},{}],7:[function(require,module,exports){
|
642
|
+
"use strict";
|
643
|
+
|
644
|
+
Object.defineProperty(exports, "__esModule", {
|
645
|
+
value: true
|
646
|
+
});
|
647
|
+
exports.classModule = void 0;
|
648
|
+
|
649
|
+
function updateClass(oldVnode, vnode) {
|
650
|
+
var cur;
|
651
|
+
var name;
|
652
|
+
var elm = vnode.elm;
|
653
|
+
var oldClass = oldVnode.data.class;
|
654
|
+
var klass = vnode.data.class;
|
655
|
+
if (!oldClass && !klass) return;
|
656
|
+
if (oldClass === klass) return;
|
657
|
+
oldClass = oldClass || {};
|
658
|
+
klass = klass || {};
|
659
|
+
|
660
|
+
for (name in oldClass) {
|
661
|
+
if (oldClass[name] && !Object.prototype.hasOwnProperty.call(klass, name)) {
|
662
|
+
// was `true` and now not provided
|
663
|
+
elm.classList.remove(name);
|
664
|
+
}
|
665
|
+
}
|
666
|
+
|
667
|
+
for (name in klass) {
|
668
|
+
cur = klass[name];
|
669
|
+
|
670
|
+
if (cur !== oldClass[name]) {
|
671
|
+
elm.classList[cur ? 'add' : 'remove'](name);
|
672
|
+
}
|
673
|
+
}
|
674
|
+
}
|
675
|
+
|
676
|
+
const classModule = {
|
677
|
+
create: updateClass,
|
678
|
+
update: updateClass
|
679
|
+
};
|
680
|
+
exports.classModule = classModule;
|
681
|
+
|
682
|
+
},{}],8:[function(require,module,exports){
|
683
|
+
"use strict";
|
684
|
+
|
685
|
+
Object.defineProperty(exports, "__esModule", {
|
686
|
+
value: true
|
687
|
+
});
|
688
|
+
exports.eventListenersModule = void 0;
|
689
|
+
|
690
|
+
function invokeHandler(handler, vnode, event) {
|
691
|
+
if (typeof handler === 'function') {
|
692
|
+
// call function handler
|
693
|
+
handler.call(vnode, event, vnode);
|
694
|
+
} else if (typeof handler === 'object') {
|
695
|
+
// call multiple handlers
|
696
|
+
for (var i = 0; i < handler.length; i++) {
|
697
|
+
invokeHandler(handler[i], vnode, event);
|
698
|
+
}
|
699
|
+
}
|
700
|
+
}
|
701
|
+
|
702
|
+
function handleEvent(event, vnode) {
|
703
|
+
var name = event.type;
|
704
|
+
var on = vnode.data.on; // call event handler(s) if exists
|
705
|
+
|
706
|
+
if (on && on[name]) {
|
707
|
+
invokeHandler(on[name], vnode, event);
|
708
|
+
}
|
709
|
+
}
|
710
|
+
|
711
|
+
function createListener() {
|
712
|
+
return function handler(event) {
|
713
|
+
handleEvent(event, handler.vnode);
|
714
|
+
};
|
715
|
+
}
|
716
|
+
|
717
|
+
function updateEventListeners(oldVnode, vnode) {
|
718
|
+
var oldOn = oldVnode.data.on;
|
719
|
+
var oldListener = oldVnode.listener;
|
720
|
+
var oldElm = oldVnode.elm;
|
721
|
+
var on = vnode && vnode.data.on;
|
722
|
+
var elm = vnode && vnode.elm;
|
723
|
+
var name; // optimization for reused immutable handlers
|
724
|
+
|
725
|
+
if (oldOn === on) {
|
726
|
+
return;
|
727
|
+
} // remove existing listeners which no longer used
|
728
|
+
|
729
|
+
|
730
|
+
if (oldOn && oldListener) {
|
731
|
+
// if element changed or deleted we remove all existing listeners unconditionally
|
732
|
+
if (!on) {
|
733
|
+
for (name in oldOn) {
|
734
|
+
// remove listener if element was changed or existing listeners removed
|
735
|
+
oldElm.removeEventListener(name, oldListener, false);
|
736
|
+
}
|
737
|
+
} else {
|
738
|
+
for (name in oldOn) {
|
739
|
+
// remove listener if existing listener removed
|
740
|
+
if (!on[name]) {
|
741
|
+
oldElm.removeEventListener(name, oldListener, false);
|
434
742
|
}
|
435
|
-
|
436
|
-
|
743
|
+
}
|
744
|
+
}
|
745
|
+
} // add new listeners which has not already attached
|
746
|
+
|
747
|
+
|
748
|
+
if (on) {
|
749
|
+
// reuse existing listener or create new
|
750
|
+
var listener = vnode.listener = oldVnode.listener || createListener(); // update vnode for listener
|
751
|
+
|
752
|
+
listener.vnode = vnode; // if element changed or added we add all needed listeners unconditionally
|
753
|
+
|
754
|
+
if (!oldOn) {
|
755
|
+
for (name in on) {
|
756
|
+
// add listener if element was changed or new listeners added
|
757
|
+
elm.addEventListener(name, listener, false);
|
758
|
+
}
|
759
|
+
} else {
|
760
|
+
for (name in on) {
|
761
|
+
// add listener if new listener added
|
762
|
+
if (!oldOn[name]) {
|
763
|
+
elm.addEventListener(name, listener, false);
|
437
764
|
}
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
};
|
765
|
+
}
|
766
|
+
}
|
767
|
+
}
|
442
768
|
}
|
443
|
-
exports.init = init;
|
444
769
|
|
445
|
-
|
770
|
+
const eventListenersModule = {
|
771
|
+
create: updateEventListeners,
|
772
|
+
update: updateEventListeners,
|
773
|
+
destroy: updateEventListeners
|
774
|
+
};
|
775
|
+
exports.eventListenersModule = eventListenersModule;
|
776
|
+
|
777
|
+
},{}],9:[function(require,module,exports){
|
446
778
|
"use strict";
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
}
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
779
|
+
|
780
|
+
Object.defineProperty(exports, "__esModule", {
|
781
|
+
value: true
|
782
|
+
});
|
783
|
+
exports.propsModule = void 0;
|
784
|
+
|
785
|
+
function updateProps(oldVnode, vnode) {
|
786
|
+
var key;
|
787
|
+
var cur;
|
788
|
+
var old;
|
789
|
+
var elm = vnode.elm;
|
790
|
+
var oldProps = oldVnode.data.props;
|
791
|
+
var props = vnode.data.props;
|
792
|
+
if (!oldProps && !props) return;
|
793
|
+
if (oldProps === props) return;
|
794
|
+
oldProps = oldProps || {};
|
795
|
+
props = props || {};
|
796
|
+
|
797
|
+
for (key in props) {
|
798
|
+
cur = props[key];
|
799
|
+
old = oldProps[key];
|
800
|
+
|
801
|
+
if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
|
802
|
+
elm[key] = cur;
|
469
803
|
}
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
804
|
+
}
|
805
|
+
}
|
806
|
+
|
807
|
+
const propsModule = {
|
808
|
+
create: updateProps,
|
809
|
+
update: updateProps
|
810
|
+
};
|
811
|
+
exports.propsModule = propsModule;
|
812
|
+
|
813
|
+
},{}],10:[function(require,module,exports){
|
814
|
+
"use strict";
|
815
|
+
|
816
|
+
Object.defineProperty(exports, "__esModule", {
|
817
|
+
value: true
|
818
|
+
});
|
819
|
+
exports.styleModule = void 0;
|
820
|
+
// Bindig `requestAnimationFrame` like this fixes a bug in IE/Edge. See #360 and #409.
|
821
|
+
var raf = typeof window !== 'undefined' && window.requestAnimationFrame.bind(window) || setTimeout;
|
822
|
+
|
823
|
+
var nextFrame = function (fn) {
|
824
|
+
raf(function () {
|
825
|
+
raf(fn);
|
826
|
+
});
|
827
|
+
};
|
828
|
+
|
829
|
+
var reflowForced = false;
|
830
|
+
|
831
|
+
function setNextFrame(obj, prop, val) {
|
832
|
+
nextFrame(function () {
|
833
|
+
obj[prop] = val;
|
834
|
+
});
|
835
|
+
}
|
836
|
+
|
837
|
+
function updateStyle(oldVnode, vnode) {
|
838
|
+
var cur;
|
839
|
+
var name;
|
840
|
+
var elm = vnode.elm;
|
841
|
+
var oldStyle = oldVnode.data.style;
|
842
|
+
var style = vnode.data.style;
|
843
|
+
if (!oldStyle && !style) return;
|
844
|
+
if (oldStyle === style) return;
|
845
|
+
oldStyle = oldStyle || {};
|
846
|
+
style = style || {};
|
847
|
+
var oldHasDel = ('delayed' in oldStyle);
|
848
|
+
|
849
|
+
for (name in oldStyle) {
|
850
|
+
if (!style[name]) {
|
851
|
+
if (name[0] === '-' && name[1] === '-') {
|
852
|
+
elm.style.removeProperty(name);
|
853
|
+
} else {
|
854
|
+
elm.style[name] = '';
|
855
|
+
}
|
856
|
+
}
|
857
|
+
}
|
858
|
+
|
859
|
+
for (name in style) {
|
860
|
+
cur = style[name];
|
861
|
+
|
862
|
+
if (name === 'delayed' && style.delayed) {
|
863
|
+
for (const name2 in style.delayed) {
|
864
|
+
cur = style.delayed[name2];
|
865
|
+
|
866
|
+
if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
|
867
|
+
setNextFrame(elm.style, name2, cur);
|
474
868
|
}
|
869
|
+
}
|
870
|
+
} else if (name !== 'remove' && cur !== oldStyle[name]) {
|
871
|
+
if (name[0] === '-' && name[1] === '-') {
|
872
|
+
elm.style.setProperty(name, cur);
|
873
|
+
} else {
|
874
|
+
elm.style[name] = cur;
|
875
|
+
}
|
475
876
|
}
|
476
|
-
|
877
|
+
}
|
477
878
|
}
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
879
|
+
|
880
|
+
function applyDestroyStyle(vnode) {
|
881
|
+
var style;
|
882
|
+
var name;
|
883
|
+
var elm = vnode.elm;
|
884
|
+
var s = vnode.data.style;
|
885
|
+
if (!s || !(style = s.destroy)) return;
|
886
|
+
|
887
|
+
for (name in style) {
|
888
|
+
elm.style[name] = style[name];
|
889
|
+
}
|
890
|
+
}
|
891
|
+
|
892
|
+
function applyRemoveStyle(vnode, rm) {
|
893
|
+
var s = vnode.data.style;
|
894
|
+
|
895
|
+
if (!s || !s.remove) {
|
896
|
+
rm();
|
897
|
+
return;
|
898
|
+
}
|
899
|
+
|
900
|
+
if (!reflowForced) {
|
901
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
902
|
+
vnode.elm.offsetLeft;
|
903
|
+
reflowForced = true;
|
904
|
+
}
|
905
|
+
|
906
|
+
var name;
|
907
|
+
var elm = vnode.elm;
|
908
|
+
var i = 0;
|
909
|
+
var compStyle;
|
910
|
+
var style = s.remove;
|
911
|
+
var amount = 0;
|
912
|
+
var applied = [];
|
913
|
+
|
914
|
+
for (name in style) {
|
915
|
+
applied.push(name);
|
916
|
+
elm.style[name] = style[name];
|
917
|
+
}
|
918
|
+
|
919
|
+
compStyle = getComputedStyle(elm);
|
920
|
+
var props = compStyle['transition-property'].split(', ');
|
921
|
+
|
922
|
+
for (; i < props.length; ++i) {
|
923
|
+
if (applied.indexOf(props[i]) !== -1) amount++;
|
924
|
+
}
|
925
|
+
|
926
|
+
elm.addEventListener('transitionend', function (ev) {
|
927
|
+
if (ev.target === elm) --amount;
|
928
|
+
if (amount === 0) rm();
|
929
|
+
});
|
930
|
+
}
|
931
|
+
|
932
|
+
function forceReflow() {
|
933
|
+
reflowForced = false;
|
934
|
+
}
|
935
|
+
|
936
|
+
const styleModule = {
|
937
|
+
pre: forceReflow,
|
938
|
+
create: updateStyle,
|
939
|
+
update: updateStyle,
|
940
|
+
destroy: applyDestroyStyle,
|
941
|
+
remove: applyRemoveStyle
|
490
942
|
};
|
491
|
-
exports.
|
943
|
+
exports.styleModule = styleModule;
|
492
944
|
|
493
|
-
},{
|
945
|
+
},{}],11:[function(require,module,exports){
|
494
946
|
"use strict";
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
947
|
+
|
948
|
+
Object.defineProperty(exports, "__esModule", {
|
949
|
+
value: true
|
950
|
+
});
|
951
|
+
exports.toVNode = toVNode;
|
952
|
+
|
953
|
+
var _vnode = require("./vnode.js");
|
954
|
+
|
955
|
+
var _htmldomapi = require("./htmldomapi.js");
|
956
|
+
|
957
|
+
function toVNode(node, domApi) {
|
958
|
+
const api = domApi !== undefined ? domApi : _htmldomapi.htmlDomApi;
|
959
|
+
let text;
|
960
|
+
|
961
|
+
if (api.isElement(node)) {
|
962
|
+
const id = node.id ? '#' + node.id : '';
|
963
|
+
const cn = node.getAttribute('class');
|
964
|
+
const c = cn ? '.' + cn.split(' ').join('.') : '';
|
965
|
+
const sel = api.tagName(node).toLowerCase() + id + c;
|
966
|
+
const attrs = {};
|
967
|
+
const children = [];
|
968
|
+
let name;
|
969
|
+
let i, n;
|
970
|
+
const elmAttrs = node.attributes;
|
971
|
+
const elmChildren = node.childNodes;
|
972
|
+
|
973
|
+
for (i = 0, n = elmAttrs.length; i < n; i++) {
|
974
|
+
name = elmAttrs[i].nodeName;
|
975
|
+
|
976
|
+
if (name !== 'id' && name !== 'class') {
|
977
|
+
attrs[name] = elmAttrs[i].nodeValue;
|
978
|
+
}
|
979
|
+
}
|
980
|
+
|
981
|
+
for (i = 0, n = elmChildren.length; i < n; i++) {
|
982
|
+
children.push(toVNode(elmChildren[i], domApi));
|
983
|
+
}
|
984
|
+
|
985
|
+
return (0, _vnode.vnode)(sel, {
|
986
|
+
attrs
|
987
|
+
}, children, undefined, node);
|
988
|
+
} else if (api.isText(node)) {
|
989
|
+
text = api.getTextContent(node);
|
990
|
+
return (0, _vnode.vnode)(undefined, undefined, undefined, text, node);
|
991
|
+
} else if (api.isComment(node)) {
|
992
|
+
text = api.getTextContent(node);
|
993
|
+
return (0, _vnode.vnode)('!', {}, [], text, node);
|
994
|
+
} else {
|
995
|
+
return (0, _vnode.vnode)('', {}, [], undefined, node);
|
996
|
+
}
|
500
997
|
}
|
998
|
+
|
999
|
+
},{"./htmldomapi.js":3,"./vnode.js":12}],12:[function(require,module,exports){
|
1000
|
+
"use strict";
|
1001
|
+
|
1002
|
+
Object.defineProperty(exports, "__esModule", {
|
1003
|
+
value: true
|
1004
|
+
});
|
501
1005
|
exports.vnode = vnode;
|
502
|
-
exports.default = vnode;
|
503
1006
|
|
504
|
-
|
1007
|
+
function vnode(sel, data, children, text, elm) {
|
1008
|
+
const key = data === undefined ? undefined : data.key;
|
1009
|
+
return {
|
1010
|
+
sel,
|
1011
|
+
data,
|
1012
|
+
children,
|
1013
|
+
text,
|
1014
|
+
elm,
|
1015
|
+
key
|
1016
|
+
};
|
1017
|
+
}
|
1018
|
+
|
1019
|
+
},{}]},{},[1])(1)
|
505
1020
|
});
|
506
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy8ucmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXItcGFjay82LjAuMi9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiaC5qcyIsImh0bWxkb21hcGkuanMiLCJpcy5qcyIsInNuYWJiZG9tLmpzIiwidGh1bmsuanMiLCJ2bm9kZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdm5vZGVfMSA9IHJlcXVpcmUoXCIuL3Zub2RlXCIpO1xudmFyIGlzID0gcmVxdWlyZShcIi4vaXNcIik7XG5mdW5jdGlvbiBhZGROUyhkYXRhLCBjaGlsZHJlbiwgc2VsKSB7XG4gICAgZGF0YS5ucyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gICAgaWYgKHNlbCAhPT0gJ2ZvcmVpZ25PYmplY3QnICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkRGF0YSA9IGNoaWxkcmVuW2ldLmRhdGE7XG4gICAgICAgICAgICBpZiAoY2hpbGREYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhZGROUyhjaGlsZERhdGEsIGNoaWxkcmVuW2ldLmNoaWxkcmVuLCBjaGlsZHJlbltpXS5zZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaChzZWwsIGIsIGMpIHtcbiAgICB2YXIgZGF0YSA9IHt9LCBjaGlsZHJlbiwgdGV4dCwgaTtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRhdGEgPSBiO1xuICAgICAgICBpZiAoaXMuYXJyYXkoYykpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUoYykpIHtcbiAgICAgICAgICAgIHRleHQgPSBjO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgJiYgYy5zZWwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gW2NdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXMuYXJyYXkoYikpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gYjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUoYikpIHtcbiAgICAgICAgICAgIHRleHQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgJiYgYi5zZWwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gW2JdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChpcy5wcmltaXRpdmUoY2hpbGRyZW5baV0pKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gdm5vZGVfMS52bm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjaGlsZHJlbltpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbFswXSA9PT0gJ3MnICYmIHNlbFsxXSA9PT0gJ3YnICYmIHNlbFsyXSA9PT0gJ2cnICYmXG4gICAgICAgIChzZWwubGVuZ3RoID09PSAzIHx8IHNlbFszXSA9PT0gJy4nIHx8IHNlbFszXSA9PT0gJyMnKSkge1xuICAgICAgICBhZGROUyhkYXRhLCBjaGlsZHJlbiwgc2VsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlXzEudm5vZGUoc2VsLCBkYXRhLCBjaGlsZHJlbiwgdGV4dCwgdW5kZWZpbmVkKTtcbn1cbmV4cG9ydHMuaCA9IGg7XG47XG5leHBvcnRzLmRlZmF1bHQgPSBoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21tZW50KHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KTtcbn1cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnROb2RlLCBuZXdOb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSk7XG59XG5mdW5jdGlvbiByZW1vdmVDaGlsZChub2RlLCBjaGlsZCkge1xuICAgIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgY2hpbGQpIHtcbiAgICBub2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIHBhcmVudE5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLnBhcmVudE5vZGU7XG59XG5mdW5jdGlvbiBuZXh0U2libGluZyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG59XG5mdW5jdGlvbiB0YWdOYW1lKGVsbSkge1xuICAgIHJldHVybiBlbG0udGFnTmFtZTtcbn1cbmZ1bmN0aW9uIHNldFRleHRDb250ZW50KG5vZGUsIHRleHQpIHtcbiAgICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHRDb250ZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50ZXh0Q29udGVudDtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDE7XG59XG5mdW5jdGlvbiBpc1RleHQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAzO1xufVxuZnVuY3Rpb24gaXNDb21tZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gODtcbn1cbmV4cG9ydHMuaHRtbERvbUFwaSA9IHtcbiAgICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50LFxuICAgIGNyZWF0ZUVsZW1lbnROUzogY3JlYXRlRWxlbWVudE5TLFxuICAgIGNyZWF0ZVRleHROb2RlOiBjcmVhdGVUZXh0Tm9kZSxcbiAgICBjcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LFxuICAgIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZUNoaWxkOiByZW1vdmVDaGlsZCxcbiAgICBhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsXG4gICAgcGFyZW50Tm9kZTogcGFyZW50Tm9kZSxcbiAgICBuZXh0U2libGluZzogbmV4dFNpYmxpbmcsXG4gICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICBzZXRUZXh0Q29udGVudDogc2V0VGV4dENvbnRlbnQsXG4gICAgZ2V0VGV4dENvbnRlbnQ6IGdldFRleHRDb250ZW50LFxuICAgIGlzRWxlbWVudDogaXNFbGVtZW50LFxuICAgIGlzVGV4dDogaXNUZXh0LFxuICAgIGlzQ29tbWVudDogaXNDb21tZW50LFxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuaHRtbERvbUFwaTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0bWxkb21hcGkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFycmF5ID0gQXJyYXkuaXNBcnJheTtcbmZ1bmN0aW9uIHByaW1pdGl2ZShzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLnByaW1pdGl2ZSA9IHByaW1pdGl2ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHZub2RlXzEgPSByZXF1aXJlKFwiLi92bm9kZVwiKTtcbnZhciBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xudmFyIGh0bWxkb21hcGlfMSA9IHJlcXVpcmUoXCIuL2h0bWxkb21hcGlcIik7XG5mdW5jdGlvbiBpc1VuZGVmKHMpIHsgcmV0dXJuIHMgPT09IHVuZGVmaW5lZDsgfVxuZnVuY3Rpb24gaXNEZWYocykgeyByZXR1cm4gcyAhPT0gdW5kZWZpbmVkOyB9XG52YXIgZW1wdHlOb2RlID0gdm5vZGVfMS5kZWZhdWx0KCcnLCB7fSwgW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbmZ1bmN0aW9uIHNhbWVWbm9kZSh2bm9kZTEsIHZub2RlMikge1xuICAgIHJldHVybiB2bm9kZTEua2V5ID09PSB2bm9kZTIua2V5ICYmIHZub2RlMS5zZWwgPT09IHZub2RlMi5zZWw7XG59XG5mdW5jdGlvbiBpc1Zub2RlKHZub2RlKSB7XG4gICAgcmV0dXJuIHZub2RlLnNlbCAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlS2V5VG9PbGRJZHgoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHtcbiAgICB2YXIgaSwgbWFwID0ge30sIGtleSwgY2g7XG4gICAgZm9yIChpID0gYmVnaW5JZHg7IGkgPD0gZW5kSWR4OyArK2kpIHtcbiAgICAgICAgY2ggPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGtleSA9IGNoLmtleTtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBtYXBba2V5XSA9IGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbnZhciBob29rcyA9IFsnY3JlYXRlJywgJ3VwZGF0ZScsICdyZW1vdmUnLCAnZGVzdHJveScsICdwcmUnLCAncG9zdCddO1xudmFyIGhfMSA9IHJlcXVpcmUoXCIuL2hcIik7XG5leHBvcnRzLmggPSBoXzEuaDtcbnZhciB0aHVua18xID0gcmVxdWlyZShcIi4vdGh1bmtcIik7XG5leHBvcnRzLnRodW5rID0gdGh1bmtfMS50aHVuaztcbmZ1bmN0aW9uIGluaXQobW9kdWxlcywgZG9tQXBpKSB7XG4gICAgdmFyIGksIGosIGNicyA9IHt9O1xuICAgIHZhciBhcGkgPSBkb21BcGkgIT09IHVuZGVmaW5lZCA/IGRvbUFwaSA6IGh0bWxkb21hcGlfMS5kZWZhdWx0O1xuICAgIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYnNbaG9va3NbaV1dID0gW107XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBtb2R1bGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIgaG9vayA9IG1vZHVsZXNbal1baG9va3NbaV1dO1xuICAgICAgICAgICAgaWYgKGhvb2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNic1tob29rc1tpXV0ucHVzaChob29rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBlbXB0eU5vZGVBdChlbG0pIHtcbiAgICAgICAgdmFyIGlkID0gZWxtLmlkID8gJyMnICsgZWxtLmlkIDogJyc7XG4gICAgICAgIHZhciBjID0gZWxtLmNsYXNzTmFtZSA/ICcuJyArIGVsbS5jbGFzc05hbWUuc3BsaXQoJyAnKS5qb2luKCcuJykgOiAnJztcbiAgICAgICAgcmV0dXJuIHZub2RlXzEuZGVmYXVsdChhcGkudGFnTmFtZShlbG0pLnRvTG93ZXJDYXNlKCkgKyBpZCArIGMsIHt9LCBbXSwgdW5kZWZpbmVkLCBlbG0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVSbUNiKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJtQ2IoKSB7XG4gICAgICAgICAgICBpZiAoLS1saXN0ZW5lcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50XzEgPSBhcGkucGFyZW50Tm9kZShjaGlsZEVsbSk7XG4gICAgICAgICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudF8xLCBjaGlsZEVsbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUVsbSh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgICAgIHZhciBpLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmluaXQpKSB7XG4gICAgICAgICAgICAgICAgaSh2bm9kZSk7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4sIHNlbCA9IHZub2RlLnNlbDtcbiAgICAgICAgaWYgKHNlbCA9PT0gJyEnKSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkge1xuICAgICAgICAgICAgICAgIHZub2RlLnRleHQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZub2RlLmVsbSA9IGFwaS5jcmVhdGVDb21tZW50KHZub2RlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBQYXJzZSBzZWxlY3RvclxuICAgICAgICAgICAgdmFyIGhhc2hJZHggPSBzZWwuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgdmFyIGRvdElkeCA9IHNlbC5pbmRleE9mKCcuJywgaGFzaElkeCk7XG4gICAgICAgICAgICB2YXIgaGFzaCA9IGhhc2hJZHggPiAwID8gaGFzaElkeCA6IHNlbC5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgZG90ID0gZG90SWR4ID4gMCA/IGRvdElkeCA6IHNlbC5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgdGFnID0gaGFzaElkeCAhPT0gLTEgfHwgZG90SWR4ICE9PSAtMSA/IHNlbC5zbGljZSgwLCBNYXRoLm1pbihoYXNoLCBkb3QpKSA6IHNlbDtcbiAgICAgICAgICAgIHZhciBlbG0gPSB2bm9kZS5lbG0gPSBpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ucykgPyBhcGkuY3JlYXRlRWxlbWVudE5TKGksIHRhZylcbiAgICAgICAgICAgICAgICA6IGFwaS5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgICAgICAgICBpZiAoaGFzaCA8IGRvdClcbiAgICAgICAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlKCdpZCcsIHNlbC5zbGljZShoYXNoICsgMSwgZG90KSk7XG4gICAgICAgICAgICBpZiAoZG90SWR4ID4gMClcbiAgICAgICAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlKCdjbGFzcycsIHNlbC5zbGljZShkb3QgKyAxKS5yZXBsYWNlKC9cXC4vZywgJyAnKSk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBjYnMuY3JlYXRlW2ldKGVtcHR5Tm9kZSwgdm5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5hcHBlbmRDaGlsZChlbG0sIGNyZWF0ZUVsbShjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgICAgICBhcGkuYXBwZW5kQ2hpbGQoZWxtLCBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IHZub2RlLmRhdGEuaG9vazsgLy8gUmV1c2UgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgICAgICAgICAgIGlmIChpLmNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkuaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2bm9kZS5lbG0gPSBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZub2RlLmVsbTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVm5vZGVzKHBhcmVudEVsbSwgYmVmb3JlLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB2bm9kZXNbc3RhcnRJZHhdO1xuICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKGNoLCBpbnNlcnRlZFZub2RlUXVldWUpLCBiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludm9rZURlc3Ryb3lIb29rKHZub2RlKSB7XG4gICAgICAgIHZhciBpLCBqLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmRlc3Ryb3kpKVxuICAgICAgICAgICAgICAgIGkodm5vZGUpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy5kZXN0cm95W2ldKHZub2RlKTtcbiAgICAgICAgICAgIGlmICh2bm9kZS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHZub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB2bm9kZS5jaGlsZHJlbltqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCAmJiB0eXBlb2YgaSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHtcbiAgICAgICAgICAgIHZhciBpXzEgPSB2b2lkIDAsIGxpc3RlbmVycyA9IHZvaWQgMCwgcm0gPSB2b2lkIDAsIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgICAgICAgIGlmIChjaCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVmKGNoLnNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soY2gpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBjYnMucmVtb3ZlLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgICAgIHJtID0gY3JlYXRlUm1DYihjaC5lbG0sIGxpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaV8xID0gMDsgaV8xIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraV8xKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2JzLnJlbW92ZVtpXzFdKGNoLCBybSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0RlZihpXzEgPSBjaC5kYXRhKSAmJiBpc0RlZihpXzEgPSBpXzEuaG9vaykgJiYgaXNEZWYoaV8xID0gaV8xLnJlbW92ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlfMShjaCwgcm0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudEVsbSwgY2guZWxtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4ocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgb2xkU3RhcnRJZHggPSAwLCBuZXdTdGFydElkeCA9IDA7XG4gICAgICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgb2xkU3RhcnRWbm9kZSA9IG9sZENoWzBdO1xuICAgICAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdO1xuICAgICAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFswXTtcbiAgICAgICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTtcbiAgICAgICAgdmFyIG9sZEtleVRvSWR4O1xuICAgICAgICB2YXIgaWR4SW5PbGQ7XG4gICAgICAgIHZhciBlbG1Ub01vdmU7XG4gICAgICAgIHZhciBiZWZvcmU7XG4gICAgICAgIHdoaWxlIChvbGRTdGFydElkeCA8PSBvbGRFbmRJZHggJiYgbmV3U3RhcnRJZHggPD0gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICBpZiAob2xkU3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOyAvLyBWbm9kZSBtaWdodCBoYXZlIGJlZW4gbW92ZWQgbGVmdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob2xkRW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3U3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3RW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBhcGkubmV4dFNpYmxpbmcob2xkRW5kVm5vZGUuZWxtKSk7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChvbGRLZXlUb0lkeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZHhJbk9sZCA9IG9sZEtleVRvSWR4W25ld1N0YXJ0Vm5vZGUua2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZihpZHhJbk9sZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGNyZWF0ZUVsbShuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsbVRvTW92ZSA9IG9sZENoW2lkeEluT2xkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsbVRvTW92ZS5zZWwgIT09IG5ld1N0YXJ0Vm5vZGUuc2VsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSksIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUoZWxtVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2hbaWR4SW5PbGRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGVsbVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElkeCkge1xuICAgICAgICAgICAgYmVmb3JlID0gbmV3Q2hbbmV3RW5kSWR4ICsgMV0gPT0gbnVsbCA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07XG4gICAgICAgICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCBiZWZvcmUsIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ld1N0YXJ0SWR4ID4gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgaSwgaG9vaztcbiAgICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhKSAmJiBpc0RlZihob29rID0gaS5ob29rKSAmJiBpc0RlZihpID0gaG9vay5wcmVwYXRjaCkpIHtcbiAgICAgICAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtO1xuICAgICAgICB2YXIgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIGlmIChvbGRWbm9kZSA9PT0gdm5vZGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh2bm9kZS5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgICAgIGkgPSB2bm9kZS5kYXRhLmhvb2s7XG4gICAgICAgICAgICBpZiAoaXNEZWYoaSkgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSlcbiAgICAgICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5kZWYodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZENoICE9PSBjaClcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4oZWxtLCBvbGRDaCwgY2gsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNEZWYob2xkVm5vZGUudGV4dCkpXG4gICAgICAgICAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sICcnKTtcbiAgICAgICAgICAgICAgICBhZGRWbm9kZXMoZWxtLCBudWxsLCBjaCwgMCwgY2gubGVuZ3RoIC0gMSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZENoKSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZVZub2RlcyhlbG0sIG9sZENoLCAwLCBvbGRDaC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgYXBpLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9sZFZub2RlLnRleHQgIT09IHZub2RlLnRleHQpIHtcbiAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlZihob29rKSAmJiBpc0RlZihpID0gaG9vay5wb3N0cGF0Y2gpKSB7XG4gICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHBhdGNoKG9sZFZub2RlLCB2bm9kZSkge1xuICAgICAgICB2YXIgaSwgZWxtLCBwYXJlbnQ7XG4gICAgICAgIHZhciBpbnNlcnRlZFZub2RlUXVldWUgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5wcmUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICBjYnMucHJlW2ldKCk7XG4gICAgICAgIGlmICghaXNWbm9kZShvbGRWbm9kZSkpIHtcbiAgICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1lVm5vZGUob2xkVm5vZGUsIHZub2RlKSkge1xuICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbG0gPSBvbGRWbm9kZS5lbG07XG4gICAgICAgICAgICBwYXJlbnQgPSBhcGkucGFyZW50Tm9kZShlbG0pO1xuICAgICAgICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFwaS5pbnNlcnRCZWZvcmUocGFyZW50LCB2bm9kZS5lbG0sIGFwaS5uZXh0U2libGluZyhlbG0pKTtcbiAgICAgICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50LCBbb2xkVm5vZGVdLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWVbaV0uZGF0YS5ob29rLmluc2VydChpbnNlcnRlZFZub2RlUXVldWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMucG9zdC5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGNicy5wb3N0W2ldKCk7XG4gICAgICAgIHJldHVybiB2bm9kZTtcbiAgICB9O1xufVxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNuYWJiZG9tLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGhfMSA9IHJlcXVpcmUoXCIuL2hcIik7XG5mdW5jdGlvbiBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspIHtcbiAgICB0aHVuay5lbG0gPSB2bm9kZS5lbG07XG4gICAgdm5vZGUuZGF0YS5mbiA9IHRodW5rLmRhdGEuZm47XG4gICAgdm5vZGUuZGF0YS5hcmdzID0gdGh1bmsuZGF0YS5hcmdzO1xuICAgIHRodW5rLmRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIHRodW5rLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgdGh1bmsudGV4dCA9IHZub2RlLnRleHQ7XG4gICAgdGh1bmsuZWxtID0gdm5vZGUuZWxtO1xufVxuZnVuY3Rpb24gaW5pdCh0aHVuaykge1xuICAgIHZhciBjdXIgPSB0aHVuay5kYXRhO1xuICAgIHZhciB2bm9kZSA9IGN1ci5mbi5hcHBseSh1bmRlZmluZWQsIGN1ci5hcmdzKTtcbiAgICBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspO1xufVxuZnVuY3Rpb24gcHJlcGF0Y2gob2xkVm5vZGUsIHRodW5rKSB7XG4gICAgdmFyIGksIG9sZCA9IG9sZFZub2RlLmRhdGEsIGN1ciA9IHRodW5rLmRhdGE7XG4gICAgdmFyIG9sZEFyZ3MgPSBvbGQuYXJncywgYXJncyA9IGN1ci5hcmdzO1xuICAgIGlmIChvbGQuZm4gIT09IGN1ci5mbiB8fCBvbGRBcmdzLmxlbmd0aCAhPT0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY29weVRvVGh1bmsoY3VyLmZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyksIHRodW5rKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAob2xkQXJnc1tpXSAhPT0gYXJnc1tpXSkge1xuICAgICAgICAgICAgY29weVRvVGh1bmsoY3VyLmZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyksIHRodW5rKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3B5VG9UaHVuayhvbGRWbm9kZSwgdGh1bmspO1xufVxuZXhwb3J0cy50aHVuayA9IGZ1bmN0aW9uIHRodW5rKHNlbCwga2V5LCBmbiwgYXJncykge1xuICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncyA9IGZuO1xuICAgICAgICBmbiA9IGtleTtcbiAgICAgICAga2V5ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaF8xLmgoc2VsLCB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBob29rOiB7IGluaXQ6IGluaXQsIHByZXBhdGNoOiBwcmVwYXRjaCB9LFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KTtcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLnRodW5rO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGh1bmsuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiB2bm9kZShzZWwsIGRhdGEsIGNoaWxkcmVuLCB0ZXh0LCBlbG0pIHtcbiAgICB2YXIga2V5ID0gZGF0YSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZGF0YS5rZXk7XG4gICAgcmV0dXJuIHsgc2VsOiBzZWwsIGRhdGE6IGRhdGEsIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgICAgdGV4dDogdGV4dCwgZWxtOiBlbG0sIGtleToga2V5IH07XG59XG5leHBvcnRzLnZub2RlID0gdm5vZGU7XG5leHBvcnRzLmRlZmF1bHQgPSB2bm9kZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZub2RlLmpzLm1hcCJdfQ==
|