mage-engine 3.16.4 → 3.16.7

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.
Files changed (2) hide show
  1. package/dist/mage.js +537 -40
  2. package/package.json +1 -1
package/dist/mage.js CHANGED
@@ -54612,11 +54612,8 @@ var VECTOR_BACK = {
54612
54612
  type: BACK,
54613
54613
  vector: new Vector3$1(0, 0, -1)
54614
54614
  };
54615
- var ORIGIN = {
54616
- x: 0,
54617
- y: 0,
54618
- z: 0
54619
- };
54615
+ var ORIGIN = new Vector3$1(0, 0, 0);
54616
+ var ZERO_QUATERNION = new Quaternion().identity();
54620
54617
  var MATERIALS = {
54621
54618
  LAMBERT: 0,
54622
54619
  PHONG: 1,
@@ -54631,7 +54628,7 @@ var EFFECTS = {
54631
54628
  HUE_SATURATION: 'HUESATURATIONEFFECT',
54632
54629
  BLOOM: 'BLOOM',
54633
54630
  DEPTH_OF_FIELD: 'DOF',
54634
- // SELECTIVE_OUTLINE: 'SELECTIVEOUTLINE',
54631
+ SELECTIVE_OUTLINE: 'SELECTIVEOUTLINE',
54635
54632
  OUTLINE: 'OUTLINE',
54636
54633
  GLITCH: 'GLITCH',
54637
54634
  PIXEL: 'PIXEL'
@@ -54670,7 +54667,7 @@ var HASH = '#';
54670
54667
  var EMPTY = '';
54671
54668
  var DEFAULT_SELECTOR = '#gameContainer';
54672
54669
  var BEFORE_UNLOAD = 'beforeunload';
54673
- var HASH_CHANGE = 'hashchange';var lib_constants=/*#__PURE__*/Object.freeze({__proto__:null,UP: UP,DOWN: DOWN,LEFT: LEFT,RIGHT: RIGHT,FRONT: FRONT,BACK: BACK,VECTOR_UP: VECTOR_UP,VECTOR_DOWN: VECTOR_DOWN,VECTOR_LEFT: VECTOR_LEFT,VECTOR_RIGHT: VECTOR_RIGHT,VECTOR_FRONT: VECTOR_FRONT,VECTOR_BACK: VECTOR_BACK,ORIGIN: ORIGIN,MATERIALS: MATERIALS,EFFECTS: EFFECTS,COLLISION_EVENT: COLLISION_EVENT,COLORS: COLORS,ASSETS_TYPES: ASSETS_TYPES,OUTPUT_ENCODINGS: OUTPUT_ENCODINGS,DEFAULT_OUTPUT_ENCODING: DEFAULT_OUTPUT_ENCODING,ROOT: ROOT,DIVIDER: DIVIDER,HASH: HASH,EMPTY: EMPTY,DEFAULT_SELECTOR: DEFAULT_SELECTOR,BEFORE_UNLOAD: BEFORE_UNLOAD,HASH_CHANGE: HASH_CHANGE});var buildAssetId = function buildAssetId(name, level) {
54670
+ var HASH_CHANGE = 'hashchange';var lib_constants=/*#__PURE__*/Object.freeze({__proto__:null,UP: UP,DOWN: DOWN,LEFT: LEFT,RIGHT: RIGHT,FRONT: FRONT,BACK: BACK,VECTOR_UP: VECTOR_UP,VECTOR_DOWN: VECTOR_DOWN,VECTOR_LEFT: VECTOR_LEFT,VECTOR_RIGHT: VECTOR_RIGHT,VECTOR_FRONT: VECTOR_FRONT,VECTOR_BACK: VECTOR_BACK,ORIGIN: ORIGIN,ZERO_QUATERNION: ZERO_QUATERNION,MATERIALS: MATERIALS,EFFECTS: EFFECTS,COLLISION_EVENT: COLLISION_EVENT,COLORS: COLORS,ASSETS_TYPES: ASSETS_TYPES,OUTPUT_ENCODINGS: OUTPUT_ENCODINGS,DEFAULT_OUTPUT_ENCODING: DEFAULT_OUTPUT_ENCODING,ROOT: ROOT,DIVIDER: DIVIDER,HASH: HASH,EMPTY: EMPTY,DEFAULT_SELECTOR: DEFAULT_SELECTOR,BEFORE_UNLOAD: BEFORE_UNLOAD,HASH_CHANGE: HASH_CHANGE});var buildAssetId = function buildAssetId(name, level) {
54674
54671
  return level ? "".concat(level, "_").concat(name) : name;
54675
54672
  };
54676
54673
  var isLevelName = function isLevelName(level) {
@@ -56234,7 +56231,7 @@ function applyMiddleware() {
56234
56231
 
56235
56232
  var thunk = createThunkMiddleware();
56236
56233
  thunk.withExtraArgument = createThunkMiddleware;var name = "mage-engine";
56237
- var version = "3.16.4";
56234
+ var version = "3.16.7";
56238
56235
  var description = "A WebGL Javascript Game Engine, built on top of THREE.js and many other libraries.";
56239
56236
  var main = "dist/mage.js";
56240
56237
  var author = {
@@ -57548,7 +57545,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
57548
57545
  url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
57549
57546
  return new Worker(url, options);
57550
57547
  };
57551
- }var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIEFQUExZOiB7CiAgICAgICAgICBJTVBVTFNFOiAncGh5c2ljczplbGVtZW50OmFwcGx5OmltcHVsc2UnCiAgICAgICAgfQogICAgICB9LAogICAgICBWRUhJQ0xFOiB7CiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cXVhdGVybmlvbicKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczp2ZWhpY2xlOnJlc2V0JywKICAgICAgICBTUEVFRDogJ3BoeXNpY3M6dmVoaWNsZTpzcGVlZCcsCiAgICAgICAgRElSRUNUSU9OOiAncGh5c2ljczp2ZWhpY2xlOmRpcmVjdGlvbicKICAgICAgfSwKICAgICAgRUZGRUNUUzogewogICAgICAgIEVYUExPU0lPTjogJ3BoeXNpY3M6ZWZmZWN0czpleHBsb3Npb24nCiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7CiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsKCiAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7CiAgICAgICAgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsKICAgICAgICB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGtleXM7CiAgICB9CgogICAgZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307CiAgICAgICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICB9KTsKICAgICAgcmV0dXJuIENvbnN0cnVjdG9yOwogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGtleSBpbiBvYmopIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIG9ialtrZXldID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgdmFyIERpc3BhdGNoZXIgPSBmdW5jdGlvbiBEaXNwYXRjaGVyKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGlzcGF0Y2hlcik7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRQaHlzaWNzVXBkYXRlIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5VUERBVEUsCiAgICAgICAgICBkdDogZHQKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRSZWFkeUV2ZW50IiwgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuUkVBRFkKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRUZXJtaW5hdGVFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURQogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic2VuZEJvZHlVcGRhdGUiLCBmdW5jdGlvbiAodXVpZCwgcG9zaXRpb24sIHJvdGF0aW9uLCBkdCwgZXh0cmFEYXRhKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlVQREFURSwKICAgICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgICBwb3NpdGlvbjogewogICAgICAgICAgICB4OiBwb3NpdGlvbi54KCksCiAgICAgICAgICAgIHk6IHBvc2l0aW9uLnkoKSwKICAgICAgICAgICAgejogcG9zaXRpb24ueigpCiAgICAgICAgICB9LAogICAgICAgICAgcXVhdGVybmlvbjogewogICAgICAgICAgICB4OiByb3RhdGlvbi54KCksCiAgICAgICAgICAgIHk6IHJvdGF0aW9uLnkoKSwKICAgICAgICAgICAgejogcm90YXRpb24ueigpLAogICAgICAgICAgICB3OiByb3RhdGlvbi53KCkKICAgICAgICAgIH0KICAgICAgICB9LCBleHRyYURhdGEpLCB7fSwgewogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSkpOwogICAgICB9KTsKCiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic2VuZERpc3BhdGNoRXZlbnQiLCBmdW5jdGlvbiAodXVpZCwgZXZlbnROYW1lLCBldmVudERhdGEpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLkRJU1BBVENILAogICAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAogICAgICAgICAgZXZlbnREYXRhOiBldmVudERhdGEKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGRpc3BhdGNoZXIkMSA9IG5ldyBEaXNwYXRjaGVyKCk7CgogICAgdmFyIGFwcGx5TWF0cml4NFRvVmVjdG9yMyA9IGZ1bmN0aW9uIGFwcGx5TWF0cml4NFRvVmVjdG9yMyhfcmVmKSB7CiAgICAgIHZhciBfcmVmJHggPSBfcmVmLngsCiAgICAgICAgICB4ID0gX3JlZiR4ID09PSB2b2lkIDAgPyAwIDogX3JlZiR4LAogICAgICAgICAgX3JlZiR5ID0gX3JlZi55LAogICAgICAgICAgeSA9IF9yZWYkeSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkeSwKICAgICAgICAgIF9yZWYkeiA9IF9yZWYueiwKICAgICAgICAgIHogPSBfcmVmJHogPT09IHZvaWQgMCA/IDAgOiBfcmVmJHo7CiAgICAgIHZhciBtYXRyaXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdOwogICAgICB2YXIgdyA9IDEgLyAobWF0cml4WzNdICogeCArIG1hdHJpeFs3XSAqIHkgKyBtYXRyaXhbMTFdICogeiArIG1hdHJpeFsxNV0pOwogICAgICByZXR1cm4gewogICAgICAgIHg6IChtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzRdICogeSArIG1hdHJpeFs4XSAqIHogKyBtYXRyaXhbMTJdKSAqIHcsCiAgICAgICAgeTogKG1hdHJpeFsxXSAqIHggKyBtYXRyaXhbNV0gKiB5ICsgbWF0cml4WzldICogeiArIG1hdHJpeFsxM10pICogdywKICAgICAgICB6OiAobWF0cml4WzJdICogeCArIG1hdHJpeFs2XSAqIHkgKyBtYXRyaXhbMTBdICogeiArIG1hdHJpeFsxNF0pICogdwogICAgICB9OwogICAgfTsKCiAgICB2YXIgY3JlYXRlUmlnaWRCb2R5ID0gZnVuY3Rpb24gY3JlYXRlUmlnaWRCb2R5KHNoYXBlLCBvcHRpb25zKSB7CiAgICAgIHZhciB1dWlkID0gb3B0aW9ucy51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IG9wdGlvbnMucXVhdGVybmlvbiwKICAgICAgICAgIG1hc3MgPSBvcHRpb25zLm1hc3MsCiAgICAgICAgICBmcmljdGlvbiA9IG9wdGlvbnMuZnJpY3Rpb24sCiAgICAgICAgICBfb3B0aW9ucyRyZXN0aXR1dGlvbiA9IG9wdGlvbnMucmVzdGl0dXRpb24sCiAgICAgICAgICByZXN0aXR1dGlvbiA9IF9vcHRpb25zJHJlc3RpdHV0aW9uID09PSB2b2lkIDAgPyAuOSA6IF9vcHRpb25zJHJlc3RpdHV0aW9uLAogICAgICAgICAgX29wdGlvbnMkZGFtcGluZyA9IG9wdGlvbnMuZGFtcGluZywKICAgICAgICAgIGRhbXBpbmcgPSBfb3B0aW9ucyRkYW1waW5nID09PSB2b2lkIDAgPyB7CiAgICAgICAgbGluZWFyOiAwLjIsCiAgICAgICAgYW5ndWxhcjogMC4yCiAgICAgIH0gOiBfb3B0aW9ucyRkYW1waW5nOwogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTsKICAgICAgdmFyIGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTsKICAgICAgc2hhcGUuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciByYkluZm8gPSBuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIHNoYXBlLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgYm9keSA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5KHJiSW5mbyk7CgogICAgICBpZiAobWFzcyA+IDApIHsKICAgICAgICBib2R5LnNldEZyaWN0aW9uKGZyaWN0aW9uKTsKICAgICAgICBib2R5LnNldFJlc3RpdHV0aW9uKHJlc3RpdHV0aW9uKTsKICAgICAgICBib2R5LnNldERhbXBpbmcoZGFtcGluZy5saW5lYXIsIGRhbXBpbmcuYW5ndWxhcik7CiAgICAgICAgYm9keS5zZXRBY3RpdmF0aW9uU3RhdGUoRElTQUJMRV9ERUFDVElWQVRJT04pOwogICAgICB9IC8vIHN0b3JpbmcgdXVpZCBmb3IgZnV0dXJlIHJlZmVyZW5jZQoKCiAgICAgIGJvZHkudXVpZCA9IHV1aWQ7CiAgICAgIHdvcmxkLmFkZFJpZ2lkQm9keShib2R5KTsKICAgICAgcmV0dXJuIGJvZHk7CiAgICB9OwogICAgdmFyIGFkZE1vZGVsID0gZnVuY3Rpb24gYWRkTW9kZWwob3B0aW9ucykgewogICAgICB2YXIgdXVpZCA9IG9wdGlvbnMudXVpZCwKICAgICAgICAgIHZlcnRpY2VzID0gb3B0aW9ucy52ZXJ0aWNlcywKICAgICAgICAgIG1hdHJpY2VzID0gb3B0aW9ucy5tYXRyaWNlcywKICAgICAgICAgIGluZGV4ZXMgPSBvcHRpb25zLmluZGV4ZXMsCiAgICAgICAgICBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gb3B0aW9ucy5xdWF0ZXJuaW9uLAogICAgICAgICAgX29wdGlvbnMkbWFzcyA9IG9wdGlvbnMubWFzcywKICAgICAgICAgIG1hc3MgPSBfb3B0aW9ucyRtYXNzID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkbWFzcywKICAgICAgICAgIF9vcHRpb25zJGZyaWN0aW9uID0gb3B0aW9ucy5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX29wdGlvbnMkZnJpY3Rpb24gPT09IHZvaWQgMCA/IDIgOiBfb3B0aW9ucyRmcmljdGlvbjsKICAgICAgdmFyIHNjYWxlID0gREVGQVVMVF9TQ0FMRTsKICAgICAgdmFyIGJ0YSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgYnRiID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciBidGMgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIHRyaU1lc2ggPSBuZXcgQW1tby5idFRyaWFuZ2xlTWVzaCh0cnVlLCBmYWxzZSk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNvbXBvbmVudHMgPSB2ZXJ0aWNlc1tpXTsKICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2ldID8gaW5kZXhlc1tpXSA6IG51bGw7CiAgICAgICAgdmFyIG1hdHJpeCA9IEFycmF5LmZyb20obWF0cmljZXNbaV0pOwoKICAgICAgICBpZiAoaW5kZXgpIHsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW5kZXgubGVuZ3RoOyBqICs9IDMpIHsKICAgICAgICAgICAgdmFyIGFpID0gaW5kZXhbal0gKiAzOwogICAgICAgICAgICB2YXIgYmkgPSBpbmRleFtqICsgMV0gKiAzOwogICAgICAgICAgICB2YXIgY2kgPSBpbmRleFtqICsgMl0gKiAzOwogICAgICAgICAgICB2YXIgdmEgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbYWldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbYWkgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2FpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgdmFyIHZiID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2JpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2JpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tiaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIHZhciB2YyA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tjaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tjaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbY2kgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICBidGEuc2V0VmFsdWUodmEueCwgdmEueSwgdmEueik7CiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZSh2Yi54LCB2Yi55LCB2Yi56KTsKICAgICAgICAgICAgYnRjLnNldFZhbHVlKHZjLngsIHZjLnksIHZjLnopOwogICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IGNvbXBvbmVudHMubGVuZ3RoOyBfaiArPSA5KSB7CiAgICAgICAgICAgIHZhciBfdmEgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyAwXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICB2YXIgX3ZiID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgM10sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDRdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyA1XQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgdmFyIF92YyA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDZdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyA3XSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgOF0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIGJ0YS5zZXRWYWx1ZShfdmEueCwgX3ZhLnksIF92YS56KTsKICAgICAgICAgICAgYnRiLnNldFZhbHVlKF92Yi54LCBfdmIueSwgX3ZiLnopOwogICAgICAgICAgICBidGMuc2V0VmFsdWUoX3ZjLngsIF92Yy55LCBfdmMueik7CiAgICAgICAgICAgIHRyaU1lc2guYWRkVHJpYW5nbGUoYnRhLCBidGIsIGJ0YywgZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGxvY2FsU2NhbGUgPSBuZXcgQW1tby5idFZlY3RvcjMoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueik7CiAgICAgIHRyaU1lc2guc2V0U2NhbGluZyhsb2NhbFNjYWxlKTsKICAgICAgQW1tby5kZXN0cm95KGxvY2FsU2NhbGUpOwogICAgICB2YXIgY29sbGlzaW9uU2hhcGUgPSBuZXcgQW1tby5idEJ2aFRyaWFuZ2xlTWVzaFNoYXBlKHRyaU1lc2gsIHRydWUsIHRydWUpOwogICAgICBjb2xsaXNpb25TaGFwZS5yZXNvdXJjZXMgPSBbdHJpTWVzaF07CiAgICAgIEFtbW8uZGVzdHJveShidGEpOwogICAgICBBbW1vLmRlc3Ryb3koYnRiKTsKICAgICAgQW1tby5kZXN0cm95KGJ0Yyk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGNvbGxpc2lvblNoYXBlLCB7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgcXVhdGVybmlvbjogcXVhdGVybmlvbiwKICAgICAgICBtYXNzOiBtYXNzLAogICAgICAgIGZyaWN0aW9uOiBmcmljdGlvbgogICAgICB9KTsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLk1FU0gsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBhZGRCb3ggPSBmdW5jdGlvbiBhZGRCb3goZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdpZHRoID0gZGF0YS53aWR0aCwKICAgICAgICAgIGxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgX2RhdGEkbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzID09PSB2b2lkIDAgPyAwIDogX2RhdGEkbWFzcywKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24gPT09IHZvaWQgMCA/IDIgOiBfZGF0YSRmcmljdGlvbjsKICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAwLjUsIGhlaWdodCAqIDAuNSwgbGVuZ3RoICogMC41KSk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGdlb21ldHJ5LCB7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgcXVhdGVybmlvbjogcXVhdGVybmlvbiwKICAgICAgICBtYXNzOiBtYXNzLAogICAgICAgIGZyaWN0aW9uOiBmcmljdGlvbgogICAgICB9KTsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLkJPWCwKICAgICAgICBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGFkZFNwaGVyZSA9IGZ1bmN0aW9uIGFkZFNwaGVyZShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcmFkaXVzID0gZGF0YS5yYWRpdXMsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgX2RhdGEkbWFzczIgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzczIgPT09IHZvaWQgMCA/IDAgOiBfZGF0YSRtYXNzMiwKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uMiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uMiA9PT0gdm9pZCAwID8gMiA6IF9kYXRhJGZyaWN0aW9uMjsKICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5TUEhFUkUsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBzZXRMaW5lYXJWZWxvY2l0eSA9IGZ1bmN0aW9uIHNldExpbmVhclZlbG9jaXR5KGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBfZGF0YSR2ZWxvY2l0eSA9IGRhdGEudmVsb2NpdHksCiAgICAgICAgICB2ZWxvY2l0eSA9IF9kYXRhJHZlbG9jaXR5ID09PSB2b2lkIDAgPyBERUZBVUxUX0xJTkVBUl9WRUxPQ0lUWSA6IF9kYXRhJHZlbG9jaXR5OwoKICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgIGJvZHkgPSBfd29ybGQkZ2V0RWxlbWVudC5ib2R5OwoKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIGxpbmVhclZlbG9jaXR5ID0gbmV3IEFtbW8uYnRWZWN0b3IzKHZlbG9jaXR5LngsIHZlbG9jaXR5LnksIHZlbG9jaXR5LnopOwogICAgICAgIGJvZHkuc2V0TGluZWFyVmVsb2NpdHkobGluZWFyVmVsb2NpdHkpOwogICAgICAgIEFtbW8uZGVzdHJveShsaW5lYXJWZWxvY2l0eSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgc2V0UG9zaXRpb24gPSBmdW5jdGlvbiBzZXRQb3NpdGlvbihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uOwoKICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50MiA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQyLmJvZHk7CgogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgIH07CiAgICB2YXIgYXBwbHlJbXB1c2UgPSBmdW5jdGlvbiBhcHBseUltcHVzZShfcmVmKSB7CiAgICAgIHZhciB1dWlkID0gX3JlZi51dWlkLAogICAgICAgICAgX3JlZiRpbXB1bHNlID0gX3JlZi5pbXB1bHNlLAogICAgICAgICAgaW1wdWxzZSA9IF9yZWYkaW1wdWxzZSA9PT0gdm9pZCAwID8gREVGQVVMVF9JTVBVTFNFIDogX3JlZiRpbXB1bHNlOwoKICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50MyA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQzLmJvZHk7CgogICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CgogICAgICBpZiAobW90aW9uU3RhdGUpIHsKICAgICAgICB2YXIgaW1wdWxzZVZlY3RvciA9IG5ldyBBbW1vLmJ0VmVjdG9yMyhpbXB1bHNlLngsIGltcHVsc2UueSwgaW1wdWxzZS56KTsKICAgICAgICBib2R5LmFwcGx5Q2VudHJhbEltcHVsc2UoaW1wdWxzZVZlY3Rvcik7CiAgICAgICAgQW1tby5kZXN0cm95KGltcHVsc2VWZWN0b3IpOwogICAgICB9CiAgICB9OwogICAgdmFyIGhhbmRsZUVsZW1lbnRVcGRhdGUgPSBmdW5jdGlvbiBoYW5kbGVFbGVtZW50VXBkYXRlKF9yZWYyLCBkdCkgewogICAgICB2YXIgYm9keSA9IF9yZWYyLmJvZHksCiAgICAgICAgICB1dWlkID0gX3JlZjIudXVpZCwKICAgICAgICAgIF9yZWYyJHN0YXRlID0gX3JlZjIuc3RhdGU7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKCiAgICAgIGlmIChtb3Rpb25TdGF0ZSkgewogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdmFyIG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICB2YXIgcm90YXRpb24gPSB0cmFuc2Zvcm0uZ2V0Um90YXRpb24oKTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZEJvZHlVcGRhdGUodXVpZCwgb3JpZ2luLCByb3RhdGlvbiwgZHQpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwoKICAgIHZhciBhZGRQbGF5ZXIgPSBmdW5jdGlvbiBhZGRQbGF5ZXIoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdpZHRoID0gZGF0YS53aWR0aCwKICAgICAgICAgIGhlaWdodCA9IGRhdGEuaGVpZ2h0LAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb247CiAgICAgIHZhciBjYXBzdWxlID0gbmV3IEFtbW8uYnRDYXBzdWxlU2hhcGUod2lkdGgsIGhlaWdodCk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGNhcHN1bGUsIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOyAvLyBkaXNhYmxpaW5nIHJvdGF0aW9uIGZvciBjb2xsaXNpb25zCgogICAgICBib2R5LnNldEFuZ3VsYXJGYWN0b3IoMCk7CiAgICAgIHdvcmxkLmFkZFJpZ2lkQm9keShib2R5KTsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLlBMQVlFUiwKICAgICAgICBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGhhbmRsZVBsYXllclVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVBsYXllclVwZGF0ZShfcmVmLCBkdCkgewogICAgICB2YXIgYm9keSA9IF9yZWYuYm9keSwKICAgICAgICAgIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBfcmVmJHN0YXRlID0gX3JlZi5zdGF0ZSwKICAgICAgICAgIHN0YXRlID0gX3JlZiRzdGF0ZSA9PT0gdm9pZCAwID8gREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgOiBfcmVmJHN0YXRlOwogICAgICB2YXIgbW92ZW1lbnQgPSBzdGF0ZS5tb3ZlbWVudCwKICAgICAgICAgIGRpcmVjdGlvbiA9IHN0YXRlLmRpcmVjdGlvbiwKICAgICAgICAgIGNhbWVyYURpcmVjdGlvbiA9IHN0YXRlLmNhbWVyYURpcmVjdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBzdGF0ZS5xdWF0ZXJuaW9uLAogICAgICAgICAgcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgdmFyIE1BWF9TUEVFRCA9IDE7CiAgICAgIHZhciB3YWxrVmVsb2NpdHkgPSAuMTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgbGluZWFyVmVsb2NpdHkgPSBib2R5LmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgdmFyIHNwZWVkID0gbGluZWFyVmVsb2NpdHkubGVuZ3RoKCk7CiAgICAgICAgdmFyIGZvcndhcmREaXIgPSB0cmFuc2Zvcm0uZ2V0QmFzaXMoKS5nZXRSb3coMik7CiAgICAgICAgZm9yd2FyZERpci5ub3JtYWxpemUoKTsKICAgICAgICB2YXIgd2Fsa0RpcmVjdGlvbiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLjAsIDAuMCwgMC4wKTsKICAgICAgICB2YXIgd2Fsa1NwZWVkID0gd2Fsa1ZlbG9jaXR5ICogZHQ7CgogICAgICAgIGlmIChtb3ZlbWVudC5mb3J3YXJkKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgKyBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSArIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgKyBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgLSBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSAtIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgLSBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW1vdmVtZW50LmZvcndhcmQgJiYgIW1vdmVtZW50LmJhY2t3YXJkcykgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKiAwLjIpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKiAwLjIpOwogICAgICAgIH0gZWxzZSBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHsKICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFgobGluZWFyVmVsb2NpdHkueCgpICsgY2FtZXJhRGlyZWN0aW9uLnggKiB3YWxrU3BlZWQpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKyBjYW1lcmFEaXJlY3Rpb24ueiAqIHdhbGtTcGVlZCk7CiAgICAgICAgfQoKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBib2R5LmdldE1vdGlvblN0YXRlKCkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBib2R5LnNldENlbnRlck9mTWFzc1RyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgICAgdmFyIHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIENsb2NrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gQ2xvY2soKSB7CiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsb2NrKTsKCiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBudWxsOwogICAgICB9CgogICAgICBfY3JlYXRlQ2xhc3MoQ2xvY2ssIFt7CiAgICAgICAga2V5OiAiZ2V0RGVsdGEiLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWx0YSgpIHsKICAgICAgICAgIHZhciB0aW1lID0gRGF0ZS5ub3coKTsKCiAgICAgICAgICBpZiAodGhpcy50aW1lc3RhbXApIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHRoaXMudGltZXN0YW1wOwogICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWU7CiAgICAgICAgICAgIHJldHVybiBkZWx0YTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gQ2xvY2s7CiAgICB9KCk7CgogICAgdmFyIFdvcmxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gV29ybGQoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdvcmxkKTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpbml0IiwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBfb3B0aW9ucyRncmF2aXR5ID0gb3B0aW9ucy5ncmF2aXR5LAogICAgICAgICAgICAgIGdyYXZpdHkgPSBfb3B0aW9ucyRncmF2aXR5ID09PSB2b2lkIDAgPyBHUkFWSVRZIDogX29wdGlvbnMkZ3Jhdml0eTsKICAgICAgICAgIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSBuZXcgQW1tby5idERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uKCk7CiAgICAgICAgICBfdGhpcy5kaXNwYXRjaGVyID0gbmV3IEFtbW8uYnRDb2xsaXNpb25EaXNwYXRjaGVyKF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgX3RoaXMuYnJvYWRwaGFzZSA9IG5ldyBBbW1vLmJ0RGJ2dEJyb2FkcGhhc2UoKTsKICAgICAgICAgIF90aGlzLnNvbHZlciA9IG5ldyBBbW1vLmJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyKCk7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkID0gbmV3IEFtbW8uYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQoX3RoaXMuZGlzcGF0Y2hlciwgX3RoaXMuYnJvYWRwaGFzZSwgX3RoaXMuc29sdmVyLCBfdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTsKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnNldEdyYXZpdHkobmV3IEFtbW8uYnRWZWN0b3IzKGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnopKTsgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGdob3N0T2JqZWN0IGNvbGxpc2lvbnMKCgogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5nZXRCcm9hZHBoYXNlKCkuZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUoKS5zZXRJbnRlcm5hbEdob3N0UGFpckNhbGxiYWNrKG5ldyBBbW1vLmJ0R2hvc3RQYWlyQ2FsbGJhY2soKSk7CgogICAgICAgICAgX3RoaXMuaW5pdGlhbGlzZWQgPSB0cnVlOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInJlbW92ZUVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5maWx0ZXIoZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdLmRlbGV0ZWQ7CiAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImhhc0VsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5pbmNsdWRlcyh1dWlkKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJnZXRFbGVtZW50IiwgZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpc0luaXRpYWxpc2VkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmluaXRpYWxpc2VkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldER5bmFtaWNzV29ybGQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuZHluYW1pY3NXb3JsZDsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRSaWdpZEJvZHkiLCBmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiYWRkQWN0aW9uIiwgZnVuY3Rpb24gKGFjdGlvbikgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRBY3Rpb24oYWN0aW9uKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRDb2xsaXNpb25PYmplY3QiLCBmdW5jdGlvbiAoY29sbGlzaW9uT2JqZWN0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZENvbGxpc2lvbk9iamVjdChjb2xsaXNpb25PYmplY3QpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInN0ZXBTaW11bGF0aW9uIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnN0ZXBTaW11bGF0aW9uKGR0KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzaW11bGF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBkdCA9IF90aGlzLmNsb2NrLmdldERlbHRhKCk7CgogICAgICAgICAgX3RoaXMuc3RlcFNpbXVsYXRpb24oZHQpOwoKICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuQk9YOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5TUEhFUkU6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLk1FU0g6CiAgICAgICAgICAgICAgICAgIGhhbmRsZUVsZW1lbnRVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlBMQVlFUjoKICAgICAgICAgICAgICAgICAgaGFuZGxlUGxheWVyVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5WRUhJQ0xFOgogICAgICAgICAgICAgICAgICBoYW5kbGVWZWhpY2xlVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBfdGhpcy5jYWxjdWxhdGVDb2xsaXNpb25zKCk7CgogICAgICAgICAgX3RoaXMucmVtb3ZlRGVsZXRlZEVsZW1lbnRzKCk7CgogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRQaHlzaWNzVXBkYXRlKGR0KTsKICAgICAgICAgIF90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnNpbXVsYXRlLmJpbmQoX3RoaXMpKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJjYWxjdWxhdGVDb2xsaXNpb25zIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGFtbW9EaXNwYXRjaGVyID0gX3RoaXMuZHluYW1pY3NXb3JsZC5nZXREaXNwYXRjaGVyKCk7CgogICAgICAgICAgdmFyIG51bU1hbmlmb2xkcyA9IGFtbW9EaXNwYXRjaGVyLmdldE51bU1hbmlmb2xkcygpOwoKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTWFuaWZvbGRzOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNvbnRhY3RNYW5pZm9sZCA9IGFtbW9EaXNwYXRjaGVyLmdldE1hbmlmb2xkQnlJbmRleEludGVybmFsKGkpOwogICAgICAgICAgICB2YXIgcmIwID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MCgpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICAgICAgdmFyIHJiMSA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTEoKSwgQW1tby5idFJpZ2lkQm9keSk7CiAgICAgICAgICAgIHZhciBudW1Db250YWN0cyA9IGNvbnRhY3RNYW5pZm9sZC5nZXROdW1Db250YWN0cygpOyAvLyB0aGlzIGl0ZXJhdGlvbiBkb2Vzbid0IGhhdmUgdXVpZHMKCiAgICAgICAgICAgIGlmICghcmIwLnV1aWQgfHwgIXJiMS51dWlkKSBjb250aW51ZTsKICAgICAgICAgICAgdmFyIGNvbnRhY3RzID0gW107CgogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bUNvbnRhY3RzOyBqKyspIHsKICAgICAgICAgICAgICB2YXIgY29udGFjdFBvaW50ID0gY29udGFjdE1hbmlmb2xkLmdldENvbnRhY3RQb2ludChqKTsKICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBjb250YWN0UG9pbnQuZ2V0RGlzdGFuY2UoKTsKICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiAwLjApIGNvbnRpbnVlOwogICAgICAgICAgICAgIHZhciB2ZWxvY2l0eTAgPSByYjAuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICAgICAgICB2YXIgdmVsb2NpdHkxID0gcmIxLmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25BKCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25CKCk7CiAgICAgICAgICAgICAgdmFyIGxvY2FsUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QSgpOwogICAgICAgICAgICAgIHZhciBsb2NhbFBvczEgPSBjb250YWN0UG9pbnQuZ2V0X21fbG9jYWxQb2ludEIoKTsKICAgICAgICAgICAgICBjb250YWN0cy5wdXNoKHsKICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZSwKICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbewogICAgICAgICAgICAgICAgICB1dWlkOiByYjAudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MC55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkwLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczAueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMC56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICB1dWlkOiByYjEudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MS55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkxLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczEueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMS56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMC51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMS51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRFbGVtZW50IiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgIF90aGlzLmVsZW1lbnRzW2RhdGEudXVpZF0gPSBkYXRhOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInVwZGF0ZUJvZHlTdGF0ZSIsIGZ1bmN0aW9uIChfcmVmKSB7CiAgICAgICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgICAgICBzdGF0ZSA9IF9yZWYuc3RhdGU7CgogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUpLCBzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAidGVybWluYXRlIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmR5bmFtaWNzV29ybGQpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLnNvbHZlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuZGlzcGF0Y2hlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7CiAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShfdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7CiAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFRlcm1pbmF0ZUV2ZW50KCk7CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMuZWxlbWVudHMgPSB7fTsKICAgICAgICB0aGlzLmluaXRpYWxpc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmJyb2FkcGhhc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5zb2x2ZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSBudWxsOwogICAgICAgIHRoaXMuY2xvY2sgPSBuZXcgQ2xvY2soKTsKICAgICAgfQoKICAgICAgX2NyZWF0ZUNsYXNzKFdvcmxkLCBbewogICAgICAgIGtleTogImRpc3Bvc2VCb2R5IiwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZUJvZHkoX3JlZjIpIHsKICAgICAgICAgIHZhciB1dWlkID0gX3JlZjIudXVpZDsKICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHV1aWQpOwogICAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnJlbW92ZVJpZ2lkQm9keShlbGVtZW50LmJvZHkpOwogICAgICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHV1aWQpOwogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRFbGVtZW50RGlzcG9zZWQoewogICAgICAgICAgICB1dWlkOiB1dWlkCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH1dKTsKCiAgICAgIHJldHVybiBXb3JsZDsKICAgIH0oKTsKICAgIHZhciB3b3JsZCA9IG5ldyBXb3JsZCgpOwoKICAgIHZhciBERUZBVUxUX1JPTExfSU5GTFVFTkNFID0gMC4yOwogICAgdmFyIERFRkFVTFRfRlJJQ1RJT04gPSAxMDAwOwogICAgdmFyIERFRkFVTFRfTUFTUyA9IDgwMDsKICAgIHZhciBhZGRWZWhpY2xlID0gZnVuY3Rpb24gYWRkVmVoaWNsZShkYXRhKSB7CiAgICAgIHZhciBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdoZWVscyA9IGRhdGEud2hlZWxzLAogICAgICAgICAgX2RhdGEkbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzID09PSB2b2lkIDAgPyBERUZBVUxUX01BU1MgOiBfZGF0YSRtYXNzLAogICAgICAgICAgX2RhdGEkd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgd2lkdGggPSBfZGF0YSR3aWR0aCA9PT0gdm9pZCAwID8gMS44IDogX2RhdGEkd2lkdGgsCiAgICAgICAgICBfZGF0YSRoZWlnaHQgPSBkYXRhLmhlaWdodCwKICAgICAgICAgIGhlaWdodCA9IF9kYXRhJGhlaWdodCA9PT0gdm9pZCAwID8gLjYgOiBfZGF0YSRoZWlnaHQsCiAgICAgICAgICBfZGF0YSRsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGxlbmd0aCA9IF9kYXRhJGxlbmd0aCA9PT0gdm9pZCAwID8gNCA6IF9kYXRhJGxlbmd0aCwKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24gPT09IHZvaWQgMCA/IERFRkFVTFRfRlJJQ1RJT04gOiBfZGF0YSRmcmljdGlvbiwKICAgICAgICAgIF9kYXRhJHJvbGxJbmZsdWVuY2UgPSBkYXRhLnJvbGxJbmZsdWVuY2UsCiAgICAgICAgICByb2xsSW5mbHVlbmNlID0gX2RhdGEkcm9sbEluZmx1ZW5jZSA9PT0gdm9pZCAwID8gREVGQVVMVF9ST0xMX0lORkxVRU5DRSA6IF9kYXRhJHJvbGxJbmZsdWVuY2UsCiAgICAgICAgICBfZGF0YSR3aGVlbHNPcHRpb25zID0gZGF0YS53aGVlbHNPcHRpb25zLAogICAgICAgICAgd2hlZWxzT3B0aW9ucyA9IF9kYXRhJHdoZWVsc09wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkd2hlZWxzT3B0aW9ucywKICAgICAgICAgIF9kYXRhJHN1c3BlbnNpb25zID0gZGF0YS5zdXNwZW5zaW9ucywKICAgICAgICAgIHN1c3BlbnNpb25zID0gX2RhdGEkc3VzcGVuc2lvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkc3VzcGVuc2lvbnM7CiAgICAgIHZhciBfd2hlZWxzT3B0aW9ucyRiYWNrID0gd2hlZWxzT3B0aW9ucy5iYWNrLAogICAgICAgICAgYmFjayA9IF93aGVlbHNPcHRpb25zJGJhY2sgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkYmFjaywKICAgICAgICAgIF93aGVlbHNPcHRpb25zJGZyb250ID0gd2hlZWxzT3B0aW9ucy5mcm9udCwKICAgICAgICAgIGZyb250ID0gX3doZWVsc09wdGlvbnMkZnJvbnQgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkZnJvbnQ7CiAgICAgIHZhciBfYmFjayRheGlzUG9zaXRpb24gPSBiYWNrLmF4aXNQb3NpdGlvbiwKICAgICAgICAgIGF4aXNQb3NpdGlvbkJhY2sgPSBfYmFjayRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IC0xIDogX2JhY2skYXhpc1Bvc2l0aW9uLAogICAgICAgICAgX2JhY2skcmFkaXVzID0gYmFjay5yYWRpdXMsCiAgICAgICAgICB3aGVlbFJhZGl1c0JhY2sgPSBfYmFjayRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2JhY2skcmFkaXVzLAogICAgICAgICAgX2JhY2skaGFsZlRyYWNrID0gYmFjay5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0JhY2sgPSBfYmFjayRoYWxmVHJhY2sgPT09IHZvaWQgMCA/IDEgOiBfYmFjayRoYWxmVHJhY2ssCiAgICAgICAgICBfYmFjayRheGlzSGVpZ2h0ID0gYmFjay5heGlzSGVpZ2h0LAogICAgICAgICAgd2hlZWxBeGlzSGVpZ2h0QmFjayA9IF9iYWNrJGF4aXNIZWlnaHQgPT09IHZvaWQgMCA/IC4zIDogX2JhY2skYXhpc0hlaWdodDsKICAgICAgdmFyIF9mcm9udCRheGlzUG9zaXRpb24gPSBmcm9udC5heGlzUG9zaXRpb24sCiAgICAgICAgICBheGlzUG9zaXRpb25Gcm9udCA9IF9mcm9udCRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IDEuNyA6IF9mcm9udCRheGlzUG9zaXRpb24sCiAgICAgICAgICBfZnJvbnQkcmFkaXVzID0gZnJvbnQucmFkaXVzLAogICAgICAgICAgd2hlZWxSYWRpdXNGcm9udCA9IF9mcm9udCRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2Zyb250JHJhZGl1cywKICAgICAgICAgIF9mcm9udCRoYWxmVHJhY2sgPSBmcm9udC5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0Zyb250ID0gX2Zyb250JGhhbGZUcmFjayA9PT0gdm9pZCAwID8gMSA6IF9mcm9udCRoYWxmVHJhY2ssCiAgICAgICAgICBfZnJvbnQkYXhpc0hlaWdodCA9IGZyb250LmF4aXNIZWlnaHQsCiAgICAgICAgICB3aGVlbEF4aXNIZWlnaHRGcm9udCA9IF9mcm9udCRheGlzSGVpZ2h0ID09PSB2b2lkIDAgPyAuMyA6IF9mcm9udCRheGlzSGVpZ2h0OwogICAgICB2YXIgX3N1c3BlbnNpb25zJHN0aWZmbmVzID0gc3VzcGVuc2lvbnMuc3RpZmZuZXNzLAogICAgICAgICAgc3RpZmZuZXNzID0gX3N1c3BlbnNpb25zJHN0aWZmbmVzID09PSB2b2lkIDAgPyAyMC4wIDogX3N1c3BlbnNpb25zJHN0aWZmbmVzLAogICAgICAgICAgX3N1c3BlbnNpb25zJGRhbXBpbmcgPSBzdXNwZW5zaW9ucy5kYW1waW5nLAogICAgICAgICAgZGFtcGluZyA9IF9zdXNwZW5zaW9ucyRkYW1waW5nID09PSB2b2lkIDAgPyAyLjMgOiBfc3VzcGVuc2lvbnMkZGFtcGluZywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRjb21wcmVzcyA9IHN1c3BlbnNpb25zLmNvbXByZXNzaW9uLAogICAgICAgICAgY29tcHJlc3Npb24gPSBfc3VzcGVuc2lvbnMkY29tcHJlc3MgPT09IHZvaWQgMCA/IDQuNCA6IF9zdXNwZW5zaW9ucyRjb21wcmVzcywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRyZXN0TGVuZyA9IHN1c3BlbnNpb25zLnJlc3RMZW5ndGgsCiAgICAgICAgICByZXN0TGVuZ3RoID0gX3N1c3BlbnNpb25zJHJlc3RMZW5nID09PSB2b2lkIDAgPyAwLjYgOiBfc3VzcGVuc2lvbnMkcmVzdExlbmc7IC8vIENoYXNzaXMKCiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogLjUsIGhlaWdodCAqIC41LCBsZW5ndGggKiAuNSkpOwogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTsKICAgICAgdmFyIGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTsKICAgICAgZ2VvbWV0cnkuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciBjaGFzc2lzID0gbmV3IEFtbW8uYnRSaWdpZEJvZHkobmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBnZW9tZXRyeSwgbG9jYWxJbmVydGlhKSk7CiAgICAgIGNoYXNzaXMuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGNoYXNzaXMpOyAvLyBSYXljYXN0IFZlaGljbGUKCiAgICAgIHZhciB0dW5pbmcgPSBuZXcgQW1tby5idFZlaGljbGVUdW5pbmcoKTsKICAgICAgdmFyIHJheUNhc3RlciA9IG5ldyBBbW1vLmJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIod29ybGQuZ2V0RHluYW1pY3NXb3JsZCgpKTsKICAgICAgdmFyIHZlaGljbGUgPSBuZXcgQW1tby5idFJheWNhc3RWZWhpY2xlKHR1bmluZywgY2hhc3NpcywgcmF5Q2FzdGVyKTsKICAgICAgdmVoaWNsZS5zZXRDb29yZGluYXRlU3lzdGVtKDAsIDEsIDIpOwogICAgICB3b3JsZC5hZGRBY3Rpb24odmVoaWNsZSk7CiAgICAgIHZhciB3aGVlbERpcmVjdGlvbkNTMCA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAtMSwgMCk7CiAgICAgIHZhciB3aGVlbEF4bGVDUyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygtMSwgMCwgMCk7CgogICAgICB2YXIgYWRkV2hlZWwgPSBmdW5jdGlvbiBhZGRXaGVlbChpc0Zyb250LCBwb3MsIHJhZGl1cykgewogICAgICAgIHZhciB3aGVlbEluZm8gPSB2ZWhpY2xlLmFkZFdoZWVsKHBvcywgd2hlZWxEaXJlY3Rpb25DUzAsIHdoZWVsQXhsZUNTLCByZXN0TGVuZ3RoLCByYWRpdXMsIHR1bmluZywgaXNGcm9udCk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3Moc3RpZmZuZXNzKTsKICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ1JlbGF4YXRpb24oZGFtcGluZyk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdDb21wcmVzc2lvbihjb21wcmVzc2lvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX2ZyaWN0aW9uU2xpcChmcmljdGlvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3JvbGxJbmZsdWVuY2Uocm9sbEluZmx1ZW5jZSk7CiAgICAgIH07CgogICAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMygtd2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tCYWNrLCB3aGVlbEF4aXNIZWlnaHRCYWNrLCBheGlzUG9zaXRpb25CYWNrKSwgd2hlZWxSYWRpdXNCYWNrKTsKICAgICAgdmVoaWNsZS51dWlkID0gdXVpZDsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdHlwZTogVFlQRVMuVkVISUNMRSwKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHZlaGljbGU6IHZlaGljbGUsCiAgICAgICAgd2hlZWxzOiB3aGVlbHMsCiAgICAgICAgb3B0aW9uczogZGF0YSwKICAgICAgICBzdGF0ZTogREVGQVVMVF9WRUhJQ0xFX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBzZXRWZWhpY2xlUG9zaXRpb24gPSBmdW5jdGlvbiBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFZlaGljbGVRdWF0ZXJuaW9uID0gZnVuY3Rpb24gc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcmVzZXRWZWhpY2xlID0gZnVuY3Rpb24gcmVzZXRWZWhpY2xlKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CgogICAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7CiAgICAgICAgdmFyIGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciBoYW5kbGVWZWhpY2xlVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlVmVoaWNsZVVwZGF0ZShfcmVmLCBkdCkgewogICAgICB2YXIgdmVoaWNsZSA9IF9yZWYudmVoaWNsZSwKICAgICAgICAgIHdoZWVscyA9IF9yZWYud2hlZWxzLAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1ZFSElDTEVfU1RBVEUgOiBfcmVmJHN0YXRlLAogICAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLAogICAgICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJG9wdGlvbnM7CiAgICAgIHZhciBicmVha2luZ0ZvcmNlID0gMDsKICAgICAgdmFyIGVuZ2luZUZvcmNlID0gMDsKICAgICAgdmFyIF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSA9IG9wdGlvbnMuc3RlZXJpbmdDbGFtcCwKICAgICAgICAgIHN0ZWVyaW5nQ2xhbXAgPSBfb3B0aW9ucyRzdGVlcmluZ0NsYW0gPT09IHZvaWQgMCA/IERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAgOiBfb3B0aW9ucyRzdGVlcmluZ0NsYW0sCiAgICAgICAgICBfb3B0aW9ucyRzdGVlcmluZ0luY3IgPSBvcHRpb25zLnN0ZWVyaW5nSW5jcmVtZW50LAogICAgICAgICAgc3RlZXJpbmdJbmNyZW1lbnQgPSBfb3B0aW9ucyRzdGVlcmluZ0luY3IgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UIDogX29wdGlvbnMkc3RlZXJpbmdJbmNyLAogICAgICAgICAgX29wdGlvbnMkbWF4RW5naW5lRm9yID0gb3B0aW9ucy5tYXhFbmdpbmVGb3JjZSwKICAgICAgICAgIG1heEVuZ2luZUZvcmNlID0gX29wdGlvbnMkbWF4RW5naW5lRm9yID09PSB2b2lkIDAgPyBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UgOiBfb3B0aW9ucyRtYXhFbmdpbmVGb3IsCiAgICAgICAgICBfb3B0aW9ucyRtYXhCcmVha2luZ0YgPSBvcHRpb25zLm1heEJyZWFraW5nRm9yY2UsCiAgICAgICAgICBtYXhCcmVha2luZ0ZvcmNlID0gX29wdGlvbnMkbWF4QnJlYWtpbmdGID09PSB2b2lkIDAgPyBERUZBVUxUX01BWF9CUkVBS0lOR19GT1JDRSA6IF9vcHRpb25zJG1heEJyZWFraW5nRjsKCiAgICAgIGlmIChzdGF0ZS5hY2NlbGVyYXRpb24pIHsKICAgICAgICBpZiAoc3BlZWQgPCAtMSkgYnJlYWtpbmdGb3JjZSA9IG1heEJyZWFraW5nRm9yY2U7ZWxzZSBlbmdpbmVGb3JjZSA9IG1heEVuZ2luZUZvcmNlOwogICAgICB9CgogICAgICBpZiAoc3RhdGUuYnJha2luZykgewogICAgICAgIGlmIChzcGVlZCA+IDEpIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO2Vsc2UgZW5naW5lRm9yY2UgPSAtbWF4RW5naW5lRm9yY2UgLyAyOwogICAgICB9CgogICAgICBpZiAoc3RhdGUubGVmdCkgewogICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCBzdGVlcmluZ0NsYW1wKSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgKz0gc3RlZXJpbmdJbmNyZW1lbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHN0YXRlLnJpZ2h0KSB7CiAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gLXN0ZWVyaW5nQ2xhbXApIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA8IC1zdGVlcmluZ0luY3JlbWVudCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O2Vsc2UgewogICAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gc3RlZXJpbmdJbmNyZW1lbnQpIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDtlbHNlIHsKICAgICAgICAgICAgICBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB2ZWhpY2xlLmFwcGx5RW5naW5lRm9yY2UoZW5naW5lRm9yY2UsIEJBQ0tfTEVGVCk7CiAgICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSAvIDIsIEZST05UX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRTdGVlcmluZ1ZhbHVlKHN0YXRlLnZlaGljbGVTdGVlcmluZywgRlJPTlRfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0U3RlZXJpbmdWYWx1ZShzdGF0ZS52ZWhpY2xlU3RlZXJpbmcsIEZST05UX1JJR0hUKTsKICAgICAgdmFyIHRtLCBwLCBxLCBpOwogICAgICB2YXIgbiA9IHZlaGljbGUuZ2V0TnVtV2hlZWxzKCk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdmVoaWNsZS51cGRhdGVXaGVlbFRyYW5zZm9ybShpLCB0cnVlKTsKICAgICAgICB0bSA9IHZlaGljbGUuZ2V0V2hlZWxUcmFuc2Zvcm1XUyhpKTsKICAgICAgICBwID0gdG0uZ2V0T3JpZ2luKCk7CiAgICAgICAgcSA9IHRtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgdmFyIHdoZWVsVVVJRCA9IHdoZWVsc1tpXTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZEJvZHlVcGRhdGUod2hlZWxVVUlELCBwLCBxLCBkdCk7CiAgICAgIH0KCiAgICAgIHRtID0gdmVoaWNsZS5nZXRDaGFzc2lzV29ybGRUcmFuc2Zvcm0oKTsKICAgICAgcCA9IHRtLmdldE9yaWdpbigpOwogICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTsKICAgICAgdmFyIGRpcmVjdGlvbiA9IHZlaGljbGUuZ2V0Rm9yd2FyZFZlY3RvcigpOwogICAgICB2YXIgc3BlZWQgPSB2ZWhpY2xlLmdldEN1cnJlbnRTcGVlZEttSG91cigpOwogICAgICB2YXIgZXh0cmFEYXRhID0gewogICAgICAgIGRpcmVjdGlvbjogewogICAgICAgICAgeDogZGlyZWN0aW9uLngoKSwKICAgICAgICAgIHk6IGRpcmVjdGlvbi55KCksCiAgICAgICAgICB6OiBkaXJlY3Rpb24ueigpCiAgICAgICAgfSwKICAgICAgICBzcGVlZDogc3BlZWQKICAgICAgfTsKICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHV1aWQsIHAsIHEsIGR0LCBleHRyYURhdGEpOwogICAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUodXVpZCwgc3RhdGUpOwogICAgfTsKCiAgICB2YXIgY3JlYXRlR2hvc3RDb2xsaWRlciA9IGZ1bmN0aW9uIGNyZWF0ZUdob3N0Q29sbGlkZXIocmFkaXVzLCBwb3NpdGlvbikgewogICAgICB2YXIgZ2hvc3RDb2xsaWRlciA9IG5ldyBBbW1vLmJ0R2hvc3RPYmplY3QoKTsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGdob3N0Q29sbGlkZXIuc2V0Q29sbGlzaW9uU2hhcGUobmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpKTsKICAgICAgZ2hvc3RDb2xsaWRlci5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihwb3NpdGlvbik7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24oMCwgMCwgMCwgMSkpOwogICAgICBnaG9zdENvbGxpZGVyLnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZ2hvc3RDb2xsaWRlcjogZ2hvc3RDb2xsaWRlciwKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybQogICAgICB9OwogICAgfTsKICAgIHZhciBmb3JFYWNoR2hvc3RDb2xsaXNpb24gPSBmdW5jdGlvbiBmb3JFYWNoR2hvc3RDb2xsaXNpb24oZ2hvc3RDb2xsaWRlcikgewogICAgICB2YXIgZm9yRWFjaENhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmdW5jdGlvbiAoKSB7fTsKICAgICAgdmFyIGNvbGxpc2lvbnMgPSBnaG9zdENvbGxpZGVyLmdldE51bU92ZXJsYXBwaW5nT2JqZWN0cygpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xsaXNpb25zOyBpKyspIHsKICAgICAgICB2YXIgb2JqZWN0ID0gQW1tby5jYXN0T2JqZWN0KGdob3N0Q29sbGlkZXIuZ2V0T3ZlcmxhcHBpbmdPYmplY3QoaSksIEFtbW8uYnRSaWdpZEJvZHkpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG9iamVjdC5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGZvckVhY2hDYWxsYmFjayhvYmplY3QsIHRyYW5zZm9ybSwgaSk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgZ2V0RXhwbG9zaW9uUG9zaXRpb24gPSBmdW5jdGlvbiBnZXRFeHBsb3Npb25Qb3NpdGlvbih1dWlkLCBwb3NpdGlvbikgewogICAgICB2YXIgZXhwbG9zaW9uUG9zaXRpb24gPSBwb3NpdGlvbjsKCiAgICAgIGlmICghZXhwbG9zaW9uUG9zaXRpb24pIHsKICAgICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQuYm9keTsKCiAgICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgZXhwbG9zaW9uUG9zaXRpb24gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBleHBsb3Npb25Qb3NpdGlvbjsKICAgIH07CiAgICB2YXIgZ2V0RXhwbG9zaW9uSW1wdWxzZSA9IGZ1bmN0aW9uIGdldEV4cGxvc2lvbkltcHVsc2UocG9zaXRpb24sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkgewogICAgICB2YXIgZGlzdGFuY2UgPSBwb3NpdGlvbi5vcF9zdWIoZXhwbG9zaW9uUG9zaXRpb24pOwogICAgICBkaXN0YW5jZS5ub3JtYWxpemUoKTsKICAgICAgdmFyIGltcHVsc2UgPSBkaXN0YW5jZS5vcF9tdWwoc3RyZW5ndGgpOwogICAgICBpbXB1bHNlLnNldFkoaW1wdWxzZS55KCkgKyBzdHJlbmd0aCk7CiAgICAgIHJldHVybiBpbXB1bHNlOwogICAgfTsKICAgIHZhciBjcmVhdGVFeHBsb3Npb24gPSBmdW5jdGlvbiBjcmVhdGVFeHBsb3Npb24oX3JlZikgewogICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gX3JlZi5wb3NpdGlvbiwKICAgICAgICAgIF9yZWYkcmFkaXVzID0gX3JlZi5yYWRpdXMsCiAgICAgICAgICByYWRpdXMgPSBfcmVmJHJhZGl1cyA9PT0gdm9pZCAwID8gRVhQTE9TSU9OX1NJWkVTLlNNQUxMIDogX3JlZiRyYWRpdXMsCiAgICAgICAgICBfcmVmJHN0cmVuZ3RoID0gX3JlZi5zdHJlbmd0aCwKICAgICAgICAgIHN0cmVuZ3RoID0gX3JlZiRzdHJlbmd0aCA9PT0gdm9pZCAwID8gRVhQTE9TSU9OX1NUUkVOR1RIUy5NRURJVU0gOiBfcmVmJHN0cmVuZ3RoOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgZXhwbG9zaW9uUG9zaXRpb24gPSBnZXRFeHBsb3Npb25Qb3NpdGlvbih1dWlkLCBwb3NpdGlvbik7CgogICAgICAgIHZhciBfY3JlYXRlR2hvc3RDb2xsaWRlciA9IGNyZWF0ZUdob3N0Q29sbGlkZXIocmFkaXVzLCBleHBsb3Npb25Qb3NpdGlvbiksCiAgICAgICAgICAgIGdob3N0Q29sbGlkZXIgPSBfY3JlYXRlR2hvc3RDb2xsaWRlci5naG9zdENvbGxpZGVyLAogICAgICAgICAgICB0cmFuc2Zvcm0gPSBfY3JlYXRlR2hvc3RDb2xsaWRlci50cmFuc2Zvcm07CgogICAgICAgIHdvcmxkLmFkZENvbGxpc2lvbk9iamVjdChnaG9zdENvbGxpZGVyKTsKICAgICAgICBmb3JFYWNoR2hvc3RDb2xsaXNpb24oZ2hvc3RDb2xsaWRlciwgZnVuY3Rpb24gKG9iamVjdCwgb2JqZWN0VHJhbnNmb3JtKSB7CiAgICAgICAgICB2YXIgb3JpZ2luID0gb2JqZWN0VHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgICAgb2JqZWN0LmFjdGl2YXRlKHRydWUpOwogICAgICAgICAgb2JqZWN0LmFwcGx5Q2VudHJhbEltcHVsc2UoZ2V0RXhwbG9zaW9uSW1wdWxzZShvcmlnaW4sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkpOwogICAgICAgIH0pOwogICAgICAgIHdvcmxkLmdldER5bmFtaWNzV29ybGQoKS5yZW1vdmVDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgQW1tby5kZXN0cm95KGdob3N0Q29sbGlkZXIpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGhhbmRsZUxvYWRFdmVudCA9IGZ1bmN0aW9uIGhhbmRsZUxvYWRFdmVudChvcHRpb25zKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoQW1tbykgewogICAgICAgIHNlbGYuQW1tbyA9IEFtbW87CgogICAgICAgIG9ubWVzc2FnZSA9IGZ1bmN0aW9uIG9ubWVzc2FnZShfcmVmKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IF9yZWYuZGF0YTsKCiAgICAgICAgICBzd2l0Y2ggKGRhdGEuZXZlbnQpIHsKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuQk9YOgogICAgICAgICAgICAgIGFkZEJveChkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlNQSEVSRToKICAgICAgICAgICAgICBhZGRTcGhlcmUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5WRUhJQ0xFOgogICAgICAgICAgICAgIGFkZFZlaGljbGUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5NT0RFTDoKICAgICAgICAgICAgICBhZGRNb2RlbChkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlBMQVlFUjoKICAgICAgICAgICAgICBhZGRQbGF5ZXIoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULkxJTkVBUl9WRUxPQ0lUWToKICAgICAgICAgICAgICBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5TRVQuUE9TSVRJT046CiAgICAgICAgICAgICAgc2V0UG9zaXRpb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuU0VULlBPU0lUSU9OOgogICAgICAgICAgICAgIHNldFZlaGljbGVQb3NpdGlvbihkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TRVQuUVVBVEVSTklPTjoKICAgICAgICAgICAgICBzZXRWZWhpY2xlUXVhdGVybmlvbihkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5SRVNFVDoKICAgICAgICAgICAgICByZXNldFZlaGljbGUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQVBQTFkuSU1QVUxTRToKICAgICAgICAgICAgICBhcHBseUltcHVzZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEU6CiAgICAgICAgICAgICAgd29ybGQudXBkYXRlQm9keVN0YXRlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkRJU1BPU0U6CiAgICAgICAgICAgICAgd29ybGQuZGlzcG9zZUJvZHkoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVGRkVDVFMuRVhQTE9TSU9OOgogICAgICAgICAgICAgIGNyZWF0ZUV4cGxvc2lvbihkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVEVSTUlOQVRFOgogICAgICAgICAgICAgIHdvcmxkLnRlcm1pbmF0ZSgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHdvcmxkLmluaXQob3B0aW9ucyk7CiAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRSZWFkeUV2ZW50KCk7CiAgICAgICAgd29ybGQuc2ltdWxhdGUoKTsKICAgICAgfTsKICAgIH07CgogICAgdmFyIGxvYWRBbW1vID0gZnVuY3Rpb24gbG9hZEFtbW8ob3B0aW9ucykgewogICAgICB2YXIgc2NyaXB0VXJsID0gb3B0aW9ucy5ob3N0ICsgJy8nICsgKG9wdGlvbnMucGF0aCB8fCBMSUJSQVJZX05BTUUpOwogICAgICBpbXBvcnRTY3JpcHRzKHNjcmlwdFVybCk7CiAgICAgIEFtbW8oKS50aGVuKGhhbmRsZUxvYWRFdmVudChvcHRpb25zKSk7CiAgICB9OwoKICAgIG9ubWVzc2FnZSA9IGZ1bmN0aW9uIG9ubWVzc2FnZShfcmVmMikgewogICAgICB2YXIgZGF0YSA9IF9yZWYyLmRhdGE7CgogICAgICBzd2l0Y2ggKGRhdGEuZXZlbnQpIHsKICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkxPQUQuQU1NTzoKICAgICAgICAgIGxvYWRBbW1vKGRhdGEpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH07Cgp9KCkpOwoK', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy9jb25zdGFudHMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3MvbWVzc2FnZXMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL2xpYi9kaXNwYXRjaGVyLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9saWIvbWF0aC5qcyIsIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy93b3JrZXIvZWxlbWVudHMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL3BsYXllci5qcyIsIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy93b3JrZXIvd29ybGQuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL3ZlaGljbGVzLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9lZmZlY3RzLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgTElCUkFSWV9OQU1FID0gJ2FtbW8uanMnO1xuXG5leHBvcnQgY29uc3QgVFlQRVMgPSB7XG4gICAgQk9YOiAnQk9YJyxcbiAgICBTUEhFUkU6ICdTUEhFUkUnLFxuICAgIFZFSElDTEU6ICdWRUhJQ0xFJyxcbiAgICBNRVNIOiAnTUVTSCcsXG4gICAgUExBWUVSOiAnUExBWUVSJ1xufTtcblxuZXhwb3J0IGNvbnN0IENPTExJREVSX1RZUEVTID0ge1xuICAgIEJPWDogJ0JPWCcsXG4gICAgVkVISUNMRTogJ1ZFSElDTEUnLFxuICAgIFBMQVlFUjogJ1BMQVlFUicsXG4gICAgU1BIRVJFOiAnU1BIRVJFJ1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHtcbiAgICB2ZWhpY2xlU3RlZXJpbmc6IDAsXG4gICAgYWNjZWxlcmF0aW9uOiBmYWxzZSxcbiAgICBicmVha2luZzogZmFsc2UsXG4gICAgcmlnaHQ6IGZhbHNlLFxuICAgIGxlZnQ6IGZhbHNlXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7XG4gICAgdmVsb2NpdHk6IHsgeDogMCwgeTogMCwgejogMCB9LFxuICAgIG1vdmVtZW50OiB7XG4gICAgICAgIGZvcndhcmQ6IGZhbHNlLFxuICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLFxuICAgICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgICAgcmlnaHQ6IGZhbHNlXG4gICAgfSxcbiAgICBkaXJlY3Rpb246IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgejogMFxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NDQUxFID0geyB4OiAxLCB5OiAxLCB6OiAxIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9RVUFURVJOSU9OID0geyB4OiAwLCB5OiAwLCB6OiAwLCB3OiAxIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9QT1NJVElPTiA9IHsgeDogMCwgeTogMCwgejogMCB9O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElORUFSX1ZFTE9DSVRZID0geyB4OiAwLCB5OiAwLCB6OiAwIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9JTVBVTFNFID0geyB4OiAwLCB5OiAwLCB6OiAwIH07XG5cbmV4cG9ydCBjb25zdCBESVNBQkxFX0RFQUNUSVZBVElPTiA9IDQ7XG5leHBvcnQgY29uc3QgR1JBVklUWSA9IHsgeDogMCwgeTogLTEwLCB6OiAwIH07XG5cbmV4cG9ydCBjb25zdCBGUk9OVF9MRUZUID0gMDtcbmV4cG9ydCBjb25zdCBGUk9OVF9SSUdIVCA9IDE7XG5leHBvcnQgY29uc3QgQkFDS19MRUZUID0gMjtcbmV4cG9ydCBjb25zdCBCQUNLX1JJR0hUID0gMztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UID0gLjA0O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAgPSAuNTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UgPSAyMDAwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFID0gMTAwO1xuXG5leHBvcnQgY29uc3QgRVhQTE9TSU9OX1NJWkVTID0ge1xuICAgIFNNQUxMOiA0LFxuICAgIE1FRElVTTogNixcbiAgICBMQVJHRTogOCxcbiAgICBNQVNTSVZFOiAxMlxufTtcblxuZXhwb3J0IGNvbnN0IEVYUExPU0lPTl9TVFJFTkdUSFMgPSB7XG4gICAgVkVSWV9XRUFLOiAyLFxuICAgIFdFQUs6IDQsXG4gICAgTUVESVVNOiA4LFxuICAgIExBUkdFOiAxNixcbiAgICBNQVNTSVZFOiAzMixcbiAgICBPS19OTzogNjRcbn07IiwiZXhwb3J0IGNvbnN0IFBIWVNJQ1NfRVZFTlRTID0ge1xuICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsXG4gICAgVEVSTUlOQVRFOiAncGh5c2ljczp0ZXJtaW5hdGUnLFxuICAgIExPQUQ6IHtcbiAgICAgICAgQU1NTzogJ3BoeXNpY3M6bG9hZDphbW1vJyxcbiAgICB9LFxuICAgIFJFQURZOiAncGh5c2ljczpyZWFkeScsXG4gICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsXG4gICAgVVBEQVRFOiAncGh5c2ljczp1cGRhdGUnLFxuICAgIFxuICAgIEFERDoge1xuICAgICAgICBCT1g6ICdwaHlzaWNzOmFkZDpib3gnLFxuICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsXG4gICAgICAgIE1PREVMOiAncGh5c2ljczphZGQ6bW9kZWwnLFxuICAgICAgICBQTEFZRVI6ICdwaHlzaWNzOmFkZDpwbGF5ZXInLFxuICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnLFxuICAgIH0sXG5cbiAgICBFTEVNRU5UOiB7XG4gICAgICAgIERJU1BPU0U6ICdwaHlzaWNzOmVsZW1lbnQ6ZGlzcG9zZScsXG4gICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLFxuICAgICAgICBVUERBVEU6ICdwaHlzaWNzOmVsZW1lbnQ6dXBkYXRlJyxcbiAgICAgICAgQ1JFQVRFRDogJ3BoeXNpY3M6ZWxlbWVudDpjcmVhdGVkJyxcblxuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICAgIFBPU0lUSU9OOiAncGh5c2ljczplbGVtZW50OnNldDpwb3NpdGlvbicsXG4gICAgICAgICAgICBRVUFURVJOSU9OOiAncGh5c2ljczplbGVtZW50OnNldDpxdWF0ZXJuaW9uJyxcbiAgICAgICAgICAgIExJTkVBUl9WRUxPQ0lUWTogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6bGluZWFyX3ZlbG9jaXR5J1xuICAgICAgICB9LFxuXG4gICAgICAgIEFQUExZOiB7XG4gICAgICAgICAgICBJTVBVTFNFOiAncGh5c2ljczplbGVtZW50OmFwcGx5OmltcHVsc2UnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgVkVISUNMRToge1xuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICAgIFBPU0lUSU9OOiAncGh5c2ljczp2ZWhpY2xlOnNldDpwb3NpdGlvbicsXG4gICAgICAgICAgICBRVUFURVJOSU9OOiAncGh5c2ljczp2ZWhpY2xlOnNldDpxdWF0ZXJuaW9uJ1xuICAgICAgICB9LFxuICAgICAgICBSRVNFVDogJ3BoeXNpY3M6dmVoaWNsZTpyZXNldCcsXG4gICAgICAgIFxuICAgICAgICBTUEVFRDogJ3BoeXNpY3M6dmVoaWNsZTpzcGVlZCcsXG4gICAgICAgIERJUkVDVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpkaXJlY3Rpb24nXG4gICAgfSxcblxuICAgIEVGRkVDVFM6IHtcbiAgICAgICAgRVhQTE9TSU9OOiAncGh5c2ljczplZmZlY3RzOmV4cGxvc2lvbidcbiAgICB9XG59OyIsImltcG9ydCB7IFBIWVNJQ1NfRVZFTlRTIH0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2hlciB7XG5cbiAgICBzZW5kUGh5c2ljc1VwZGF0ZSA9IGR0ID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlVQREFURSwgZHQgfSlcbiAgICBzZW5kUmVhZHlFdmVudCA9ICgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlJFQURZIH0pO1xuICAgIHNlbmRUZXJtaW5hdGVFdmVudCA9ICgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURSB9KTtcblxuICAgIHNlbmRCb2R5VXBkYXRlID0gKHV1aWQsIHBvc2l0aW9uLCByb3RhdGlvbiwgZHQsIGV4dHJhRGF0YSkgPT4gcG9zdE1lc3NhZ2Uoe1xuICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEUsXG4gICAgICAgIHV1aWQsXG4gICAgICAgIHBvc2l0aW9uOiB7IHg6IHBvc2l0aW9uLngoKSwgeTogcG9zaXRpb24ueSgpLCB6OiBwb3NpdGlvbi56KCkgfSxcbiAgICAgICAgcXVhdGVybmlvbjogeyB4OiByb3RhdGlvbi54KCksIHk6IHJvdGF0aW9uLnkoKSwgejogcm90YXRpb24ueigpLCB3OiByb3RhdGlvbi53KCkgfSxcbiAgICAgICAgLi4uZXh0cmFEYXRhLFxuICAgICAgICBkdFxuICAgIH0pO1xuXG4gICAgc2VuZERpc3BhdGNoRXZlbnQgPSAodXVpZCwgZXZlbnROYW1lLCBldmVudERhdGEpID0+IHBvc3RNZXNzYWdlKHtcbiAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLkRJU1BBVENILFxuICAgICAgICB1dWlkLFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGV2ZW50RGF0YVxuICAgIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IERpc3BhdGNoZXIoKTsiLCJleHBvcnQgY29uc3QgYXBwbHlNYXRyaXg0VG9WZWN0b3IzID0gKHsgeCA9IDAsIHkgPSAwLCB6ID0gMCB9LCBtYXRyaXggPSBbXSkgPT4ge1xuICAgIGNvbnN0IHcgPSAxIC8gKCBtYXRyaXhbIDMgXSAqIHggKyBtYXRyaXhbIDcgXSAqIHkgKyBtYXRyaXhbIDExIF0gKiB6ICsgbWF0cml4WyAxNSBdICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiAoIG1hdHJpeFsgMCBdICogeCArIG1hdHJpeFsgNCBdICogeSArIG1hdHJpeFsgOCBdICogeiArIG1hdHJpeFsgMTIgXSApICogdyxcbiAgICAgICAgeTogKCBtYXRyaXhbIDEgXSAqIHggKyBtYXRyaXhbIDUgXSAqIHkgKyBtYXRyaXhbIDkgXSAqIHogKyBtYXRyaXhbIDEzIF0gKSAqIHcsXG4gICAgICAgIHo6ICggbWF0cml4WyAyIF0gKiB4ICsgbWF0cml4WyA2IF0gKiB5ICsgbWF0cml4WyAxMCBdICogeiArIG1hdHJpeFsgMTQgXSApICogdyxcbiAgICB9XG59OyIsImltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHdvcmxkIGZyb20gJy4vd29ybGQnO1xuXG5pbXBvcnQge1xuICAgIGFwcGx5TWF0cml4NFRvVmVjdG9yM1xufSBmcm9tICcuL2xpYi9tYXRoJztcblxuaW1wb3J0IHtcbiAgICBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSxcbiAgICBUWVBFUyxcbiAgICBERUZBVUxUX1NDQUxFLFxuICAgIERJU0FCTEVfREVBQ1RJVkFUSU9OLFxuICAgIERFRkFVTFRfTElORUFSX1ZFTE9DSVRZLFxuICAgIERFRkFVTFRfSU1QVUxTRVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUmlnaWRCb2R5ID0gKHNoYXBlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICB1dWlkLFxuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgcXVhdGVybmlvbixcbiAgICAgICAgbWFzcyxcbiAgICAgICAgZnJpY3Rpb24sXG4gICAgICAgIHJlc3RpdHV0aW9uID0gLjksXG4gICAgICAgIGRhbXBpbmcgPSB7IGxpbmVhcjogMC4yLCBhbmd1bGFyOiAwLjIgfVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpO1xuICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTtcbiAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpO1xuICAgIGNvbnN0IG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTtcbiAgICBjb25zdCBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7XG4gICAgc2hhcGUuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7XG5cbiAgICBjb25zdCByYkluZm8gPSBuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIHNoYXBlLCBsb2NhbEluZXJ0aWEpO1xuICAgIGNvbnN0IGJvZHkgPSBuZXcgQW1tby5idFJpZ2lkQm9keShyYkluZm8pO1xuXG4gICAgXG5cbiAgICBpZiAobWFzcyA+IDApIHtcbiAgICAgICAgYm9keS5zZXRGcmljdGlvbihmcmljdGlvbik7XG4gICAgICAgIGJvZHkuc2V0UmVzdGl0dXRpb24ocmVzdGl0dXRpb24pO1xuICAgICAgICBib2R5LnNldERhbXBpbmcoZGFtcGluZy5saW5lYXIsIGRhbXBpbmcuYW5ndWxhcik7XG4gICAgICAgIGJvZHkuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTtcbiAgICB9XG5cbiAgICAvLyBzdG9yaW5nIHV1aWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VcbiAgICBib2R5LnV1aWQgPSB1dWlkO1xuXG4gICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpO1xuXG4gICAgcmV0dXJuIGJvZHk7XG59XG5cbmV4cG9ydCBjb25zdCBhZGRNb2RlbCA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICB1dWlkLFxuICAgICAgICB2ZXJ0aWNlcyxcbiAgICAgICAgbWF0cmljZXMsXG4gICAgICAgIGluZGV4ZXMsXG4gICAgICAgIHBvc2l0aW9uLFxuICAgICAgICBxdWF0ZXJuaW9uLFxuICAgICAgICBtYXNzID0gMCxcbiAgICAgICAgZnJpY3Rpb24gPSAyXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzY2FsZSA9IERFRkFVTFRfU0NBTEU7XG5cbiAgICBjb25zdCBidGEgPSBuZXcgQW1tby5idFZlY3RvcjMoKTtcbiAgICBjb25zdCBidGIgPSBuZXcgQW1tby5idFZlY3RvcjMoKTtcbiAgICBjb25zdCBidGMgPSBuZXcgQW1tby5idFZlY3RvcjMoKTtcbiAgICBjb25zdCB0cmlNZXNoID0gbmV3IEFtbW8uYnRUcmlhbmdsZU1lc2godHJ1ZSwgZmFsc2UpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdmVydGljZXNbaV07XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhlc1tpXSA/IGluZGV4ZXNbaV0gOiBudWxsO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBBcnJheS5mcm9tKG1hdHJpY2VzW2ldKTtcblxuICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kZXgubGVuZ3RoOyBqICs9IDMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFpID0gaW5kZXhbal0gKiAzO1xuICAgICAgICAgICAgY29uc3QgYmkgPSBpbmRleFtqICsgMV0gKiAzO1xuICAgICAgICAgICAgY29uc3QgY2kgPSBpbmRleFtqICsgMl0gKiAzO1xuXG4gICAgICAgICAgICBjb25zdCB2YSA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbYWldLCB5OiBjb21wb25lbnRzW2FpICsgMV0sIHo6IGNvbXBvbmVudHNbYWkgKyAyXSB9LCBtYXRyaXgpO1xuICAgICAgICAgICAgY29uc3QgdmIgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2JpXSwgeTogY29tcG9uZW50c1tiaSArIDFdLCB6OiBjb21wb25lbnRzW2JpICsgMl0gfSwgbWF0cml4KTtcbiAgICAgICAgICAgIGNvbnN0IHZjID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsgeDogY29tcG9uZW50c1tjaV0sIHk6IGNvbXBvbmVudHNbY2kgKyAxXSwgejogY29tcG9uZW50c1tjaSArIDJdIH0sIG1hdHJpeCk7XG5cbiAgICAgICAgICAgIGJ0YS5zZXRWYWx1ZSh2YS54LCB2YS55LCB2YS56KTtcbiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZSh2Yi54LCB2Yi55LCB2Yi56KTtcbiAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZSh2Yy54LCB2Yy55LCB2Yy56KTtcbiAgICAgICAgICAgIHRyaU1lc2guYWRkVHJpYW5nbGUoYnRhLCBidGIsIGJ0YywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb21wb25lbnRzLmxlbmd0aDsgaiArPSA5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmEgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2ogKyAwXSwgeTogY29tcG9uZW50c1tqICsgMV0sIHo6IGNvbXBvbmVudHNbaiArIDJdIH0sIG1hdHJpeCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmIgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2ogKyAzXSwgeTogY29tcG9uZW50c1tqICsgNF0sIHo6IGNvbXBvbmVudHNbaiArIDVdIH0sIG1hdHJpeCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2ogKyA2XSwgeTogY29tcG9uZW50c1tqICsgN10sIHo6IGNvbXBvbmVudHNbaiArIDhdIH0sIG1hdHJpeCk7XG5cbiAgICAgICAgICAgICAgICBidGEuc2V0VmFsdWUodmEueCwgdmEueSwgdmEueik7XG4gICAgICAgICAgICAgICAgYnRiLnNldFZhbHVlKHZiLngsIHZiLnksIHZiLnopO1xuICAgICAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZSh2Yy54LCB2Yy55LCB2Yy56KTtcbiAgICAgICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxvY2FsU2NhbGUgPSBuZXcgQW1tby5idFZlY3RvcjMoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueik7XG4gICAgdHJpTWVzaC5zZXRTY2FsaW5nKGxvY2FsU2NhbGUpO1xuICAgIEFtbW8uZGVzdHJveShsb2NhbFNjYWxlKTtcblxuICAgIGNvbnN0IGNvbGxpc2lvblNoYXBlID0gbmV3IEFtbW8uYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSh0cmlNZXNoLCB0cnVlLCB0cnVlKTtcbiAgICBjb2xsaXNpb25TaGFwZS5yZXNvdXJjZXMgPSBbdHJpTWVzaF07XG5cbiAgICBBbW1vLmRlc3Ryb3koYnRhKTtcbiAgICBBbW1vLmRlc3Ryb3koYnRiKTtcbiAgICBBbW1vLmRlc3Ryb3koYnRjKTtcblxuICAgIGNvbnN0IGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY29sbGlzaW9uU2hhcGUsIHsgdXVpZCwgcG9zaXRpb24sIHF1YXRlcm5pb24sIG1hc3MsIGZyaWN0aW9uIH0pO1xuICAgIHdvcmxkLmFkZEVsZW1lbnQoeyB1dWlkLCBib2R5LCB0eXBlOiBUWVBFUy5NRVNILCBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBhZGRCb3ggPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgd2lkdGgsIGxlbmd0aCwgaGVpZ2h0LCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcyA9IDAsIGZyaWN0aW9uID0gMiB9ID0gZGF0YTtcblxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAwLjUsIGhlaWdodCAqIDAuNSwgbGVuZ3RoICogMC41KSk7XG4gICAgY29uc3QgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgeyB1dWlkLCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcywgZnJpY3Rpb24gfSk7XG5cbiAgICB3b3JsZC5hZGRFbGVtZW50KHsgdXVpZCwgYm9keSwgdHlwZTogVFlQRVMuQk9YLCBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3BoZXJlID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCByYWRpdXMsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzID0gMCwgZnJpY3Rpb24gPSAyIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQW1tby5idFNwaGVyZVNoYXBlKHJhZGl1cyk7XG4gICAgY29uc3QgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgeyB1dWlkLCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcywgZnJpY3Rpb24gfSk7XG5cbiAgICB3b3JsZC5hZGRFbGVtZW50KHsgdXVpZCwgYm9keSwgdHlwZTogVFlQRVMuU1BIRVJFLCBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0TGluZWFyVmVsb2NpdHkgPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgdmVsb2NpdHkgPSBERUZBVUxUX0xJTkVBUl9WRUxPQ0lUWSB9ID0gZGF0YTtcbiAgICBjb25zdCB7IGJvZHkgfSA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG4gICAgY29uc3QgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobW90aW9uU3RhdGUpIHtcbiAgICAgICAgY29uc3QgbGluZWFyVmVsb2NpdHkgPSBuZXcgQW1tby5idFZlY3RvcjModmVsb2NpdHkueCwgdmVsb2NpdHkueSwgdmVsb2NpdHkueik7XG4gICAgICAgIGJvZHkuc2V0TGluZWFyVmVsb2NpdHkobGluZWFyVmVsb2NpdHkpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kobGluZWFyVmVsb2NpdHkpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRQb3NpdGlvbiA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgcG9zaXRpb24gfSA9IGRhdGE7XG4gICAgY29uc3QgeyBib2R5IH0gPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICkpO1xuXG4gICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xufVxuXG5leHBvcnQgY29uc3QgYXBwbHlJbXB1c2UgPSAoeyB1dWlkLCBpbXB1bHNlID0gREVGQVVMVF9JTVBVTFNFIH0pID0+IHtcbiAgICBjb25zdCB7IGJvZHkgfSA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG4gICAgY29uc3QgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobW90aW9uU3RhdGUpIHtcbiAgICAgICAgY29uc3QgaW1wdWxzZVZlY3RvciA9IG5ldyBBbW1vLmJ0VmVjdG9yMyhpbXB1bHNlLngsIGltcHVsc2UueSwgaW1wdWxzZS56KTtcbiAgICAgICAgYm9keS5hcHBseUNlbnRyYWxJbXB1bHNlKGltcHVsc2VWZWN0b3IpO1xuICAgICAgICBBbW1vLmRlc3Ryb3koaW1wdWxzZVZlY3Rvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlRWxlbWVudFVwZGF0ZSA9ICh7IGJvZHksIHV1aWQsIHN0YXRlID0gREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSwgZHQpID0+IHtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTtcblxuICAgIGlmIChtb3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGxldCBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7XG4gICAgICAgIGxldCByb3RhdGlvbiA9IHRyYW5zZm9ybS5nZXRSb3RhdGlvbigpO1xuXG4gICAgICAgIGRpc3BhdGNoZXIuc2VuZEJvZHlVcGRhdGUodXVpZCwgb3JpZ2luLCByb3RhdGlvbiwgZHQpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnNmb3JtKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgY3JlYXRlUmlnaWRCb2R5IH0gZnJvbSAnLi9lbGVtZW50cyc7XG5pbXBvcnQgd29ybGQgZnJvbSAnLi93b3JsZCc7XG5cbmltcG9ydCB7XG4gICAgVFlQRVMsXG4gICAgREVGQVVMVF9SSUdJREJPRFlfU1RBVEVcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNvbnN0IGFkZFBsYXllciA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCB3aWR0aCwgaGVpZ2h0LCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcywgZnJpY3Rpb24gfSA9IGRhdGE7XG5cbiAgICBjb25zdCBjYXBzdWxlID0gbmV3IEFtbW8uYnRDYXBzdWxlU2hhcGUod2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjYXBzdWxlLCB7IHV1aWQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzLCBmcmljdGlvbiB9KTtcblxuICAgIC8vIGRpc2FibGlpbmcgcm90YXRpb24gZm9yIGNvbGxpc2lvbnNcbiAgICBib2R5LnNldEFuZ3VsYXJGYWN0b3IoMCk7XG5cbiAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7XG4gICAgd29ybGQuYWRkRWxlbWVudCh7IHV1aWQsIGJvZHksIHR5cGU6IFRZUEVTLlBMQVlFUiwgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZVBsYXllclVwZGF0ZSA9ICh7IGJvZHksIHV1aWQsIHN0YXRlID0gREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSwgZHQpID0+IHtcbiAgICBjb25zdCB7IG1vdmVtZW50LCBkaXJlY3Rpb24sIGNhbWVyYURpcmVjdGlvbiwgcXVhdGVybmlvbiwgcG9zaXRpb24gfSA9IHN0YXRlO1xuXG4gICAgY29uc3QgTUFYX1NQRUVEID0gMTtcbiAgICBjb25zdCB3YWxrVmVsb2NpdHkgPSAuMTtcblxuICAgIGNvbnN0IG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpO1xuXG4gICAgaWYgKG1vdGlvblN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG4gICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG5cbiAgICAgICAgY29uc3QgbGluZWFyVmVsb2NpdHkgPSBib2R5LmdldExpbmVhclZlbG9jaXR5KCk7XG4gICAgICAgIGNvbnN0IHNwZWVkID0gbGluZWFyVmVsb2NpdHkubGVuZ3RoKCk7XG5cbiAgICAgICAgY29uc3QgZm9yd2FyZERpciA9IHRyYW5zZm9ybS5nZXRCYXNpcygpLmdldFJvdygyKTtcbiAgICAgICAgZm9yd2FyZERpci5ub3JtYWxpemUoKTtcbiAgICAgICAgY29uc3Qgd2Fsa0RpcmVjdGlvbiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLjAsIDAuMCwgMC4wKTtcblxuICAgICAgICBjb25zdCB3YWxrU3BlZWQgPSB3YWxrVmVsb2NpdHkgKiBkdDtcblxuICAgICAgICBpZiAobW92ZW1lbnQuZm9yd2FyZCkge1xuICAgICAgICAgICAgd2Fsa0RpcmVjdGlvbi5zZXRYKCB3YWxrRGlyZWN0aW9uLngoKSArIGZvcndhcmREaXIueCgpKTtcbiAgICAgICAgICAgIC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSArIGZvcndhcmREaXIueSgpKTtcbiAgICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wiggd2Fsa0RpcmVjdGlvbi56KCkgKyBmb3J3YXJkRGlyLnooKSk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgaWYgKG1vdmVtZW50LmJhY2t3YXJkcykge1xuICAgICAgICAgICAgd2Fsa0RpcmVjdGlvbi5zZXRYKCB3YWxrRGlyZWN0aW9uLngoKSAtIGZvcndhcmREaXIueCgpKTtcbiAgICAgICAgICAgIC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSAtIGZvcndhcmREaXIueSgpKTtcbiAgICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wiggd2Fsa0RpcmVjdGlvbi56KCkgLSBmb3J3YXJkRGlyLnooKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW1vdmVtZW50LmZvcndhcmQgJiYgIW1vdmVtZW50LmJhY2t3YXJkcykge1xuICAgICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKiAwLjIpO1xuICAgICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKiAwLjIpO1xuICAgICAgICB9IGVsc2UgaWYgKHNwZWVkIDwgTUFYX1NQRUVEKSB7XG4gICAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRYKGxpbmVhclZlbG9jaXR5LngoKSArIGNhbWVyYURpcmVjdGlvbi54ICogd2Fsa1NwZWVkKTtcbiAgICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFoobGluZWFyVmVsb2NpdHkueigpICsgY2FtZXJhRGlyZWN0aW9uLnogKiB3YWxrU3BlZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYm9keS5zZXRMaW5lYXJWZWxvY2l0eShsaW5lYXJWZWxvY2l0eSk7XG5cbiAgICAgICAgYm9keS5nZXRNb3Rpb25TdGF0ZSgpLnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGJvZHkuc2V0Q2VudGVyT2ZNYXNzVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG5cbiAgICAgICAgbGV0IG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTtcbiAgICAgICAgbGV0IHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7XG4gICAgfVxufTsiLCJpbXBvcnQge1xuICAgIEdSQVZJVFksXG4gICAgVFlQRVNcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHsgaGFuZGxlRWxlbWVudFVwZGF0ZSB9IGZyb20gJy4vZWxlbWVudHMnO1xuaW1wb3J0IHsgaGFuZGxlVmVoaWNsZVVwZGF0ZSB9IGZyb20gJy4vdmVoaWNsZXMnO1xuaW1wb3J0IHsgaGFuZGxlUGxheWVyVXBkYXRlIH0gZnJvbSAnLi9wbGF5ZXInO1xuXG5pbXBvcnQgZGlzcGF0Y2hlciBmcm9tICcuL2xpYi9kaXNwYXRjaGVyJztcbmltcG9ydCB7IFBIWVNJQ1NfRVZFTlRTIH0gZnJvbSAnLi4vbWVzc2FnZXMnO1xuXG5jbGFzcyBDbG9jayB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBudWxsO1xuICAgIH1cblxuICAgIGdldERlbHRhKCkge1xuICAgICAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKHRoaXMudGltZXN0YW1wKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IHRpbWUgLSB0aGlzLnRpbWVzdGFtcDtcbiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTtcblxuICAgICAgICAgICAgcmV0dXJuIGRlbHRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lO1xuXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBXb3JsZCB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IHt9O1xuICAgICAgICB0aGlzLmluaXRpYWxpc2VkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYnJvYWRwaGFzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbG9jayA9IG5ldyBDbG9jaygpO1xuICAgIH1cblxuICAgIGluaXQgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCB7IGdyYXZpdHkgPSBHUkFWSVRZIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbiA9IG5ldyBBbW1vLmJ0RGVmYXVsdENvbGxpc2lvbkNvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IEFtbW8uYnRDb2xsaXNpb25EaXNwYXRjaGVyKHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuYnJvYWRwaGFzZSA9IG5ldyBBbW1vLmJ0RGJ2dEJyb2FkcGhhc2UoKTtcbiAgICAgICAgdGhpcy5zb2x2ZXIgPSBuZXcgQW1tby5idFNlcXVlbnRpYWxJbXB1bHNlQ29uc3RyYWludFNvbHZlcigpO1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQgPSBuZXcgQW1tby5idERpc2NyZXRlRHluYW1pY3NXb3JsZCh0aGlzLmRpc3BhdGNoZXIsIHRoaXMuYnJvYWRwaGFzZSwgdGhpcy5zb2x2ZXIsIHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5zZXRHcmF2aXR5KG5ldyBBbW1vLmJ0VmVjdG9yMyhncmF2aXR5LngsIGdyYXZpdHkueSwgZ3Jhdml0eS56KSk7XG5cbiAgICAgICAgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGdob3N0T2JqZWN0IGNvbGxpc2lvbnNcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkXG4gICAgICAgICAgICAuZ2V0QnJvYWRwaGFzZSgpXG4gICAgICAgICAgICAuZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUoKVxuICAgICAgICAgICAgLnNldEludGVybmFsR2hvc3RQYWlyQ2FsbGJhY2sobmV3IEFtbW8uYnRHaG9zdFBhaXJDYWxsYmFjaygpKVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbGlzZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICByZW1vdmVFbGVtZW50ID0gdXVpZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0VsZW1lbnQodXVpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVEZWxldGVkRWxlbWVudHMgPSAoKSA9PiAoXG4gICAgICAgIE9iamVjdFxuICAgICAgICAgICAgLmtleXModGhpcy5lbGVtZW50cylcbiAgICAgICAgICAgIC5maWx0ZXIodXVpZCA9PiB0aGlzLmVsZW1lbnRzW3V1aWRdLmRlbGV0ZWQpXG4gICAgICAgICAgICAuZm9yRWFjaCh1dWlkID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50c1t1dWlkXTtcbiAgICAgICAgICAgIH0pXG4gICAgKTtcblxuICAgIGhhc0VsZW1lbnQgPSB1dWlkID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZWxlbWVudHMpLmluY2x1ZGVzKHV1aWQpO1xuICAgIH1cblxuICAgIGdldEVsZW1lbnQgPSB1dWlkID0+IHRoaXMuZWxlbWVudHNbdXVpZF07XG5cbiAgICBpc0luaXRpYWxpc2VkID0gKCkgPT4gdGhpcy5pbml0aWFsaXNlZDtcblxuICAgIGdldER5bmFtaWNzV29ybGQgPSAoKSA9PiB0aGlzLmR5bmFtaWNzV29ybGQ7XG5cbiAgICBhZGRSaWdpZEJvZHkgPSBib2R5ID0+IHtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLmFkZFJpZ2lkQm9keShib2R5KTtcbiAgICB9XG5cbiAgICBhZGRBY3Rpb24gPSBhY3Rpb24gPT4ge1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQuYWRkQWN0aW9uKGFjdGlvbik7XG4gICAgfVxuXG4gICAgYWRkQ29sbGlzaW9uT2JqZWN0ID0gY29sbGlzaW9uT2JqZWN0ID0+IHtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLmFkZENvbGxpc2lvbk9iamVjdChjb2xsaXNpb25PYmplY3QpO1xuICAgIH1cblxuICAgIHN0ZXBTaW11bGF0aW9uID0gZHQgPT4ge1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQuc3RlcFNpbXVsYXRpb24oZHQpO1xuICAgIH1cblxuICAgIHNpbXVsYXRlID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkdCA9IHRoaXMuY2xvY2suZ2V0RGVsdGEoKTtcbiAgICAgICAgdGhpcy5zdGVwU2ltdWxhdGlvbihkdCk7XG5cbiAgICAgICAgT2JqZWN0XG4gICAgICAgICAgICAua2V5cyh0aGlzLmVsZW1lbnRzKVxuICAgICAgICAgICAgLmZvckVhY2godXVpZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChlbGVtZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuQk9YOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5TUEhFUkU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLk1FU0g6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRWxlbWVudFVwZGF0ZShlbGVtZW50LCBkdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlBMQVlFUjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQbGF5ZXJVcGRhdGUoZWxlbWVudCwgZHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5WRUhJQ0xFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVZlaGljbGVVcGRhdGUoZWxlbWVudCwgZHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sbGlzaW9ucygpO1xuICAgICAgICB0aGlzLnJlbW92ZURlbGV0ZWRFbGVtZW50cygpO1xuXG4gICAgICAgIGRpc3BhdGNoZXIuc2VuZFBoeXNpY3NVcGRhdGUoZHQpO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5zaW11bGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVDb2xsaXNpb25zID0gKCkgPT4ge1xuICAgICAgICBsZXQgYW1tb0Rpc3BhdGNoZXIgPSB0aGlzLmR5bmFtaWNzV29ybGQuZ2V0RGlzcGF0Y2hlcigpO1xuICAgICAgICBsZXQgbnVtTWFuaWZvbGRzID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TnVtTWFuaWZvbGRzKCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1NYW5pZm9sZHM7IGkrKykge1xuXG4gICAgICAgICAgICBsZXQgY29udGFjdE1hbmlmb2xkID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TWFuaWZvbGRCeUluZGV4SW50ZXJuYWwoaSk7XG5cbiAgICAgICAgICAgIGxldCByYjAgPSBBbW1vLmNhc3RPYmplY3QoY29udGFjdE1hbmlmb2xkLmdldEJvZHkwKCksIEFtbW8uYnRSaWdpZEJvZHkpO1xuICAgICAgICAgICAgbGV0IHJiMSA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTEoKSwgQW1tby5idFJpZ2lkQm9keSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBudW1Db250YWN0cyA9IGNvbnRhY3RNYW5pZm9sZC5nZXROdW1Db250YWN0cygpO1xuXG4gICAgICAgICAgICAvLyB0aGlzIGl0ZXJhdGlvbiBkb2Vzbid0IGhhdmUgdXVpZHNcbiAgICAgICAgICAgIGlmICghcmIwLnV1aWQgfHwgIXJiMS51dWlkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgbGV0IGNvbnRhY3RzID0gW107XG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29udGFjdHM7IGorKykge1xuXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRhY3RQb2ludCA9IGNvbnRhY3RNYW5pZm9sZC5nZXRDb250YWN0UG9pbnQoaik7XG4gICAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gY29udGFjdFBvaW50LmdldERpc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiggZGlzdGFuY2UgPiAwLjApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgbGV0IHZlbG9jaXR5MCA9IHJiMC5nZXRMaW5lYXJWZWxvY2l0eSgpO1xuICAgICAgICAgICAgICAgIGxldCB2ZWxvY2l0eTEgPSByYjEuZ2V0TGluZWFyVmVsb2NpdHkoKTtcbiAgICAgICAgICAgICAgICBsZXQgd29ybGRQb3MwID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkEoKTtcbiAgICAgICAgICAgICAgICBsZXQgd29ybGRQb3MxID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkIoKTtcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxQb3MwID0gY29udGFjdFBvaW50LmdldF9tX2xvY2FsUG9pbnRBKCk7XG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QigpO1xuXG4gICAgICAgICAgICAgICAgY29udGFjdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50czpbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogcmIwLnV1aWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsgeDogdmVsb2NpdHkwLngoKSwgeTogdmVsb2NpdHkwLnkoKSwgejogdmVsb2NpdHkwLnooKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7IHg6IHdvcmxkUG9zMC54KCksIHk6IHdvcmxkUG9zMC55KCksIHo6IHdvcmxkUG9zMC56KCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvczogeyB4OiBsb2NhbFBvczAueCgpLCB5OiBsb2NhbFBvczAueSgpLCB6OiBsb2NhbFBvczAueigpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogcmIxLnV1aWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsgeDogdmVsb2NpdHkxLngoKSwgeTogdmVsb2NpdHkxLnkoKSwgejogdmVsb2NpdHkxLnooKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7IHg6IHdvcmxkUG9zMS54KCksIHk6IHdvcmxkUG9zMS55KCksIHo6IHdvcmxkUG9zMS56KCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvczogeyB4OiBsb2NhbFBvczEueCgpLCB5OiBsb2NhbFBvczEueSgpLCB6OiBsb2NhbFBvczEueigpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaXNwYXRjaGVyLnNlbmREaXNwYXRjaEV2ZW50KHJiMC51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgeyBjb250YWN0cyB9KTtcbiAgICAgICAgICAgIGRpc3BhdGNoZXIuc2VuZERpc3BhdGNoRXZlbnQocmIxLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7IGNvbnRhY3RzIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRWxlbWVudCA9IGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmVsZW1lbnRzW2RhdGEudXVpZF0gPSBkYXRhO1xuICAgIH1cblxuICAgIHVwZGF0ZUJvZHlTdGF0ZSA9ICh7IHV1aWQsIHN0YXRlIH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRWxlbWVudCh1dWlkKSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50c1t1dWlkXS5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlLFxuICAgICAgICAgICAgICAgIC4uLnN0YXRlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZUJvZHkoeyB1dWlkIH0pIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnJlbW92ZVJpZ2lkQm9keShlbGVtZW50LmJvZHkpO1xuICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodXVpZCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kRWxlbWVudERpc3Bvc2VkKHsgdXVpZCB9KTtcbiAgICB9XG5cbiAgICB0ZXJtaW5hdGUgPSAoKSA9PiB7XG4gICAgICAgIEFtbW8uZGVzdHJveSh0aGlzLmR5bmFtaWNzV29ybGQpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodGhpcy5zb2x2ZXIpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgQW1tby5kZXN0cm95KHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kVGVybWluYXRlRXZlbnQoKTtcbiAgICB9XG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBXb3JsZCgpOyIsImltcG9ydCB7XG4gICAgRElTQUJMRV9ERUFDVElWQVRJT04sXG4gICAgVFlQRVMsXG4gICAgREVGQVVMVF9WRUhJQ0xFX1NUQVRFLFxuICAgIEJBQ0tfTEVGVCxcbiAgICBCQUNLX1JJR0hULFxuICAgIEZST05UX0xFRlQsXG4gICAgRlJPTlRfUklHSFQsXG4gICAgREVGQVVMVF9NQVhfRU5HSU5FX0ZPUkNFLFxuICAgIERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFLFxuICAgIERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAsXG4gICAgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlRcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgICBQSFlTSUNTX0VWRU5UU1xufSBmcm9tICcuLi9tZXNzYWdlcyc7XG5cbmltcG9ydCB3b3JsZCBmcm9tICcuL3dvcmxkJztcbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuXG5jb25zdCBERUZBVUxUX1JPTExfSU5GTFVFTkNFID0gMC4yO1xuY29uc3QgREVGQVVMVF9GUklDVElPTiA9IDEwMDA7XG5jb25zdCBERUZBVUxUX01BU1MgPSA4MDA7XG5cbmV4cG9ydCBjb25zdCBhZGRWZWhpY2xlID0gZGF0YSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgcXVhdGVybmlvbixcbiAgICAgICAgdXVpZCxcbiAgICAgICAgd2hlZWxzLFxuICAgICAgICBtYXNzID0gREVGQVVMVF9NQVNTLFxuICAgICAgICB3aWR0aCA9IDEuOCxcbiAgICAgICAgaGVpZ2h0ID0gLjYsXG4gICAgICAgIGxlbmd0aCA9IDQsXG4gICAgICAgIGZyaWN0aW9uID0gREVGQVVMVF9GUklDVElPTixcbiAgICAgICAgcm9sbEluZmx1ZW5jZSA9IERFRkFVTFRfUk9MTF9JTkZMVUVOQ0UsXG4gICAgICAgIHdoZWVsc09wdGlvbnMgPSB7fSxcbiAgICAgICAgc3VzcGVuc2lvbnMgPSB7fVxuICAgIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgeyBiYWNrID0ge30sIGZyb250ID0ge30gfSA9IHdoZWVsc09wdGlvbnM7XG4gICAgY29uc3Qge1xuICAgICAgICBheGlzUG9zaXRpb246IGF4aXNQb3NpdGlvbkJhY2sgPSAtMSxcbiAgICAgICAgcmFkaXVzOiB3aGVlbFJhZGl1c0JhY2sgPSAuNCxcbiAgICAgICAgaGFsZlRyYWNrOiB3aGVlbEhhbGZUcmFja0JhY2sgPSAxLFxuICAgICAgICBheGlzSGVpZ2h0OiB3aGVlbEF4aXNIZWlnaHRCYWNrID0gLjNcbiAgICB9ID0gYmFjaztcblxuICAgIGNvbnN0IHtcbiAgICAgICAgYXhpc1Bvc2l0aW9uOiBheGlzUG9zaXRpb25Gcm9udCA9IDEuNyxcbiAgICAgICAgcmFkaXVzOiB3aGVlbFJhZGl1c0Zyb250ID0gLjQsXG4gICAgICAgIGhhbGZUcmFjazogd2hlZWxIYWxmVHJhY2tGcm9udCA9IDEsXG4gICAgICAgIGF4aXNIZWlnaHQ6IHdoZWVsQXhpc0hlaWdodEZyb250ID0gLjNcbiAgICB9ID0gZnJvbnQ7XG5cbiAgICBjb25zdCB7IHN0aWZmbmVzcyA9IDIwLjAsIGRhbXBpbmcgPSAyLjMsIGNvbXByZXNzaW9uID0gNC40LCByZXN0TGVuZ3RoID0gMC42IH0gPSBzdXNwZW5zaW9ucztcblxuXG4gICAgLy8gQ2hhc3Npc1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAuNSwgaGVpZ2h0ICogLjUsIGxlbmd0aCAqIC41KSk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7XG4gICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7XG4gICAgY29uc3QgbG9jYWxJbmVydGlhID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAsIDAsIDApO1xuICAgIGdlb21ldHJ5LmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpO1xuICAgIGNvbnN0IGNoYXNzaXMgPSBuZXcgQW1tby5idFJpZ2lkQm9keShuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIGdlb21ldHJ5LCBsb2NhbEluZXJ0aWEpKTtcbiAgICBjaGFzc2lzLnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7XG4gICAgd29ybGQuYWRkUmlnaWRCb2R5KGNoYXNzaXMpO1xuXG5cbiAgICAvLyBSYXljYXN0IFZlaGljbGVcbiAgICBjb25zdCB0dW5pbmcgPSBuZXcgQW1tby5idFZlaGljbGVUdW5pbmcoKTtcbiAgICBjb25zdCByYXlDYXN0ZXIgPSBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkLmdldER5bmFtaWNzV29ybGQoKSk7XG4gICAgY29uc3QgdmVoaWNsZSA9IG5ldyBBbW1vLmJ0UmF5Y2FzdFZlaGljbGUodHVuaW5nLCBjaGFzc2lzLCByYXlDYXN0ZXIpO1xuICAgIHZlaGljbGUuc2V0Q29vcmRpbmF0ZVN5c3RlbSgwLCAxLCAyKTtcbiAgICB3b3JsZC5hZGRBY3Rpb24odmVoaWNsZSk7XG5cbiAgICBjb25zdCB3aGVlbERpcmVjdGlvbkNTMCA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAtMSwgMCk7XG4gICAgY29uc3Qgd2hlZWxBeGxlQ1MgPSBuZXcgQW1tby5idFZlY3RvcjMoLTEsIDAsIDApO1xuXG4gICAgY29uc3QgYWRkV2hlZWwgPSAoaXNGcm9udCwgcG9zLCByYWRpdXMpID0+IHtcblxuICAgICAgICB2YXIgd2hlZWxJbmZvID0gdmVoaWNsZS5hZGRXaGVlbChcbiAgICAgICAgICAgIHBvcyxcbiAgICAgICAgICAgIHdoZWVsRGlyZWN0aW9uQ1MwLFxuICAgICAgICAgICAgd2hlZWxBeGxlQ1MsXG4gICAgICAgICAgICByZXN0TGVuZ3RoLFxuICAgICAgICAgICAgcmFkaXVzLFxuICAgICAgICAgICAgdHVuaW5nLFxuICAgICAgICAgICAgaXNGcm9udCk7XG5cbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3Moc3RpZmZuZXNzKTtcbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdSZWxheGF0aW9uKGRhbXBpbmcpO1xuICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ0NvbXByZXNzaW9uKGNvbXByZXNzaW9uKTtcbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX2ZyaWN0aW9uU2xpcChmcmljdGlvbik7XG4gICAgICAgIHdoZWVsSW5mby5zZXRfbV9yb2xsSW5mbHVlbmNlKHJvbGxJbmZsdWVuY2UpO1xuICAgIH1cblxuICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0Zyb250LCB3aGVlbEF4aXNIZWlnaHRGcm9udCwgYXhpc1Bvc2l0aW9uRnJvbnQpLCB3aGVlbFJhZGl1c0Zyb250KTtcbiAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpO1xuICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7XG4gICAgYWRkV2hlZWwoZmFsc2UsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0JhY2ssIHdoZWVsQXhpc0hlaWdodEJhY2ssIGF4aXNQb3NpdGlvbkJhY2spLCB3aGVlbFJhZGl1c0JhY2spO1xuXG4gICAgdmVoaWNsZS51dWlkID0gdXVpZDtcblxuICAgIHdvcmxkLmFkZEVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBUWVBFUy5WRUhJQ0xFLFxuICAgICAgICB1dWlkLFxuICAgICAgICB2ZWhpY2xlOiB2ZWhpY2xlLFxuICAgICAgICB3aGVlbHMsXG4gICAgICAgIG9wdGlvbnM6IGRhdGEsXG4gICAgICAgIHN0YXRlOiBERUZBVUxUX1ZFSElDTEVfU1RBVEVcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHNldFZlaGljbGVQb3NpdGlvbiA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgcG9zaXRpb24gfSA9IGRhdGE7XG4gICAgY29uc3QgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICkpO1xuXG4gICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0VmVoaWNsZVF1YXRlcm5pb24gPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IHV1aWQsIHF1YXRlcm5pb24gfSA9IGRhdGE7XG4gICAgY29uc3QgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpO1xuXG4gICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzZXRWZWhpY2xlID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCBxdWF0ZXJuaW9uLCBwb3NpdGlvbiB9ID0gZGF0YTtcbiAgICBjb25zdCBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICAgICAgXG4gICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApKTtcbiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTtcblxuICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlVmVoaWNsZVVwZGF0ZSA9ICh7IHZlaGljbGUsIHdoZWVscywgdXVpZCwgc3RhdGUgPSBERUZBVUxUX1ZFSElDTEVfU1RBVEUsIG9wdGlvbnMgPSB7fSB9LCBkdCkgPT4ge1xuICAgIGxldCBicmVha2luZ0ZvcmNlID0gMDtcbiAgICBsZXQgZW5naW5lRm9yY2UgPSAwO1xuXG4gICAgY29uc3Qge1xuICAgICAgICBzdGVlcmluZ0NsYW1wID0gREVGQVVMVF9TVEVFUklOR19DTEFNUCxcbiAgICAgICAgc3RlZXJpbmdJbmNyZW1lbnQgPSBERUZBVUxUX1NURUVSSU5HX0lOQ1JFTUVOVCxcbiAgICAgICAgbWF4RW5naW5lRm9yY2UgPSBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UsXG4gICAgICAgIG1heEJyZWFraW5nRm9yY2UgPSBERUZBVUxUX01BWF9CUkVBS0lOR19GT1JDRVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHN0YXRlLmFjY2VsZXJhdGlvbikge1xuICAgICAgICBpZiAoc3BlZWQgPCAtMSlcbiAgICAgICAgICAgIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO1xuICAgICAgICBlbHNlIGVuZ2luZUZvcmNlID0gbWF4RW5naW5lRm9yY2U7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5icmFraW5nKSB7XG4gICAgICAgIGlmIChzcGVlZCA+IDEpXG4gICAgICAgICAgICBicmVha2luZ0ZvcmNlID0gbWF4QnJlYWtpbmdGb3JjZTtcbiAgICAgICAgZWxzZSBlbmdpbmVGb3JjZSA9IC1tYXhFbmdpbmVGb3JjZSAvIDI7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5sZWZ0KSB7XG4gICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCBzdGVlcmluZ0NsYW1wKVxuICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzdGF0ZS5yaWdodCkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IC1zdGVlcmluZ0NsYW1wKVxuICAgICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCAtc3RlZXJpbmdJbmNyZW1lbnQpXG4gICAgICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IHN0ZWVyaW5nSW5jcmVtZW50KVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgLT0gc3RlZXJpbmdJbmNyZW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX0xFRlQpO1xuICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19SSUdIVCk7XG5cbiAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9MRUZUKTtcbiAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9SSUdIVCk7XG4gICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX0xFRlQpO1xuICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19SSUdIVCk7XG5cbiAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9MRUZUKTtcbiAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9SSUdIVCk7XG5cbiAgICBsZXQgdG0sIHAsIHEsIGk7XG4gICAgY29uc3QgbiA9IHZlaGljbGUuZ2V0TnVtV2hlZWxzKCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICB2ZWhpY2xlLnVwZGF0ZVdoZWVsVHJhbnNmb3JtKGksIHRydWUpO1xuICAgICAgICB0bSA9IHZlaGljbGUuZ2V0V2hlZWxUcmFuc2Zvcm1XUyhpKTtcbiAgICAgICAgcCA9IHRtLmdldE9yaWdpbigpO1xuICAgICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTtcblxuICAgICAgICBjb25zdCB3aGVlbFVVSUQgPSB3aGVlbHNbaV07XG4gICAgICAgIGRpc3BhdGNoZXIuc2VuZEJvZHlVcGRhdGUod2hlZWxVVUlELCBwLCBxLCBkdCk7XG4gICAgfVxuXG4gICAgdG0gPSB2ZWhpY2xlLmdldENoYXNzaXNXb3JsZFRyYW5zZm9ybSgpO1xuICAgIHAgPSB0bS5nZXRPcmlnaW4oKTtcbiAgICBxID0gdG0uZ2V0Um90YXRpb24oKTtcblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHZlaGljbGUuZ2V0Rm9yd2FyZFZlY3RvcigpO1xuICAgIGNvbnN0IHNwZWVkID0gdmVoaWNsZS5nZXRDdXJyZW50U3BlZWRLbUhvdXIoKTtcblxuICAgIGNvbnN0IGV4dHJhRGF0YSA9IHtcbiAgICAgICAgZGlyZWN0aW9uOiB7XG4gICAgICAgICAgICB4OiBkaXJlY3Rpb24ueCgpLFxuICAgICAgICAgICAgeTogZGlyZWN0aW9uLnkoKSxcbiAgICAgICAgICAgIHo6IGRpcmVjdGlvbi56KClcbiAgICAgICAgfSxcbiAgICAgICAgc3BlZWRcbiAgICB9XG5cblxuICAgIGRpc3BhdGNoZXIuc2VuZEJvZHlVcGRhdGUodXVpZCwgcCwgcSwgZHQsIGV4dHJhRGF0YSk7XG4gICAgd29ybGQudXBkYXRlQm9keVN0YXRlKHV1aWQsIHN0YXRlKTtcbn0iLCJpbXBvcnQgeyBFWFBMT1NJT05fU0laRVMsIEVYUExPU0lPTl9TVFJFTkdUSFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgd29ybGQgZnJvbSBcIi4vd29ybGRcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUdob3N0Q29sbGlkZXIgPSAocmFkaXVzLCBwb3NpdGlvbikgPT4ge1xuICAgIGNvbnN0IGdob3N0Q29sbGlkZXIgPSBuZXcgQW1tby5idEdob3N0T2JqZWN0KCk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgIGdob3N0Q29sbGlkZXIuc2V0Q29sbGlzaW9uU2hhcGUobmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpKTtcbiAgICBnaG9zdENvbGxpZGVyLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG5cbiAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKHBvc2l0aW9uKTtcbiAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKDAsIDAsIDAsIDEpKTtcblxuICAgIGdob3N0Q29sbGlkZXIuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgIHJldHVybiB7IGdob3N0Q29sbGlkZXIsIHRyYW5zZm9ybSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGZvckVhY2hHaG9zdENvbGxpc2lvbiA9IChnaG9zdENvbGxpZGVyLCBmb3JFYWNoQ2FsbGJhY2sgPSAoKSA9PiB7fSkgPT4ge1xuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSBnaG9zdENvbGxpZGVyLmdldE51bU92ZXJsYXBwaW5nT2JqZWN0cygpO1xuICAgIGZvciAobGV0IGk9MDsgaTxjb2xsaXNpb25zOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gQW1tby5jYXN0T2JqZWN0KGdob3N0Q29sbGlkZXIuZ2V0T3ZlcmxhcHBpbmdPYmplY3QoaSksIEFtbW8uYnRSaWdpZEJvZHkpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgICAgIG9iamVjdC5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICBmb3JFYWNoQ2FsbGJhY2sob2JqZWN0LCB0cmFuc2Zvcm0sIGkpO1xuXG4gICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEV4cGxvc2lvblBvc2l0aW9uID0gKHV1aWQsIHBvc2l0aW9uKSA9PiB7XG4gICAgbGV0IGV4cGxvc2lvblBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgaWYgKCFleHBsb3Npb25Qb3NpdGlvbikge1xuICAgICAgICBjb25zdCB7IGJvZHkgfSA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG4gICAgICAgIGNvbnN0IG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGV4cGxvc2lvblBvc2l0aW9uID0gdHJhbnNmb3JtLmdldE9yaWdpbigpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBsb3Npb25Qb3NpdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBsb3Npb25JbXB1bHNlID0gKHBvc2l0aW9uLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IHBvc2l0aW9uLm9wX3N1YihleHBsb3Npb25Qb3NpdGlvbik7XG4gICAgZGlzdGFuY2Uubm9ybWFsaXplKCk7XG4gICAgY29uc3QgaW1wdWxzZSA9IGRpc3RhbmNlLm9wX211bChzdHJlbmd0aCk7XG5cbiAgICBpbXB1bHNlLnNldFkoaW1wdWxzZS55KCkgKyBzdHJlbmd0aCk7XG5cbiAgICByZXR1cm4gaW1wdWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUV4cGxvc2lvbiA9ICh7XG4gICAgdXVpZCxcbiAgICBwb3NpdGlvbixcbiAgICByYWRpdXMgPSBFWFBMT1NJT05fU0laRVMuU01BTEwsXG4gICAgc3RyZW5ndGggPSBFWFBMT1NJT05fU1RSRU5HVEhTLk1FRElVTVxufSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV4cGxvc2lvblBvc2l0aW9uID0gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pO1xuICAgICAgICBjb25zdCB7IGdob3N0Q29sbGlkZXIsIHRyYW5zZm9ybSB9ID0gY3JlYXRlR2hvc3RDb2xsaWRlcihyYWRpdXMsIGV4cGxvc2lvblBvc2l0aW9uKTtcblxuICAgICAgICB3b3JsZC5hZGRDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7XG5cbiAgICAgICAgZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIsIChvYmplY3QsIG9iamVjdFRyYW5zZm9ybSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gb2JqZWN0VHJhbnNmb3JtLmdldE9yaWdpbigpO1xuICAgICAgICAgICAgb2JqZWN0LmFjdGl2YXRlKHRydWUpO1xuICAgICAgICAgICAgb2JqZWN0LmFwcGx5Q2VudHJhbEltcHVsc2UoZ2V0RXhwbG9zaW9uSW1wdWxzZShvcmlnaW4sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB3b3JsZC5nZXREeW5hbWljc1dvcmxkKCkucmVtb3ZlQ29sbGlzaW9uT2JqZWN0KGdob3N0Q29sbGlkZXIpO1xuICAgICAgICBBbW1vLmRlc3Ryb3koZ2hvc3RDb2xsaWRlcik7XG4gICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICB9XG59IiwiaW1wb3J0IHtcbiAgICBMSUJSQVJZX05BTUVcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHsgYWRkVmVoaWNsZSwgcmVzZXRWZWhpY2xlLCBzZXRWZWhpY2xlUG9zaXRpb24sIHNldFZlaGljbGVRdWF0ZXJuaW9uIH0gZnJvbSAnLi92ZWhpY2xlcyc7XG5pbXBvcnQgeyBhZGRCb3gsIGFkZE1vZGVsLCBzZXRMaW5lYXJWZWxvY2l0eSwgYXBwbHlJbXB1c2UsIGFkZFNwaGVyZSwgc2V0UG9zaXRpb24gfSBmcm9tICcuL2VsZW1lbnRzJztcbmltcG9ydCB7IGNyZWF0ZUV4cGxvc2lvbiB9IGZyb20gJy4vZWZmZWN0cyc7XG5pbXBvcnQgeyBhZGRQbGF5ZXIgfSBmcm9tICcuL3BsYXllcic7XG5cbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHdvcmxkIGZyb20gJy4vd29ybGQnO1xuaW1wb3J0IHsgUEhZU0lDU19FVkVOVFMgfSBmcm9tICcuLi9tZXNzYWdlcyc7XG5cbmNvbnN0IGhhbmRsZUxvYWRFdmVudCA9IG9wdGlvbnMgPT4gQW1tbyA9PiB7XG4gICAgc2VsZi5BbW1vID0gQW1tbztcblxuICAgIG9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICBzd2l0Y2goZGF0YS5ldmVudCkge1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuQk9YOlxuICAgICAgICAgICAgICAgIGFkZEJveChkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlNQSEVSRTpcbiAgICAgICAgICAgICAgICBhZGRTcGhlcmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5WRUhJQ0xFOlxuICAgICAgICAgICAgICAgIGFkZFZlaGljbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5NT0RFTDpcbiAgICAgICAgICAgICAgICBhZGRNb2RlbChkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlBMQVlFUjpcbiAgICAgICAgICAgICAgICBhZGRQbGF5ZXIoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULkxJTkVBUl9WRUxPQ0lUWTpcbiAgICAgICAgICAgICAgICBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5TRVQuUE9TSVRJT046XG4gICAgICAgICAgICAgICAgc2V0UG9zaXRpb24oZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuU0VULlBPU0lUSU9OOlxuICAgICAgICAgICAgICAgIHNldFZlaGljbGVQb3NpdGlvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TRVQuUVVBVEVSTklPTjpcbiAgICAgICAgICAgICAgICBzZXRWZWhpY2xlUXVhdGVybmlvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5SRVNFVDpcbiAgICAgICAgICAgICAgICByZXNldFZlaGljbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQVBQTFkuSU1QVUxTRTpcbiAgICAgICAgICAgICAgICBhcHBseUltcHVzZShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEU6XG4gICAgICAgICAgICAgICAgd29ybGQudXBkYXRlQm9keVN0YXRlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkRJU1BPU0U6XG4gICAgICAgICAgICAgICAgd29ybGQuZGlzcG9zZUJvZHkoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVGRkVDVFMuRVhQTE9TSU9OOlxuICAgICAgICAgICAgICAgIGNyZWF0ZUV4cGxvc2lvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVEVSTUlOQVRFOlxuICAgICAgICAgICAgICAgIHdvcmxkLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd29ybGQuaW5pdChvcHRpb25zKTtcbiAgICBkaXNwYXRjaGVyLnNlbmRSZWFkeUV2ZW50KCk7XG4gICAgd29ybGQuc2ltdWxhdGUoKVxufTtcblxuY29uc3QgbG9hZEFtbW8gPSAob3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHNjcmlwdFVybCA9IG9wdGlvbnMuaG9zdCArICcvJyArIChvcHRpb25zLnBhdGggfHwgTElCUkFSWV9OQU1FKTtcbiAgICBpbXBvcnRTY3JpcHRzKHNjcmlwdFVybCk7XG5cbiAgICBBbW1vKCkudGhlbihoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykpO1xufTtcblxub25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiB7XG4gICAgc3dpdGNoKGRhdGEuZXZlbnQpIHtcbiAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5MT0FELkFNTU86XG4gICAgICAgICAgICBsb2FkQW1tbyhkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufSJdLCJuYW1lcyI6WyJMSUJSQVJZX05BTUUiLCJUWVBFUyIsIkJPWCIsIlNQSEVSRSIsIlZFSElDTEUiLCJNRVNIIiwiUExBWUVSIiwiREVGQVVMVF9WRUhJQ0xFX1NUQVRFIiwidmVoaWNsZVN0ZWVyaW5nIiwiYWNjZWxlcmF0aW9uIiwiYnJlYWtpbmciLCJyaWdodCIsImxlZnQiLCJERUZBVUxUX1JJR0lEQk9EWV9TVEFURSIsInZlbG9jaXR5IiwieCIsInkiLCJ6IiwibW92ZW1lbnQiLCJmb3J3YXJkIiwiYmFja3dhcmRzIiwiZGlyZWN0aW9uIiwiREVGQVVMVF9TQ0FMRSIsIkRFRkFVTFRfTElORUFSX1ZFTE9DSVRZIiwiREVGQVVMVF9JTVBVTFNFIiwiRElTQUJMRV9ERUFDVElWQVRJT04iLCJHUkFWSVRZIiwiRlJPTlRfTEVGVCIsIkZST05UX1JJR0hUIiwiQkFDS19MRUZUIiwiQkFDS19SSUdIVCIsIkRFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UIiwiREVGQVVMVF9TVEVFUklOR19DTEFNUCIsIkRFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSIsIkRFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFIiwiRVhQTE9TSU9OX1NJWkVTIiwiU01BTEwiLCJNRURJVU0iLCJMQVJHRSIsIk1BU1NJVkUiLCJFWFBMT1NJT05fU1RSRU5HVEhTIiwiVkVSWV9XRUFLIiwiV0VBSyIsIk9LX05PIiwiUEhZU0lDU19FVkVOVFMiLCJESVNQQVRDSCIsIlRFUk1JTkFURSIsIkxPQUQiLCJBTU1PIiwiUkVBRFkiLCJJTklUIiwiVVBEQVRFIiwiQUREIiwiTU9ERUwiLCJFTEVNRU5UIiwiRElTUE9TRSIsIkNPTExJU0lPTiIsIkNSRUFURUQiLCJTRVQiLCJQT1NJVElPTiIsIlFVQVRFUk5JT04iLCJMSU5FQVJfVkVMT0NJVFkiLCJBUFBMWSIsIklNUFVMU0UiLCJSRVNFVCIsIlNQRUVEIiwiRElSRUNUSU9OIiwiRUZGRUNUUyIsIkVYUExPU0lPTiIsIkRpc3BhdGNoZXIiLCJkdCIsInBvc3RNZXNzYWdlIiwiZXZlbnQiLCJ1dWlkIiwicG9zaXRpb24iLCJyb3RhdGlvbiIsImV4dHJhRGF0YSIsInF1YXRlcm5pb24iLCJ3IiwiZXZlbnROYW1lIiwiZXZlbnREYXRhIiwiYXBwbHlNYXRyaXg0VG9WZWN0b3IzIiwibWF0cml4IiwiY3JlYXRlUmlnaWRCb2R5Iiwic2hhcGUiLCJvcHRpb25zIiwibWFzcyIsImZyaWN0aW9uIiwicmVzdGl0dXRpb24iLCJkYW1waW5nIiwibGluZWFyIiwiYW5ndWxhciIsInRyYW5zZm9ybSIsIkFtbW8iLCJidFRyYW5zZm9ybSIsInNldElkZW50aXR5Iiwic2V0T3JpZ2luIiwiYnRWZWN0b3IzIiwic2V0Um90YXRpb24iLCJidFF1YXRlcm5pb24iLCJtb3Rpb25TdGF0ZSIsImJ0RGVmYXVsdE1vdGlvblN0YXRlIiwibG9jYWxJbmVydGlhIiwiY2FsY3VsYXRlTG9jYWxJbmVydGlhIiwicmJJbmZvIiwiYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvIiwiYm9keSIsImJ0UmlnaWRCb2R5Iiwic2V0RnJpY3Rpb24iLCJzZXRSZXN0aXR1dGlvbiIsInNldERhbXBpbmciLCJzZXRBY3RpdmF0aW9uU3RhdGUiLCJ3b3JsZCIsImFkZFJpZ2lkQm9keSIsImFkZE1vZGVsIiwidmVydGljZXMiLCJtYXRyaWNlcyIsImluZGV4ZXMiLCJzY2FsZSIsImJ0YSIsImJ0YiIsImJ0YyIsInRyaU1lc2giLCJidFRyaWFuZ2xlTWVzaCIsImkiLCJsZW5ndGgiLCJjb21wb25lbnRzIiwiaW5kZXgiLCJBcnJheSIsImZyb20iLCJqIiwiYWkiLCJiaSIsImNpIiwidmEiLCJ2YiIsInZjIiwic2V0VmFsdWUiLCJhZGRUcmlhbmdsZSIsImxvY2FsU2NhbGUiLCJzZXRTY2FsaW5nIiwiZGVzdHJveSIsImNvbGxpc2lvblNoYXBlIiwiYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSIsInJlc291cmNlcyIsImFkZEVsZW1lbnQiLCJ0eXBlIiwic3RhdGUiLCJhZGRCb3giLCJkYXRhIiwid2lkdGgiLCJoZWlnaHQiLCJnZW9tZXRyeSIsImJ0Qm94U2hhcGUiLCJhZGRTcGhlcmUiLCJyYWRpdXMiLCJidFNwaGVyZVNoYXBlIiwic2V0TGluZWFyVmVsb2NpdHkiLCJnZXRFbGVtZW50IiwiZ2V0TW90aW9uU3RhdGUiLCJsaW5lYXJWZWxvY2l0eSIsInNldFBvc2l0aW9uIiwiZ2V0V29ybGRUcmFuc2Zvcm0iLCJzZXRXb3JsZFRyYW5zZm9ybSIsImFwcGx5SW1wdXNlIiwiaW1wdWxzZSIsImltcHVsc2VWZWN0b3IiLCJhcHBseUNlbnRyYWxJbXB1bHNlIiwiaGFuZGxlRWxlbWVudFVwZGF0ZSIsIm9yaWdpbiIsImdldE9yaWdpbiIsImdldFJvdGF0aW9uIiwiZGlzcGF0Y2hlciIsInNlbmRCb2R5VXBkYXRlIiwiYWRkUGxheWVyIiwiY2Fwc3VsZSIsImJ0Q2Fwc3VsZVNoYXBlIiwic2V0QW5ndWxhckZhY3RvciIsImhhbmRsZVBsYXllclVwZGF0ZSIsImNhbWVyYURpcmVjdGlvbiIsIk1BWF9TUEVFRCIsIndhbGtWZWxvY2l0eSIsImdldExpbmVhclZlbG9jaXR5Iiwic3BlZWQiLCJmb3J3YXJkRGlyIiwiZ2V0QmFzaXMiLCJnZXRSb3ciLCJub3JtYWxpemUiLCJ3YWxrRGlyZWN0aW9uIiwid2Fsa1NwZWVkIiwic2V0WCIsInNldFoiLCJzZXRDZW50ZXJPZk1hc3NUcmFuc2Zvcm0iLCJDbG9jayIsInRpbWVzdGFtcCIsInRpbWUiLCJEYXRlIiwibm93IiwiZGVsdGEiLCJXb3JsZCIsImdyYXZpdHkiLCJjb2xsaXNpb25Db25maWd1cmF0aW9uIiwiYnREZWZhdWx0Q29sbGlzaW9uQ29uZmlndXJhdGlvbiIsImJ0Q29sbGlzaW9uRGlzcGF0Y2hlciIsImJyb2FkcGhhc2UiLCJidERidnRCcm9hZHBoYXNlIiwic29sdmVyIiwiYnRTZXF1ZW50aWFsSW1wdWxzZUNvbnN0cmFpbnRTb2x2ZXIiLCJkeW5hbWljc1dvcmxkIiwiYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQiLCJzZXRHcmF2aXR5IiwiZ2V0QnJvYWRwaGFzZSIsImdldE92ZXJsYXBwaW5nUGFpckNhY2hlIiwic2V0SW50ZXJuYWxHaG9zdFBhaXJDYWxsYmFjayIsImJ0R2hvc3RQYWlyQ2FsbGJhY2siLCJpbml0aWFsaXNlZCIsImhhc0VsZW1lbnQiLCJlbGVtZW50cyIsImRlbGV0ZWQiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwiZm9yRWFjaCIsImluY2x1ZGVzIiwiYWN0aW9uIiwiYWRkQWN0aW9uIiwiY29sbGlzaW9uT2JqZWN0IiwiYWRkQ29sbGlzaW9uT2JqZWN0Iiwic3RlcFNpbXVsYXRpb24iLCJjbG9jayIsImdldERlbHRhIiwiZWxlbWVudCIsImhhbmRsZVZlaGljbGVVcGRhdGUiLCJjYWxjdWxhdGVDb2xsaXNpb25zIiwicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwic2VuZFBoeXNpY3NVcGRhdGUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInNpbXVsYXRlIiwiYmluZCIsImFtbW9EaXNwYXRjaGVyIiwiZ2V0RGlzcGF0Y2hlciIsIm51bU1hbmlmb2xkcyIsImdldE51bU1hbmlmb2xkcyIsImNvbnRhY3RNYW5pZm9sZCIsImdldE1hbmlmb2xkQnlJbmRleEludGVybmFsIiwicmIwIiwiY2FzdE9iamVjdCIsImdldEJvZHkwIiwicmIxIiwiZ2V0Qm9keTEiLCJudW1Db250YWN0cyIsImdldE51bUNvbnRhY3RzIiwiY29udGFjdHMiLCJjb250YWN0UG9pbnQiLCJnZXRDb250YWN0UG9pbnQiLCJkaXN0YW5jZSIsImdldERpc3RhbmNlIiwidmVsb2NpdHkwIiwidmVsb2NpdHkxIiwid29ybGRQb3MwIiwiZ2V0X21fcG9zaXRpb25Xb3JsZE9uQSIsIndvcmxkUG9zMSIsImdldF9tX3Bvc2l0aW9uV29ybGRPbkIiLCJsb2NhbFBvczAiLCJnZXRfbV9sb2NhbFBvaW50QSIsImxvY2FsUG9zMSIsImdldF9tX2xvY2FsUG9pbnRCIiwicHVzaCIsIndvcmxkUG9zIiwibG9jYWxQb3MiLCJzZW5kRGlzcGF0Y2hFdmVudCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwic2VuZFRlcm1pbmF0ZUV2ZW50IiwidW5kZWZpbmVkIiwicmVtb3ZlUmlnaWRCb2R5IiwicmVtb3ZlRWxlbWVudCIsInNlbmRFbGVtZW50RGlzcG9zZWQiLCJERUZBVUxUX1JPTExfSU5GTFVFTkNFIiwiREVGQVVMVF9GUklDVElPTiIsIkRFRkFVTFRfTUFTUyIsImFkZFZlaGljbGUiLCJ3aGVlbHMiLCJyb2xsSW5mbHVlbmNlIiwid2hlZWxzT3B0aW9ucyIsInN1c3BlbnNpb25zIiwiYmFjayIsImZyb250IiwiYXhpc1Bvc2l0aW9uIiwiYXhpc1Bvc2l0aW9uQmFjayIsIndoZWVsUmFkaXVzQmFjayIsImhhbGZUcmFjayIsIndoZWVsSGFsZlRyYWNrQmFjayIsImF4aXNIZWlnaHQiLCJ3aGVlbEF4aXNIZWlnaHRCYWNrIiwiYXhpc1Bvc2l0aW9uRnJvbnQiLCJ3aGVlbFJhZGl1c0Zyb250Iiwid2hlZWxIYWxmVHJhY2tGcm9udCIsIndoZWVsQXhpc0hlaWdodEZyb250Iiwic3RpZmZuZXNzIiwiY29tcHJlc3Npb24iLCJyZXN0TGVuZ3RoIiwiY2hhc3NpcyIsInR1bmluZyIsImJ0VmVoaWNsZVR1bmluZyIsInJheUNhc3RlciIsImJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIiLCJnZXREeW5hbWljc1dvcmxkIiwidmVoaWNsZSIsImJ0UmF5Y2FzdFZlaGljbGUiLCJzZXRDb29yZGluYXRlU3lzdGVtIiwid2hlZWxEaXJlY3Rpb25DUzAiLCJ3aGVlbEF4bGVDUyIsImFkZFdoZWVsIiwiaXNGcm9udCIsInBvcyIsIndoZWVsSW5mbyIsInNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3MiLCJzZXRfbV93aGVlbHNEYW1waW5nUmVsYXhhdGlvbiIsInNldF9tX3doZWVsc0RhbXBpbmdDb21wcmVzc2lvbiIsInNldF9tX2ZyaWN0aW9uU2xpcCIsInNldF9tX3JvbGxJbmZsdWVuY2UiLCJzZXRWZWhpY2xlUG9zaXRpb24iLCJnZXRSaWdpZEJvZHkiLCJzZXRWZWhpY2xlUXVhdGVybmlvbiIsInJlc2V0VmVoaWNsZSIsImJyZWFraW5nRm9yY2UiLCJlbmdpbmVGb3JjZSIsInN0ZWVyaW5nQ2xhbXAiLCJzdGVlcmluZ0luY3JlbWVudCIsIm1heEVuZ2luZUZvcmNlIiwibWF4QnJlYWtpbmdGb3JjZSIsImJyYWtpbmciLCJhcHBseUVuZ2luZUZvcmNlIiwic2V0QnJha2UiLCJzZXRTdGVlcmluZ1ZhbHVlIiwidG0iLCJwIiwicSIsIm4iLCJnZXROdW1XaGVlbHMiLCJ1cGRhdGVXaGVlbFRyYW5zZm9ybSIsImdldFdoZWVsVHJhbnNmb3JtV1MiLCJ3aGVlbFVVSUQiLCJnZXRDaGFzc2lzV29ybGRUcmFuc2Zvcm0iLCJnZXRGb3J3YXJkVmVjdG9yIiwiZ2V0Q3VycmVudFNwZWVkS21Ib3VyIiwidXBkYXRlQm9keVN0YXRlIiwiY3JlYXRlR2hvc3RDb2xsaWRlciIsImdob3N0Q29sbGlkZXIiLCJidEdob3N0T2JqZWN0Iiwic2V0Q29sbGlzaW9uU2hhcGUiLCJmb3JFYWNoR2hvc3RDb2xsaXNpb24iLCJmb3JFYWNoQ2FsbGJhY2siLCJjb2xsaXNpb25zIiwiZ2V0TnVtT3ZlcmxhcHBpbmdPYmplY3RzIiwib2JqZWN0IiwiZ2V0T3ZlcmxhcHBpbmdPYmplY3QiLCJnZXRFeHBsb3Npb25Qb3NpdGlvbiIsImV4cGxvc2lvblBvc2l0aW9uIiwiZ2V0RXhwbG9zaW9uSW1wdWxzZSIsInN0cmVuZ3RoIiwib3Bfc3ViIiwib3BfbXVsIiwic2V0WSIsImNyZWF0ZUV4cGxvc2lvbiIsIm9iamVjdFRyYW5zZm9ybSIsImFjdGl2YXRlIiwicmVtb3ZlQ29sbGlzaW9uT2JqZWN0IiwiZSIsImNvbnNvbGUiLCJsb2ciLCJoYW5kbGVMb2FkRXZlbnQiLCJzZWxmIiwib25tZXNzYWdlIiwiZGlzcG9zZUJvZHkiLCJ0ZXJtaW5hdGUiLCJpbml0Iiwic2VuZFJlYWR5RXZlbnQiLCJsb2FkQW1tbyIsInNjcmlwdFVybCIsImhvc3QiLCJwYXRoIiwiaW1wb3J0U2NyaXB0cyIsInRoZW4iXSwibWFwcGluZ3MiOiI7OztJQUFPLElBQU1BLFlBQVksR0FBRyxTQUFyQjtJQUVBLElBQU1DLEtBQUssR0FBRztJQUNqQkMsRUFBQUEsR0FBRyxFQUFFLEtBRFk7SUFFakJDLEVBQUFBLE1BQU0sRUFBRSxRQUZTO0lBR2pCQyxFQUFBQSxPQUFPLEVBQUUsU0FIUTtJQUlqQkMsRUFBQUEsSUFBSSxFQUFFLE1BSlc7SUFLakJDLEVBQUFBLE1BQU0sRUFBRTtJQUxTLENBQWQ7SUFlQSxJQUFNQyxxQkFBcUIsR0FBRztJQUNqQ0MsRUFBQUEsZUFBZSxFQUFFLENBRGdCO0lBRWpDQyxFQUFBQSxZQUFZLEVBQUUsS0FGbUI7SUFHakNDLEVBQUFBLFFBQVEsRUFBRSxLQUh1QjtJQUlqQ0MsRUFBQUEsS0FBSyxFQUFFLEtBSjBCO0lBS2pDQyxFQUFBQSxJQUFJLEVBQUU7SUFMMkIsQ0FBOUI7SUFRQSxJQUFNQyx1QkFBdUIsR0FBRztJQUNuQ0MsRUFBQUEsUUFBUSxFQUFFO0lBQUVDLElBQUFBLENBQUMsRUFBRSxDQUFMO0lBQVFDLElBQUFBLENBQUMsRUFBRSxDQUFYO0lBQWNDLElBQUFBLENBQUMsRUFBRTtJQUFqQixHQUR5QjtJQUVuQ0MsRUFBQUEsUUFBUSxFQUFFO0lBQ05DLElBQUFBLE9BQU8sRUFBRSxLQURIO0lBRU5DLElBQUFBLFNBQVMsRUFBRSxLQUZMO0lBR05SLElBQUFBLElBQUksRUFBRSxLQUhB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', false);
57548
+ }var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIEFQUExZOiB7CiAgICAgICAgICBJTVBVTFNFOiAncGh5c2ljczplbGVtZW50OmFwcGx5OmltcHVsc2UnCiAgICAgICAgfQogICAgICB9LAogICAgICBWRUhJQ0xFOiB7CiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cXVhdGVybmlvbicKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczp2ZWhpY2xlOnJlc2V0JywKICAgICAgICBTUEVFRDogJ3BoeXNpY3M6dmVoaWNsZTpzcGVlZCcsCiAgICAgICAgRElSRUNUSU9OOiAncGh5c2ljczp2ZWhpY2xlOmRpcmVjdGlvbicKICAgICAgfSwKICAgICAgRUZGRUNUUzogewogICAgICAgIEVYUExPU0lPTjogJ3BoeXNpY3M6ZWZmZWN0czpleHBsb3Npb24nCiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7CiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsKCiAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7CiAgICAgICAgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsKICAgICAgICB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGtleXM7CiAgICB9CgogICAgZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307CiAgICAgICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICB9KTsKICAgICAgcmV0dXJuIENvbnN0cnVjdG9yOwogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGtleSBpbiBvYmopIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIG9ialtrZXldID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgdmFyIERpc3BhdGNoZXIgPSBmdW5jdGlvbiBEaXNwYXRjaGVyKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGlzcGF0Y2hlcik7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRQaHlzaWNzVXBkYXRlIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5VUERBVEUsCiAgICAgICAgICBkdDogZHQKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRSZWFkeUV2ZW50IiwgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuUkVBRFkKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRUZXJtaW5hdGVFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURQogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic2VuZEJvZHlVcGRhdGUiLCBmdW5jdGlvbiAodXVpZCwgcG9zaXRpb24sIHJvdGF0aW9uLCBkdCwgZXh0cmFEYXRhKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlVQREFURSwKICAgICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgICBwb3NpdGlvbjogewogICAgICAgICAgICB4OiBwb3NpdGlvbi54KCksCiAgICAgICAgICAgIHk6IHBvc2l0aW9uLnkoKSwKICAgICAgICAgICAgejogcG9zaXRpb24ueigpCiAgICAgICAgICB9LAogICAgICAgICAgcXVhdGVybmlvbjogewogICAgICAgICAgICB4OiByb3RhdGlvbi54KCksCiAgICAgICAgICAgIHk6IHJvdGF0aW9uLnkoKSwKICAgICAgICAgICAgejogcm90YXRpb24ueigpLAogICAgICAgICAgICB3OiByb3RhdGlvbi53KCkKICAgICAgICAgIH0KICAgICAgICB9LCBleHRyYURhdGEpLCB7fSwgewogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSkpOwogICAgICB9KTsKCiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic2VuZERpc3BhdGNoRXZlbnQiLCBmdW5jdGlvbiAodXVpZCwgZXZlbnROYW1lLCBldmVudERhdGEpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLkRJU1BBVENILAogICAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAogICAgICAgICAgZXZlbnREYXRhOiBldmVudERhdGEKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGRpc3BhdGNoZXIkMSA9IG5ldyBEaXNwYXRjaGVyKCk7CgogICAgdmFyIGFwcGx5TWF0cml4NFRvVmVjdG9yMyA9IGZ1bmN0aW9uIGFwcGx5TWF0cml4NFRvVmVjdG9yMyhfcmVmKSB7CiAgICAgIHZhciBfcmVmJHggPSBfcmVmLngsCiAgICAgICAgICB4ID0gX3JlZiR4ID09PSB2b2lkIDAgPyAwIDogX3JlZiR4LAogICAgICAgICAgX3JlZiR5ID0gX3JlZi55LAogICAgICAgICAgeSA9IF9yZWYkeSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkeSwKICAgICAgICAgIF9yZWYkeiA9IF9yZWYueiwKICAgICAgICAgIHogPSBfcmVmJHogPT09IHZvaWQgMCA/IDAgOiBfcmVmJHo7CiAgICAgIHZhciBtYXRyaXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdOwogICAgICB2YXIgdyA9IDEgLyAobWF0cml4WzNdICogeCArIG1hdHJpeFs3XSAqIHkgKyBtYXRyaXhbMTFdICogeiArIG1hdHJpeFsxNV0pOwogICAgICByZXR1cm4gewogICAgICAgIHg6IChtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzRdICogeSArIG1hdHJpeFs4XSAqIHogKyBtYXRyaXhbMTJdKSAqIHcsCiAgICAgICAgeTogKG1hdHJpeFsxXSAqIHggKyBtYXRyaXhbNV0gKiB5ICsgbWF0cml4WzldICogeiArIG1hdHJpeFsxM10pICogdywKICAgICAgICB6OiAobWF0cml4WzJdICogeCArIG1hdHJpeFs2XSAqIHkgKyBtYXRyaXhbMTBdICogeiArIG1hdHJpeFsxNF0pICogdwogICAgICB9OwogICAgfTsKCiAgICB2YXIgY3JlYXRlUmlnaWRCb2R5ID0gZnVuY3Rpb24gY3JlYXRlUmlnaWRCb2R5KHNoYXBlLCBvcHRpb25zKSB7CiAgICAgIHZhciB1dWlkID0gb3B0aW9ucy51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IG9wdGlvbnMucXVhdGVybmlvbiwKICAgICAgICAgIG1hc3MgPSBvcHRpb25zLm1hc3MsCiAgICAgICAgICBmcmljdGlvbiA9IG9wdGlvbnMuZnJpY3Rpb24sCiAgICAgICAgICBfb3B0aW9ucyRyZXN0aXR1dGlvbiA9IG9wdGlvbnMucmVzdGl0dXRpb24sCiAgICAgICAgICByZXN0aXR1dGlvbiA9IF9vcHRpb25zJHJlc3RpdHV0aW9uID09PSB2b2lkIDAgPyAuOSA6IF9vcHRpb25zJHJlc3RpdHV0aW9uLAogICAgICAgICAgX29wdGlvbnMkZGFtcGluZyA9IG9wdGlvbnMuZGFtcGluZywKICAgICAgICAgIGRhbXBpbmcgPSBfb3B0aW9ucyRkYW1waW5nID09PSB2b2lkIDAgPyB7CiAgICAgICAgbGluZWFyOiAwLjIsCiAgICAgICAgYW5ndWxhcjogMC4yCiAgICAgIH0gOiBfb3B0aW9ucyRkYW1waW5nOwogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTsKICAgICAgdmFyIGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTsKICAgICAgc2hhcGUuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciByYkluZm8gPSBuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIHNoYXBlLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgYm9keSA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5KHJiSW5mbyk7CgogICAgICBpZiAobWFzcyA+IDApIHsKICAgICAgICBib2R5LnNldEZyaWN0aW9uKGZyaWN0aW9uKTsKICAgICAgICBib2R5LnNldFJlc3RpdHV0aW9uKHJlc3RpdHV0aW9uKTsKICAgICAgICBib2R5LnNldERhbXBpbmcoZGFtcGluZy5saW5lYXIsIGRhbXBpbmcuYW5ndWxhcik7CiAgICAgICAgYm9keS5zZXRBY3RpdmF0aW9uU3RhdGUoRElTQUJMRV9ERUFDVElWQVRJT04pOwogICAgICB9IC8vIHN0b3JpbmcgdXVpZCBmb3IgZnV0dXJlIHJlZmVyZW5jZQoKCiAgICAgIGJvZHkudXVpZCA9IHV1aWQ7CiAgICAgIHdvcmxkLmFkZFJpZ2lkQm9keShib2R5KTsKICAgICAgcmV0dXJuIGJvZHk7CiAgICB9OwogICAgdmFyIGFkZE1vZGVsID0gZnVuY3Rpb24gYWRkTW9kZWwob3B0aW9ucykgewogICAgICB2YXIgdXVpZCA9IG9wdGlvbnMudXVpZCwKICAgICAgICAgIHZlcnRpY2VzID0gb3B0aW9ucy52ZXJ0aWNlcywKICAgICAgICAgIG1hdHJpY2VzID0gb3B0aW9ucy5tYXRyaWNlcywKICAgICAgICAgIGluZGV4ZXMgPSBvcHRpb25zLmluZGV4ZXMsCiAgICAgICAgICBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gb3B0aW9ucy5xdWF0ZXJuaW9uLAogICAgICAgICAgX29wdGlvbnMkbWFzcyA9IG9wdGlvbnMubWFzcywKICAgICAgICAgIG1hc3MgPSBfb3B0aW9ucyRtYXNzID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkbWFzcywKICAgICAgICAgIF9vcHRpb25zJGZyaWN0aW9uID0gb3B0aW9ucy5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX29wdGlvbnMkZnJpY3Rpb24gPT09IHZvaWQgMCA/IDIgOiBfb3B0aW9ucyRmcmljdGlvbjsKICAgICAgdmFyIHNjYWxlID0gREVGQVVMVF9TQ0FMRTsKICAgICAgdmFyIGJ0YSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgYnRiID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciBidGMgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIHRyaU1lc2ggPSBuZXcgQW1tby5idFRyaWFuZ2xlTWVzaCh0cnVlLCBmYWxzZSk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNvbXBvbmVudHMgPSB2ZXJ0aWNlc1tpXTsKICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2ldID8gaW5kZXhlc1tpXSA6IG51bGw7CiAgICAgICAgdmFyIG1hdHJpeCA9IEFycmF5LmZyb20obWF0cmljZXNbaV0pOwoKICAgICAgICBpZiAoaW5kZXgpIHsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW5kZXgubGVuZ3RoOyBqICs9IDMpIHsKICAgICAgICAgICAgdmFyIGFpID0gaW5kZXhbal0gKiAzOwogICAgICAgICAgICB2YXIgYmkgPSBpbmRleFtqICsgMV0gKiAzOwogICAgICAgICAgICB2YXIgY2kgPSBpbmRleFtqICsgMl0gKiAzOwogICAgICAgICAgICB2YXIgdmEgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbYWldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbYWkgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2FpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgdmFyIHZiID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2JpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2JpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tiaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIHZhciB2YyA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tjaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tjaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbY2kgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICBidGEuc2V0VmFsdWUodmEueCwgdmEueSwgdmEueik7CiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZSh2Yi54LCB2Yi55LCB2Yi56KTsKICAgICAgICAgICAgYnRjLnNldFZhbHVlKHZjLngsIHZjLnksIHZjLnopOwogICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IGNvbXBvbmVudHMubGVuZ3RoOyBfaiArPSA5KSB7CiAgICAgICAgICAgIHZhciBfdmEgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyAwXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICB2YXIgX3ZiID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgM10sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDRdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyA1XQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgdmFyIF92YyA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDZdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyA3XSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgOF0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIGJ0YS5zZXRWYWx1ZShfdmEueCwgX3ZhLnksIF92YS56KTsKICAgICAgICAgICAgYnRiLnNldFZhbHVlKF92Yi54LCBfdmIueSwgX3ZiLnopOwogICAgICAgICAgICBidGMuc2V0VmFsdWUoX3ZjLngsIF92Yy55LCBfdmMueik7CiAgICAgICAgICAgIHRyaU1lc2guYWRkVHJpYW5nbGUoYnRhLCBidGIsIGJ0YywgZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGxvY2FsU2NhbGUgPSBuZXcgQW1tby5idFZlY3RvcjMoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueik7CiAgICAgIHRyaU1lc2guc2V0U2NhbGluZyhsb2NhbFNjYWxlKTsKICAgICAgQW1tby5kZXN0cm95KGxvY2FsU2NhbGUpOwogICAgICB2YXIgY29sbGlzaW9uU2hhcGUgPSBuZXcgQW1tby5idEJ2aFRyaWFuZ2xlTWVzaFNoYXBlKHRyaU1lc2gsIHRydWUsIHRydWUpOwogICAgICBjb2xsaXNpb25TaGFwZS5yZXNvdXJjZXMgPSBbdHJpTWVzaF07CiAgICAgIEFtbW8uZGVzdHJveShidGEpOwogICAgICBBbW1vLmRlc3Ryb3koYnRiKTsKICAgICAgQW1tby5kZXN0cm95KGJ0Yyk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGNvbGxpc2lvblNoYXBlLCB7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgcXVhdGVybmlvbjogcXVhdGVybmlvbiwKICAgICAgICBtYXNzOiBtYXNzLAogICAgICAgIGZyaWN0aW9uOiBmcmljdGlvbgogICAgICB9KTsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLk1FU0gsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBhZGRCb3ggPSBmdW5jdGlvbiBhZGRCb3goZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdpZHRoID0gZGF0YS53aWR0aCwKICAgICAgICAgIGxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgX2RhdGEkbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzID09PSB2b2lkIDAgPyAwIDogX2RhdGEkbWFzcywKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24gPT09IHZvaWQgMCA/IDIgOiBfZGF0YSRmcmljdGlvbjsKICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAwLjUsIGhlaWdodCAqIDAuNSwgbGVuZ3RoICogMC41KSk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGdlb21ldHJ5LCB7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgcXVhdGVybmlvbjogcXVhdGVybmlvbiwKICAgICAgICBtYXNzOiBtYXNzLAogICAgICAgIGZyaWN0aW9uOiBmcmljdGlvbgogICAgICB9KTsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLkJPWCwKICAgICAgICBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGFkZFNwaGVyZSA9IGZ1bmN0aW9uIGFkZFNwaGVyZShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcmFkaXVzID0gZGF0YS5yYWRpdXMsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgX2RhdGEkbWFzczIgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzczIgPT09IHZvaWQgMCA/IDAgOiBfZGF0YSRtYXNzMiwKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uMiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uMiA9PT0gdm9pZCAwID8gMiA6IF9kYXRhJGZyaWN0aW9uMjsKICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5TUEhFUkUsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBzZXRMaW5lYXJWZWxvY2l0eSA9IGZ1bmN0aW9uIHNldExpbmVhclZlbG9jaXR5KGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBfZGF0YSR2ZWxvY2l0eSA9IGRhdGEudmVsb2NpdHksCiAgICAgICAgICB2ZWxvY2l0eSA9IF9kYXRhJHZlbG9jaXR5ID09PSB2b2lkIDAgPyBERUZBVUxUX0xJTkVBUl9WRUxPQ0lUWSA6IF9kYXRhJHZlbG9jaXR5OwoKICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgIGJvZHkgPSBfd29ybGQkZ2V0RWxlbWVudC5ib2R5OwoKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIGxpbmVhclZlbG9jaXR5ID0gbmV3IEFtbW8uYnRWZWN0b3IzKHZlbG9jaXR5LngsIHZlbG9jaXR5LnksIHZlbG9jaXR5LnopOwogICAgICAgIGJvZHkuc2V0TGluZWFyVmVsb2NpdHkobGluZWFyVmVsb2NpdHkpOwogICAgICAgIEFtbW8uZGVzdHJveShsaW5lYXJWZWxvY2l0eSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgc2V0UG9zaXRpb24gPSBmdW5jdGlvbiBzZXRQb3NpdGlvbihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uOwoKICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50MiA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQyLmJvZHk7CgogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgIH07CiAgICB2YXIgYXBwbHlJbXB1c2UgPSBmdW5jdGlvbiBhcHBseUltcHVzZShfcmVmKSB7CiAgICAgIHZhciB1dWlkID0gX3JlZi51dWlkLAogICAgICAgICAgX3JlZiRpbXB1bHNlID0gX3JlZi5pbXB1bHNlLAogICAgICAgICAgaW1wdWxzZSA9IF9yZWYkaW1wdWxzZSA9PT0gdm9pZCAwID8gREVGQVVMVF9JTVBVTFNFIDogX3JlZiRpbXB1bHNlOwoKICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50MyA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQzLmJvZHk7CgogICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CgogICAgICBpZiAobW90aW9uU3RhdGUpIHsKICAgICAgICB2YXIgaW1wdWxzZVZlY3RvciA9IG5ldyBBbW1vLmJ0VmVjdG9yMyhpbXB1bHNlLngsIGltcHVsc2UueSwgaW1wdWxzZS56KTsKICAgICAgICBib2R5LmFwcGx5Q2VudHJhbEltcHVsc2UoaW1wdWxzZVZlY3Rvcik7CiAgICAgICAgQW1tby5kZXN0cm95KGltcHVsc2VWZWN0b3IpOwogICAgICB9CiAgICB9OwogICAgdmFyIGhhbmRsZUVsZW1lbnRVcGRhdGUgPSBmdW5jdGlvbiBoYW5kbGVFbGVtZW50VXBkYXRlKF9yZWYyLCBkdCkgewogICAgICB2YXIgYm9keSA9IF9yZWYyLmJvZHksCiAgICAgICAgICB1dWlkID0gX3JlZjIudXVpZCwKICAgICAgICAgIF9yZWYyJHN0YXRlID0gX3JlZjIuc3RhdGU7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKCiAgICAgIGlmIChtb3Rpb25TdGF0ZSkgewogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdmFyIG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICB2YXIgcm90YXRpb24gPSB0cmFuc2Zvcm0uZ2V0Um90YXRpb24oKTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZEJvZHlVcGRhdGUodXVpZCwgb3JpZ2luLCByb3RhdGlvbiwgZHQpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwoKICAgIHZhciBhZGRQbGF5ZXIgPSBmdW5jdGlvbiBhZGRQbGF5ZXIoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdpZHRoID0gZGF0YS53aWR0aCwKICAgICAgICAgIGhlaWdodCA9IGRhdGEuaGVpZ2h0LAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb247CiAgICAgIHZhciBjYXBzdWxlID0gbmV3IEFtbW8uYnRDYXBzdWxlU2hhcGUod2lkdGgsIGhlaWdodCk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGNhcHN1bGUsIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOyAvLyBkaXNhYmxpaW5nIHJvdGF0aW9uIGZvciBjb2xsaXNpb25zCgogICAgICBib2R5LnNldEFuZ3VsYXJGYWN0b3IoMCk7CiAgICAgIHdvcmxkLmFkZFJpZ2lkQm9keShib2R5KTsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLlBMQVlFUiwKICAgICAgICBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGhhbmRsZVBsYXllclVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVBsYXllclVwZGF0ZShfcmVmLCBkdCkgewogICAgICB2YXIgYm9keSA9IF9yZWYuYm9keSwKICAgICAgICAgIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBfcmVmJHN0YXRlID0gX3JlZi5zdGF0ZSwKICAgICAgICAgIHN0YXRlID0gX3JlZiRzdGF0ZSA9PT0gdm9pZCAwID8gREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgOiBfcmVmJHN0YXRlOwogICAgICB2YXIgbW92ZW1lbnQgPSBzdGF0ZS5tb3ZlbWVudCwKICAgICAgICAgIGRpcmVjdGlvbiA9IHN0YXRlLmRpcmVjdGlvbiwKICAgICAgICAgIGNhbWVyYURpcmVjdGlvbiA9IHN0YXRlLmNhbWVyYURpcmVjdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBzdGF0ZS5xdWF0ZXJuaW9uLAogICAgICAgICAgcG9zaXRpb24gPSBzdGF0ZS5wb3NpdGlvbjsKICAgICAgdmFyIE1BWF9TUEVFRCA9IDE7CiAgICAgIHZhciB3YWxrVmVsb2NpdHkgPSAuMTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgbGluZWFyVmVsb2NpdHkgPSBib2R5LmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgdmFyIHNwZWVkID0gbGluZWFyVmVsb2NpdHkubGVuZ3RoKCk7CiAgICAgICAgdmFyIGZvcndhcmREaXIgPSB0cmFuc2Zvcm0uZ2V0QmFzaXMoKS5nZXRSb3coMik7CiAgICAgICAgZm9yd2FyZERpci5ub3JtYWxpemUoKTsKICAgICAgICB2YXIgd2Fsa0RpcmVjdGlvbiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLjAsIDAuMCwgMC4wKTsKICAgICAgICB2YXIgd2Fsa1NwZWVkID0gd2Fsa1ZlbG9jaXR5ICogZHQ7CgogICAgICAgIGlmIChtb3ZlbWVudC5mb3J3YXJkKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgKyBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSArIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgKyBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgLSBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSAtIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgLSBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW1vdmVtZW50LmZvcndhcmQgJiYgIW1vdmVtZW50LmJhY2t3YXJkcykgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKiAwLjIpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKiAwLjIpOwogICAgICAgIH0gZWxzZSBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHsKICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFgobGluZWFyVmVsb2NpdHkueCgpICsgY2FtZXJhRGlyZWN0aW9uLnggKiB3YWxrU3BlZWQpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKyBjYW1lcmFEaXJlY3Rpb24ueiAqIHdhbGtTcGVlZCk7CiAgICAgICAgfQoKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBib2R5LmdldE1vdGlvblN0YXRlKCkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBib2R5LnNldENlbnRlck9mTWFzc1RyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgICAgdmFyIHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIENsb2NrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gQ2xvY2soKSB7CiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsb2NrKTsKCiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBudWxsOwogICAgICB9CgogICAgICBfY3JlYXRlQ2xhc3MoQ2xvY2ssIFt7CiAgICAgICAga2V5OiAiZ2V0RGVsdGEiLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWx0YSgpIHsKICAgICAgICAgIHZhciB0aW1lID0gRGF0ZS5ub3coKTsKCiAgICAgICAgICBpZiAodGhpcy50aW1lc3RhbXApIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHRoaXMudGltZXN0YW1wOwogICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWU7CiAgICAgICAgICAgIHJldHVybiBkZWx0YTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gQ2xvY2s7CiAgICB9KCk7CgogICAgdmFyIFdvcmxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gV29ybGQoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdvcmxkKTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpbml0IiwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBfb3B0aW9ucyRncmF2aXR5ID0gb3B0aW9ucy5ncmF2aXR5LAogICAgICAgICAgICAgIGdyYXZpdHkgPSBfb3B0aW9ucyRncmF2aXR5ID09PSB2b2lkIDAgPyBHUkFWSVRZIDogX29wdGlvbnMkZ3Jhdml0eTsKICAgICAgICAgIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSBuZXcgQW1tby5idERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uKCk7CiAgICAgICAgICBfdGhpcy5kaXNwYXRjaGVyID0gbmV3IEFtbW8uYnRDb2xsaXNpb25EaXNwYXRjaGVyKF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgX3RoaXMuYnJvYWRwaGFzZSA9IG5ldyBBbW1vLmJ0RGJ2dEJyb2FkcGhhc2UoKTsKICAgICAgICAgIF90aGlzLnNvbHZlciA9IG5ldyBBbW1vLmJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyKCk7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkID0gbmV3IEFtbW8uYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQoX3RoaXMuZGlzcGF0Y2hlciwgX3RoaXMuYnJvYWRwaGFzZSwgX3RoaXMuc29sdmVyLCBfdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTsKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnNldEdyYXZpdHkobmV3IEFtbW8uYnRWZWN0b3IzKGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnopKTsgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGdob3N0T2JqZWN0IGNvbGxpc2lvbnMKCgogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5nZXRCcm9hZHBoYXNlKCkuZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUoKS5zZXRJbnRlcm5hbEdob3N0UGFpckNhbGxiYWNrKG5ldyBBbW1vLmJ0R2hvc3RQYWlyQ2FsbGJhY2soKSk7CgogICAgICAgICAgX3RoaXMuaW5pdGlhbGlzZWQgPSB0cnVlOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInJlbW92ZUVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5maWx0ZXIoZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdLmRlbGV0ZWQ7CiAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImhhc0VsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5pbmNsdWRlcyh1dWlkKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJnZXRFbGVtZW50IiwgZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpc0luaXRpYWxpc2VkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmluaXRpYWxpc2VkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldER5bmFtaWNzV29ybGQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuZHluYW1pY3NXb3JsZDsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRSaWdpZEJvZHkiLCBmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiYWRkQWN0aW9uIiwgZnVuY3Rpb24gKGFjdGlvbikgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRBY3Rpb24oYWN0aW9uKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRDb2xsaXNpb25PYmplY3QiLCBmdW5jdGlvbiAoY29sbGlzaW9uT2JqZWN0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZENvbGxpc2lvbk9iamVjdChjb2xsaXNpb25PYmplY3QpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInN0ZXBTaW11bGF0aW9uIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnN0ZXBTaW11bGF0aW9uKGR0KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzaW11bGF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBkdCA9IF90aGlzLmNsb2NrLmdldERlbHRhKCk7CgogICAgICAgICAgX3RoaXMuc3RlcFNpbXVsYXRpb24oZHQpOwoKICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuQk9YOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5TUEhFUkU6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLk1FU0g6CiAgICAgICAgICAgICAgICAgIGhhbmRsZUVsZW1lbnRVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlBMQVlFUjoKICAgICAgICAgICAgICAgICAgaGFuZGxlUGxheWVyVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5WRUhJQ0xFOgogICAgICAgICAgICAgICAgICBoYW5kbGVWZWhpY2xlVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBfdGhpcy5jYWxjdWxhdGVDb2xsaXNpb25zKCk7CgogICAgICAgICAgX3RoaXMucmVtb3ZlRGVsZXRlZEVsZW1lbnRzKCk7CgogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRQaHlzaWNzVXBkYXRlKGR0KTsKICAgICAgICAgIF90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnNpbXVsYXRlLmJpbmQoX3RoaXMpKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJjYWxjdWxhdGVDb2xsaXNpb25zIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGFtbW9EaXNwYXRjaGVyID0gX3RoaXMuZHluYW1pY3NXb3JsZC5nZXREaXNwYXRjaGVyKCk7CgogICAgICAgICAgdmFyIG51bU1hbmlmb2xkcyA9IGFtbW9EaXNwYXRjaGVyLmdldE51bU1hbmlmb2xkcygpOwoKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTWFuaWZvbGRzOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNvbnRhY3RNYW5pZm9sZCA9IGFtbW9EaXNwYXRjaGVyLmdldE1hbmlmb2xkQnlJbmRleEludGVybmFsKGkpOwogICAgICAgICAgICB2YXIgcmIwID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MCgpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICAgICAgdmFyIHJiMSA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTEoKSwgQW1tby5idFJpZ2lkQm9keSk7CiAgICAgICAgICAgIHZhciBudW1Db250YWN0cyA9IGNvbnRhY3RNYW5pZm9sZC5nZXROdW1Db250YWN0cygpOyAvLyB0aGlzIGl0ZXJhdGlvbiBkb2Vzbid0IGhhdmUgdXVpZHMKCiAgICAgICAgICAgIGlmICghcmIwLnV1aWQgfHwgIXJiMS51dWlkKSBjb250aW51ZTsKICAgICAgICAgICAgdmFyIGNvbnRhY3RzID0gW107CgogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bUNvbnRhY3RzOyBqKyspIHsKICAgICAgICAgICAgICB2YXIgY29udGFjdFBvaW50ID0gY29udGFjdE1hbmlmb2xkLmdldENvbnRhY3RQb2ludChqKTsKICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBjb250YWN0UG9pbnQuZ2V0RGlzdGFuY2UoKTsKICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiAwLjApIGNvbnRpbnVlOwogICAgICAgICAgICAgIHZhciB2ZWxvY2l0eTAgPSByYjAuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICAgICAgICB2YXIgdmVsb2NpdHkxID0gcmIxLmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25BKCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25CKCk7CiAgICAgICAgICAgICAgdmFyIGxvY2FsUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QSgpOwogICAgICAgICAgICAgIHZhciBsb2NhbFBvczEgPSBjb250YWN0UG9pbnQuZ2V0X21fbG9jYWxQb2ludEIoKTsKICAgICAgICAgICAgICBjb250YWN0cy5wdXNoKHsKICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZSwKICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbewogICAgICAgICAgICAgICAgICB1dWlkOiByYjAudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MC55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkwLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczAueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMC56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICB1dWlkOiByYjEudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MS55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkxLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczEueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMS56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMC51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMS51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRFbGVtZW50IiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgIF90aGlzLmVsZW1lbnRzW2RhdGEudXVpZF0gPSBkYXRhOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInVwZGF0ZUJvZHlTdGF0ZSIsIGZ1bmN0aW9uIChfcmVmKSB7CiAgICAgICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgICAgICBzdGF0ZSA9IF9yZWYuc3RhdGU7CgogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUpLCBzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAidGVybWluYXRlIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmR5bmFtaWNzV29ybGQpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLnNvbHZlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuZGlzcGF0Y2hlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7CiAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShfdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7CiAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFRlcm1pbmF0ZUV2ZW50KCk7CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMuZWxlbWVudHMgPSB7fTsKICAgICAgICB0aGlzLmluaXRpYWxpc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmJyb2FkcGhhc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5zb2x2ZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSBudWxsOwogICAgICAgIHRoaXMuY2xvY2sgPSBuZXcgQ2xvY2soKTsKICAgICAgfQoKICAgICAgX2NyZWF0ZUNsYXNzKFdvcmxkLCBbewogICAgICAgIGtleTogImRpc3Bvc2VCb2R5IiwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZUJvZHkoX3JlZjIpIHsKICAgICAgICAgIHZhciB1dWlkID0gX3JlZjIudXVpZDsKICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHV1aWQpOwogICAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnJlbW92ZVJpZ2lkQm9keShlbGVtZW50LmJvZHkpOwogICAgICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHV1aWQpOwogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRFbGVtZW50RGlzcG9zZWQoewogICAgICAgICAgICB1dWlkOiB1dWlkCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH1dKTsKCiAgICAgIHJldHVybiBXb3JsZDsKICAgIH0oKTsKICAgIHZhciB3b3JsZCA9IG5ldyBXb3JsZCgpOwoKICAgIHZhciBERUZBVUxUX1JPTExfSU5GTFVFTkNFID0gMC4yOwogICAgdmFyIERFRkFVTFRfRlJJQ1RJT04gPSAxMDAwOwogICAgdmFyIERFRkFVTFRfTUFTUyA9IDgwMDsKICAgIHZhciBhZGRWZWhpY2xlID0gZnVuY3Rpb24gYWRkVmVoaWNsZShkYXRhKSB7CiAgICAgIHZhciBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdoZWVscyA9IGRhdGEud2hlZWxzLAogICAgICAgICAgX2RhdGEkbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzID09PSB2b2lkIDAgPyBERUZBVUxUX01BU1MgOiBfZGF0YSRtYXNzLAogICAgICAgICAgX2RhdGEkd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgd2lkdGggPSBfZGF0YSR3aWR0aCA9PT0gdm9pZCAwID8gMS44IDogX2RhdGEkd2lkdGgsCiAgICAgICAgICBfZGF0YSRoZWlnaHQgPSBkYXRhLmhlaWdodCwKICAgICAgICAgIGhlaWdodCA9IF9kYXRhJGhlaWdodCA9PT0gdm9pZCAwID8gLjYgOiBfZGF0YSRoZWlnaHQsCiAgICAgICAgICBfZGF0YSRsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGxlbmd0aCA9IF9kYXRhJGxlbmd0aCA9PT0gdm9pZCAwID8gNCA6IF9kYXRhJGxlbmd0aCwKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24gPT09IHZvaWQgMCA/IERFRkFVTFRfRlJJQ1RJT04gOiBfZGF0YSRmcmljdGlvbiwKICAgICAgICAgIF9kYXRhJHJvbGxJbmZsdWVuY2UgPSBkYXRhLnJvbGxJbmZsdWVuY2UsCiAgICAgICAgICByb2xsSW5mbHVlbmNlID0gX2RhdGEkcm9sbEluZmx1ZW5jZSA9PT0gdm9pZCAwID8gREVGQVVMVF9ST0xMX0lORkxVRU5DRSA6IF9kYXRhJHJvbGxJbmZsdWVuY2UsCiAgICAgICAgICBfZGF0YSR3aGVlbHNPcHRpb25zID0gZGF0YS53aGVlbHNPcHRpb25zLAogICAgICAgICAgd2hlZWxzT3B0aW9ucyA9IF9kYXRhJHdoZWVsc09wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkd2hlZWxzT3B0aW9ucywKICAgICAgICAgIF9kYXRhJHN1c3BlbnNpb25zID0gZGF0YS5zdXNwZW5zaW9ucywKICAgICAgICAgIHN1c3BlbnNpb25zID0gX2RhdGEkc3VzcGVuc2lvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkc3VzcGVuc2lvbnM7CiAgICAgIHZhciBfd2hlZWxzT3B0aW9ucyRiYWNrID0gd2hlZWxzT3B0aW9ucy5iYWNrLAogICAgICAgICAgYmFjayA9IF93aGVlbHNPcHRpb25zJGJhY2sgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkYmFjaywKICAgICAgICAgIF93aGVlbHNPcHRpb25zJGZyb250ID0gd2hlZWxzT3B0aW9ucy5mcm9udCwKICAgICAgICAgIGZyb250ID0gX3doZWVsc09wdGlvbnMkZnJvbnQgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkZnJvbnQ7CiAgICAgIHZhciBfYmFjayRheGlzUG9zaXRpb24gPSBiYWNrLmF4aXNQb3NpdGlvbiwKICAgICAgICAgIGF4aXNQb3NpdGlvbkJhY2sgPSBfYmFjayRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IC0xIDogX2JhY2skYXhpc1Bvc2l0aW9uLAogICAgICAgICAgX2JhY2skcmFkaXVzID0gYmFjay5yYWRpdXMsCiAgICAgICAgICB3aGVlbFJhZGl1c0JhY2sgPSBfYmFjayRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2JhY2skcmFkaXVzLAogICAgICAgICAgX2JhY2skaGFsZlRyYWNrID0gYmFjay5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0JhY2sgPSBfYmFjayRoYWxmVHJhY2sgPT09IHZvaWQgMCA/IDEgOiBfYmFjayRoYWxmVHJhY2ssCiAgICAgICAgICBfYmFjayRheGlzSGVpZ2h0ID0gYmFjay5heGlzSGVpZ2h0LAogICAgICAgICAgd2hlZWxBeGlzSGVpZ2h0QmFjayA9IF9iYWNrJGF4aXNIZWlnaHQgPT09IHZvaWQgMCA/IC4zIDogX2JhY2skYXhpc0hlaWdodDsKICAgICAgdmFyIF9mcm9udCRheGlzUG9zaXRpb24gPSBmcm9udC5heGlzUG9zaXRpb24sCiAgICAgICAgICBheGlzUG9zaXRpb25Gcm9udCA9IF9mcm9udCRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IDEuNyA6IF9mcm9udCRheGlzUG9zaXRpb24sCiAgICAgICAgICBfZnJvbnQkcmFkaXVzID0gZnJvbnQucmFkaXVzLAogICAgICAgICAgd2hlZWxSYWRpdXNGcm9udCA9IF9mcm9udCRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2Zyb250JHJhZGl1cywKICAgICAgICAgIF9mcm9udCRoYWxmVHJhY2sgPSBmcm9udC5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0Zyb250ID0gX2Zyb250JGhhbGZUcmFjayA9PT0gdm9pZCAwID8gMSA6IF9mcm9udCRoYWxmVHJhY2ssCiAgICAgICAgICBfZnJvbnQkYXhpc0hlaWdodCA9IGZyb250LmF4aXNIZWlnaHQsCiAgICAgICAgICB3aGVlbEF4aXNIZWlnaHRGcm9udCA9IF9mcm9udCRheGlzSGVpZ2h0ID09PSB2b2lkIDAgPyAuMyA6IF9mcm9udCRheGlzSGVpZ2h0OwogICAgICB2YXIgX3N1c3BlbnNpb25zJHN0aWZmbmVzID0gc3VzcGVuc2lvbnMuc3RpZmZuZXNzLAogICAgICAgICAgc3RpZmZuZXNzID0gX3N1c3BlbnNpb25zJHN0aWZmbmVzID09PSB2b2lkIDAgPyAyMC4wIDogX3N1c3BlbnNpb25zJHN0aWZmbmVzLAogICAgICAgICAgX3N1c3BlbnNpb25zJGRhbXBpbmcgPSBzdXNwZW5zaW9ucy5kYW1waW5nLAogICAgICAgICAgZGFtcGluZyA9IF9zdXNwZW5zaW9ucyRkYW1waW5nID09PSB2b2lkIDAgPyAyLjMgOiBfc3VzcGVuc2lvbnMkZGFtcGluZywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRjb21wcmVzcyA9IHN1c3BlbnNpb25zLmNvbXByZXNzaW9uLAogICAgICAgICAgY29tcHJlc3Npb24gPSBfc3VzcGVuc2lvbnMkY29tcHJlc3MgPT09IHZvaWQgMCA/IDQuNCA6IF9zdXNwZW5zaW9ucyRjb21wcmVzcywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRyZXN0TGVuZyA9IHN1c3BlbnNpb25zLnJlc3RMZW5ndGgsCiAgICAgICAgICByZXN0TGVuZ3RoID0gX3N1c3BlbnNpb25zJHJlc3RMZW5nID09PSB2b2lkIDAgPyAwLjYgOiBfc3VzcGVuc2lvbnMkcmVzdExlbmc7IC8vIENoYXNzaXMKCiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogLjUsIGhlaWdodCAqIC41LCBsZW5ndGggKiAuNSkpOwogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTsKICAgICAgdmFyIGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTsKICAgICAgZ2VvbWV0cnkuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciBjaGFzc2lzID0gbmV3IEFtbW8uYnRSaWdpZEJvZHkobmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBnZW9tZXRyeSwgbG9jYWxJbmVydGlhKSk7CiAgICAgIGNoYXNzaXMuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGNoYXNzaXMpOyAvLyBSYXljYXN0IFZlaGljbGUKCiAgICAgIHZhciB0dW5pbmcgPSBuZXcgQW1tby5idFZlaGljbGVUdW5pbmcoKTsKICAgICAgdmFyIHJheUNhc3RlciA9IG5ldyBBbW1vLmJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIod29ybGQuZ2V0RHluYW1pY3NXb3JsZCgpKTsKICAgICAgdmFyIHZlaGljbGUgPSBuZXcgQW1tby5idFJheWNhc3RWZWhpY2xlKHR1bmluZywgY2hhc3NpcywgcmF5Q2FzdGVyKTsKICAgICAgdmVoaWNsZS5zZXRDb29yZGluYXRlU3lzdGVtKDAsIDEsIDIpOwogICAgICB3b3JsZC5hZGRBY3Rpb24odmVoaWNsZSk7CiAgICAgIHZhciB3aGVlbERpcmVjdGlvbkNTMCA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAtMSwgMCk7CiAgICAgIHZhciB3aGVlbEF4bGVDUyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygtMSwgMCwgMCk7CgogICAgICB2YXIgYWRkV2hlZWwgPSBmdW5jdGlvbiBhZGRXaGVlbChpc0Zyb250LCBwb3MsIHJhZGl1cykgewogICAgICAgIHZhciB3aGVlbEluZm8gPSB2ZWhpY2xlLmFkZFdoZWVsKHBvcywgd2hlZWxEaXJlY3Rpb25DUzAsIHdoZWVsQXhsZUNTLCByZXN0TGVuZ3RoLCByYWRpdXMsIHR1bmluZywgaXNGcm9udCk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3Moc3RpZmZuZXNzKTsKICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ1JlbGF4YXRpb24oZGFtcGluZyk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdDb21wcmVzc2lvbihjb21wcmVzc2lvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX2ZyaWN0aW9uU2xpcChmcmljdGlvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3JvbGxJbmZsdWVuY2Uocm9sbEluZmx1ZW5jZSk7CiAgICAgIH07CgogICAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMygtd2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tCYWNrLCB3aGVlbEF4aXNIZWlnaHRCYWNrLCBheGlzUG9zaXRpb25CYWNrKSwgd2hlZWxSYWRpdXNCYWNrKTsKICAgICAgdmVoaWNsZS51dWlkID0gdXVpZDsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdHlwZTogVFlQRVMuVkVISUNMRSwKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHZlaGljbGU6IHZlaGljbGUsCiAgICAgICAgd2hlZWxzOiB3aGVlbHMsCiAgICAgICAgb3B0aW9uczogZGF0YSwKICAgICAgICBzdGF0ZTogREVGQVVMVF9WRUhJQ0xFX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBzZXRWZWhpY2xlUG9zaXRpb24gPSBmdW5jdGlvbiBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFZlaGljbGVRdWF0ZXJuaW9uID0gZnVuY3Rpb24gc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcmVzZXRWZWhpY2xlID0gZnVuY3Rpb24gcmVzZXRWZWhpY2xlKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CiAgICAgIGNvbnNvbGUubG9nKHF1YXRlcm5pb24pOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgaGFuZGxlVmVoaWNsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVZlaGljbGVVcGRhdGUoX3JlZiwgZHQpIHsKICAgICAgdmFyIHZlaGljbGUgPSBfcmVmLnZlaGljbGUsCiAgICAgICAgICB3aGVlbHMgPSBfcmVmLndoZWVscywKICAgICAgICAgIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBfcmVmJHN0YXRlID0gX3JlZi5zdGF0ZSwKICAgICAgICAgIHN0YXRlID0gX3JlZiRzdGF0ZSA9PT0gdm9pZCAwID8gREVGQVVMVF9WRUhJQ0xFX1NUQVRFIDogX3JlZiRzdGF0ZSwKICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucywKICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zOwogICAgICB2YXIgYnJlYWtpbmdGb3JjZSA9IDA7CiAgICAgIHZhciBlbmdpbmVGb3JjZSA9IDA7CiAgICAgIHZhciBfb3B0aW9ucyRzdGVlcmluZ0NsYW0gPSBvcHRpb25zLnN0ZWVyaW5nQ2xhbXAsCiAgICAgICAgICBzdGVlcmluZ0NsYW1wID0gX29wdGlvbnMkc3RlZXJpbmdDbGFtID09PSB2b2lkIDAgPyBERUZBVUxUX1NURUVSSU5HX0NMQU1QIDogX29wdGlvbnMkc3RlZXJpbmdDbGFtLAogICAgICAgICAgX29wdGlvbnMkc3RlZXJpbmdJbmNyID0gb3B0aW9ucy5zdGVlcmluZ0luY3JlbWVudCwKICAgICAgICAgIHN0ZWVyaW5nSW5jcmVtZW50ID0gX29wdGlvbnMkc3RlZXJpbmdJbmNyID09PSB2b2lkIDAgPyBERUZBVUxUX1NURUVSSU5HX0lOQ1JFTUVOVCA6IF9vcHRpb25zJHN0ZWVyaW5nSW5jciwKICAgICAgICAgIF9vcHRpb25zJG1heEVuZ2luZUZvciA9IG9wdGlvbnMubWF4RW5naW5lRm9yY2UsCiAgICAgICAgICBtYXhFbmdpbmVGb3JjZSA9IF9vcHRpb25zJG1heEVuZ2luZUZvciA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVhfRU5HSU5FX0ZPUkNFIDogX29wdGlvbnMkbWF4RW5naW5lRm9yLAogICAgICAgICAgX29wdGlvbnMkbWF4QnJlYWtpbmdGID0gb3B0aW9ucy5tYXhCcmVha2luZ0ZvcmNlLAogICAgICAgICAgbWF4QnJlYWtpbmdGb3JjZSA9IF9vcHRpb25zJG1heEJyZWFraW5nRiA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgOiBfb3B0aW9ucyRtYXhCcmVha2luZ0Y7CgogICAgICBpZiAoc3RhdGUuYWNjZWxlcmF0aW9uKSB7CiAgICAgICAgaWYgKHNwZWVkIDwgLTEpIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO2Vsc2UgZW5naW5lRm9yY2UgPSBtYXhFbmdpbmVGb3JjZTsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLmJyYWtpbmcpIHsKICAgICAgICBpZiAoc3BlZWQgPiAxKSBicmVha2luZ0ZvcmNlID0gbWF4QnJlYWtpbmdGb3JjZTtlbHNlIGVuZ2luZUZvcmNlID0gLW1heEVuZ2luZUZvcmNlIC8gMjsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLmxlZnQpIHsKICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nIDwgc3RlZXJpbmdDbGFtcCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdGF0ZS5yaWdodCkgewogICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IC1zdGVlcmluZ0NsYW1wKSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgLT0gc3RlZXJpbmdJbmNyZW1lbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCAtc3RlZXJpbmdJbmNyZW1lbnQpIHN0YXRlLnZlaGljbGVTdGVlcmluZyArPSBzdGVlcmluZ0luY3JlbWVudDtlbHNlIHsKICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IHN0ZWVyaW5nSW5jcmVtZW50KSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgLT0gc3RlZXJpbmdJbmNyZW1lbnQ7ZWxzZSB7CiAgICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX0xFRlQpOwogICAgICB2ZWhpY2xlLmFwcGx5RW5naW5lRm9yY2UoZW5naW5lRm9yY2UsIEJBQ0tfUklHSFQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlIC8gMiwgRlJPTlRfUklHSFQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UsIEJBQ0tfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0U3RlZXJpbmdWYWx1ZShzdGF0ZS52ZWhpY2xlU3RlZXJpbmcsIEZST05UX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9SSUdIVCk7CiAgICAgIHZhciB0bSwgcCwgcSwgaTsKICAgICAgdmFyIG4gPSB2ZWhpY2xlLmdldE51bVdoZWVscygpOwoKICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHZlaGljbGUudXBkYXRlV2hlZWxUcmFuc2Zvcm0oaSwgdHJ1ZSk7CiAgICAgICAgdG0gPSB2ZWhpY2xlLmdldFdoZWVsVHJhbnNmb3JtV1MoaSk7CiAgICAgICAgcCA9IHRtLmdldE9yaWdpbigpOwogICAgICAgIHEgPSB0bS5nZXRSb3RhdGlvbigpOwogICAgICAgIHZhciB3aGVlbFVVSUQgPSB3aGVlbHNbaV07CiAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHdoZWVsVVVJRCwgcCwgcSwgZHQpOwogICAgICB9CgogICAgICB0bSA9IHZlaGljbGUuZ2V0Q2hhc3Npc1dvcmxkVHJhbnNmb3JtKCk7CiAgICAgIHAgPSB0bS5nZXRPcmlnaW4oKTsKICAgICAgcSA9IHRtLmdldFJvdGF0aW9uKCk7CiAgICAgIHZhciBkaXJlY3Rpb24gPSB2ZWhpY2xlLmdldEZvcndhcmRWZWN0b3IoKTsKICAgICAgdmFyIHNwZWVkID0gdmVoaWNsZS5nZXRDdXJyZW50U3BlZWRLbUhvdXIoKTsKICAgICAgdmFyIGV4dHJhRGF0YSA9IHsKICAgICAgICBkaXJlY3Rpb246IHsKICAgICAgICAgIHg6IGRpcmVjdGlvbi54KCksCiAgICAgICAgICB5OiBkaXJlY3Rpb24ueSgpLAogICAgICAgICAgejogZGlyZWN0aW9uLnooKQogICAgICAgIH0sCiAgICAgICAgc3BlZWQ6IHNwZWVkCiAgICAgIH07CiAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBwLCBxLCBkdCwgZXh0cmFEYXRhKTsKICAgICAgd29ybGQudXBkYXRlQm9keVN0YXRlKHV1aWQsIHN0YXRlKTsKICAgIH07CgogICAgdmFyIGNyZWF0ZUdob3N0Q29sbGlkZXIgPSBmdW5jdGlvbiBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgcG9zaXRpb24pIHsKICAgICAgdmFyIGdob3N0Q29sbGlkZXIgPSBuZXcgQW1tby5idEdob3N0T2JqZWN0KCk7CiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICBnaG9zdENvbGxpZGVyLnNldENvbGxpc2lvblNoYXBlKG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKSk7CiAgICAgIGdob3N0Q29sbGlkZXIuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4ocG9zaXRpb24pOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKDAsIDAsIDAsIDEpKTsKICAgICAgZ2hvc3RDb2xsaWRlci5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICByZXR1cm4gewogICAgICAgIGdob3N0Q29sbGlkZXI6IGdob3N0Q29sbGlkZXIsCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0KICAgICAgfTsKICAgIH07CiAgICB2YXIgZm9yRWFjaEdob3N0Q29sbGlzaW9uID0gZnVuY3Rpb24gZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIpIHsKICAgICAgdmFyIGZvckVhY2hDYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkge307CiAgICAgIHZhciBjb2xsaXNpb25zID0gZ2hvc3RDb2xsaWRlci5nZXROdW1PdmVybGFwcGluZ09iamVjdHMoKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sbGlzaW9uczsgaSsrKSB7CiAgICAgICAgdmFyIG9iamVjdCA9IEFtbW8uY2FzdE9iamVjdChnaG9zdENvbGxpZGVyLmdldE92ZXJsYXBwaW5nT2JqZWN0KGkpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBvYmplY3QuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBmb3JFYWNoQ2FsbGJhY2sob2JqZWN0LCB0cmFuc2Zvcm0sIGkpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvblBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pIHsKICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gcG9zaXRpb247CgogICAgICBpZiAoIWV4cGxvc2lvblBvc2l0aW9uKSB7CiAgICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50LmJvZHk7CgogICAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBtb3Rpb25TdGF0ZS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGV4cGxvc2lvblBvc2l0aW9uID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICB9CgogICAgICByZXR1cm4gZXhwbG9zaW9uUG9zaXRpb247CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvbkltcHVsc2UgPSBmdW5jdGlvbiBnZXRFeHBsb3Npb25JbXB1bHNlKHBvc2l0aW9uLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpIHsKICAgICAgdmFyIGRpc3RhbmNlID0gcG9zaXRpb24ub3Bfc3ViKGV4cGxvc2lvblBvc2l0aW9uKTsKICAgICAgZGlzdGFuY2Uubm9ybWFsaXplKCk7CiAgICAgIHZhciBpbXB1bHNlID0gZGlzdGFuY2Uub3BfbXVsKHN0cmVuZ3RoKTsKICAgICAgaW1wdWxzZS5zZXRZKGltcHVsc2UueSgpICsgc3RyZW5ndGgpOwogICAgICByZXR1cm4gaW1wdWxzZTsKICAgIH07CiAgICB2YXIgY3JlYXRlRXhwbG9zaW9uID0gZnVuY3Rpb24gY3JlYXRlRXhwbG9zaW9uKF9yZWYpIHsKICAgICAgdmFyIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IF9yZWYucG9zaXRpb24sCiAgICAgICAgICBfcmVmJHJhZGl1cyA9IF9yZWYucmFkaXVzLAogICAgICAgICAgcmFkaXVzID0gX3JlZiRyYWRpdXMgPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TSVpFUy5TTUFMTCA6IF9yZWYkcmFkaXVzLAogICAgICAgICAgX3JlZiRzdHJlbmd0aCA9IF9yZWYuc3RyZW5ndGgsCiAgICAgICAgICBzdHJlbmd0aCA9IF9yZWYkc3RyZW5ndGggPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TVFJFTkdUSFMuTUVESVVNIDogX3JlZiRzdHJlbmd0aDsKCiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pOwoKICAgICAgICB2YXIgX2NyZWF0ZUdob3N0Q29sbGlkZXIgPSBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgZXhwbG9zaW9uUG9zaXRpb24pLAogICAgICAgICAgICBnaG9zdENvbGxpZGVyID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIuZ2hvc3RDb2xsaWRlciwKICAgICAgICAgICAgdHJhbnNmb3JtID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIudHJhbnNmb3JtOwoKICAgICAgICB3b3JsZC5hZGRDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIsIGZ1bmN0aW9uIChvYmplY3QsIG9iamVjdFRyYW5zZm9ybSkgewogICAgICAgICAgdmFyIG9yaWdpbiA9IG9iamVjdFRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICAgIG9iamVjdC5hY3RpdmF0ZSh0cnVlKTsKICAgICAgICAgIG9iamVjdC5hcHBseUNlbnRyYWxJbXB1bHNlKGdldEV4cGxvc2lvbkltcHVsc2Uob3JpZ2luLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpKTsKICAgICAgICB9KTsKICAgICAgICB3b3JsZC5nZXREeW5hbWljc1dvcmxkKCkucmVtb3ZlQ29sbGlzaW9uT2JqZWN0KGdob3N0Q29sbGlkZXIpOwogICAgICAgIEFtbW8uZGVzdHJveShnaG9zdENvbGxpZGVyKTsKICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnNmb3JtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBoYW5kbGVMb2FkRXZlbnQgPSBmdW5jdGlvbiBoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykgewogICAgICByZXR1cm4gZnVuY3Rpb24gKEFtbW8pIHsKICAgICAgICBzZWxmLkFtbW8gPSBBbW1vOwoKICAgICAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZikgewogICAgICAgICAgdmFyIGRhdGEgPSBfcmVmLmRhdGE7CgogICAgICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELkJPWDoKICAgICAgICAgICAgICBhZGRCb3goZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5TUEhFUkU6CiAgICAgICAgICAgICAgYWRkU3BoZXJlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuVkVISUNMRToKICAgICAgICAgICAgICBhZGRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuTU9ERUw6CiAgICAgICAgICAgICAgYWRkTW9kZWwoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5QTEFZRVI6CiAgICAgICAgICAgICAgYWRkUGxheWVyKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5MSU5FQVJfVkVMT0NJVFk6CiAgICAgICAgICAgICAgc2V0TGluZWFyVmVsb2NpdHkoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULlBPU0lUSU9OOgogICAgICAgICAgICAgIHNldFBvc2l0aW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5QT1NJVElPTjoKICAgICAgICAgICAgICBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuU0VULlFVQVRFUk5JT046CiAgICAgICAgICAgICAgc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuUkVTRVQ6CiAgICAgICAgICAgICAgcmVzZXRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkFQUExZLklNUFVMU0U6CiAgICAgICAgICAgICAgYXBwbHlJbXB1c2UoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuVVBEQVRFOgogICAgICAgICAgICAgIHdvcmxkLnVwZGF0ZUJvZHlTdGF0ZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5ESVNQT1NFOgogICAgICAgICAgICAgIHdvcmxkLmRpc3Bvc2VCb2R5KGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FRkZFQ1RTLkVYUExPU0lPTjoKICAgICAgICAgICAgICBjcmVhdGVFeHBsb3Npb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURToKICAgICAgICAgICAgICB3b3JsZC50ZXJtaW5hdGUoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB3b3JsZC5pbml0KG9wdGlvbnMpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kUmVhZHlFdmVudCgpOwogICAgICAgIHdvcmxkLnNpbXVsYXRlKCk7CiAgICAgIH07CiAgICB9OwoKICAgIHZhciBsb2FkQW1tbyA9IGZ1bmN0aW9uIGxvYWRBbW1vKG9wdGlvbnMpIHsKICAgICAgdmFyIHNjcmlwdFVybCA9IG9wdGlvbnMuaG9zdCArICcvJyArIChvcHRpb25zLnBhdGggfHwgTElCUkFSWV9OQU1FKTsKICAgICAgaW1wb3J0U2NyaXB0cyhzY3JpcHRVcmwpOwogICAgICBBbW1vKCkudGhlbihoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykpOwogICAgfTsKCiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZjIpIHsKICAgICAgdmFyIGRhdGEgPSBfcmVmMi5kYXRhOwoKICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5MT0FELkFNTU86CiAgICAgICAgICBsb2FkQW1tbyhkYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9OwoKfSgpKTsKCg==', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy9jb25zdGFudHMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3MvbWVzc2FnZXMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL2xpYi9kaXNwYXRjaGVyLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9saWIvbWF0aC5qcyIsIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy93b3JrZXIvZWxlbWVudHMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL3BsYXllci5qcyIsIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy93b3JrZXIvd29ybGQuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL3ZlaGljbGVzLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9lZmZlY3RzLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgTElCUkFSWV9OQU1FID0gJ2FtbW8uanMnO1xuXG5leHBvcnQgY29uc3QgVFlQRVMgPSB7XG4gICAgQk9YOiAnQk9YJyxcbiAgICBTUEhFUkU6ICdTUEhFUkUnLFxuICAgIFZFSElDTEU6ICdWRUhJQ0xFJyxcbiAgICBNRVNIOiAnTUVTSCcsXG4gICAgUExBWUVSOiAnUExBWUVSJ1xufTtcblxuZXhwb3J0IGNvbnN0IENPTExJREVSX1RZUEVTID0ge1xuICAgIEJPWDogJ0JPWCcsXG4gICAgVkVISUNMRTogJ1ZFSElDTEUnLFxuICAgIFBMQVlFUjogJ1BMQVlFUicsXG4gICAgU1BIRVJFOiAnU1BIRVJFJ1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHtcbiAgICB2ZWhpY2xlU3RlZXJpbmc6IDAsXG4gICAgYWNjZWxlcmF0aW9uOiBmYWxzZSxcbiAgICBicmVha2luZzogZmFsc2UsXG4gICAgcmlnaHQ6IGZhbHNlLFxuICAgIGxlZnQ6IGZhbHNlXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7XG4gICAgdmVsb2NpdHk6IHsgeDogMCwgeTogMCwgejogMCB9LFxuICAgIG1vdmVtZW50OiB7XG4gICAgICAgIGZvcndhcmQ6IGZhbHNlLFxuICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLFxuICAgICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgICAgcmlnaHQ6IGZhbHNlXG4gICAgfSxcbiAgICBkaXJlY3Rpb246IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgejogMFxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NDQUxFID0geyB4OiAxLCB5OiAxLCB6OiAxIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9RVUFURVJOSU9OID0geyB4OiAwLCB5OiAwLCB6OiAwLCB3OiAxIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9QT1NJVElPTiA9IHsgeDogMCwgeTogMCwgejogMCB9O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElORUFSX1ZFTE9DSVRZID0geyB4OiAwLCB5OiAwLCB6OiAwIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9JTVBVTFNFID0geyB4OiAwLCB5OiAwLCB6OiAwIH07XG5cbmV4cG9ydCBjb25zdCBESVNBQkxFX0RFQUNUSVZBVElPTiA9IDQ7XG5leHBvcnQgY29uc3QgR1JBVklUWSA9IHsgeDogMCwgeTogLTEwLCB6OiAwIH07XG5cbmV4cG9ydCBjb25zdCBGUk9OVF9MRUZUID0gMDtcbmV4cG9ydCBjb25zdCBGUk9OVF9SSUdIVCA9IDE7XG5leHBvcnQgY29uc3QgQkFDS19MRUZUID0gMjtcbmV4cG9ydCBjb25zdCBCQUNLX1JJR0hUID0gMztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UID0gLjA0O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAgPSAuNTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UgPSAyMDAwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFID0gMTAwO1xuXG5leHBvcnQgY29uc3QgRVhQTE9TSU9OX1NJWkVTID0ge1xuICAgIFNNQUxMOiA0LFxuICAgIE1FRElVTTogNixcbiAgICBMQVJHRTogOCxcbiAgICBNQVNTSVZFOiAxMlxufTtcblxuZXhwb3J0IGNvbnN0IEVYUExPU0lPTl9TVFJFTkdUSFMgPSB7XG4gICAgVkVSWV9XRUFLOiAyLFxuICAgIFdFQUs6IDQsXG4gICAgTUVESVVNOiA4LFxuICAgIExBUkdFOiAxNixcbiAgICBNQVNTSVZFOiAzMixcbiAgICBPS19OTzogNjRcbn07IiwiZXhwb3J0IGNvbnN0IFBIWVNJQ1NfRVZFTlRTID0ge1xuICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsXG4gICAgVEVSTUlOQVRFOiAncGh5c2ljczp0ZXJtaW5hdGUnLFxuICAgIExPQUQ6IHtcbiAgICAgICAgQU1NTzogJ3BoeXNpY3M6bG9hZDphbW1vJyxcbiAgICB9LFxuICAgIFJFQURZOiAncGh5c2ljczpyZWFkeScsXG4gICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsXG4gICAgVVBEQVRFOiAncGh5c2ljczp1cGRhdGUnLFxuICAgIFxuICAgIEFERDoge1xuICAgICAgICBCT1g6ICdwaHlzaWNzOmFkZDpib3gnLFxuICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsXG4gICAgICAgIE1PREVMOiAncGh5c2ljczphZGQ6bW9kZWwnLFxuICAgICAgICBQTEFZRVI6ICdwaHlzaWNzOmFkZDpwbGF5ZXInLFxuICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnLFxuICAgIH0sXG5cbiAgICBFTEVNRU5UOiB7XG4gICAgICAgIERJU1BPU0U6ICdwaHlzaWNzOmVsZW1lbnQ6ZGlzcG9zZScsXG4gICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLFxuICAgICAgICBVUERBVEU6ICdwaHlzaWNzOmVsZW1lbnQ6dXBkYXRlJyxcbiAgICAgICAgQ1JFQVRFRDogJ3BoeXNpY3M6ZWxlbWVudDpjcmVhdGVkJyxcblxuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICAgIFBPU0lUSU9OOiAncGh5c2ljczplbGVtZW50OnNldDpwb3NpdGlvbicsXG4gICAgICAgICAgICBRVUFURVJOSU9OOiAncGh5c2ljczplbGVtZW50OnNldDpxdWF0ZXJuaW9uJyxcbiAgICAgICAgICAgIExJTkVBUl9WRUxPQ0lUWTogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6bGluZWFyX3ZlbG9jaXR5J1xuICAgICAgICB9LFxuXG4gICAgICAgIEFQUExZOiB7XG4gICAgICAgICAgICBJTVBVTFNFOiAncGh5c2ljczplbGVtZW50OmFwcGx5OmltcHVsc2UnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgVkVISUNMRToge1xuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICAgIFBPU0lUSU9OOiAncGh5c2ljczp2ZWhpY2xlOnNldDpwb3NpdGlvbicsXG4gICAgICAgICAgICBRVUFURVJOSU9OOiAncGh5c2ljczp2ZWhpY2xlOnNldDpxdWF0ZXJuaW9uJ1xuICAgICAgICB9LFxuICAgICAgICBSRVNFVDogJ3BoeXNpY3M6dmVoaWNsZTpyZXNldCcsXG4gICAgICAgIFxuICAgICAgICBTUEVFRDogJ3BoeXNpY3M6dmVoaWNsZTpzcGVlZCcsXG4gICAgICAgIERJUkVDVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpkaXJlY3Rpb24nXG4gICAgfSxcblxuICAgIEVGRkVDVFM6IHtcbiAgICAgICAgRVhQTE9TSU9OOiAncGh5c2ljczplZmZlY3RzOmV4cGxvc2lvbidcbiAgICB9XG59OyIsImltcG9ydCB7IFBIWVNJQ1NfRVZFTlRTIH0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2hlciB7XG5cbiAgICBzZW5kUGh5c2ljc1VwZGF0ZSA9IGR0ID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlVQREFURSwgZHQgfSlcbiAgICBzZW5kUmVhZHlFdmVudCA9ICgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlJFQURZIH0pO1xuICAgIHNlbmRUZXJtaW5hdGVFdmVudCA9ICgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURSB9KTtcblxuICAgIHNlbmRCb2R5VXBkYXRlID0gKHV1aWQsIHBvc2l0aW9uLCByb3RhdGlvbiwgZHQsIGV4dHJhRGF0YSkgPT4gcG9zdE1lc3NhZ2Uoe1xuICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEUsXG4gICAgICAgIHV1aWQsXG4gICAgICAgIHBvc2l0aW9uOiB7IHg6IHBvc2l0aW9uLngoKSwgeTogcG9zaXRpb24ueSgpLCB6OiBwb3NpdGlvbi56KCkgfSxcbiAgICAgICAgcXVhdGVybmlvbjogeyB4OiByb3RhdGlvbi54KCksIHk6IHJvdGF0aW9uLnkoKSwgejogcm90YXRpb24ueigpLCB3OiByb3RhdGlvbi53KCkgfSxcbiAgICAgICAgLi4uZXh0cmFEYXRhLFxuICAgICAgICBkdFxuICAgIH0pO1xuXG4gICAgc2VuZERpc3BhdGNoRXZlbnQgPSAodXVpZCwgZXZlbnROYW1lLCBldmVudERhdGEpID0+IHBvc3RNZXNzYWdlKHtcbiAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLkRJU1BBVENILFxuICAgICAgICB1dWlkLFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGV2ZW50RGF0YVxuICAgIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbmV3IERpc3BhdGNoZXIoKTsiLCJleHBvcnQgY29uc3QgYXBwbHlNYXRyaXg0VG9WZWN0b3IzID0gKHsgeCA9IDAsIHkgPSAwLCB6ID0gMCB9LCBtYXRyaXggPSBbXSkgPT4ge1xuICAgIGNvbnN0IHcgPSAxIC8gKCBtYXRyaXhbIDMgXSAqIHggKyBtYXRyaXhbIDcgXSAqIHkgKyBtYXRyaXhbIDExIF0gKiB6ICsgbWF0cml4WyAxNSBdICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB4OiAoIG1hdHJpeFsgMCBdICogeCArIG1hdHJpeFsgNCBdICogeSArIG1hdHJpeFsgOCBdICogeiArIG1hdHJpeFsgMTIgXSApICogdyxcbiAgICAgICAgeTogKCBtYXRyaXhbIDEgXSAqIHggKyBtYXRyaXhbIDUgXSAqIHkgKyBtYXRyaXhbIDkgXSAqIHogKyBtYXRyaXhbIDEzIF0gKSAqIHcsXG4gICAgICAgIHo6ICggbWF0cml4WyAyIF0gKiB4ICsgbWF0cml4WyA2IF0gKiB5ICsgbWF0cml4WyAxMCBdICogeiArIG1hdHJpeFsgMTQgXSApICogdyxcbiAgICB9XG59OyIsImltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHdvcmxkIGZyb20gJy4vd29ybGQnO1xuXG5pbXBvcnQge1xuICAgIGFwcGx5TWF0cml4NFRvVmVjdG9yM1xufSBmcm9tICcuL2xpYi9tYXRoJztcblxuaW1wb3J0IHtcbiAgICBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSxcbiAgICBUWVBFUyxcbiAgICBERUZBVUxUX1NDQUxFLFxuICAgIERJU0FCTEVfREVBQ1RJVkFUSU9OLFxuICAgIERFRkFVTFRfTElORUFSX1ZFTE9DSVRZLFxuICAgIERFRkFVTFRfSU1QVUxTRVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUmlnaWRCb2R5ID0gKHNoYXBlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICB1dWlkLFxuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgcXVhdGVybmlvbixcbiAgICAgICAgbWFzcyxcbiAgICAgICAgZnJpY3Rpb24sXG4gICAgICAgIHJlc3RpdHV0aW9uID0gLjksXG4gICAgICAgIGRhbXBpbmcgPSB7IGxpbmVhcjogMC4yLCBhbmd1bGFyOiAwLjIgfVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpO1xuICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTtcbiAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpO1xuICAgIGNvbnN0IG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTtcbiAgICBjb25zdCBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7XG4gICAgc2hhcGUuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7XG5cbiAgICBjb25zdCByYkluZm8gPSBuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIHNoYXBlLCBsb2NhbEluZXJ0aWEpO1xuICAgIGNvbnN0IGJvZHkgPSBuZXcgQW1tby5idFJpZ2lkQm9keShyYkluZm8pO1xuXG4gICAgXG5cbiAgICBpZiAobWFzcyA+IDApIHtcbiAgICAgICAgYm9keS5zZXRGcmljdGlvbihmcmljdGlvbik7XG4gICAgICAgIGJvZHkuc2V0UmVzdGl0dXRpb24ocmVzdGl0dXRpb24pO1xuICAgICAgICBib2R5LnNldERhbXBpbmcoZGFtcGluZy5saW5lYXIsIGRhbXBpbmcuYW5ndWxhcik7XG4gICAgICAgIGJvZHkuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTtcbiAgICB9XG5cbiAgICAvLyBzdG9yaW5nIHV1aWQgZm9yIGZ1dHVyZSByZWZlcmVuY2VcbiAgICBib2R5LnV1aWQgPSB1dWlkO1xuXG4gICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpO1xuXG4gICAgcmV0dXJuIGJvZHk7XG59XG5cbmV4cG9ydCBjb25zdCBhZGRNb2RlbCA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICB1dWlkLFxuICAgICAgICB2ZXJ0aWNlcyxcbiAgICAgICAgbWF0cmljZXMsXG4gICAgICAgIGluZGV4ZXMsXG4gICAgICAgIHBvc2l0aW9uLFxuICAgICAgICBxdWF0ZXJuaW9uLFxuICAgICAgICBtYXNzID0gMCxcbiAgICAgICAgZnJpY3Rpb24gPSAyXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBzY2FsZSA9IERFRkFVTFRfU0NBTEU7XG5cbiAgICBjb25zdCBidGEgPSBuZXcgQW1tby5idFZlY3RvcjMoKTtcbiAgICBjb25zdCBidGIgPSBuZXcgQW1tby5idFZlY3RvcjMoKTtcbiAgICBjb25zdCBidGMgPSBuZXcgQW1tby5idFZlY3RvcjMoKTtcbiAgICBjb25zdCB0cmlNZXNoID0gbmV3IEFtbW8uYnRUcmlhbmdsZU1lc2godHJ1ZSwgZmFsc2UpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdmVydGljZXNbaV07XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhlc1tpXSA/IGluZGV4ZXNbaV0gOiBudWxsO1xuICAgICAgICBjb25zdCBtYXRyaXggPSBBcnJheS5mcm9tKG1hdHJpY2VzW2ldKTtcblxuICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kZXgubGVuZ3RoOyBqICs9IDMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFpID0gaW5kZXhbal0gKiAzO1xuICAgICAgICAgICAgY29uc3QgYmkgPSBpbmRleFtqICsgMV0gKiAzO1xuICAgICAgICAgICAgY29uc3QgY2kgPSBpbmRleFtqICsgMl0gKiAzO1xuXG4gICAgICAgICAgICBjb25zdCB2YSA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbYWldLCB5OiBjb21wb25lbnRzW2FpICsgMV0sIHo6IGNvbXBvbmVudHNbYWkgKyAyXSB9LCBtYXRyaXgpO1xuICAgICAgICAgICAgY29uc3QgdmIgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2JpXSwgeTogY29tcG9uZW50c1tiaSArIDFdLCB6OiBjb21wb25lbnRzW2JpICsgMl0gfSwgbWF0cml4KTtcbiAgICAgICAgICAgIGNvbnN0IHZjID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsgeDogY29tcG9uZW50c1tjaV0sIHk6IGNvbXBvbmVudHNbY2kgKyAxXSwgejogY29tcG9uZW50c1tjaSArIDJdIH0sIG1hdHJpeCk7XG5cbiAgICAgICAgICAgIGJ0YS5zZXRWYWx1ZSh2YS54LCB2YS55LCB2YS56KTtcbiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZSh2Yi54LCB2Yi55LCB2Yi56KTtcbiAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZSh2Yy54LCB2Yy55LCB2Yy56KTtcbiAgICAgICAgICAgIHRyaU1lc2guYWRkVHJpYW5nbGUoYnRhLCBidGIsIGJ0YywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb21wb25lbnRzLmxlbmd0aDsgaiArPSA5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmEgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2ogKyAwXSwgeTogY29tcG9uZW50c1tqICsgMV0sIHo6IGNvbXBvbmVudHNbaiArIDJdIH0sIG1hdHJpeCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmIgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2ogKyAzXSwgeTogY29tcG9uZW50c1tqICsgNF0sIHo6IGNvbXBvbmVudHNbaiArIDVdIH0sIG1hdHJpeCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2ogKyA2XSwgeTogY29tcG9uZW50c1tqICsgN10sIHo6IGNvbXBvbmVudHNbaiArIDhdIH0sIG1hdHJpeCk7XG5cbiAgICAgICAgICAgICAgICBidGEuc2V0VmFsdWUodmEueCwgdmEueSwgdmEueik7XG4gICAgICAgICAgICAgICAgYnRiLnNldFZhbHVlKHZiLngsIHZiLnksIHZiLnopO1xuICAgICAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZSh2Yy54LCB2Yy55LCB2Yy56KTtcbiAgICAgICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGxvY2FsU2NhbGUgPSBuZXcgQW1tby5idFZlY3RvcjMoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueik7XG4gICAgdHJpTWVzaC5zZXRTY2FsaW5nKGxvY2FsU2NhbGUpO1xuICAgIEFtbW8uZGVzdHJveShsb2NhbFNjYWxlKTtcblxuICAgIGNvbnN0IGNvbGxpc2lvblNoYXBlID0gbmV3IEFtbW8uYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSh0cmlNZXNoLCB0cnVlLCB0cnVlKTtcbiAgICBjb2xsaXNpb25TaGFwZS5yZXNvdXJjZXMgPSBbdHJpTWVzaF07XG5cbiAgICBBbW1vLmRlc3Ryb3koYnRhKTtcbiAgICBBbW1vLmRlc3Ryb3koYnRiKTtcbiAgICBBbW1vLmRlc3Ryb3koYnRjKTtcblxuICAgIGNvbnN0IGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY29sbGlzaW9uU2hhcGUsIHsgdXVpZCwgcG9zaXRpb24sIHF1YXRlcm5pb24sIG1hc3MsIGZyaWN0aW9uIH0pO1xuICAgIHdvcmxkLmFkZEVsZW1lbnQoeyB1dWlkLCBib2R5LCB0eXBlOiBUWVBFUy5NRVNILCBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSk7XG59XG5cbmV4cG9ydCBjb25zdCBhZGRCb3ggPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgd2lkdGgsIGxlbmd0aCwgaGVpZ2h0LCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcyA9IDAsIGZyaWN0aW9uID0gMiB9ID0gZGF0YTtcblxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAwLjUsIGhlaWdodCAqIDAuNSwgbGVuZ3RoICogMC41KSk7XG4gICAgY29uc3QgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgeyB1dWlkLCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcywgZnJpY3Rpb24gfSk7XG5cbiAgICB3b3JsZC5hZGRFbGVtZW50KHsgdXVpZCwgYm9keSwgdHlwZTogVFlQRVMuQk9YLCBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3BoZXJlID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCByYWRpdXMsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzID0gMCwgZnJpY3Rpb24gPSAyIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQW1tby5idFNwaGVyZVNoYXBlKHJhZGl1cyk7XG4gICAgY29uc3QgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgeyB1dWlkLCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcywgZnJpY3Rpb24gfSk7XG5cbiAgICB3b3JsZC5hZGRFbGVtZW50KHsgdXVpZCwgYm9keSwgdHlwZTogVFlQRVMuU1BIRVJFLCBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0TGluZWFyVmVsb2NpdHkgPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgdmVsb2NpdHkgPSBERUZBVUxUX0xJTkVBUl9WRUxPQ0lUWSB9ID0gZGF0YTtcbiAgICBjb25zdCB7IGJvZHkgfSA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG4gICAgY29uc3QgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobW90aW9uU3RhdGUpIHtcbiAgICAgICAgY29uc3QgbGluZWFyVmVsb2NpdHkgPSBuZXcgQW1tby5idFZlY3RvcjModmVsb2NpdHkueCwgdmVsb2NpdHkueSwgdmVsb2NpdHkueik7XG4gICAgICAgIGJvZHkuc2V0TGluZWFyVmVsb2NpdHkobGluZWFyVmVsb2NpdHkpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kobGluZWFyVmVsb2NpdHkpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRQb3NpdGlvbiA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgcG9zaXRpb24gfSA9IGRhdGE7XG4gICAgY29uc3QgeyBib2R5IH0gPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICkpO1xuXG4gICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xufVxuXG5leHBvcnQgY29uc3QgYXBwbHlJbXB1c2UgPSAoeyB1dWlkLCBpbXB1bHNlID0gREVGQVVMVF9JTVBVTFNFIH0pID0+IHtcbiAgICBjb25zdCB7IGJvZHkgfSA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG4gICAgY29uc3QgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobW90aW9uU3RhdGUpIHtcbiAgICAgICAgY29uc3QgaW1wdWxzZVZlY3RvciA9IG5ldyBBbW1vLmJ0VmVjdG9yMyhpbXB1bHNlLngsIGltcHVsc2UueSwgaW1wdWxzZS56KTtcbiAgICAgICAgYm9keS5hcHBseUNlbnRyYWxJbXB1bHNlKGltcHVsc2VWZWN0b3IpO1xuICAgICAgICBBbW1vLmRlc3Ryb3koaW1wdWxzZVZlY3Rvcik7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlRWxlbWVudFVwZGF0ZSA9ICh7IGJvZHksIHV1aWQsIHN0YXRlID0gREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSwgZHQpID0+IHtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTtcblxuICAgIGlmIChtb3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGxldCBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7XG4gICAgICAgIGxldCByb3RhdGlvbiA9IHRyYW5zZm9ybS5nZXRSb3RhdGlvbigpO1xuXG4gICAgICAgIGRpc3BhdGNoZXIuc2VuZEJvZHlVcGRhdGUodXVpZCwgb3JpZ2luLCByb3RhdGlvbiwgZHQpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnNmb3JtKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgY3JlYXRlUmlnaWRCb2R5IH0gZnJvbSAnLi9lbGVtZW50cyc7XG5pbXBvcnQgd29ybGQgZnJvbSAnLi93b3JsZCc7XG5cbmltcG9ydCB7XG4gICAgVFlQRVMsXG4gICAgREVGQVVMVF9SSUdJREJPRFlfU1RBVEVcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNvbnN0IGFkZFBsYXllciA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCB3aWR0aCwgaGVpZ2h0LCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcywgZnJpY3Rpb24gfSA9IGRhdGE7XG5cbiAgICBjb25zdCBjYXBzdWxlID0gbmV3IEFtbW8uYnRDYXBzdWxlU2hhcGUod2lkdGgsIGhlaWdodCk7XG4gICAgY29uc3QgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjYXBzdWxlLCB7IHV1aWQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzLCBmcmljdGlvbiB9KTtcblxuICAgIC8vIGRpc2FibGlpbmcgcm90YXRpb24gZm9yIGNvbGxpc2lvbnNcbiAgICBib2R5LnNldEFuZ3VsYXJGYWN0b3IoMCk7XG5cbiAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7XG4gICAgd29ybGQuYWRkRWxlbWVudCh7IHV1aWQsIGJvZHksIHR5cGU6IFRZUEVTLlBMQVlFUiwgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZVBsYXllclVwZGF0ZSA9ICh7IGJvZHksIHV1aWQsIHN0YXRlID0gREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSwgZHQpID0+IHtcbiAgICBjb25zdCB7IG1vdmVtZW50LCBkaXJlY3Rpb24sIGNhbWVyYURpcmVjdGlvbiwgcXVhdGVybmlvbiwgcG9zaXRpb24gfSA9IHN0YXRlO1xuXG4gICAgY29uc3QgTUFYX1NQRUVEID0gMTtcbiAgICBjb25zdCB3YWxrVmVsb2NpdHkgPSAuMTtcblxuICAgIGNvbnN0IG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpO1xuXG4gICAgaWYgKG1vdGlvblN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG4gICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG5cbiAgICAgICAgY29uc3QgbGluZWFyVmVsb2NpdHkgPSBib2R5LmdldExpbmVhclZlbG9jaXR5KCk7XG4gICAgICAgIGNvbnN0IHNwZWVkID0gbGluZWFyVmVsb2NpdHkubGVuZ3RoKCk7XG5cbiAgICAgICAgY29uc3QgZm9yd2FyZERpciA9IHRyYW5zZm9ybS5nZXRCYXNpcygpLmdldFJvdygyKTtcbiAgICAgICAgZm9yd2FyZERpci5ub3JtYWxpemUoKTtcbiAgICAgICAgY29uc3Qgd2Fsa0RpcmVjdGlvbiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLjAsIDAuMCwgMC4wKTtcblxuICAgICAgICBjb25zdCB3YWxrU3BlZWQgPSB3YWxrVmVsb2NpdHkgKiBkdDtcblxuICAgICAgICBpZiAobW92ZW1lbnQuZm9yd2FyZCkge1xuICAgICAgICAgICAgd2Fsa0RpcmVjdGlvbi5zZXRYKCB3YWxrRGlyZWN0aW9uLngoKSArIGZvcndhcmREaXIueCgpKTtcbiAgICAgICAgICAgIC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSArIGZvcndhcmREaXIueSgpKTtcbiAgICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wiggd2Fsa0RpcmVjdGlvbi56KCkgKyBmb3J3YXJkRGlyLnooKSk7XG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgaWYgKG1vdmVtZW50LmJhY2t3YXJkcykge1xuICAgICAgICAgICAgd2Fsa0RpcmVjdGlvbi5zZXRYKCB3YWxrRGlyZWN0aW9uLngoKSAtIGZvcndhcmREaXIueCgpKTtcbiAgICAgICAgICAgIC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSAtIGZvcndhcmREaXIueSgpKTtcbiAgICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wiggd2Fsa0RpcmVjdGlvbi56KCkgLSBmb3J3YXJkRGlyLnooKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW1vdmVtZW50LmZvcndhcmQgJiYgIW1vdmVtZW50LmJhY2t3YXJkcykge1xuICAgICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKiAwLjIpO1xuICAgICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKiAwLjIpO1xuICAgICAgICB9IGVsc2UgaWYgKHNwZWVkIDwgTUFYX1NQRUVEKSB7XG4gICAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRYKGxpbmVhclZlbG9jaXR5LngoKSArIGNhbWVyYURpcmVjdGlvbi54ICogd2Fsa1NwZWVkKTtcbiAgICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFoobGluZWFyVmVsb2NpdHkueigpICsgY2FtZXJhRGlyZWN0aW9uLnogKiB3YWxrU3BlZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYm9keS5zZXRMaW5lYXJWZWxvY2l0eShsaW5lYXJWZWxvY2l0eSk7XG5cbiAgICAgICAgYm9keS5nZXRNb3Rpb25TdGF0ZSgpLnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGJvZHkuc2V0Q2VudGVyT2ZNYXNzVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG5cbiAgICAgICAgbGV0IG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTtcbiAgICAgICAgbGV0IHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7XG4gICAgfVxufTsiLCJpbXBvcnQge1xuICAgIEdSQVZJVFksXG4gICAgVFlQRVNcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHsgaGFuZGxlRWxlbWVudFVwZGF0ZSB9IGZyb20gJy4vZWxlbWVudHMnO1xuaW1wb3J0IHsgaGFuZGxlVmVoaWNsZVVwZGF0ZSB9IGZyb20gJy4vdmVoaWNsZXMnO1xuaW1wb3J0IHsgaGFuZGxlUGxheWVyVXBkYXRlIH0gZnJvbSAnLi9wbGF5ZXInO1xuXG5pbXBvcnQgZGlzcGF0Y2hlciBmcm9tICcuL2xpYi9kaXNwYXRjaGVyJztcbmltcG9ydCB7IFBIWVNJQ1NfRVZFTlRTIH0gZnJvbSAnLi4vbWVzc2FnZXMnO1xuXG5jbGFzcyBDbG9jayB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBudWxsO1xuICAgIH1cblxuICAgIGdldERlbHRhKCkge1xuICAgICAgICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKHRoaXMudGltZXN0YW1wKSB7XG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IHRpbWUgLSB0aGlzLnRpbWVzdGFtcDtcbiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTtcblxuICAgICAgICAgICAgcmV0dXJuIGRlbHRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lO1xuXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBXb3JsZCB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IHt9O1xuICAgICAgICB0aGlzLmluaXRpYWxpc2VkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuYnJvYWRwaGFzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbG9jayA9IG5ldyBDbG9jaygpO1xuICAgIH1cblxuICAgIGluaXQgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCB7IGdyYXZpdHkgPSBHUkFWSVRZIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbiA9IG5ldyBBbW1vLmJ0RGVmYXVsdENvbGxpc2lvbkNvbmZpZ3VyYXRpb24oKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gbmV3IEFtbW8uYnRDb2xsaXNpb25EaXNwYXRjaGVyKHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuYnJvYWRwaGFzZSA9IG5ldyBBbW1vLmJ0RGJ2dEJyb2FkcGhhc2UoKTtcbiAgICAgICAgdGhpcy5zb2x2ZXIgPSBuZXcgQW1tby5idFNlcXVlbnRpYWxJbXB1bHNlQ29uc3RyYWludFNvbHZlcigpO1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQgPSBuZXcgQW1tby5idERpc2NyZXRlRHluYW1pY3NXb3JsZCh0aGlzLmRpc3BhdGNoZXIsIHRoaXMuYnJvYWRwaGFzZSwgdGhpcy5zb2x2ZXIsIHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5zZXRHcmF2aXR5KG5ldyBBbW1vLmJ0VmVjdG9yMyhncmF2aXR5LngsIGdyYXZpdHkueSwgZ3Jhdml0eS56KSk7XG5cbiAgICAgICAgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGdob3N0T2JqZWN0IGNvbGxpc2lvbnNcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkXG4gICAgICAgICAgICAuZ2V0QnJvYWRwaGFzZSgpXG4gICAgICAgICAgICAuZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUoKVxuICAgICAgICAgICAgLnNldEludGVybmFsR2hvc3RQYWlyQ2FsbGJhY2sobmV3IEFtbW8uYnRHaG9zdFBhaXJDYWxsYmFjaygpKVxuXG4gICAgICAgIHRoaXMuaW5pdGlhbGlzZWQgPSB0cnVlO1xuICAgIH07XG5cbiAgICByZW1vdmVFbGVtZW50ID0gdXVpZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc0VsZW1lbnQodXVpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVEZWxldGVkRWxlbWVudHMgPSAoKSA9PiAoXG4gICAgICAgIE9iamVjdFxuICAgICAgICAgICAgLmtleXModGhpcy5lbGVtZW50cylcbiAgICAgICAgICAgIC5maWx0ZXIodXVpZCA9PiB0aGlzLmVsZW1lbnRzW3V1aWRdLmRlbGV0ZWQpXG4gICAgICAgICAgICAuZm9yRWFjaCh1dWlkID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50c1t1dWlkXTtcbiAgICAgICAgICAgIH0pXG4gICAgKTtcblxuICAgIGhhc0VsZW1lbnQgPSB1dWlkID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZWxlbWVudHMpLmluY2x1ZGVzKHV1aWQpO1xuICAgIH1cblxuICAgIGdldEVsZW1lbnQgPSB1dWlkID0+IHRoaXMuZWxlbWVudHNbdXVpZF07XG5cbiAgICBpc0luaXRpYWxpc2VkID0gKCkgPT4gdGhpcy5pbml0aWFsaXNlZDtcblxuICAgIGdldER5bmFtaWNzV29ybGQgPSAoKSA9PiB0aGlzLmR5bmFtaWNzV29ybGQ7XG5cbiAgICBhZGRSaWdpZEJvZHkgPSBib2R5ID0+IHtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLmFkZFJpZ2lkQm9keShib2R5KTtcbiAgICB9XG5cbiAgICBhZGRBY3Rpb24gPSBhY3Rpb24gPT4ge1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQuYWRkQWN0aW9uKGFjdGlvbik7XG4gICAgfVxuXG4gICAgYWRkQ29sbGlzaW9uT2JqZWN0ID0gY29sbGlzaW9uT2JqZWN0ID0+IHtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLmFkZENvbGxpc2lvbk9iamVjdChjb2xsaXNpb25PYmplY3QpO1xuICAgIH1cblxuICAgIHN0ZXBTaW11bGF0aW9uID0gZHQgPT4ge1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQuc3RlcFNpbXVsYXRpb24oZHQpO1xuICAgIH1cblxuICAgIHNpbXVsYXRlID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkdCA9IHRoaXMuY2xvY2suZ2V0RGVsdGEoKTtcbiAgICAgICAgdGhpcy5zdGVwU2ltdWxhdGlvbihkdCk7XG5cbiAgICAgICAgT2JqZWN0XG4gICAgICAgICAgICAua2V5cyh0aGlzLmVsZW1lbnRzKVxuICAgICAgICAgICAgLmZvckVhY2godXVpZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaChlbGVtZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuQk9YOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5TUEhFUkU6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLk1FU0g6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRWxlbWVudFVwZGF0ZShlbGVtZW50LCBkdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlBMQVlFUjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVQbGF5ZXJVcGRhdGUoZWxlbWVudCwgZHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5WRUhJQ0xFOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVZlaGljbGVVcGRhdGUoZWxlbWVudCwgZHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sbGlzaW9ucygpO1xuICAgICAgICB0aGlzLnJlbW92ZURlbGV0ZWRFbGVtZW50cygpO1xuXG4gICAgICAgIGRpc3BhdGNoZXIuc2VuZFBoeXNpY3NVcGRhdGUoZHQpO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5zaW11bGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVDb2xsaXNpb25zID0gKCkgPT4ge1xuICAgICAgICBsZXQgYW1tb0Rpc3BhdGNoZXIgPSB0aGlzLmR5bmFtaWNzV29ybGQuZ2V0RGlzcGF0Y2hlcigpO1xuICAgICAgICBsZXQgbnVtTWFuaWZvbGRzID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TnVtTWFuaWZvbGRzKCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1NYW5pZm9sZHM7IGkrKykge1xuXG4gICAgICAgICAgICBsZXQgY29udGFjdE1hbmlmb2xkID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TWFuaWZvbGRCeUluZGV4SW50ZXJuYWwoaSk7XG5cbiAgICAgICAgICAgIGxldCByYjAgPSBBbW1vLmNhc3RPYmplY3QoY29udGFjdE1hbmlmb2xkLmdldEJvZHkwKCksIEFtbW8uYnRSaWdpZEJvZHkpO1xuICAgICAgICAgICAgbGV0IHJiMSA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTEoKSwgQW1tby5idFJpZ2lkQm9keSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBudW1Db250YWN0cyA9IGNvbnRhY3RNYW5pZm9sZC5nZXROdW1Db250YWN0cygpO1xuXG4gICAgICAgICAgICAvLyB0aGlzIGl0ZXJhdGlvbiBkb2Vzbid0IGhhdmUgdXVpZHNcbiAgICAgICAgICAgIGlmICghcmIwLnV1aWQgfHwgIXJiMS51dWlkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgbGV0IGNvbnRhY3RzID0gW107XG5cbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbnVtQ29udGFjdHM7IGorKykge1xuXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRhY3RQb2ludCA9IGNvbnRhY3RNYW5pZm9sZC5nZXRDb250YWN0UG9pbnQoaik7XG4gICAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlID0gY29udGFjdFBvaW50LmdldERpc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiggZGlzdGFuY2UgPiAwLjApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgbGV0IHZlbG9jaXR5MCA9IHJiMC5nZXRMaW5lYXJWZWxvY2l0eSgpO1xuICAgICAgICAgICAgICAgIGxldCB2ZWxvY2l0eTEgPSByYjEuZ2V0TGluZWFyVmVsb2NpdHkoKTtcbiAgICAgICAgICAgICAgICBsZXQgd29ybGRQb3MwID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkEoKTtcbiAgICAgICAgICAgICAgICBsZXQgd29ybGRQb3MxID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkIoKTtcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxQb3MwID0gY29udGFjdFBvaW50LmdldF9tX2xvY2FsUG9pbnRBKCk7XG4gICAgICAgICAgICAgICAgbGV0IGxvY2FsUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QigpO1xuXG4gICAgICAgICAgICAgICAgY29udGFjdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50czpbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogcmIwLnV1aWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsgeDogdmVsb2NpdHkwLngoKSwgeTogdmVsb2NpdHkwLnkoKSwgejogdmVsb2NpdHkwLnooKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7IHg6IHdvcmxkUG9zMC54KCksIHk6IHdvcmxkUG9zMC55KCksIHo6IHdvcmxkUG9zMC56KCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvczogeyB4OiBsb2NhbFBvczAueCgpLCB5OiBsb2NhbFBvczAueSgpLCB6OiBsb2NhbFBvczAueigpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogcmIxLnV1aWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsgeDogdmVsb2NpdHkxLngoKSwgeTogdmVsb2NpdHkxLnkoKSwgejogdmVsb2NpdHkxLnooKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7IHg6IHdvcmxkUG9zMS54KCksIHk6IHdvcmxkUG9zMS55KCksIHo6IHdvcmxkUG9zMS56KCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvczogeyB4OiBsb2NhbFBvczEueCgpLCB5OiBsb2NhbFBvczEueSgpLCB6OiBsb2NhbFBvczEueigpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaXNwYXRjaGVyLnNlbmREaXNwYXRjaEV2ZW50KHJiMC51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgeyBjb250YWN0cyB9KTtcbiAgICAgICAgICAgIGRpc3BhdGNoZXIuc2VuZERpc3BhdGNoRXZlbnQocmIxLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7IGNvbnRhY3RzIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRWxlbWVudCA9IGRhdGEgPT4ge1xuICAgICAgICB0aGlzLmVsZW1lbnRzW2RhdGEudXVpZF0gPSBkYXRhO1xuICAgIH1cblxuICAgIHVwZGF0ZUJvZHlTdGF0ZSA9ICh7IHV1aWQsIHN0YXRlIH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRWxlbWVudCh1dWlkKSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50c1t1dWlkXS5zdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlLFxuICAgICAgICAgICAgICAgIC4uLnN0YXRlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZUJvZHkoeyB1dWlkIH0pIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnJlbW92ZVJpZ2lkQm9keShlbGVtZW50LmJvZHkpO1xuICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodXVpZCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kRWxlbWVudERpc3Bvc2VkKHsgdXVpZCB9KTtcbiAgICB9XG5cbiAgICB0ZXJtaW5hdGUgPSAoKSA9PiB7XG4gICAgICAgIEFtbW8uZGVzdHJveSh0aGlzLmR5bmFtaWNzV29ybGQpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodGhpcy5zb2x2ZXIpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgQW1tby5kZXN0cm95KHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kVGVybWluYXRlRXZlbnQoKTtcbiAgICB9XG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBXb3JsZCgpOyIsImltcG9ydCB7XG4gICAgRElTQUJMRV9ERUFDVElWQVRJT04sXG4gICAgVFlQRVMsXG4gICAgREVGQVVMVF9WRUhJQ0xFX1NUQVRFLFxuICAgIEJBQ0tfTEVGVCxcbiAgICBCQUNLX1JJR0hULFxuICAgIEZST05UX0xFRlQsXG4gICAgRlJPTlRfUklHSFQsXG4gICAgREVGQVVMVF9NQVhfRU5HSU5FX0ZPUkNFLFxuICAgIERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFLFxuICAgIERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAsXG4gICAgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlRcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgICBQSFlTSUNTX0VWRU5UU1xufSBmcm9tICcuLi9tZXNzYWdlcyc7XG5cbmltcG9ydCB3b3JsZCBmcm9tICcuL3dvcmxkJztcbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuXG5jb25zdCBERUZBVUxUX1JPTExfSU5GTFVFTkNFID0gMC4yO1xuY29uc3QgREVGQVVMVF9GUklDVElPTiA9IDEwMDA7XG5jb25zdCBERUZBVUxUX01BU1MgPSA4MDA7XG5cbmV4cG9ydCBjb25zdCBhZGRWZWhpY2xlID0gZGF0YSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgcXVhdGVybmlvbixcbiAgICAgICAgdXVpZCxcbiAgICAgICAgd2hlZWxzLFxuICAgICAgICBtYXNzID0gREVGQVVMVF9NQVNTLFxuICAgICAgICB3aWR0aCA9IDEuOCxcbiAgICAgICAgaGVpZ2h0ID0gLjYsXG4gICAgICAgIGxlbmd0aCA9IDQsXG4gICAgICAgIGZyaWN0aW9uID0gREVGQVVMVF9GUklDVElPTixcbiAgICAgICAgcm9sbEluZmx1ZW5jZSA9IERFRkFVTFRfUk9MTF9JTkZMVUVOQ0UsXG4gICAgICAgIHdoZWVsc09wdGlvbnMgPSB7fSxcbiAgICAgICAgc3VzcGVuc2lvbnMgPSB7fVxuICAgIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgeyBiYWNrID0ge30sIGZyb250ID0ge30gfSA9IHdoZWVsc09wdGlvbnM7XG4gICAgY29uc3Qge1xuICAgICAgICBheGlzUG9zaXRpb246IGF4aXNQb3NpdGlvbkJhY2sgPSAtMSxcbiAgICAgICAgcmFkaXVzOiB3aGVlbFJhZGl1c0JhY2sgPSAuNCxcbiAgICAgICAgaGFsZlRyYWNrOiB3aGVlbEhhbGZUcmFja0JhY2sgPSAxLFxuICAgICAgICBheGlzSGVpZ2h0OiB3aGVlbEF4aXNIZWlnaHRCYWNrID0gLjNcbiAgICB9ID0gYmFjaztcblxuICAgIGNvbnN0IHtcbiAgICAgICAgYXhpc1Bvc2l0aW9uOiBheGlzUG9zaXRpb25Gcm9udCA9IDEuNyxcbiAgICAgICAgcmFkaXVzOiB3aGVlbFJhZGl1c0Zyb250ID0gLjQsXG4gICAgICAgIGhhbGZUcmFjazogd2hlZWxIYWxmVHJhY2tGcm9udCA9IDEsXG4gICAgICAgIGF4aXNIZWlnaHQ6IHdoZWVsQXhpc0hlaWdodEZyb250ID0gLjNcbiAgICB9ID0gZnJvbnQ7XG5cbiAgICBjb25zdCB7IHN0aWZmbmVzcyA9IDIwLjAsIGRhbXBpbmcgPSAyLjMsIGNvbXByZXNzaW9uID0gNC40LCByZXN0TGVuZ3RoID0gMC42IH0gPSBzdXNwZW5zaW9ucztcblxuXG4gICAgLy8gQ2hhc3Npc1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAuNSwgaGVpZ2h0ICogLjUsIGxlbmd0aCAqIC41KSk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7XG4gICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7XG4gICAgY29uc3QgbG9jYWxJbmVydGlhID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAsIDAsIDApO1xuICAgIGdlb21ldHJ5LmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpO1xuICAgIGNvbnN0IGNoYXNzaXMgPSBuZXcgQW1tby5idFJpZ2lkQm9keShuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIGdlb21ldHJ5LCBsb2NhbEluZXJ0aWEpKTtcbiAgICBjaGFzc2lzLnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7XG4gICAgd29ybGQuYWRkUmlnaWRCb2R5KGNoYXNzaXMpO1xuXG5cbiAgICAvLyBSYXljYXN0IFZlaGljbGVcbiAgICBjb25zdCB0dW5pbmcgPSBuZXcgQW1tby5idFZlaGljbGVUdW5pbmcoKTtcbiAgICBjb25zdCByYXlDYXN0ZXIgPSBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkLmdldER5bmFtaWNzV29ybGQoKSk7XG4gICAgY29uc3QgdmVoaWNsZSA9IG5ldyBBbW1vLmJ0UmF5Y2FzdFZlaGljbGUodHVuaW5nLCBjaGFzc2lzLCByYXlDYXN0ZXIpO1xuICAgIHZlaGljbGUuc2V0Q29vcmRpbmF0ZVN5c3RlbSgwLCAxLCAyKTtcbiAgICB3b3JsZC5hZGRBY3Rpb24odmVoaWNsZSk7XG5cbiAgICBjb25zdCB3aGVlbERpcmVjdGlvbkNTMCA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAtMSwgMCk7XG4gICAgY29uc3Qgd2hlZWxBeGxlQ1MgPSBuZXcgQW1tby5idFZlY3RvcjMoLTEsIDAsIDApO1xuXG4gICAgY29uc3QgYWRkV2hlZWwgPSAoaXNGcm9udCwgcG9zLCByYWRpdXMpID0+IHtcblxuICAgICAgICB2YXIgd2hlZWxJbmZvID0gdmVoaWNsZS5hZGRXaGVlbChcbiAgICAgICAgICAgIHBvcyxcbiAgICAgICAgICAgIHdoZWVsRGlyZWN0aW9uQ1MwLFxuICAgICAgICAgICAgd2hlZWxBeGxlQ1MsXG4gICAgICAgICAgICByZXN0TGVuZ3RoLFxuICAgICAgICAgICAgcmFkaXVzLFxuICAgICAgICAgICAgdHVuaW5nLFxuICAgICAgICAgICAgaXNGcm9udCk7XG5cbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3Moc3RpZmZuZXNzKTtcbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdSZWxheGF0aW9uKGRhbXBpbmcpO1xuICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ0NvbXByZXNzaW9uKGNvbXByZXNzaW9uKTtcbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX2ZyaWN0aW9uU2xpcChmcmljdGlvbik7XG4gICAgICAgIHdoZWVsSW5mby5zZXRfbV9yb2xsSW5mbHVlbmNlKHJvbGxJbmZsdWVuY2UpO1xuICAgIH1cblxuICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0Zyb250LCB3aGVlbEF4aXNIZWlnaHRGcm9udCwgYXhpc1Bvc2l0aW9uRnJvbnQpLCB3aGVlbFJhZGl1c0Zyb250KTtcbiAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpO1xuICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7XG4gICAgYWRkV2hlZWwoZmFsc2UsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0JhY2ssIHdoZWVsQXhpc0hlaWdodEJhY2ssIGF4aXNQb3NpdGlvbkJhY2spLCB3aGVlbFJhZGl1c0JhY2spO1xuXG4gICAgdmVoaWNsZS51dWlkID0gdXVpZDtcblxuICAgIHdvcmxkLmFkZEVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBUWVBFUy5WRUhJQ0xFLFxuICAgICAgICB1dWlkLFxuICAgICAgICB2ZWhpY2xlOiB2ZWhpY2xlLFxuICAgICAgICB3aGVlbHMsXG4gICAgICAgIG9wdGlvbnM6IGRhdGEsXG4gICAgICAgIHN0YXRlOiBERUZBVUxUX1ZFSElDTEVfU1RBVEVcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHNldFZlaGljbGVQb3NpdGlvbiA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgcG9zaXRpb24gfSA9IGRhdGE7XG4gICAgY29uc3QgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICkpO1xuXG4gICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0VmVoaWNsZVF1YXRlcm5pb24gPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IHV1aWQsIHF1YXRlcm5pb24gfSA9IGRhdGE7XG4gICAgY29uc3QgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpO1xuXG4gICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzZXRWZWhpY2xlID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCBxdWF0ZXJuaW9uLCBwb3NpdGlvbiB9ID0gZGF0YTtcbiAgICBjb25zdCBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTtcblxuICAgIGNvbnNvbGUubG9nKHF1YXRlcm5pb24pO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkge1xuICAgICAgICBjb25zdCBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuICAgICAgICBcbiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuXG4gICAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICkpO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpO1xuXG4gICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVWZWhpY2xlVXBkYXRlID0gKHsgdmVoaWNsZSwgd2hlZWxzLCB1dWlkLCBzdGF0ZSA9IERFRkFVTFRfVkVISUNMRV9TVEFURSwgb3B0aW9ucyA9IHt9IH0sIGR0KSA9PiB7XG4gICAgbGV0IGJyZWFraW5nRm9yY2UgPSAwO1xuICAgIGxldCBlbmdpbmVGb3JjZSA9IDA7XG5cbiAgICBjb25zdCB7XG4gICAgICAgIHN0ZWVyaW5nQ2xhbXAgPSBERUZBVUxUX1NURUVSSU5HX0NMQU1QLFxuICAgICAgICBzdGVlcmluZ0luY3JlbWVudCA9IERFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5ULFxuICAgICAgICBtYXhFbmdpbmVGb3JjZSA9IERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSxcbiAgICAgICAgbWF4QnJlYWtpbmdGb3JjZSA9IERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBpZiAoc3RhdGUuYWNjZWxlcmF0aW9uKSB7XG4gICAgICAgIGlmIChzcGVlZCA8IC0xKVxuICAgICAgICAgICAgYnJlYWtpbmdGb3JjZSA9IG1heEJyZWFraW5nRm9yY2U7XG4gICAgICAgIGVsc2UgZW5naW5lRm9yY2UgPSBtYXhFbmdpbmVGb3JjZTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmJyYWtpbmcpIHtcbiAgICAgICAgaWYgKHNwZWVkID4gMSlcbiAgICAgICAgICAgIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO1xuICAgICAgICBlbHNlIGVuZ2luZUZvcmNlID0gLW1heEVuZ2luZUZvcmNlIC8gMjtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmxlZnQpIHtcbiAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA8IHN0ZWVyaW5nQ2xhbXApXG4gICAgICAgICAgICBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgKz0gc3RlZXJpbmdJbmNyZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXRlLnJpZ2h0KSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gLXN0ZWVyaW5nQ2xhbXApXG4gICAgICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nIC09IHN0ZWVyaW5nSW5jcmVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA8IC1zdGVlcmluZ0luY3JlbWVudClcbiAgICAgICAgICAgICAgICBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgKz0gc3RlZXJpbmdJbmNyZW1lbnQ7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gc3RlZXJpbmdJbmNyZW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2ZWhpY2xlLmFwcGx5RW5naW5lRm9yY2UoZW5naW5lRm9yY2UsIEJBQ0tfTEVGVCk7XG4gICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX1JJR0hUKTtcblxuICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSAvIDIsIEZST05UX0xFRlQpO1xuICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSAvIDIsIEZST05UX1JJR0hUKTtcbiAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UsIEJBQ0tfTEVGVCk7XG4gICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX1JJR0hUKTtcblxuICAgIHZlaGljbGUuc2V0U3RlZXJpbmdWYWx1ZShzdGF0ZS52ZWhpY2xlU3RlZXJpbmcsIEZST05UX0xFRlQpO1xuICAgIHZlaGljbGUuc2V0U3RlZXJpbmdWYWx1ZShzdGF0ZS52ZWhpY2xlU3RlZXJpbmcsIEZST05UX1JJR0hUKTtcblxuICAgIGxldCB0bSwgcCwgcSwgaTtcbiAgICBjb25zdCBuID0gdmVoaWNsZS5nZXROdW1XaGVlbHMoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHZlaGljbGUudXBkYXRlV2hlZWxUcmFuc2Zvcm0oaSwgdHJ1ZSk7XG4gICAgICAgIHRtID0gdmVoaWNsZS5nZXRXaGVlbFRyYW5zZm9ybVdTKGkpO1xuICAgICAgICBwID0gdG0uZ2V0T3JpZ2luKCk7XG4gICAgICAgIHEgPSB0bS5nZXRSb3RhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IHdoZWVsVVVJRCA9IHdoZWVsc1tpXTtcbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh3aGVlbFVVSUQsIHAsIHEsIGR0KTtcbiAgICB9XG5cbiAgICB0bSA9IHZlaGljbGUuZ2V0Q2hhc3Npc1dvcmxkVHJhbnNmb3JtKCk7XG4gICAgcCA9IHRtLmdldE9yaWdpbigpO1xuICAgIHEgPSB0bS5nZXRSb3RhdGlvbigpO1xuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gdmVoaWNsZS5nZXRGb3J3YXJkVmVjdG9yKCk7XG4gICAgY29uc3Qgc3BlZWQgPSB2ZWhpY2xlLmdldEN1cnJlbnRTcGVlZEttSG91cigpO1xuXG4gICAgY29uc3QgZXh0cmFEYXRhID0ge1xuICAgICAgICBkaXJlY3Rpb246IHtcbiAgICAgICAgICAgIHg6IGRpcmVjdGlvbi54KCksXG4gICAgICAgICAgICB5OiBkaXJlY3Rpb24ueSgpLFxuICAgICAgICAgICAgejogZGlyZWN0aW9uLnooKVxuICAgICAgICB9LFxuICAgICAgICBzcGVlZFxuICAgIH1cblxuXG4gICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBwLCBxLCBkdCwgZXh0cmFEYXRhKTtcbiAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUodXVpZCwgc3RhdGUpO1xufSIsImltcG9ydCB7IEVYUExPU0lPTl9TSVpFUywgRVhQTE9TSU9OX1NUUkVOR1RIUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB3b3JsZCBmcm9tIFwiLi93b3JsZFwiO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlR2hvc3RDb2xsaWRlciA9IChyYWRpdXMsIHBvc2l0aW9uKSA9PiB7XG4gICAgY29uc3QgZ2hvc3RDb2xsaWRlciA9IG5ldyBBbW1vLmJ0R2hvc3RPYmplY3QoKTtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgZ2hvc3RDb2xsaWRlci5zZXRDb2xsaXNpb25TaGFwZShuZXcgQW1tby5idFNwaGVyZVNoYXBlKHJhZGl1cykpO1xuICAgIGdob3N0Q29sbGlkZXIuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpO1xuICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4ocG9zaXRpb24pO1xuICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24oMCwgMCwgMCwgMSkpO1xuXG4gICAgZ2hvc3RDb2xsaWRlci5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuXG4gICAgcmV0dXJuIHsgZ2hvc3RDb2xsaWRlciwgdHJhbnNmb3JtIH07XG59O1xuXG5leHBvcnQgY29uc3QgZm9yRWFjaEdob3N0Q29sbGlzaW9uID0gKGdob3N0Q29sbGlkZXIsIGZvckVhY2hDYWxsYmFjayA9ICgpID0+IHt9KSA9PiB7XG4gICAgY29uc3QgY29sbGlzaW9ucyA9IGdob3N0Q29sbGlkZXIuZ2V0TnVtT3ZlcmxhcHBpbmdPYmplY3RzKCk7XG4gICAgZm9yIChsZXQgaT0wOyBpPGNvbGxpc2lvbnM7IGkrKykge1xuICAgICAgICBjb25zdCBvYmplY3QgPSBBbW1vLmNhc3RPYmplY3QoZ2hvc3RDb2xsaWRlci5nZXRPdmVybGFwcGluZ09iamVjdChpKSwgQW1tby5idFJpZ2lkQm9keSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgb2JqZWN0LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGZvckVhY2hDYWxsYmFjayhvYmplY3QsIHRyYW5zZm9ybSwgaSk7XG5cbiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0RXhwbG9zaW9uUG9zaXRpb24gPSAodXVpZCwgcG9zaXRpb24pID0+IHtcbiAgICBsZXQgZXhwbG9zaW9uUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICBpZiAoIWV4cGxvc2lvblBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHsgYm9keSB9ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTtcbiAgICAgICAgY29uc3QgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICAgICAgZXhwbG9zaW9uUG9zaXRpb24gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGxvc2lvblBvc2l0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cGxvc2lvbkltcHVsc2UgPSAocG9zaXRpb24sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkgPT4ge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gcG9zaXRpb24ub3Bfc3ViKGV4cGxvc2lvblBvc2l0aW9uKTtcbiAgICBkaXN0YW5jZS5ub3JtYWxpemUoKTtcbiAgICBjb25zdCBpbXB1bHNlID0gZGlzdGFuY2Uub3BfbXVsKHN0cmVuZ3RoKTtcblxuICAgIGltcHVsc2Uuc2V0WShpbXB1bHNlLnkoKSArIHN0cmVuZ3RoKTtcblxuICAgIHJldHVybiBpbXB1bHNlO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlRXhwbG9zaW9uID0gKHtcbiAgICB1dWlkLFxuICAgIHBvc2l0aW9uLFxuICAgIHJhZGl1cyA9IEVYUExPU0lPTl9TSVpFUy5TTUFMTCxcbiAgICBzdHJlbmd0aCA9IEVYUExPU0lPTl9TVFJFTkdUSFMuTUVESVVNXG59KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXhwbG9zaW9uUG9zaXRpb24gPSBnZXRFeHBsb3Npb25Qb3NpdGlvbih1dWlkLCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IHsgZ2hvc3RDb2xsaWRlciwgdHJhbnNmb3JtIH0gPSBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgZXhwbG9zaW9uUG9zaXRpb24pO1xuXG4gICAgICAgIHdvcmxkLmFkZENvbGxpc2lvbk9iamVjdChnaG9zdENvbGxpZGVyKTtcblxuICAgICAgICBmb3JFYWNoR2hvc3RDb2xsaXNpb24oZ2hvc3RDb2xsaWRlciwgKG9iamVjdCwgb2JqZWN0VHJhbnNmb3JtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW4gPSBvYmplY3RUcmFuc2Zvcm0uZ2V0T3JpZ2luKCk7XG4gICAgICAgICAgICBvYmplY3QuYWN0aXZhdGUodHJ1ZSk7XG4gICAgICAgICAgICBvYmplY3QuYXBwbHlDZW50cmFsSW1wdWxzZShnZXRFeHBsb3Npb25JbXB1bHNlKG9yaWdpbiwgZXhwbG9zaW9uUG9zaXRpb24sIHN0cmVuZ3RoKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdvcmxkLmdldER5bmFtaWNzV29ybGQoKS5yZW1vdmVDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7XG4gICAgICAgIEFtbW8uZGVzdHJveShnaG9zdENvbGxpZGVyKTtcbiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cbn0iLCJpbXBvcnQge1xuICAgIExJQlJBUllfTkFNRVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5pbXBvcnQgeyBhZGRWZWhpY2xlLCByZXNldFZlaGljbGUsIHNldFZlaGljbGVQb3NpdGlvbiwgc2V0VmVoaWNsZVF1YXRlcm5pb24gfSBmcm9tICcuL3ZlaGljbGVzJztcbmltcG9ydCB7IGFkZEJveCwgYWRkTW9kZWwsIHNldExpbmVhclZlbG9jaXR5LCBhcHBseUltcHVzZSwgYWRkU3BoZXJlLCBzZXRQb3NpdGlvbiB9IGZyb20gJy4vZWxlbWVudHMnO1xuaW1wb3J0IHsgY3JlYXRlRXhwbG9zaW9uIH0gZnJvbSAnLi9lZmZlY3RzJztcbmltcG9ydCB7IGFkZFBsYXllciB9IGZyb20gJy4vcGxheWVyJztcblxuaW1wb3J0IGRpc3BhdGNoZXIgZnJvbSAnLi9saWIvZGlzcGF0Y2hlcic7XG5pbXBvcnQgd29ybGQgZnJvbSAnLi93b3JsZCc7XG5pbXBvcnQgeyBQSFlTSUNTX0VWRU5UUyB9IGZyb20gJy4uL21lc3NhZ2VzJztcblxuY29uc3QgaGFuZGxlTG9hZEV2ZW50ID0gb3B0aW9ucyA9PiBBbW1vID0+IHtcbiAgICBzZWxmLkFtbW8gPSBBbW1vO1xuXG4gICAgb25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgIHN3aXRjaChkYXRhLmV2ZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5CT1g6XG4gICAgICAgICAgICAgICAgYWRkQm94KGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuU1BIRVJFOlxuICAgICAgICAgICAgICAgIGFkZFNwaGVyZShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlZFSElDTEU6XG4gICAgICAgICAgICAgICAgYWRkVmVoaWNsZShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELk1PREVMOlxuICAgICAgICAgICAgICAgIGFkZE1vZGVsKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuUExBWUVSOlxuICAgICAgICAgICAgICAgIGFkZFBsYXllcihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5TRVQuTElORUFSX1ZFTE9DSVRZOlxuICAgICAgICAgICAgICAgIHNldExpbmVhclZlbG9jaXR5KGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5QT1NJVElPTjpcbiAgICAgICAgICAgICAgICBzZXRQb3NpdGlvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TRVQuUE9TSVRJT046XG4gICAgICAgICAgICAgICAgc2V0VmVoaWNsZVBvc2l0aW9uKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5RVUFURVJOSU9OOlxuICAgICAgICAgICAgICAgIHNldFZlaGljbGVRdWF0ZXJuaW9uKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlJFU0VUOlxuICAgICAgICAgICAgICAgIHJlc2V0VmVoaWNsZShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5BUFBMWS5JTVBVTFNFOlxuICAgICAgICAgICAgICAgIGFwcGx5SW1wdXNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlVQREFURTpcbiAgICAgICAgICAgICAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuRElTUE9TRTpcbiAgICAgICAgICAgICAgICB3b3JsZC5kaXNwb3NlQm9keShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUZGRUNUUy5FWFBMT1NJT046XG4gICAgICAgICAgICAgICAgY3JlYXRlRXhwbG9zaW9uKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEU6XG4gICAgICAgICAgICAgICAgd29ybGQudGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3b3JsZC5pbml0KG9wdGlvbnMpO1xuICAgIGRpc3BhdGNoZXIuc2VuZFJlYWR5RXZlbnQoKTtcbiAgICB3b3JsZC5zaW11bGF0ZSgpXG59O1xuXG5jb25zdCBsb2FkQW1tbyA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgc2NyaXB0VXJsID0gb3B0aW9ucy5ob3N0ICsgJy8nICsgKG9wdGlvbnMucGF0aCB8fCBMSUJSQVJZX05BTUUpO1xuICAgIGltcG9ydFNjcmlwdHMoc2NyaXB0VXJsKTtcblxuICAgIEFtbW8oKS50aGVuKGhhbmRsZUxvYWRFdmVudChvcHRpb25zKSk7XG59O1xuXG5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICBzd2l0Y2goZGF0YS5ldmVudCkge1xuICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkxPQUQuQU1NTzpcbiAgICAgICAgICAgIGxvYWRBbW1vKGRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59Il0sIm5hbWVzIjpbIkxJQlJBUllfTkFNRSIsIlRZUEVTIiwiQk9YIiwiU1BIRVJFIiwiVkVISUNMRSIsIk1FU0giLCJQTEFZRVIiLCJERUZBVUxUX1ZFSElDTEVfU1RBVEUiLCJ2ZWhpY2xlU3RlZXJpbmciLCJhY2NlbGVyYXRpb24iLCJicmVha2luZyIsInJpZ2h0IiwibGVmdCIsIkRFRkFVTFRfUklHSURCT0RZX1NUQVRFIiwidmVsb2NpdHkiLCJ4IiwieSIsInoiLCJtb3ZlbWVudCIsImZvcndhcmQiLCJiYWNrd2FyZHMiLCJkaXJlY3Rpb24iLCJERUZBVUxUX1NDQUxFIiwiREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkiLCJERUZBVUxUX0lNUFVMU0UiLCJESVNBQkxFX0RFQUNUSVZBVElPTiIsIkdSQVZJVFkiLCJGUk9OVF9MRUZUIiwiRlJPTlRfUklHSFQiLCJCQUNLX0xFRlQiLCJCQUNLX1JJR0hUIiwiREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQiLCJERUZBVUxUX1NURUVSSU5HX0NMQU1QIiwiREVGQVVMVF9NQVhfRU5HSU5FX0ZPUkNFIiwiREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UiLCJFWFBMT1NJT05fU0laRVMiLCJTTUFMTCIsIk1FRElVTSIsIkxBUkdFIiwiTUFTU0lWRSIsIkVYUExPU0lPTl9TVFJFTkdUSFMiLCJWRVJZX1dFQUsiLCJXRUFLIiwiT0tfTk8iLCJQSFlTSUNTX0VWRU5UUyIsIkRJU1BBVENIIiwiVEVSTUlOQVRFIiwiTE9BRCIsIkFNTU8iLCJSRUFEWSIsIklOSVQiLCJVUERBVEUiLCJBREQiLCJNT0RFTCIsIkVMRU1FTlQiLCJESVNQT1NFIiwiQ09MTElTSU9OIiwiQ1JFQVRFRCIsIlNFVCIsIlBPU0lUSU9OIiwiUVVBVEVSTklPTiIsIkxJTkVBUl9WRUxPQ0lUWSIsIkFQUExZIiwiSU1QVUxTRSIsIlJFU0VUIiwiU1BFRUQiLCJESVJFQ1RJT04iLCJFRkZFQ1RTIiwiRVhQTE9TSU9OIiwiRGlzcGF0Y2hlciIsImR0IiwicG9zdE1lc3NhZ2UiLCJldmVudCIsInV1aWQiLCJwb3NpdGlvbiIsInJvdGF0aW9uIiwiZXh0cmFEYXRhIiwicXVhdGVybmlvbiIsInciLCJldmVudE5hbWUiLCJldmVudERhdGEiLCJhcHBseU1hdHJpeDRUb1ZlY3RvcjMiLCJtYXRyaXgiLCJjcmVhdGVSaWdpZEJvZHkiLCJzaGFwZSIsIm9wdGlvbnMiLCJtYXNzIiwiZnJpY3Rpb24iLCJyZXN0aXR1dGlvbiIsImRhbXBpbmciLCJsaW5lYXIiLCJhbmd1bGFyIiwidHJhbnNmb3JtIiwiQW1tbyIsImJ0VHJhbnNmb3JtIiwic2V0SWRlbnRpdHkiLCJzZXRPcmlnaW4iLCJidFZlY3RvcjMiLCJzZXRSb3RhdGlvbiIsImJ0UXVhdGVybmlvbiIsIm1vdGlvblN0YXRlIiwiYnREZWZhdWx0TW90aW9uU3RhdGUiLCJsb2NhbEluZXJ0aWEiLCJjYWxjdWxhdGVMb2NhbEluZXJ0aWEiLCJyYkluZm8iLCJidFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8iLCJib2R5IiwiYnRSaWdpZEJvZHkiLCJzZXRGcmljdGlvbiIsInNldFJlc3RpdHV0aW9uIiwic2V0RGFtcGluZyIsInNldEFjdGl2YXRpb25TdGF0ZSIsIndvcmxkIiwiYWRkUmlnaWRCb2R5IiwiYWRkTW9kZWwiLCJ2ZXJ0aWNlcyIsIm1hdHJpY2VzIiwiaW5kZXhlcyIsInNjYWxlIiwiYnRhIiwiYnRiIiwiYnRjIiwidHJpTWVzaCIsImJ0VHJpYW5nbGVNZXNoIiwiaSIsImxlbmd0aCIsImNvbXBvbmVudHMiLCJpbmRleCIsIkFycmF5IiwiZnJvbSIsImoiLCJhaSIsImJpIiwiY2kiLCJ2YSIsInZiIiwidmMiLCJzZXRWYWx1ZSIsImFkZFRyaWFuZ2xlIiwibG9jYWxTY2FsZSIsInNldFNjYWxpbmciLCJkZXN0cm95IiwiY29sbGlzaW9uU2hhcGUiLCJidEJ2aFRyaWFuZ2xlTWVzaFNoYXBlIiwicmVzb3VyY2VzIiwiYWRkRWxlbWVudCIsInR5cGUiLCJzdGF0ZSIsImFkZEJveCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsImdlb21ldHJ5IiwiYnRCb3hTaGFwZSIsImFkZFNwaGVyZSIsInJhZGl1cyIsImJ0U3BoZXJlU2hhcGUiLCJzZXRMaW5lYXJWZWxvY2l0eSIsImdldEVsZW1lbnQiLCJnZXRNb3Rpb25TdGF0ZSIsImxpbmVhclZlbG9jaXR5Iiwic2V0UG9zaXRpb24iLCJnZXRXb3JsZFRyYW5zZm9ybSIsInNldFdvcmxkVHJhbnNmb3JtIiwiYXBwbHlJbXB1c2UiLCJpbXB1bHNlIiwiaW1wdWxzZVZlY3RvciIsImFwcGx5Q2VudHJhbEltcHVsc2UiLCJoYW5kbGVFbGVtZW50VXBkYXRlIiwib3JpZ2luIiwiZ2V0T3JpZ2luIiwiZ2V0Um90YXRpb24iLCJkaXNwYXRjaGVyIiwic2VuZEJvZHlVcGRhdGUiLCJhZGRQbGF5ZXIiLCJjYXBzdWxlIiwiYnRDYXBzdWxlU2hhcGUiLCJzZXRBbmd1bGFyRmFjdG9yIiwiaGFuZGxlUGxheWVyVXBkYXRlIiwiY2FtZXJhRGlyZWN0aW9uIiwiTUFYX1NQRUVEIiwid2Fsa1ZlbG9jaXR5IiwiZ2V0TGluZWFyVmVsb2NpdHkiLCJzcGVlZCIsImZvcndhcmREaXIiLCJnZXRCYXNpcyIsImdldFJvdyIsIm5vcm1hbGl6ZSIsIndhbGtEaXJlY3Rpb24iLCJ3YWxrU3BlZWQiLCJzZXRYIiwic2V0WiIsInNldENlbnRlck9mTWFzc1RyYW5zZm9ybSIsIkNsb2NrIiwidGltZXN0YW1wIiwidGltZSIsIkRhdGUiLCJub3ciLCJkZWx0YSIsIldvcmxkIiwiZ3Jhdml0eSIsImNvbGxpc2lvbkNvbmZpZ3VyYXRpb24iLCJidERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uIiwiYnRDb2xsaXNpb25EaXNwYXRjaGVyIiwiYnJvYWRwaGFzZSIsImJ0RGJ2dEJyb2FkcGhhc2UiLCJzb2x2ZXIiLCJidFNlcXVlbnRpYWxJbXB1bHNlQ29uc3RyYWludFNvbHZlciIsImR5bmFtaWNzV29ybGQiLCJidERpc2NyZXRlRHluYW1pY3NXb3JsZCIsInNldEdyYXZpdHkiLCJnZXRCcm9hZHBoYXNlIiwiZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUiLCJzZXRJbnRlcm5hbEdob3N0UGFpckNhbGxiYWNrIiwiYnRHaG9zdFBhaXJDYWxsYmFjayIsImluaXRpYWxpc2VkIiwiaGFzRWxlbWVudCIsImVsZW1lbnRzIiwiZGVsZXRlZCIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJmb3JFYWNoIiwiaW5jbHVkZXMiLCJhY3Rpb24iLCJhZGRBY3Rpb24iLCJjb2xsaXNpb25PYmplY3QiLCJhZGRDb2xsaXNpb25PYmplY3QiLCJzdGVwU2ltdWxhdGlvbiIsImNsb2NrIiwiZ2V0RGVsdGEiLCJlbGVtZW50IiwiaGFuZGxlVmVoaWNsZVVwZGF0ZSIsImNhbGN1bGF0ZUNvbGxpc2lvbnMiLCJyZW1vdmVEZWxldGVkRWxlbWVudHMiLCJzZW5kUGh5c2ljc1VwZGF0ZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZUlkIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2ltdWxhdGUiLCJiaW5kIiwiYW1tb0Rpc3BhdGNoZXIiLCJnZXREaXNwYXRjaGVyIiwibnVtTWFuaWZvbGRzIiwiZ2V0TnVtTWFuaWZvbGRzIiwiY29udGFjdE1hbmlmb2xkIiwiZ2V0TWFuaWZvbGRCeUluZGV4SW50ZXJuYWwiLCJyYjAiLCJjYXN0T2JqZWN0IiwiZ2V0Qm9keTAiLCJyYjEiLCJnZXRCb2R5MSIsIm51bUNvbnRhY3RzIiwiZ2V0TnVtQ29udGFjdHMiLCJjb250YWN0cyIsImNvbnRhY3RQb2ludCIsImdldENvbnRhY3RQb2ludCIsImRpc3RhbmNlIiwiZ2V0RGlzdGFuY2UiLCJ2ZWxvY2l0eTAiLCJ2ZWxvY2l0eTEiLCJ3b3JsZFBvczAiLCJnZXRfbV9wb3NpdGlvbldvcmxkT25BIiwid29ybGRQb3MxIiwiZ2V0X21fcG9zaXRpb25Xb3JsZE9uQiIsImxvY2FsUG9zMCIsImdldF9tX2xvY2FsUG9pbnRBIiwibG9jYWxQb3MxIiwiZ2V0X21fbG9jYWxQb2ludEIiLCJwdXNoIiwid29ybGRQb3MiLCJsb2NhbFBvcyIsInNlbmREaXNwYXRjaEV2ZW50IiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJzZW5kVGVybWluYXRlRXZlbnQiLCJ1bmRlZmluZWQiLCJyZW1vdmVSaWdpZEJvZHkiLCJyZW1vdmVFbGVtZW50Iiwic2VuZEVsZW1lbnREaXNwb3NlZCIsIkRFRkFVTFRfUk9MTF9JTkZMVUVOQ0UiLCJERUZBVUxUX0ZSSUNUSU9OIiwiREVGQVVMVF9NQVNTIiwiYWRkVmVoaWNsZSIsIndoZWVscyIsInJvbGxJbmZsdWVuY2UiLCJ3aGVlbHNPcHRpb25zIiwic3VzcGVuc2lvbnMiLCJiYWNrIiwiZnJvbnQiLCJheGlzUG9zaXRpb24iLCJheGlzUG9zaXRpb25CYWNrIiwid2hlZWxSYWRpdXNCYWNrIiwiaGFsZlRyYWNrIiwid2hlZWxIYWxmVHJhY2tCYWNrIiwiYXhpc0hlaWdodCIsIndoZWVsQXhpc0hlaWdodEJhY2siLCJheGlzUG9zaXRpb25Gcm9udCIsIndoZWVsUmFkaXVzRnJvbnQiLCJ3aGVlbEhhbGZUcmFja0Zyb250Iiwid2hlZWxBeGlzSGVpZ2h0RnJvbnQiLCJzdGlmZm5lc3MiLCJjb21wcmVzc2lvbiIsInJlc3RMZW5ndGgiLCJjaGFzc2lzIiwidHVuaW5nIiwiYnRWZWhpY2xlVHVuaW5nIiwicmF5Q2FzdGVyIiwiYnREZWZhdWx0VmVoaWNsZVJheWNhc3RlciIsImdldER5bmFtaWNzV29ybGQiLCJ2ZWhpY2xlIiwiYnRSYXljYXN0VmVoaWNsZSIsInNldENvb3JkaW5hdGVTeXN0ZW0iLCJ3aGVlbERpcmVjdGlvbkNTMCIsIndoZWVsQXhsZUNTIiwiYWRkV2hlZWwiLCJpc0Zyb250IiwicG9zIiwid2hlZWxJbmZvIiwic2V0X21fc3VzcGVuc2lvblN0aWZmbmVzcyIsInNldF9tX3doZWVsc0RhbXBpbmdSZWxheGF0aW9uIiwic2V0X21fd2hlZWxzRGFtcGluZ0NvbXByZXNzaW9uIiwic2V0X21fZnJpY3Rpb25TbGlwIiwic2V0X21fcm9sbEluZmx1ZW5jZSIsInNldFZlaGljbGVQb3NpdGlvbiIsImdldFJpZ2lkQm9keSIsInNldFZlaGljbGVRdWF0ZXJuaW9uIiwicmVzZXRWZWhpY2xlIiwiY29uc29sZSIsImxvZyIsImJyZWFraW5nRm9yY2UiLCJlbmdpbmVGb3JjZSIsInN0ZWVyaW5nQ2xhbXAiLCJzdGVlcmluZ0luY3JlbWVudCIsIm1heEVuZ2luZUZvcmNlIiwibWF4QnJlYWtpbmdGb3JjZSIsImJyYWtpbmciLCJhcHBseUVuZ2luZUZvcmNlIiwic2V0QnJha2UiLCJzZXRTdGVlcmluZ1ZhbHVlIiwidG0iLCJwIiwicSIsIm4iLCJnZXROdW1XaGVlbHMiLCJ1cGRhdGVXaGVlbFRyYW5zZm9ybSIsImdldFdoZWVsVHJhbnNmb3JtV1MiLCJ3aGVlbFVVSUQiLCJnZXRDaGFzc2lzV29ybGRUcmFuc2Zvcm0iLCJnZXRGb3J3YXJkVmVjdG9yIiwiZ2V0Q3VycmVudFNwZWVkS21Ib3VyIiwidXBkYXRlQm9keVN0YXRlIiwiY3JlYXRlR2hvc3RDb2xsaWRlciIsImdob3N0Q29sbGlkZXIiLCJidEdob3N0T2JqZWN0Iiwic2V0Q29sbGlzaW9uU2hhcGUiLCJmb3JFYWNoR2hvc3RDb2xsaXNpb24iLCJmb3JFYWNoQ2FsbGJhY2siLCJjb2xsaXNpb25zIiwiZ2V0TnVtT3ZlcmxhcHBpbmdPYmplY3RzIiwib2JqZWN0IiwiZ2V0T3ZlcmxhcHBpbmdPYmplY3QiLCJnZXRFeHBsb3Npb25Qb3NpdGlvbiIsImV4cGxvc2lvblBvc2l0aW9uIiwiZ2V0RXhwbG9zaW9uSW1wdWxzZSIsInN0cmVuZ3RoIiwib3Bfc3ViIiwib3BfbXVsIiwic2V0WSIsImNyZWF0ZUV4cGxvc2lvbiIsIm9iamVjdFRyYW5zZm9ybSIsImFjdGl2YXRlIiwicmVtb3ZlQ29sbGlzaW9uT2JqZWN0IiwiZSIsImhhbmRsZUxvYWRFdmVudCIsInNlbGYiLCJvbm1lc3NhZ2UiLCJkaXNwb3NlQm9keSIsInRlcm1pbmF0ZSIsImluaXQiLCJzZW5kUmVhZHlFdmVudCIsImxvYWRBbW1vIiwic2NyaXB0VXJsIiwiaG9zdCIsInBhdGgiLCJpbXBvcnRTY3JpcHRzIiwidGhlbiJdLCJtYXBwaW5ncyI6Ijs7O0lBQU8sSUFBTUEsWUFBWSxHQUFHLFNBQXJCO0lBRUEsSUFBTUMsS0FBSyxHQUFHO0lBQ2pCQyxFQUFBQSxHQUFHLEVBQUUsS0FEWTtJQUVqQkMsRUFBQUEsTUFBTSxFQUFFLFFBRlM7SUFHakJDLEVBQUFBLE9BQU8sRUFBRSxTQUhRO0lBSWpCQyxFQUFBQSxJQUFJLEVBQUUsTUFKVztJQUtqQkMsRUFBQUEsTUFBTSxFQUFFO0lBTFMsQ0FBZDtJQWVBLElBQU1DLHFCQUFxQixHQUFHO0lBQ2pDQyxFQUFBQSxlQUFlLEVBQUUsQ0FEZ0I7SUFFakNDLEVBQUFBLFlBQVksRUFBRSxLQUZtQjtJQUdqQ0MsRUFBQUEsUUFBUSxFQUFFLEtBSHVCO0lBSWpDQyxFQUFBQSxLQUFLLEVBQUUsS0FKMEI7SUFLakNDLEVBQUFBLElBQUksRUFBRTtJQUwyQixDQUE5QjtJQVFBLElBQU1DLHVCQUF1QixHQUFHO0lBQ25DQyxFQUFBQSxRQUFRLEVBQUU7SUFBRUMsSUFBQUEsQ0FBQyxFQUFFLENBQUw7SUFBUUMsSUFBQUEsQ0FBQyxFQUFFLENBQVg7SUFBY0MsSUFBQUEsQ0FBQyxFQUFFO0lBQWpCLEdBRHlCO0lBRW5DQyxFQUFBQSxRQUFRLEVBQUU7SUFDTkMsSUFBQUEsT0FBTyxFQUFFLEtBREg7SUFFTkMsSUFBQUEsU0FBUyxFQUFF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', false);
57552
57549
  /* eslint-enable */var PHYSICS_EVENTS = {
57553
57550
  DISPATCH: 'physics:dispatch',
57554
57551
  TERMINATE: 'physics:terminate',
@@ -57605,6 +57602,9 @@ var getProportion = function getProportion(max1, b, max2) {
57605
57602
  var clamp = function clamp(value, min, max) {
57606
57603
  return value < min ? min : value > max ? max : value;
57607
57604
  };
57605
+ var isWithin = function isWithin(value, min, max) {
57606
+ return value >= min && value < max;
57607
+ };
57608
57608
  var randomIntFromInterval = function randomIntFromInterval(min, max) {
57609
57609
  // min and max included
57610
57610
  return Math.floor(Math.random() * (max - min + 1) + min);
@@ -57718,7 +57718,7 @@ var smoothDampAngle = function smoothDampAngle(current, target, currentVelocity,
57718
57718
  var dt = arguments.length > 5 ? arguments[5] : undefined;
57719
57719
  target = current + deltaAngle(current, target);
57720
57720
  return smoothDamp(current, target, currentVelocity, smoothTime, maxSpeed, dt);
57721
- };var math=/*#__PURE__*/Object.freeze({__proto__:null,PI: PI,PI_2: PI_2,pickRandom: pickRandom,degToRad: degToRad,getProportion: getProportion,clamp: clamp,randomIntFromInterval: randomIntFromInterval,getDistance: getDistance,findPointBetweenAtDistance: findPointBetweenAtDistance,lerpVectors: lerpVectors,lerp: lerp,scaleVector: scaleVector,getSphereVolume: getSphereVolume,repeat: repeat,deltaAngle: deltaAngle,smoothDamp: smoothDamp,smoothDampAngle: smoothDampAngle});var LIBRARY_NAME = 'ammo.js';
57721
+ };var math=/*#__PURE__*/Object.freeze({__proto__:null,PI: PI,PI_2: PI_2,pickRandom: pickRandom,degToRad: degToRad,getProportion: getProportion,clamp: clamp,isWithin: isWithin,randomIntFromInterval: randomIntFromInterval,getDistance: getDistance,findPointBetweenAtDistance: findPointBetweenAtDistance,lerpVectors: lerpVectors,lerp: lerp,scaleVector: scaleVector,getSphereVolume: getSphereVolume,repeat: repeat,deltaAngle: deltaAngle,smoothDamp: smoothDamp,smoothDampAngle: smoothDampAngle});var LIBRARY_NAME = 'ammo.js';
57722
57722
  var TYPES = {
57723
57723
  BOX: 'BOX',
57724
57724
  SPHERE: 'SPHERE',
@@ -58093,26 +58093,44 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
58093
58093
  }
58094
58094
  });
58095
58095
 
58096
- _defineProperty(_assertThisInitialized(_this), "setVehiclePosition", function (vehicle, position) {
58096
+ _defineProperty(_assertThisInitialized(_this), "setVehiclePosition", function (vehicle, _ref5) {
58097
+ var x = _ref5.x,
58098
+ y = _ref5.y,
58099
+ z = _ref5.z;
58100
+
58097
58101
  if (Config$1.physics().enabled) {
58098
58102
  var uuid = vehicle.uuid();
58099
58103
 
58100
58104
  _this.worker.postMessage({
58101
58105
  event: PHYSICS_EVENTS.VEHICLE.SET.POSITION,
58102
58106
  uuid: uuid,
58103
- position: position
58107
+ position: {
58108
+ x: x,
58109
+ y: y,
58110
+ z: z
58111
+ }
58104
58112
  });
58105
58113
  }
58106
58114
  });
58107
58115
 
58108
- _defineProperty(_assertThisInitialized(_this), "setVehicleQuaternion", function (vehicle, quaternion) {
58116
+ _defineProperty(_assertThisInitialized(_this), "setVehicleQuaternion", function (vehicle, _ref6) {
58117
+ var x = _ref6.x,
58118
+ y = _ref6.y,
58119
+ z = _ref6.z,
58120
+ w = _ref6.w;
58121
+
58109
58122
  if (Config$1.physics().enabled) {
58110
58123
  var uuid = vehicle.uuid();
58111
58124
 
58112
58125
  _this.worker.postMessage({
58113
58126
  event: PHYSICS_EVENTS.VEHICLE.SET.QUATERNION,
58114
58127
  uuid: uuid,
58115
- quaternion: quaternion
58128
+ quaternion: {
58129
+ x: x,
58130
+ y: y,
58131
+ z: z,
58132
+ w: w
58133
+ }
58116
58134
  });
58117
58135
  }
58118
58136
  });
@@ -58124,8 +58142,17 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
58124
58142
  _this.worker.postMessage({
58125
58143
  event: PHYSICS_EVENTS.VEHICLE.RESET,
58126
58144
  uuid: uuid,
58127
- quaternion: quaternion,
58128
- position: position
58145
+ quaternion: {
58146
+ x: quaternion.x,
58147
+ y: quaternion.y,
58148
+ z: quaternion.z,
58149
+ w: quaternion.w
58150
+ },
58151
+ position: {
58152
+ x: position.x,
58153
+ y: position.y,
58154
+ z: position.z
58155
+ }
58129
58156
  });
58130
58157
  }
58131
58158
  });
@@ -60426,7 +60453,7 @@ var Entity = /*#__PURE__*/function (_EventDispatcher) {
60426
60453
  var _add = function _add(toAdd) {
60427
60454
  _this2.children.push(toAdd);
60428
60455
 
60429
- _this2.body.add(toAdd.getBody());
60456
+ _this2.getBody().add(toAdd.getBody());
60430
60457
  };
60431
60458
 
60432
60459
  if (Array.isArray(element)) {
@@ -62458,8 +62485,6 @@ var Element = /*#__PURE__*/function (_Entity) {
62458
62485
  this.body.material.color = new Color(color);
62459
62486
  } else {
62460
62487
  this.body.traverse(function (child) {
62461
- debugger;
62462
-
62463
62488
  if (hasMaterial(child) && !_this2.isParentOf(child)) {
62464
62489
  child.material.color = new Color(color);
62465
62490
  }
@@ -75308,30 +75333,42 @@ var LightLoader$1 = new LightLoader();var Pass = /*#__PURE__*/function () {
75308
75333
  return Pass;
75309
75334
  }(); // Helper for passes that need to fill the viewport with a single quad.
75310
75335
 
75311
- Pass.FullScreenQuad = function () {
75312
- var camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1);
75313
- var geometry = new PlaneGeometry(2, 2);
75336
+ var _camera$1 = new OrthographicCamera(-1, 1, 1, -1, 0, 1); // https://github.com/mrdoob/three.js/pull/21358
75314
75337
 
75315
- var FullScreenQuad = function FullScreenQuad(material) {
75316
- this._mesh = new Mesh(geometry, material);
75317
- };
75318
75338
 
75319
- Object.defineProperty(FullScreenQuad.prototype, 'material', {
75339
+ var _geometry$1 = new BufferGeometry();
75340
+
75341
+ _geometry$1.setAttribute('position', new Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3));
75342
+
75343
+ _geometry$1.setAttribute('uv', new Float32BufferAttribute([0, 2, 0, 0, 2, 0], 2));
75344
+
75345
+ var FullScreenQuad = /*#__PURE__*/function () {
75346
+ function FullScreenQuad(material) {
75347
+ _classCallCheck(this, FullScreenQuad);
75348
+
75349
+ this._mesh = new Mesh(_geometry$1, material);
75350
+ }
75351
+
75352
+ _createClass(FullScreenQuad, [{
75353
+ key: "dispose",
75354
+ value: function dispose() {
75355
+ this._mesh.geometry.dispose();
75356
+ }
75357
+ }, {
75358
+ key: "render",
75359
+ value: function render(renderer) {
75360
+ renderer.render(this._mesh, _camera$1);
75361
+ }
75362
+ }, {
75363
+ key: "material",
75320
75364
  get: function get() {
75321
75365
  return this._mesh.material;
75322
75366
  },
75323
75367
  set: function set(value) {
75324
75368
  this._mesh.material = value;
75325
75369
  }
75326
- });
75327
- Object.assign(FullScreenQuad.prototype, {
75328
- dispose: function dispose() {
75329
- this._mesh.geometry.dispose();
75330
- },
75331
- render: function render(renderer) {
75332
- renderer.render(this._mesh, camera);
75333
- }
75334
- });
75370
+ }]);
75371
+
75335
75372
  return FullScreenQuad;
75336
75373
  }();var ShaderPass = /*#__PURE__*/function (_Pass) {
75337
75374
  _inherits(ShaderPass, _Pass);
@@ -75359,7 +75396,7 @@ Pass.FullScreenQuad = function () {
75359
75396
  });
75360
75397
  }
75361
75398
 
75362
- _this.fsQuad = new Pass.FullScreenQuad(_this.material);
75399
+ _this.fsQuad = new FullScreenQuad(_this.material);
75363
75400
  return _this;
75364
75401
  }
75365
75402
 
@@ -75906,7 +75943,7 @@ var BloomPass = /*#__PURE__*/function (_Pass) {
75906
75943
  }
75907
75944
  });
75908
75945
  _this.needsSwap = false;
75909
- _this.fsQuad = new Pass.FullScreenQuad(null);
75946
+ _this.fsQuad = new FullScreenQuad(null);
75910
75947
  _this.renderToScreen = renderToScreen;
75911
75948
  return _this;
75912
75949
  }
@@ -76035,7 +76072,7 @@ var BokehShader = {
76035
76072
  });
76036
76073
  _this.uniforms = bokehUniforms;
76037
76074
  _this.needsSwap = false;
76038
- _this.fsQuad = new Pass.FullScreenQuad(_this.materialBokeh);
76075
+ _this.fsQuad = new FullScreenQuad(_this.materialBokeh);
76039
76076
  _this._oldClearColor = new Color();
76040
76077
  _this.renderToScreen = renderToScreen;
76041
76078
  return _this;
@@ -76114,7 +76151,464 @@ var BokehShader = {
76114
76151
  }
76115
76152
 
76116
76153
  return DepthOfField;
76117
- }(BokehPass);/**
76154
+ }(BokehPass);var MAX_EDGE_THICKNESS = 4;
76155
+ var MAX_EDGE_GLOW = 4;
76156
+ var BlurDirectionX = new Vector2(1.0, 0.0);
76157
+ var BlurDirectionY = new Vector2(0.0, 1.0);
76158
+
76159
+ var replaceDepthToViewZ = function replaceDepthToViewZ(string, camera) {
76160
+ var type = camera.isPerspectiveCamera ? 'perspective' : 'orthographic';
76161
+ return string.replace(/DEPTH_TO_VIEW_Z/g, type + 'DepthToViewZ');
76162
+ };
76163
+
76164
+ var SelectiveOutline = /*#__PURE__*/function (_Pass) {
76165
+ _inherits(SelectiveOutline, _Pass);
76166
+
76167
+ var _super = _createSuper(SelectiveOutline);
76168
+
76169
+ function SelectiveOutline(_ref) {
76170
+ var _this;
76171
+
76172
+ var _ref$resolution = _ref.resolution,
76173
+ resolution = _ref$resolution === void 0 ? {} : _ref$resolution,
76174
+ selectedObjects = _ref.selectedObjects,
76175
+ _ref$visibleEdgeColor = _ref.visibleEdgeColor,
76176
+ visibleEdgeColor = _ref$visibleEdgeColor === void 0 ? PALETTES.BASE.WHITE : _ref$visibleEdgeColor,
76177
+ _ref$hiddenEdgeColor = _ref.hiddenEdgeColor,
76178
+ hiddenEdgeColor = _ref$hiddenEdgeColor === void 0 ? PALETTES.BASE.BLACK : _ref$hiddenEdgeColor;
76179
+
76180
+ _classCallCheck(this, SelectiveOutline);
76181
+
76182
+ _this = _super.call(this);
76183
+
76184
+ var _config$screen = Config$1.screen(),
76185
+ height = _config$screen.h,
76186
+ width = _config$screen.w;
76187
+
76188
+ var _resolution$x = resolution.x,
76189
+ resolutionX = _resolution$x === void 0 ? width : _resolution$x,
76190
+ _resolution$y = resolution.y,
76191
+ resolutionY = _resolution$y === void 0 ? height : _resolution$y;
76192
+ _this.renderScene = Scene$2.getScene();
76193
+ _this.renderCamera = Scene$2.getCameraBody();
76194
+ _this.selectedObjects = selectedObjects !== undefined ? selectedObjects : [];
76195
+ _this.visibleEdgeColor = visibleEdgeColor;
76196
+ _this.hiddenEdgeColor = hiddenEdgeColor;
76197
+ _this.edgeGlow = 0.0;
76198
+ _this.usePatternTexture = false;
76199
+ _this.edgeThickness = 1.0;
76200
+ _this.edgeStrength = 3.0;
76201
+ _this.downSampleRatio = 2;
76202
+ _this.pulsePeriod = 0;
76203
+ _this._visibilityCache = new Map();
76204
+ _this.resolution = new Vector2(resolutionX, resolutionY);
76205
+ var pars = {
76206
+ minFilter: LinearFilter,
76207
+ magFilter: LinearFilter,
76208
+ format: RGBAFormat
76209
+ };
76210
+ var resx = Math.round(_this.resolutionX / _this.downSampleRatio);
76211
+ var resy = Math.round(_this.resolutionY / _this.downSampleRatio);
76212
+ _this.renderTargetMaskBuffer = new WebGLRenderTarget(_this.resolutionX, _this.resolutionY, pars);
76213
+ _this.renderTargetMaskBuffer.texture.name = 'OutlinePass.mask';
76214
+ _this.renderTargetMaskBuffer.texture.generateMipmaps = false;
76215
+ _this.depthMaterial = new MeshDepthMaterial();
76216
+ _this.depthMaterial.side = DoubleSide;
76217
+ _this.depthMaterial.depthPacking = RGBADepthPacking;
76218
+ _this.depthMaterial.blending = NoBlending;
76219
+ _this.prepareMaskMaterial = _this.getPrepareMaskMaterial();
76220
+ _this.prepareMaskMaterial.side = DoubleSide;
76221
+ _this.prepareMaskMaterial.fragmentShader = replaceDepthToViewZ(_this.prepareMaskMaterial.fragmentShader, _this.renderCamera);
76222
+ _this.renderTargetDepthBuffer = new WebGLRenderTarget(_this.resolutionX, _this.resolutionY, pars);
76223
+ _this.renderTargetDepthBuffer.texture.name = 'OutlinePass.depth';
76224
+ _this.renderTargetDepthBuffer.texture.generateMipmaps = false;
76225
+ _this.renderTargetMaskDownSampleBuffer = new WebGLRenderTarget(resx, resy, pars);
76226
+ _this.renderTargetMaskDownSampleBuffer.texture.name = 'OutlinePass.depthDownSample';
76227
+ _this.renderTargetMaskDownSampleBuffer.texture.generateMipmaps = false;
76228
+ _this.renderTargetBlurBuffer1 = new WebGLRenderTarget(resx, resy, pars);
76229
+ _this.renderTargetBlurBuffer1.texture.name = 'OutlinePass.blur1';
76230
+ _this.renderTargetBlurBuffer1.texture.generateMipmaps = false;
76231
+ _this.renderTargetBlurBuffer2 = new WebGLRenderTarget(Math.round(resx / 2), Math.round(resy / 2), pars);
76232
+ _this.renderTargetBlurBuffer2.texture.name = 'OutlinePass.blur2';
76233
+ _this.renderTargetBlurBuffer2.texture.generateMipmaps = false;
76234
+ _this.edgeDetectionMaterial = _this.getEdgeDetectionMaterial();
76235
+ _this.renderTargetEdgeBuffer1 = new WebGLRenderTarget(resx, resy, pars);
76236
+ _this.renderTargetEdgeBuffer1.texture.name = 'OutlinePass.edge1';
76237
+ _this.renderTargetEdgeBuffer1.texture.generateMipmaps = false;
76238
+ _this.renderTargetEdgeBuffer2 = new WebGLRenderTarget(Math.round(resx / 2), Math.round(resy / 2), pars);
76239
+ _this.renderTargetEdgeBuffer2.texture.name = 'OutlinePass.edge2';
76240
+ _this.renderTargetEdgeBuffer2.texture.generateMipmaps = false;
76241
+ _this.separableBlurMaterial1 = _this.getSeperableBlurMaterial(MAX_EDGE_THICKNESS);
76242
+
76243
+ _this.separableBlurMaterial1.uniforms['texSize'].value.set(resx, resy);
76244
+
76245
+ _this.separableBlurMaterial1.uniforms['kernelRadius'].value = 1;
76246
+ _this.separableBlurMaterial2 = _this.getSeperableBlurMaterial(MAX_EDGE_GLOW);
76247
+
76248
+ _this.separableBlurMaterial2.uniforms['texSize'].value.set(Math.round(resx / 2), Math.round(resy / 2));
76249
+
76250
+ _this.separableBlurMaterial2.uniforms['kernelRadius'].value = MAX_EDGE_GLOW; // Overlay material
76251
+
76252
+ _this.overlayMaterial = _this.getOverlayMaterial(); // copy material
76253
+
76254
+ if (CopyShader === undefined) console.error('THREE.OutlinePass relies on CopyShader');
76255
+ var copyShader = CopyShader;
76256
+ _this.copyUniforms = UniformsUtils.clone(copyShader.uniforms);
76257
+ _this.copyUniforms['opacity'].value = 1.0;
76258
+ _this.materialCopy = new ShaderMaterial({
76259
+ uniforms: _this.copyUniforms,
76260
+ vertexShader: copyShader.vertexShader,
76261
+ fragmentShader: copyShader.fragmentShader,
76262
+ blending: NoBlending,
76263
+ depthTest: false,
76264
+ depthWrite: false,
76265
+ transparent: true
76266
+ });
76267
+ _this.enabled = true;
76268
+ _this.needsSwap = false;
76269
+ _this._oldClearColor = new Color();
76270
+ _this.oldClearAlpha = 1;
76271
+ _this.fsQuad = new FullScreenQuad(null);
76272
+ _this.tempPulseColor1 = new Color();
76273
+ _this.tempPulseColor2 = new Color();
76274
+ _this.textureMatrix = new Matrix4();
76275
+ return _this;
76276
+ }
76277
+
76278
+ _createClass(SelectiveOutline, [{
76279
+ key: "setSelectedObjects",
76280
+ value: function setSelectedObjects() {
76281
+ var selectedObjects = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
76282
+ this.selectedObjects = selectedObjects.map(function (o) {
76283
+ return o.getBody();
76284
+ });
76285
+ }
76286
+ }, {
76287
+ key: "dispose",
76288
+ value: function dispose() {
76289
+ this.renderTargetMaskBuffer.dispose();
76290
+ this.renderTargetDepthBuffer.dispose();
76291
+ this.renderTargetMaskDownSampleBuffer.dispose();
76292
+ this.renderTargetBlurBuffer1.dispose();
76293
+ this.renderTargetBlurBuffer2.dispose();
76294
+ this.renderTargetEdgeBuffer1.dispose();
76295
+ this.renderTargetEdgeBuffer2.dispose();
76296
+ }
76297
+ }, {
76298
+ key: "setSize",
76299
+ value: function setSize(width, height) {
76300
+ this.renderTargetMaskBuffer.setSize(width, height);
76301
+ this.renderTargetDepthBuffer.setSize(width, height);
76302
+ var resx = Math.round(width / this.downSampleRatio);
76303
+ var resy = Math.round(height / this.downSampleRatio);
76304
+ this.renderTargetMaskDownSampleBuffer.setSize(resx, resy);
76305
+ this.renderTargetBlurBuffer1.setSize(resx, resy);
76306
+ this.renderTargetEdgeBuffer1.setSize(resx, resy);
76307
+ this.separableBlurMaterial1.uniforms['texSize'].value.set(resx, resy);
76308
+ resx = Math.round(resx / 2);
76309
+ resy = Math.round(resy / 2);
76310
+ this.renderTargetBlurBuffer2.setSize(resx, resy);
76311
+ this.renderTargetEdgeBuffer2.setSize(resx, resy);
76312
+ this.separableBlurMaterial2.uniforms['texSize'].value.set(resx, resy);
76313
+ }
76314
+ }, {
76315
+ key: "changeVisibilityOfSelectedObjects",
76316
+ value: function changeVisibilityOfSelectedObjects(bVisible) {
76317
+ var cache = this._visibilityCache;
76318
+
76319
+ function gatherSelectedMeshesCallBack(object) {
76320
+ if (object.isMesh) {
76321
+ if (bVisible === true) {
76322
+ object.visible = cache.get(object);
76323
+ } else {
76324
+ cache.set(object, object.visible);
76325
+ object.visible = bVisible;
76326
+ }
76327
+ }
76328
+ }
76329
+
76330
+ for (var i = 0; i < this.selectedObjects.length; i++) {
76331
+ var selectedObject = this.selectedObjects[i];
76332
+ selectedObject.traverse(gatherSelectedMeshesCallBack);
76333
+ }
76334
+ }
76335
+ }, {
76336
+ key: "changeVisibilityOfNonSelectedObjects",
76337
+ value: function changeVisibilityOfNonSelectedObjects(bVisible) {
76338
+ var cache = this._visibilityCache;
76339
+ var selectedMeshes = [];
76340
+
76341
+ function gatherSelectedMeshesCallBack(object) {
76342
+ if (object.isMesh) selectedMeshes.push(object);
76343
+ }
76344
+
76345
+ for (var i = 0; i < this.selectedObjects.length; i++) {
76346
+ var selectedObject = this.selectedObjects[i];
76347
+ selectedObject.traverse(gatherSelectedMeshesCallBack);
76348
+ }
76349
+
76350
+ function VisibilityChangeCallBack(object) {
76351
+ if (object.isMesh || object.isSprite) {
76352
+ // only meshes and sprites are supported by OutlinePass
76353
+ var bFound = false;
76354
+
76355
+ for (var _i = 0; _i < selectedMeshes.length; _i++) {
76356
+ var selectedObjectId = selectedMeshes[_i].id;
76357
+
76358
+ if (selectedObjectId === object.id) {
76359
+ bFound = true;
76360
+ break;
76361
+ }
76362
+ }
76363
+
76364
+ if (bFound === false) {
76365
+ var visibility = object.visible;
76366
+
76367
+ if (bVisible === false || cache.get(object) === true) {
76368
+ object.visible = bVisible;
76369
+ }
76370
+
76371
+ cache.set(object, visibility);
76372
+ }
76373
+ } else if (object.isPoints || object.isLine) {
76374
+ // the visibilty of points and lines is always set to false in order to
76375
+ // not affect the outline computation
76376
+ if (bVisible === true) {
76377
+ object.visible = cache.get(object); // restore
76378
+ } else {
76379
+ cache.set(object, object.visible);
76380
+ object.visible = bVisible;
76381
+ }
76382
+ }
76383
+ }
76384
+
76385
+ this.renderScene.traverse(VisibilityChangeCallBack);
76386
+ }
76387
+ }, {
76388
+ key: "updateTextureMatrix",
76389
+ value: function updateTextureMatrix() {
76390
+ this.textureMatrix.set(0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0);
76391
+ this.textureMatrix.multiply(this.renderCamera.projectionMatrix);
76392
+ this.textureMatrix.multiply(this.renderCamera.matrixWorldInverse);
76393
+ }
76394
+ }, {
76395
+ key: "render",
76396
+ value: function render(renderer, writeBuffer, readBuffer, deltaTime, maskActive) {
76397
+ if (this.selectedObjects.length > 0) {
76398
+ renderer.getClearColor(this._oldClearColor);
76399
+ this.oldClearAlpha = renderer.getClearAlpha();
76400
+ var oldAutoClear = renderer.autoClear;
76401
+ renderer.autoClear = false;
76402
+ if (maskActive) renderer.state.buffers.stencil.setTest(false);
76403
+ renderer.setClearColor(0xffffff, 1); // Make selected objects invisible
76404
+
76405
+ this.changeVisibilityOfSelectedObjects(false);
76406
+ var currentBackground = this.renderScene.background;
76407
+ this.renderScene.background = null; // 1. Draw Non Selected objects in the depth buffer
76408
+
76409
+ this.renderScene.overrideMaterial = this.depthMaterial;
76410
+ renderer.setRenderTarget(this.renderTargetDepthBuffer);
76411
+ renderer.clear();
76412
+ renderer.render(this.renderScene, this.renderCamera); // Make selected objects visible
76413
+
76414
+ this.changeVisibilityOfSelectedObjects(true);
76415
+
76416
+ this._visibilityCache.clear(); // Update Texture Matrix for Depth compare
76417
+
76418
+
76419
+ this.updateTextureMatrix(); // Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects
76420
+
76421
+ this.changeVisibilityOfNonSelectedObjects(false);
76422
+ this.renderScene.overrideMaterial = this.prepareMaskMaterial;
76423
+ this.prepareMaskMaterial.uniforms['cameraNearFar'].value.set(this.renderCamera.near, this.renderCamera.far);
76424
+ this.prepareMaskMaterial.uniforms['depthTexture'].value = this.renderTargetDepthBuffer.texture;
76425
+ this.prepareMaskMaterial.uniforms['textureMatrix'].value = this.textureMatrix;
76426
+ renderer.setRenderTarget(this.renderTargetMaskBuffer);
76427
+ renderer.clear();
76428
+ renderer.render(this.renderScene, this.renderCamera);
76429
+ this.renderScene.overrideMaterial = null;
76430
+ this.changeVisibilityOfNonSelectedObjects(true);
76431
+
76432
+ this._visibilityCache.clear();
76433
+
76434
+ this.renderScene.background = currentBackground; // 2. Downsample to Half resolution
76435
+
76436
+ this.fsQuad.material = this.materialCopy;
76437
+ this.copyUniforms['tDiffuse'].value = this.renderTargetMaskBuffer.texture;
76438
+ renderer.setRenderTarget(this.renderTargetMaskDownSampleBuffer);
76439
+ renderer.clear();
76440
+ this.fsQuad.render(renderer);
76441
+ this.tempPulseColor1.copy(this.visibleEdgeColor);
76442
+ this.tempPulseColor2.copy(this.hiddenEdgeColor);
76443
+
76444
+ if (this.pulsePeriod > 0) {
76445
+ var scalar = (1 + 0.25) / 2 + Math.cos(performance.now() * 0.01 / this.pulsePeriod) * (1.0 - 0.25) / 2;
76446
+ this.tempPulseColor1.multiplyScalar(scalar);
76447
+ this.tempPulseColor2.multiplyScalar(scalar);
76448
+ } // 3. Apply Edge Detection Pass
76449
+
76450
+
76451
+ this.fsQuad.material = this.edgeDetectionMaterial;
76452
+ this.edgeDetectionMaterial.uniforms['maskTexture'].value = this.renderTargetMaskDownSampleBuffer.texture;
76453
+ this.edgeDetectionMaterial.uniforms['texSize'].value.set(this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height);
76454
+ this.edgeDetectionMaterial.uniforms['visibleEdgeColor'].value = this.tempPulseColor1;
76455
+ this.edgeDetectionMaterial.uniforms['hiddenEdgeColor'].value = this.tempPulseColor2;
76456
+ renderer.setRenderTarget(this.renderTargetEdgeBuffer1);
76457
+ renderer.clear();
76458
+ this.fsQuad.render(renderer); // 4. Apply Blur on Half res
76459
+
76460
+ this.fsQuad.material = this.separableBlurMaterial1;
76461
+ this.separableBlurMaterial1.uniforms['colorTexture'].value = this.renderTargetEdgeBuffer1.texture;
76462
+ this.separableBlurMaterial1.uniforms['direction'].value = BlurDirectionX;
76463
+ this.separableBlurMaterial1.uniforms['kernelRadius'].value = this.edgeThickness;
76464
+ renderer.setRenderTarget(this.renderTargetBlurBuffer1);
76465
+ renderer.clear();
76466
+ this.fsQuad.render(renderer);
76467
+ this.separableBlurMaterial1.uniforms['colorTexture'].value = this.renderTargetBlurBuffer1.texture;
76468
+ this.separableBlurMaterial1.uniforms['direction'].value = BlurDirectionY;
76469
+ renderer.setRenderTarget(this.renderTargetEdgeBuffer1);
76470
+ renderer.clear();
76471
+ this.fsQuad.render(renderer); // Apply Blur on quarter res
76472
+
76473
+ this.fsQuad.material = this.separableBlurMaterial2;
76474
+ this.separableBlurMaterial2.uniforms['colorTexture'].value = this.renderTargetEdgeBuffer1.texture;
76475
+ this.separableBlurMaterial2.uniforms['direction'].value = BlurDirectionX;
76476
+ renderer.setRenderTarget(this.renderTargetBlurBuffer2);
76477
+ renderer.clear();
76478
+ this.fsQuad.render(renderer);
76479
+ this.separableBlurMaterial2.uniforms['colorTexture'].value = this.renderTargetBlurBuffer2.texture;
76480
+ this.separableBlurMaterial2.uniforms['direction'].value = BlurDirectionY;
76481
+ renderer.setRenderTarget(this.renderTargetEdgeBuffer2);
76482
+ renderer.clear();
76483
+ this.fsQuad.render(renderer); // Blend it additively over the input texture
76484
+
76485
+ this.fsQuad.material = this.overlayMaterial;
76486
+ this.overlayMaterial.uniforms['maskTexture'].value = this.renderTargetMaskBuffer.texture;
76487
+ this.overlayMaterial.uniforms['edgeTexture1'].value = this.renderTargetEdgeBuffer1.texture;
76488
+ this.overlayMaterial.uniforms['edgeTexture2'].value = this.renderTargetEdgeBuffer2.texture;
76489
+ this.overlayMaterial.uniforms['patternTexture'].value = this.patternTexture;
76490
+ this.overlayMaterial.uniforms['edgeStrength'].value = this.edgeStrength;
76491
+ this.overlayMaterial.uniforms['edgeGlow'].value = this.edgeGlow;
76492
+ this.overlayMaterial.uniforms['usePatternTexture'].value = this.usePatternTexture;
76493
+ if (maskActive) renderer.state.buffers.stencil.setTest(true);
76494
+ renderer.setRenderTarget(readBuffer);
76495
+ this.fsQuad.render(renderer);
76496
+ renderer.setClearColor(this._oldClearColor, this.oldClearAlpha);
76497
+ renderer.autoClear = oldAutoClear;
76498
+ }
76499
+
76500
+ if (this.renderToScreen) {
76501
+ this.fsQuad.material = this.materialCopy;
76502
+ this.copyUniforms['tDiffuse'].value = readBuffer.texture;
76503
+ renderer.setRenderTarget(null);
76504
+ this.fsQuad.render(renderer);
76505
+ }
76506
+ }
76507
+ }, {
76508
+ key: "getPrepareMaskMaterial",
76509
+ value: function getPrepareMaskMaterial() {
76510
+ return new ShaderMaterial({
76511
+ uniforms: {
76512
+ 'depthTexture': {
76513
+ value: null
76514
+ },
76515
+ 'cameraNearFar': {
76516
+ value: new Vector2(0.5, 0.5)
76517
+ },
76518
+ 'textureMatrix': {
76519
+ value: null
76520
+ }
76521
+ },
76522
+ vertexShader: "#include <morphtarget_pars_vertex>\n #include <skinning_pars_vertex>\n\n varying vec4 projTexCoord;\n varying vec4 vPosition;\n uniform mat4 textureMatrix;\n\n void main() {\n\n #include <skinbase_vertex>\n #include <begin_vertex>\n #include <morphtarget_vertex>\n #include <skinning_vertex>\n #include <project_vertex>\n\n vPosition = mvPosition;\n vec4 worldPosition = modelMatrix * vec4(transformed, 1.0);\n projTexCoord = textureMatrix * worldPosition;\n\n }",
76523
+ fragmentShader: "#include <packing>\n varying vec4 vPosition;\n varying vec4 projTexCoord;\n uniform sampler2D depthTexture;\n uniform vec2 cameraNearFar;\n\n void main() {\n\n float depth = unpackRGBAToDepth(texture2DProj(depthTexture, projTexCoord));\n float viewZ = - DEPTH_TO_VIEW_Z(depth, cameraNearFar.x, cameraNearFar.y);\n float depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;\n gl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);\n\n }"
76524
+ });
76525
+ }
76526
+ }, {
76527
+ key: "getEdgeDetectionMaterial",
76528
+ value: function getEdgeDetectionMaterial() {
76529
+ return new ShaderMaterial({
76530
+ uniforms: {
76531
+ 'maskTexture': {
76532
+ value: null
76533
+ },
76534
+ 'texSize': {
76535
+ value: new Vector2(0.5, 0.5)
76536
+ },
76537
+ 'visibleEdgeColor': {
76538
+ value: new Vector3$1(1.0, 1.0, 1.0)
76539
+ },
76540
+ 'hiddenEdgeColor': {
76541
+ value: new Vector3$1(1.0, 1.0, 1.0)
76542
+ }
76543
+ },
76544
+ vertexShader: "varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }",
76545
+ fragmentShader: "varying vec2 vUv;\n\n uniform sampler2D maskTexture;\n uniform vec2 texSize;\n uniform vec3 visibleEdgeColor;\n uniform vec3 hiddenEdgeColor;\n\n void main() {\n vec2 invSize = 1.0 / texSize;\n vec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\n vec4 c1 = texture2D(maskTexture, vUv + uvOffset.xy);\n vec4 c2 = texture2D(maskTexture, vUv - uvOffset.xy);\n vec4 c3 = texture2D(maskTexture, vUv + uvOffset.yw);\n vec4 c4 = texture2D(maskTexture, vUv - uvOffset.yw);\n float diff1 = (c1.r - c2.r)*0.5;\n float diff2 = (c3.r - c4.r)*0.5;\n float d = length(vec2(diff1, diff2));\n float a1 = min(c1.g, c2.g);\n float a2 = min(c3.g, c4.g);\n float visibilityFactor = min(a1, a2);\n vec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\n gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\n }"
76546
+ });
76547
+ }
76548
+ }, {
76549
+ key: "getSeperableBlurMaterial",
76550
+ value: function getSeperableBlurMaterial(maxRadius) {
76551
+ return new ShaderMaterial({
76552
+ defines: {
76553
+ 'MAX_RADIUS': maxRadius
76554
+ },
76555
+ uniforms: {
76556
+ 'colorTexture': {
76557
+ value: null
76558
+ },
76559
+ 'texSize': {
76560
+ value: new Vector2(0.5, 0.5)
76561
+ },
76562
+ 'direction': {
76563
+ value: new Vector2(0.5, 0.5)
76564
+ },
76565
+ 'kernelRadius': {
76566
+ value: 1.0
76567
+ }
76568
+ },
76569
+ vertexShader: "varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }",
76570
+ fragmentShader: "#include <common>\n varying vec2 vUv;\n uniform sampler2D colorTexture;\n uniform vec2 texSize;\n uniform vec2 direction;\n uniform float kernelRadius;\n\n float gaussianPdf(in float x, in float sigma) {\n return 0.39894 * exp(-0.5 * x * x/(sigma * sigma))/sigma;\n }\n\n void main() {\n vec2 invSize = 1.0 / texSize;\n float weightSum = gaussianPdf(0.0, kernelRadius);\n vec4 diffuseSum = texture2D(colorTexture, vUv) * weightSum;\n vec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\n vec2 uvOffset = delta;\n for(int i = 1; i <= MAX_RADIUS; i ++) {\n float w = gaussianPdf(uvOffset.x, kernelRadius);\n vec4 sample1 = texture2D(colorTexture, vUv + uvOffset);\n vec4 sample2 = texture2D(colorTexture, vUv - uvOffset);\n diffuseSum += ((sample1 + sample2) * w);\n weightSum += (2.0 * w);\n uvOffset += delta;\n }\n gl_FragColor = diffuseSum/weightSum;\n }"
76571
+ });
76572
+ }
76573
+ }, {
76574
+ key: "getOverlayMaterial",
76575
+ value: function getOverlayMaterial() {
76576
+ return new ShaderMaterial({
76577
+ uniforms: {
76578
+ 'maskTexture': {
76579
+ value: null
76580
+ },
76581
+ 'edgeTexture1': {
76582
+ value: null
76583
+ },
76584
+ 'edgeTexture2': {
76585
+ value: null
76586
+ },
76587
+ 'patternTexture': {
76588
+ value: null
76589
+ },
76590
+ 'edgeStrength': {
76591
+ value: 1.0
76592
+ },
76593
+ 'edgeGlow': {
76594
+ value: 1.0
76595
+ },
76596
+ 'usePatternTexture': {
76597
+ value: 0.0
76598
+ }
76599
+ },
76600
+ vertexShader: "varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }",
76601
+ fragmentShader: "varying vec2 vUv;\n\n uniform sampler2D maskTexture;\n uniform sampler2D edgeTexture1;\n uniform sampler2D edgeTexture2;\n uniform sampler2D patternTexture;\n uniform float edgeStrength;\n uniform float edgeGlow;\n uniform bool usePatternTexture;\n\n void main() {\n vec4 edgeValue1 = texture2D(edgeTexture1, vUv);\n vec4 edgeValue2 = texture2D(edgeTexture2, vUv);\n vec4 maskColor = texture2D(maskTexture, vUv);\n vec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\n float visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\n vec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\n vec4 finalColor = edgeStrength * maskColor.r * edgeValue;\n if(usePatternTexture)\n finalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\n gl_FragColor = finalColor;\n }",
76602
+ blending: AdditiveBlending,
76603
+ depthTest: false,
76604
+ depthWrite: false,
76605
+ transparent: true
76606
+ });
76607
+ }
76608
+ }]);
76609
+
76610
+ return SelectiveOutline;
76611
+ }(Pass);/**
76118
76612
  * RGB Shift Shader
76119
76613
  * Shifts red and blue channels from center in opposite directions
76120
76614
  * Ported from http://kriss.cx/tom/2009/05/rgb-shift/
@@ -76191,7 +76685,7 @@ var DigitalGlitch = {
76191
76685
  vertexShader: DigitalGlitch.vertexShader,
76192
76686
  fragmentShader: DigitalGlitch.fragmentShader
76193
76687
  });
76194
- _this.fsQuad = new Pass.FullScreenQuad(_this.material);
76688
+ _this.fsQuad = new FullScreenQuad(_this.material);
76195
76689
  _this.goWild = false;
76196
76690
  _this.curF = 0;
76197
76691
 
@@ -76836,6 +77330,9 @@ var OutlineEffect = /*#__PURE__*/function () {
76836
77330
  }), _defineProperty(_this$map, EFFECTS.DEPTH_OF_FIELD, {
76837
77331
  effect: DepthOfField,
76838
77332
  isClass: true
77333
+ }), _defineProperty(_this$map, EFFECTS.SELECTIVE_OUTLINE, {
77334
+ effect: SelectiveOutline,
77335
+ isClass: true
76839
77336
  }), _defineProperty(_this$map, EFFECTS.GLITCH, {
76840
77337
  effect: GlitchEffect,
76841
77338
  isClass: true