UNPKG

25.3 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.Shader = undefined;
7
8var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
9
10var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
11
12var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
13
14var _core = require('../core');
15
16var _utils = require('../utils');
17
18var _scope = require('../scope');
19
20function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
21
22function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
23
24function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
25
26var Shader = exports.Shader = function (_Component) {
27 _inherits(Shader, _Component);
28
29 _createClass(Shader, null, [{
30 key: 'defaults',
31 value: function defaults() {
32 return _extends({}, _core.ShaderLib.defaults(), { defines: {} });
33 }
34 }]);
35
36 function Shader(ctx) {
37 var initialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
38
39 _classCallCheck(this, Shader);
40
41 (0, _utils.assignDefaults)(initialState, Shader.defaults());
42 var defines = initialState.defines,
43 shaderName = initialState.shaderName;
44
45 var contextCache = {};
46 var shaderCache = {};
47 var shaderLib = new _core.ShaderLib(_extends({}, initialState, { defines: defines }));
48
49 var injectParentContext = new _scope.ScopedContext(ctx, {
50 defines: function (_defines) {
51 function defines(_x2) {
52 return _defines.apply(this, arguments);
53 }
54
55 defines.toString = function () {
56 return _defines.toString();
57 };
58
59 return defines;
60 }(function (_ref) {
61 var contextDefines = _ref.defines;
62
63 return _extends({}, contextDefines, defines);
64 })
65 });
66
67 var injectContext = null;
68
69 var fragmentShaderUncompiled = null;
70 var vertexShaderUncompiled = null;
71 var fragmentShader = null;
72 var vertexShader = null;
73
74 var _this = _possibleConstructorReturn(this, (Shader.__proto__ || Object.getPrototypeOf(Shader)).call(this, ctx, initialState, update));
75
76 function update(state, block, previousState) {
77 injectParentContext(function (reglContext) {
78 var _state$forceCompile = state.forceCompile,
79 forceCompile = _state$forceCompile === undefined ? false : _state$forceCompile;
80
81 Object.assign(defines, _extends({}, reglContext.defines, state.defines));
82
83 if (Object.keys(defines).length) {
84 if (shaderLib.preprocessor.define(defines)) {
85 forceCompile = true;
86 }
87 }
88
89 if (forceCompile || shouldCompile(reglContext, state)) {
90 compile(reglContext, state);
91 }
92
93 setInjectContext(reglContext, state);
94
95 if ('function' == typeof injectContext) {
96 injectContext(state, block);
97 } else {
98 block(state);
99 }
100 });
101 }
102
103 function getShaderFromCache(reglContext, currentState, shader) {
104 shader = getViableShader(reglContext, currentState, shader);
105 return shaderCache[shaderLib.hash(shader)];
106 }
107
108 function setInjectContext(reglContext, currentState) {
109 var opts = {
110 context: {
111 fragmentShader: function (_fragmentShader) {
112 function fragmentShader(_x3) {
113 return _fragmentShader.apply(this, arguments);
114 }
115
116 fragmentShader.toString = function () {
117 return _fragmentShader.toString();
118 };
119
120 return fragmentShader;
121 }(function (_ref2) {
122 var fs = _ref2.fragmentShader;
123 return fragmentShader || fs;
124 }),
125 vertexShader: function (_vertexShader) {
126 function vertexShader(_x4) {
127 return _vertexShader.apply(this, arguments);
128 }
129
130 vertexShader.toString = function () {
131 return _vertexShader.toString();
132 };
133
134 return vertexShader;
135 }(function (_ref3) {
136 var vs = _ref3.vertexShader;
137 return vertexShader || vs;
138 })
139 }
140 };
141
142 var requestedFragmentShader = getShaderFromCache(reglContext, currentState, currentState.fragmentShader);
143
144 var requestedVertexShader = getShaderFromCache(reglContext, currentState, currentState.vertexShader);
145
146 if (requestedFragmentShader && requestedFragmentShader != fragmentShader) {
147 fragmentShader = requestedFragmentShader;
148 }
149
150 if (requestedVertexShader && requestedVertexShader != vertexShader) {
151 vertexShader = requestedVertexShader;
152 }
153
154 if ('string' == typeof vertexShader) {
155 opts.vert = vertexShader;
156 }
157 if ('string' == typeof fragmentShader) {
158 opts.frag = fragmentShader;
159 }
160
161 if ('string' == typeof opts.vert || 'string' == typeof opts.frag) {
162 var hash = [shaderLib.hash(opts.vert), shaderLib.hash(opts.frag)].filter(Boolean).join('');
163 if (null == contextCache[hash]) {
164 injectContext = ctx.regl(opts);
165 contextCache[hash] = injectContext;
166 injectContext.opts = opts;
167 } else {
168 injectContext = contextCache[hash];
169 }
170 }
171 }
172
173 function compile(reglContext, currentState) {
174 if (!isShaderCached(currentState.vertexShader)) {
175 compileVertexShader();
176 }
177
178 if (!isShaderCached(currentState.fragmentShader)) {
179 compileFragmentShader();
180 }
181
182 function compileShader(type, shader) {
183 var compiled = null;
184 var uncompiled = null;
185 if (isViableShader(shader)) {
186 uncompiled = getViableShader(reglContext, currentState, shader);
187 compiled = shaderLib.compile(shaderName + ' (' + type + ')', uncompiled);
188 compiled = shaderLib.preprocess(compiled);
189 return { compiled: compiled, uncompiled: uncompiled };
190 }
191 return null;
192 }
193
194 function isShaderCached(shader) {
195 return Boolean(getShaderFromCache(reglContext, currentState, shader));
196 }
197
198 function compileVertexShader() {
199 var result = compileShader('vertex', currentState.vertexShader);
200 if (result) {
201 vertexShader = result.compiled;
202 vertexShaderUncompiled = result.uncompiled;
203 shaderCache[shaderLib.hash(vertexShaderUncompiled)] = vertexShader;
204 }
205 }
206
207 function compileFragmentShader() {
208 var result = compileShader('fragment', currentState.fragmentShader);
209 if (result) {
210 fragmentShader = result.compiled;
211 fragmentShaderUncompiled = result.uncompiled;
212 shaderCache[shaderLib.hash(fragmentShaderUncompiled)] = fragmentShader;
213 }
214 }
215 }
216
217 function getViableShader(reglContext, currentState, shader) {
218 if ('string' == typeof shader) {
219 return shader;
220 } else if ('function' == typeof shader) {
221 return shader(reglContext, currentState);
222 }
223 }
224
225 function isViableShader(shader) {
226 return ['string', 'function'].indexOf(typeof shader === 'undefined' ? 'undefined' : _typeof(shader)) > -1;
227 }
228
229 function shouldCompile(reglContext, currentState) {
230 var needsCompile = false;
231 check('function' != typeof injectContext);
232 checkShader(vertexShaderUncompiled, currentState.vertexShader);
233 checkShader(fragmentShaderUncompiled, currentState.fragmentShader);
234 return needsCompile;
235
236 function check(cond) {
237 if (cond) {
238 needsCompile = true;
239 }
240 }
241
242 function checkShader(current, next) {
243 next = getViableShader(reglContext, currentState, next);
244 if (shaderCache[shaderLib.hash(next)]) {
245 return check(true);
246 } else if ('string' != typeof current && next) {
247 return check(true);
248 } else if ('string' == typeof next && current != next) {
249 return check(true);
250 }
251 }
252 }
253 return _this;
254 }
255
256 return Shader;
257}(_core.Component);
258//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zaGFkZXIvc2hhZGVyLmpzIl0sIm5hbWVzIjpbIlNoYWRlciIsImRlZmF1bHRzIiwiZGVmaW5lcyIsImN0eCIsImluaXRpYWxTdGF0ZSIsInNoYWRlck5hbWUiLCJjb250ZXh0Q2FjaGUiLCJzaGFkZXJDYWNoZSIsInNoYWRlckxpYiIsImluamVjdFBhcmVudENvbnRleHQiLCJjb250ZXh0RGVmaW5lcyIsImluamVjdENvbnRleHQiLCJmcmFnbWVudFNoYWRlclVuY29tcGlsZWQiLCJ2ZXJ0ZXhTaGFkZXJVbmNvbXBpbGVkIiwiZnJhZ21lbnRTaGFkZXIiLCJ2ZXJ0ZXhTaGFkZXIiLCJ1cGRhdGUiLCJzdGF0ZSIsImJsb2NrIiwicHJldmlvdXNTdGF0ZSIsInJlZ2xDb250ZXh0IiwiZm9yY2VDb21waWxlIiwiT2JqZWN0IiwiYXNzaWduIiwia2V5cyIsImxlbmd0aCIsInByZXByb2Nlc3NvciIsImRlZmluZSIsInNob3VsZENvbXBpbGUiLCJjb21waWxlIiwic2V0SW5qZWN0Q29udGV4dCIsImdldFNoYWRlckZyb21DYWNoZSIsImN1cnJlbnRTdGF0ZSIsInNoYWRlciIsImdldFZpYWJsZVNoYWRlciIsImhhc2giLCJvcHRzIiwiY29udGV4dCIsImZzIiwidnMiLCJyZXF1ZXN0ZWRGcmFnbWVudFNoYWRlciIsInJlcXVlc3RlZFZlcnRleFNoYWRlciIsInZlcnQiLCJmcmFnIiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJyZWdsIiwiaXNTaGFkZXJDYWNoZWQiLCJjb21waWxlVmVydGV4U2hhZGVyIiwiY29tcGlsZUZyYWdtZW50U2hhZGVyIiwiY29tcGlsZVNoYWRlciIsInR5cGUiLCJjb21waWxlZCIsInVuY29tcGlsZWQiLCJpc1ZpYWJsZVNoYWRlciIsInByZXByb2Nlc3MiLCJyZXN1bHQiLCJpbmRleE9mIiwibmVlZHNDb21waWxlIiwiY2hlY2siLCJjaGVja1NoYWRlciIsImNvbmQiLCJjdXJyZW50IiwibmV4dCJdLCJtYXBw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QUFxQjtBQUNsQzs7QUFFRCxlQUFTRSxXQUFULENBQXFCRSxPQUFyQixFQUE4QkMsSUFBOUIsRUFBb0M7QUFFbENBLGVBQU85QixnQkFBZ0JkLFdBQWhCLEVBQTZCWSxZQUE3QixFQUEyQ2dDLElBQTNDLENBQVA7QUFDQSxZQUFJekQsWUFBWUMsVUFBVTJCLElBQVYsQ0FBZTZCLElBQWYsQ0FBWixDQUFKLEVBQXVDO0FBQ3JDLGlCQUFPSixNQUFNLElBQU4sQ0FBUDtBQUNELFNBRkQsTUFFTyxJQUFJLFlBQVksT0FBT0csT0FBbkIsSUFBOEJDLElBQWxDLEVBQXdDO0FBQzdDLGlCQUFPSixNQUFNLElBQU4sQ0FBUDtBQUNELFNBRk0sTUFFQSxJQUFJLFlBQVksT0FBT0ksSUFBbkIsSUFBMkJELFdBQVdDLElBQTFDLEVBQWdEO0FBQ3JELGlCQUFPSixNQUFNLElBQU4sQ0FBUDtBQUNEO0FBQ0Y7QUFDRjtBQTFLaUM7QUEyS25DIiwiZmlsZSI6InNoYWRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgU2hhZGVyTGliIH0gZnJvbSAnLi4vY29yZSdcbmltcG9ydCB7IGFzc2lnbkRlZmF1bHRzIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBTY29wZWRDb250ZXh0IH0gZnJvbSAnLi4vc2NvcGUnXG5cbmV4cG9ydCBjbGFzcyBTaGFkZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgZGVmYXVsdHMoKSB7IHJldHVybiB7IC4uLlNoYWRlckxpYi5kZWZhdWx0cygpLCBkZWZpbmVzOiB7fSB9IH1cbiAgY29uc3RydWN0b3IoY3R4LCBpbml0aWFsU3RhdGUgPSB7fSkge1xuICAgIGFzc2lnbkRlZmF1bHRzKGluaXRpYWxTdGF0ZSwgU2hhZGVyLmRlZmF1bHRzKCkpXG4gICAgY29uc3QgeyBkZWZpbmVzLCBzaGFkZXJOYW1lIH0gPSBpbml0aWFsU3RhdGVcbiAgICBjb25zdCBjb250ZXh0Q2FjaGUgPSB7fVxuICAgIGNvbnN0IHNoYWRlckNhY2hlID0ge31cbiAgICBjb25zdCBzaGFkZXJMaWIgPSBuZXcgU2hhZGVyTGliKHsgLi4uaW5pdGlhbFN0YXRlLCBkZWZpbmVzIH0pXG5cbiAgICBjb25zdCBpbmplY3RQYXJlbnRDb250ZXh0ID0gbmV3IFNjb3BlZENvbnRleHQoY3R4LCB7XG4gICAgICBkZWZpbmVzKHtkZWZpbmVzOiBjb250ZXh0RGVmaW5lc30pIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29udGV4dERlZmluZXMsIC4uLmRlZmluZXMgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBsZXQgaW5qZWN0Q29udGV4dCA9IG51bGxcblxuICAgIGxldCBmcmFnbWVudFNoYWRlclVuY29tcGlsZWQgPSBudWxsXG4gICAgbGV0IHZlcnRleFNoYWRlclVuY29tcGlsZWQgPSBudWxsXG4gICAgbGV0IGZyYWdtZW50U2hhZGVyID0gbnVsbFxuICAgIGxldCB2ZXJ0ZXhTaGFkZXIgPSBudWxsXG5cbiAgICBzdXBlcihjdHgsIGluaXRpYWxTdGF0ZSwgdXBkYXRlKVxuICAgIGZ1bmN0aW9uIHVwZGF0ZShzdGF0ZSwgYmxvY2ssIHByZXZpb3VzU3RhdGUpIHtcbiAgICAgIGluamVjdFBhcmVudENvbnRleHQoKHJlZ2xDb250ZXh0KSA9PiB7XG4gICAgICAgIGxldCB7Zm9yY2VDb21waWxlID0gZmFsc2V9ID0gc3RhdGVcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkZWZpbmVzLCB7IC4uLnJlZ2xDb250ZXh0LmRlZmluZXMsIC4uLnN0YXRlLmRlZmluZXMgfSlcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVmaW5lcykubGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKHNoYWRlckxpYi5wcmVwcm9jZXNzb3IuZGVmaW5lKGRlZmluZXMpKSB7XG4gICAgICAgICAgICBmb3JjZUNvbXBpbGUgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcmNlQ29tcGlsZSB8fCBzaG91bGRDb21waWxlKHJlZ2xDb250ZXh0LCBzdGF0ZSkpIHtcbiAgICAgICAgICBjb21waWxlKHJlZ2xDb250ZXh0LCBzdGF0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEluamVjdENvbnRleHQocmVnbENvbnRleHQsIHN0YXRlKVxuXG4gICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBpbmplY3RDb250ZXh0KSB7XG4gICAgICAgICAgaW5qZWN0Q29udGV4dChzdGF0ZSwgYmxvY2spXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmxvY2soc3RhdGUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2hhZGVyRnJvbUNhY2hlKHJlZ2xDb250ZXh0LCBjdXJyZW50U3RhdGUsIHNoYWRlcikge1xuICAgICAgc2hhZGVyID0gZ2V0VmlhYmxlU2hhZGVyKHJlZ2xDb250ZXh0LCBjdXJyZW50U3RhdGUsIHNoYWRlcilcbiAgICAgIHJldHVybiBzaGFkZXJDYWNoZVtzaGFkZXJMaWIuaGFzaChzaGFkZXIpXVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEluamVjdENvbnRleHQocmVnbENvbnRleHQsIGN1cnJlbnRTdGF0ZSkge1xuICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZyYWdtZW50U2hhZGVyOiAoe2ZyYWdtZW50U2hhZGVyOiBmc30pID0+IGZyYWdtZW50U2hhZGVyIHx8IGZzLFxuICAgICAgICAgIHZlcnRleFNoYWRlcjogKHt2ZXJ0ZXhTaGFkZXI6IHZzIH0pID0+IHZlcnRleFNoYWRlciB8fCB2cyxcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1ZXN0ZWRGcmFnbWVudFNoYWRlciA9IGdldFNoYWRlckZyb21DYWNoZShcbiAgICAgICAgcmVnbENvbnRleHQsXG4gICAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgICAgY3VycmVudFN0YXRlLmZyYWdtZW50U2hhZGVyKVxuXG4gICAgICBjb25zdCByZXF1ZXN0ZWRWZXJ0ZXhTaGFkZXIgPSBnZXRTaGFkZXJGcm9tQ2FjaGUoXG4gICAgICAgIHJlZ2xDb250ZXh0LFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGN1cnJlbnRTdGF0ZS52ZXJ0ZXhTaGFkZXIpXG5cbiAgICAgIGlmIChyZXF1ZXN0ZWRGcmFnbWVudFNoYWRlciAmJiByZXF1ZXN0ZWRGcmFnbWVudFNoYWRlciAhPSBmcmFnbWVudFNoYWRlcikge1xuICAgICAgICBmcmFnbWVudFNoYWRlciA9IHJlcXVlc3RlZEZyYWdtZW50U2hhZGVyXG4gICAgICB9XG5cbiAgICAgIGlmIChyZXF1ZXN0ZWRWZXJ0ZXhTaGFkZXIgJiYgcmVxdWVzdGVkVmVydGV4U2hhZGVyICE9IHZlcnRleFNoYWRlcikge1xuICAgICAgICB2ZXJ0ZXhTaGFkZXIgPSByZXF1ZXN0ZWRWZXJ0ZXhTaGFkZXJcbiAgICAgIH1cblxuICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiB2ZXJ0ZXhTaGFkZXIpIHsgb3B0cy52ZXJ0ID0gdmVydGV4U2hhZGVyIH1cbiAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZnJhZ21lbnRTaGFkZXIpIHsgb3B0cy5mcmFnID0gZnJhZ21lbnRTaGFkZXIgfVxuXG4gICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIG9wdHMudmVydCB8fCAnc3RyaW5nJyA9PSB0eXBlb2Ygb3B0cy5mcmFnKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBbc2hhZGVyTGliLmhhc2gob3B0cy52ZXJ0KSwgc2hhZGVyTGliLmhhc2gob3B0cy5mcmFnKV1cbiAgICAgICAgLmZpbHRlcihCb29sZWFuKS5qb2luKCcnKVxuICAgICAgICBpZiAobnVsbCA9PSBjb250ZXh0Q2FjaGVbaGFzaF0pIHtcbiAgICAgICAgICBpbmplY3RDb250ZXh0ID0gY3R4LnJlZ2wob3B0cylcbiAgICAgICAgICBjb250ZXh0Q2FjaGVbaGFzaF0gPSBpbmplY3RDb250ZXh0XG4gICAgICAgICAgaW5qZWN0Q29udGV4dC5vcHRzID0gb3B0c1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluamVjdENvbnRleHQgPSBjb250ZXh0Q2FjaGVbaGFzaF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbXBpbGUocmVnbENvbnRleHQsIGN1cnJlbnRTdGF0ZSkge1xuICAgICAgaWYgKCFpc1NoYWRlckNhY2hlZChjdXJyZW50U3RhdGUudmVydGV4U2hhZGVyKSkge1xuICAgICAgICBjb21waWxlVmVydGV4U2hhZGVyKClcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc1NoYWRlckNhY2hlZChjdXJyZW50U3RhdGUuZnJhZ21lbnRTaGFkZXIpKSB7XG4gICAgICAgIGNvbXBpbGVGcmFnbWVudFNoYWRlcigpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBpbGVTaGFkZXIodHlwZSwgc2hhZGVyKSB7XG4gICAgICAgIGxldCBjb21waWxlZCA9IG51bGxcbiAgICAgICAgbGV0IHVuY29tcGlsZWQgPSBudWxsXG4gICAgICAgIGlmIChpc1ZpYWJsZVNoYWRlcihzaGFkZXIpKSB7XG4gICAgICAgICAgdW5jb21waWxlZCA9IGdldFZpYWJsZVNoYWRlcihyZWdsQ29udGV4dCwgY3VycmVudFN0YXRlLCBzaGFkZXIpXG4gICAgICAgICAgY29tcGlsZWQgPSBzaGFkZXJMaWIuY29tcGlsZShgJHtzaGFkZXJOYW1lfSAoJHt0eXBlfSlgLCB1bmNvbXBpbGVkKVxuICAgICAgICAgIGNvbXBpbGVkID0gc2hhZGVyTGliLnByZXByb2Nlc3MoY29tcGlsZWQpXG4gICAgICAgICAgcmV0dXJuIHtjb21waWxlZCwgdW5jb21waWxlZH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc1NoYWRlckNhY2hlZChzaGFkZXIpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0U2hhZGVyRnJvbUNhY2hlKHJlZ2xDb250ZXh0LCBjdXJyZW50U3RhdGUsIHNoYWRlcikpXG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBpbGVWZXJ0ZXhTaGFkZXIoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBpbGVTaGFkZXIoJ3ZlcnRleCcsIGN1cnJlbnRTdGF0ZS52ZXJ0ZXhTaGFkZXIpXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB2ZXJ0ZXhTaGFkZXIgPSByZXN1bHQuY29tcGlsZWRcbiAgICAgICAgICB2ZXJ0ZXhTaGFkZXJVbmNvbXBpbGVkID0gcmVzdWx0LnVuY29tcGlsZWRcbiAgICAgICAgICBzaGFkZXJDYWNoZVtzaGFkZXJMaWIuaGFzaCh2ZXJ0ZXhTaGFkZXJVbmNvbXBpbGVkKV0gPSB2ZXJ0ZXhTaGFkZXJcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjb21waWxlRnJhZ21lbnRTaGFkZXIoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBpbGVTaGFkZXIoJ2ZyYWdtZW50JywgY3VycmVudFN0YXRlLmZyYWdtZW50U2hhZGVyKVxuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgZnJhZ21lbnRTaGFkZXIgPSByZXN1bHQuY29tcGlsZWRcbiAgICAgICAgICBmcmFnbWVudFNoYWRlclVuY29tcGlsZWQgPSByZXN1bHQudW5jb21waWxlZFxuICAgICAgICAgIHNoYWRlckNhY2hlW3NoYWRlckxpYi5oYXNoKGZyYWdtZW50U2hhZGVyVW5jb21waWxlZCldID0gZnJhZ21lbnRTaGFkZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFZpYWJsZVNoYWRlcihyZWdsQ29udGV4dCwgY3VycmVudFN0YXRlLCBzaGFkZXIpIHtcbiAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2Ygc2hhZGVyKSB7IHJldHVybiBzaGFkZXIgfVxuICAgICAgZWxzZSBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygc2hhZGVyKSB7XG4gICAgICAgIHJldHVybiBzaGFkZXIocmVnbENvbnRleHQsIGN1cnJlbnRTdGF0ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZpYWJsZVNoYWRlcihzaGFkZXIpIHtcbiAgICAgIHJldHVybiBbJ3N0cmluZycsICdmdW5jdGlvbiddLmluZGV4T2YodHlwZW9mIHNoYWRlcikgPiAtMVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNob3VsZENvbXBpbGUocmVnbENvbnRleHQsIGN1cnJlbnRTdGF0ZSkge1xuICAgICAgbGV0IG5lZWRzQ29tcGlsZSA9IGZhbHNlXG4gICAgICBjaGVjaygnZnVuY3Rpb24nICE9IHR5cGVvZiBpbmplY3RDb250ZXh0KVxuICAgICAgY2hlY2tTaGFkZXIodmVydGV4U2hhZGVyVW5jb21waWxlZCwgY3VycmVudFN0YXRlLnZlcnRleFNoYWRlcilcbiAgICAgIGNoZWNrU2hhZGVyKGZyYWdtZW50U2hhZGVyVW5jb21waWxlZCwgY3VycmVudFN0YXRlLmZyYWdtZW50U2hhZGVyKVxuICAgICAgcmV0dXJuIG5lZWRzQ29tcGlsZVxuXG4gICAgICBmdW5jdGlvbiBjaGVjayhjb25kKSB7XG4gICAgICAgIGlmIChjb25kKSB7IG5lZWRzQ29tcGlsZSA9IHRydWUgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjaGVja1NoYWRlcihjdXJyZW50LCBuZXh0KSB7XG4gICAgICAgIGxldCBjb25kID0gZmFsc2VcbiAgICAgICAgbmV4dCA9IGdldFZpYWJsZVNoYWRlcihyZWdsQ29udGV4dCwgY3VycmVudFN0YXRlLCBuZXh0KVxuICAgICAgICBpZiAoc2hhZGVyQ2FjaGVbc2hhZGVyTGliLmhhc2gobmV4dCldKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKHRydWUpXG4gICAgICAgIH0gZWxzZSBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIGN1cnJlbnQgJiYgbmV4dCkge1xuICAgICAgICAgIHJldHVybiBjaGVjayh0cnVlKVxuICAgICAgICB9IGVsc2UgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBuZXh0ICYmIGN1cnJlbnQgIT0gbmV4dCkge1xuICAgICAgICAgIHJldHVybiBjaGVjayh0cnVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
\No newline at end of file