fleetio_spark 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6932bdc5acd849bd634509c012c9227894fab54da7ef6923e7ad1cdaa18be69
4
- data.tar.gz: 44f7b8c0e6235858fafcd7f90fbaaf4283c05326bd72b34543ba91fb1e162e4d
3
+ metadata.gz: a69211017e472afe66c06bd0059b93335ae63505a5fd1a155bad98b0ad87e13e
4
+ data.tar.gz: bb6e0a58abd9da5b5017af1fbd55de6343eb7fb5ac04c35c30ffdcfd09e5bd95
5
5
  SHA512:
6
- metadata.gz: 322407626af4f3da9e61f22931e1ee133a2618de04153293cf6d6213832e524c2193aab51d3684a6db7ea829b0e064897da8986c45a53edf734bc349c7926029
7
- data.tar.gz: 15425c5ae57892ee391a31b717e796587e15737205eda3ecd383655fc39eaccb5773f703a7e7f161f85ae37b97748fc4b941daf3fb599b6b7ee74020202346cc
6
+ metadata.gz: ecda7214cdb6eeebc7045668854a94d4d88e506500d8a6d9698b80eff9d1f6ccdbcd31bf528dae0032e5e108e4d9fa5b85b889e0f799f858952bffc4c981a550
7
+ data.tar.gz: 48db81b45d45a9425ebdd10b74ea8d4ec4ffa13cdaa8c11754dd54f37df5275707db0266f3b62cac264f16a4f4ce76f543d4ffe28b8e8b3b8a874a1b5a769451
@@ -278,7 +278,7 @@ function triggerEvent ( event ) {
278
278
  }
279
279
 
280
280
  // Don't follow links used to trigger modals
281
- if ( el.tagName == 'A' ) {
281
+ if ( el.tagName.toLowerCase() == 'a' && el.href == '#' ) {
282
282
  event.preventDefault()
283
283
  }
284
284
 
@@ -411,6 +411,7 @@ function setup () {
411
411
 
412
412
  module.exports = {
413
413
  new: Modal.new,
414
+ links: links,
414
415
  setup: setup,
415
416
  modals: Modals,
416
417
  init: init,
@@ -1,10 +1,10 @@
1
1
  module Spark
2
- module TrialHelper
2
+ module TrialHelper
3
3
  def trialing( end_date, url, options={} )
4
4
 
5
5
  options[:class] = 'trial-status'
6
6
 
7
- days = [0, ( end_date.to_date - Date.current ).to_i].max
7
+ days = [0, (end_date.to_date - Time.zone.now.to_date).to_i].max
8
8
  text = %Q{#{pluralize(days, 'day')} left in trial}
9
9
 
10
10
  if days < 1
@@ -1,3 +1,3 @@
1
1
  module FleetioSpark
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
File without changes
@@ -398,7 +398,7 @@ function triggerEvent ( event ) {
398
398
  }
399
399
 
400
400
  // Don't follow links used to trigger modals
401
- if ( el.tagName == 'A' ) {
401
+ if ( el.tagName.toLowerCase() == 'a' && el.href == '#' ) {
402
402
  event.preventDefault()
403
403
  }
404
404
 
@@ -531,6 +531,7 @@ function setup () {
531
531
 
532
532
  module.exports = {
533
533
  new: Modal.new,
534
+ links: links,
534
535
  setup: setup,
535
536
  modals: Modals,
536
537
  init: init,
@@ -11924,4 +11925,4 @@ exports.Settings = Settings;
11924
11925
  },{}]},{},[10])(10)
11925
11926
  });
11926
11927
 
11927
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19jb29raWUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19lc3ZnLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy9zcGFyay9faWNvbnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19tb2RhbC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3NlYXJjaC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3NpZGViYXIuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19zdGFjay5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3RyZWUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL3NoaW1zL19kYXRhc2V0LmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy9zcGFyay9zcGFyay5qcyIsIm5vZGVfbW9kdWxlcy9iZWFuL2JlYW4uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9hZnRlci1hbmltYXRpb24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvYW5pbWF0aW9uLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9idWJibGUtZm9ybS1ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvY2FsbGJhY2stbWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9kZWxheS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9tZWRpYS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9wYWdlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3JlcGVhdC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9yZXNpemUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvc2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3NoaW1zL2N1c3RvbS1ldmVudC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9zdWJtaXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvdGFwLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi90aHJvdHRsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvZ2dsZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvZWFzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL2Zyb210b3AuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zY3JvbGx0by5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3NoaW1zL19jbGFzc2xpc3QuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zaGltcy9fb2JqZWN0LmFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3RpbWUuanMiLCJub2RlX21vZHVsZXMvY29va2llX2pzL2Nvb2tpZS5qcyIsIm5vZGVfbW9kdWxlcy9rZXltYXN0ZXIva2V5bWFzdGVyLmpzIiwibm9kZV9tb2R1bGVzL2x1eG9uL2J1aWxkL2Nqcy1icm93c2VyL2x1eG9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdndCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDamFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsInZhciB0b29sYm94ID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBjb29raWUgPSByZXF1aXJlKCAnY29va2llX2pzJyApLmNvb2tpZVxuXG5mdW5jdGlvbiB1cGRhdGUgKCBrZXksIGRhdGEsIG9wdGlvbnMgKSB7XG4gIHZhciBvbGRfZGF0YSA9IGdldCgga2V5IClcbiAgc2V0KCBrZXksIHRvb2xib3gubWVyZ2UoIG9sZF9kYXRhLCBkYXRhKSwgb3B0aW9ucyApXG59XG5cbmZ1bmN0aW9uIGdldCAoIGtleSApIHtcbiAgdmFyIGRhdGEgPSBjb29raWUuZ2V0KCBrZXkgKVxuICByZXR1cm4gZGF0YSA/IEpTT04ucGFyc2UoIGRhdGEpIDoge31cbn1cblxuZnVuY3Rpb24gc2V0ICgga2V5LCB2YWx1ZSwgb3B0aW9ucyApIHtcbiAgb3B0aW9ucyA9IHRvb2xib3gubWVyZ2UoIHsgcGF0aDogJy8nIH0sIG9wdGlvbnMgfHwge30gKVxuICBjb29raWUuc2V0KCBrZXksIEpTT04uc3RyaW5naWZ5KCB2YWx1ZSApLCBvcHRpb25zIClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBnZXQ6IGdldCxcbiAgdXBkYXRlOiB1cGRhdGVcbn1cbiIsIihmdW5jdGlvbigpe1xuICB2YXIgbmFtZXNcblxuICBmdW5jdGlvbiBhdHRyKCBzb3VyY2UsIG5hbWUgKXtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSA9PSAnb2JqZWN0JylcbiAgICAgIHJldHVybiBuYW1lKyc9XCInK3NvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSkrJ1wiICdcbiAgICBlbHNlXG4gICAgICByZXR1cm4gbmFtZSsnPVwiJytzb3VyY2UrJ1wiICcgfVxuXG4gIGZ1bmN0aW9uIGRhc2hlcml6ZSggaW5wdXQgKSB7XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1tcXFcsX10vZywgJy0nKS5yZXBsYWNlKC8tezIsfS9nLCAnLScpXG4gIH1cblxuICBmdW5jdGlvbiBzdmdOYW1lKCBuYW1lICkge1xuICAgIHJldHVybiBcInN2Zy1cIitkYXNoZXJpemUoIG5hbWUgKVxuICB9XG5cbiAgZnVuY3Rpb24gdXNlKCBuYW1lLCBvcHRpb25zICkge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gICAgdmFyIGlkID0gZGFzaGVyaXplKCBuYW1lIClcbiAgICB2YXIgc3ltYm9sID0gc3ZncygpW2lkXVxuXG4gICAgaWYgKCBzeW1ib2wgKSB7XG4gICAgICB2YXIgcGFyZW50ID0gc3ltYm9sLnBhcmVudEVsZW1lbnRcbiAgICAgIHZhciBwcmVmaXggPSBwYXJlbnQuZGF0YXNldC5wcmVmaXhcbiAgICAgIHZhciBiYXNlICAgPSBwYXJlbnQuZGF0YXNldC5zeW1ib2xDbGFzc1xuXG4gICAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoICc8c3ZnPjx1c2UgeGxpbms6aHJlZj1cIiMnICsgcHJlZml4ICsgJy0nICsgaWQgKyAnXCIvPjwvc3ZnPicgKS5maXJzdENoaWxkO1xuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgYmFzZSArICcgJyArIHByZWZpeCArICctJyArIGlkICsgJyAnICsgKCBvcHRpb25zLmNsYXNzIHx8ICcnICkudHJpbSgpIClcbiAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoICd2aWV3Qm94Jywgc3ltYm9sLmdldEF0dHJpYnV0ZSggJ3ZpZXdCb3gnICkgKVxuXG4gICAgICBpZiAoICEoIG9wdGlvbnMud2lkdGggfHwgb3B0aW9ucy5oZWlnaHQgfHwgb3B0aW9ucy5zY2FsZSApICkge1xuXG4gICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgIHN5bWJvbC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpXG4gICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIHN5bWJvbC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKVxuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmICggb3B0aW9ucy53aWR0aCApICBzdmcuc2V0QXR0cmlidXRlKCAnd2lkdGgnLCAgb3B0aW9ucy53aWR0aCApXG4gICAgICAgIGlmICggb3B0aW9ucy5oZWlnaHQgKSBzdmcuc2V0QXR0cmlidXRlKCAnaGVpZ2h0Jywgb3B0aW9ucy5oZWlnaHQgKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3ZnXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBmaW5kIFwiJytuYW1lKydcIiBzdmcgc3ltYm9sLiBFbnN1cmUgdGhhdCBzdmcgc2NyaXB0cyBhcmUgbG9hZGVkJylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdmdzKCl7XG4gICAgaWYgKCAhbmFtZXMgKSB7XG4gICAgICBuYW1lcyA9IHt9XG4gICAgICB2YXIgc3ltYm9scyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnc3ZnW2lkXj1lc3ZnXSBzeW1ib2wnICkgKVxuICAgICAgc3ltYm9scy5mb3JFYWNoKCBmdW5jdGlvbiggc3ltYm9sICkge1xuICAgICAgICBuYW1lc1tzeW1ib2wuZGF0YXNldC5uYW1lXSA9IHN5bWJvbFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVzXG4gIH1cblxuICB2YXIgZXN2ZyA9IHtcbiAgICBzdmdzOiBzdmdzLFxuICAgIHVzZTogdXNlXG4gIH1cblxuICAvLyBIYW5kbGUgVHVyYm9saW5rcyBwYWdlIGNoYW5nZSBldmVudHNcbiAgaWYgKCB3aW5kb3cuVHVyYm9saW5rcyApIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcInR1cmJvbGlua3M6bG9hZFwiLCBmdW5jdGlvbiggZXZlbnQgKSB7IG5hbWVzID0gbnVsbDsgZXN2Zy5zdmdzKCkgfSlcbiAgfVxuXG4gIGlmKCB0eXBlb2YoIG1vZHVsZSApICE9ICd1bmRlZmluZWQnICkgeyBtb2R1bGUuZXhwb3J0cyA9IGVzdmcgfVxuICBlbHNlIHdpbmRvdy5lc3ZnID0gZXN2Z1xuXG59KSgpIiwiKGZ1bmN0aW9uKCl7XG5cbiAgZnVuY3Rpb24gZW1iZWQoKSB7XG4gICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZXN2Zy1zdmctaWNvbnMnKSkge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLmluc2VydEFkamFjZW50SFRNTCgnYWZ0ZXJiZWdpbicsICc8c3ZnIGlkPVwiZXN2Zy1zdmctaWNvbnNcIiBkYXRhLXN5bWJvbC1jbGFzcz1cImljb25cIiBkYXRhLXByZWZpeD1cInN2Z1wiIHZlcnNpb249XCIxLjFcIiBzdHlsZT1cImhlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlXCIgZGF0YS10dXJib2xpbmtzLXBlcm1hbmVudD48ZGVmcz48Y2xpcFBhdGggaWQ9XCJkZWYtc3ZnLXF1ZXN0aW9uLTBcIj48cmVjdCB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiBmaWxsPVwid2hpdGVcIi8+PC9jbGlwUGF0aD48L2RlZnM+PHN5bWJvbCBpZD1cInN2Zy1hZGRcIiBkYXRhLW5hbWU9XCJhZGRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMCAxMkMwIDEyLjM5NzggMC4xNTgwMzUgMTIuNzc5NCAwLjQzOTM0IDEzLjA2MDdDMC43MjA2NDQgMTMuMzQyIDEuMTAyMTggMTMuNSAxLjUgMTMuNUgxMC4yNUMxMC4zMTYzIDEzLjUgMTAuMzc5OSAxMy41MjYzIDEwLjQyNjggMTMuNTczMkMxMC40NzM3IDEzLjYyMDEgMTAuNSAxMy42ODM3IDEwLjUgMTMuNzVWMjIuNUMxMC41IDIyLjg5NzggMTAuNjU4IDIzLjI3OTQgMTAuOTM5MyAyMy41NjA3QzExLjIyMDYgMjMuODQyIDExLjYwMjIgMjQgMTIgMjRDMTIuMzk3OCAyNCAxMi43Nzk0IDIzLjg0MiAxMy4wNjA3IDIzLjU2MDdDMTMuMzQyIDIzLjI3OTQgMTMuNSAyMi44OTc4IDEzLjUgMjIuNVYxMy43NUMxMy41IDEzLjY4MzcgMTMuNTI2MyAxMy42MjAxIDEzLjU3MzIgMTMuNTczMkMxMy42MjAxIDEzLjUyNjMgMTMuNjgzNyAxMy41IDEzLjc1IDEzLjVIMjIuNUMyMi44OTc4IDEzLjUgMjMuMjc5NCAxMy4zNDIgMjMuNTYwNyAxMy4wNjA3QzIzLjg0MiAxMi43Nzk0IDI0IDEyLjM5NzggMjQgMTJDMjQgMTEuNjAyMiAyMy44NDIgMTEuMjIwNiAyMy41NjA3IDEwLjkzOTNDMjMuMjc5NCAxMC42NTggMjIuODk3OCAxMC41IDIyLjUgMTAuNUgxMy43NUMxMy42ODM3IDEwLjUgMTMuNjIwMSAxMC40NzM3IDEzLjU3MzIgMTAuNDI2OEMxMy41MjYzIDEwLjM3OTkgMTMuNSAxMC4zMTYzIDEzLjUgMTAuMjVWMS41QzEzLjUgMS4xMDIxOCAxMy4zNDIgMC43MjA2NDQgMTMuMDYwNyAwLjQzOTM0QzEyLjc3OTQgMC4xNTgwMzUgMTIuMzk3OCAwIDEyIDBDMTEuNjAyMiAwIDExLjIyMDYgMC4xNTgwMzUgMTAuOTM5MyAwLjQzOTM0QzEwLjY1OCAwLjcyMDY0NCAxMC41IDEuMTAyMTggMTAuNSAxLjVWMTAuMjVDMTAuNSAxMC4zMTYzIDEwLjQ3MzcgMTAuMzc5OSAxMC40MjY4IDEwLjQyNjhDMTAuMzc5OSAxMC40NzM3IDEwLjMxNjMgMTAuNSAxMC4yNSAxMC41SDEuNUMxLjEwMjE4IDEwLjUgMC43MjA2NDQgMTAuNjU4IDAuNDM5MzQgMTAuOTM5M0MwLjE1ODAzNSAxMS4yMjA2IDAgMTEuNjAyMiAwIDEySDBaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctYWRtaW4tdXNlclwiIGRhdGEtbmFtZT1cImFkbWluLXVzZXJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMTMuMDE5IDE2LjVDMTMuMDE5IDE2LjIzNDggMTIuOTEzNiAxNS45ODA0IDEyLjcyNjEgMTUuNzkyOUMxMi41Mzg2IDE1LjYwNTQgMTIuMjg0MiAxNS41IDEyLjAxOSAxNS41SDguMTA1QzguMDQ4OTQgMTUuNTAwNiA3Ljk5NDM1IDE1LjQ4MjEgNy45NTAxOSAxNS40NDc2QzcuOTA2MDMgMTUuNDEzMSA3Ljg3NDkzIDE1LjM2NDUgNy44NjIgMTUuMzFDNy42MjA2NiAxNC4yMjMzIDcuNTAxNTkgMTMuMTEzMSA3LjUwNyAxMkM3LjUwNTI3IDExLjA2MDggNy41OTAyOSAxMC4xMjM1IDcuNzYxIDkuMkM3Ljc3MzIyIDkuMTQyOTUgNy44MDQ3OCA5LjA5MTg4IDcuODUwMzQgOS4wNTU0M0M3Ljg5NTkgOS4wMTg5OCA3Ljk1MjY2IDguOTk5NCA4LjAxMSA5QzE4Ljg4NCA5IDIxLjU2NiA5LjAwOCAyMi4yOTEgOC45ODJDMjIuNDUzNiA4Ljk5MTY2IDIyLjYxNTggOC45NTg3NCAyMi43NjE4IDguODg2NDlDMjIuOTA3NyA4LjgxNDI1IDIzLjAzMjMgOC43MDUxOCAyMy4xMjMyIDguNTcwMDZDMjMuMjE0IDguNDM0OTQgMjMuMjY4MSA4LjI3ODQ0IDIzLjI4IDguMTE2MDRDMjMuMjkxOSA3Ljk1MzYzIDIzLjI2MTIgNy43OTA5MiAyMy4xOTEgNy42NDRDMjIuMzE2OCA1LjM3NzQ0IDIwLjc3MjEgMy40MzE0MiAxOC43NjMgMi4wNjU2MkMxNi43NTQgMC42OTk4MzEgMTQuMzc2MiAtMC4wMjA3NjQ3IDExLjk0NyAxLjY1NjI0ZS0wNkM4LjgyNzc2IDAuMDc0MjY1NCA1Ljg1NDY3IDEuMzM3MTQgMy42MzU1MyAzLjUzMDQ0QzEuNDE2MzggNS43MjM3NSAwLjExODc4NCA4LjY4MTg0IDAuMDA3OTk4NTUgMTEuOEMtMC4wNTA2NTU3IDE0LjkyNjcgMS4xMTYzMiAxNy45NTIyIDMuMjU5NCAyMC4yMjk2QzUuNDAyNDcgMjIuNTA3MSA4LjM1MTU0IDIzLjg1NTcgMTEuNDc2IDIzLjk4N0gxMS41MkMxMS43NjE4IDIzLjk4NzQgMTEuOTk1NSAyMy45MDAxIDEyLjE3NzkgMjMuNzQxNEMxMi4zNjAzIDIzLjU4MjcgMTIuNDc5IDIzLjM2MzMgMTIuNTEyMSAyMy4xMjM4QzEyLjU0NTIgMjIuODg0MiAxMi40OTAzIDIyLjY0MDkgMTIuMzU3OCAyMi40Mzg3QzEyLjIyNTIgMjIuMjM2NSAxMi4wMjM4IDIyLjA4OTIgMTEuNzkxIDIyLjAyNEMxMS41OTQgMjEuOTU3MSAxMS40MjQ2IDIxLjgyNyAxMS4zMDkgMjEuNjU0QzEwLjM4MTkgMjAuNDQ2IDkuNTMyODcgMTkuMTgwMSA4Ljc2NyAxNy44NjRDOC43NDY4MiAxNy44MjU5IDguNzM2ODQgMTcuNzgzMiA4LjczODAyIDE3Ljc0MDFDOC43MzkyMSAxNy42OTcgOC43NTE1MiAxNy42NTUgOC43NzM3NiAxNy42MThDOC43OTYwMSAxNy41ODExIDguODI3NDIgMTcuNTUwNSA4Ljg2NDk2IDE3LjUyOTNDOC45MDI1IDE3LjUwODEgOC45NDQ4OCAxNy40OTcgOC45ODggMTcuNDk3SDEyLjAxOUMxMi4yODM3IDE3LjQ5NyAxMi41Mzc2IDE3LjM5MjEgMTIuNzI1IDE3LjIwNTJDMTIuOTEyNSAxNy4wMTgzIDEzLjAxODIgMTYuNzY0NyAxMy4wMTkgMTYuNVpNNS44IDE1LjJDNS44MDc2MSAxNS4yMzYzIDUuODA2OTkgMTUuMjczOSA1Ljc5ODE4IDE1LjMxQzUuNzg5MzggMTUuMzQ2MSA1Ljc3MjYzIDE1LjM3OTcgNS43NDkxNCAxNS40MDg1QzUuNzI1NjUgMTUuNDM3MyA1LjY5NjAyIDE1LjQ2MDQgNS42NjI0MyAxNS40NzYyQzUuNjI4ODQgMTUuNDkyMSA1LjU5MjEzIDE1LjUwMDIgNS41NTUgMTUuNUgyLjgxOEMyLjc2NjI0IDE1LjQ5OTkgMi43MTU3OSAxNS40ODM4IDIuNjczNTQgMTUuNDUzOUMyLjYzMTI5IDE1LjQyNCAyLjU5OTMyIDE1LjM4MTggMi41ODIgMTUuMzMzQzEuODc4MSAxMy4zNTEyIDEuODE4OTUgMTEuMTk3NSAyLjQxMyA5LjE4QzIuNDI4MjkgOS4xMjgxNiAyLjQ1OTkxIDkuMDgyNjMgMi41MDMxNSA5LjA1MDJDMi41NDYzOSA5LjAxNzc3IDIuNTk4OTUgOS4wMDAxNiAyLjY1MyA5SDUuNDZDNS40OTU5MyA5LjAwMDM1IDUuNTMxMzcgOS4wMDgzNyA1LjU2Mzk1IDkuMDIzNTRDNS41OTY1MiA5LjAzODcgNS42MjU0OCA5LjA2MDY2IDUuNjQ4ODcgOS4wODc5NEM1LjY3MjI2IDkuMTE1MjEgNS42ODk1NSA5LjE0NzE3IDUuNjk5NTggOS4xODE2OEM1LjcwOTYgOS4yMTYxOSA1LjcxMjEzIDkuMjUyNDQgNS43MDcgOS4yODhDNS41NzE2MyAxMC4xODU2IDUuNTA0NzcgMTEuMDkyMiA1LjUwNyAxMkM1LjUwNDE5IDEzLjA3MzUgNS42MDIyOSAxNC4xNDQ5IDUuOCAxNS4yVjE1LjJaTTExLjg1OSAyLjI3QzExLjkwMTUgMi4yMzk3NyAxMS45NTIzIDIuMjIzNTMgMTIuMDA0NSAyLjIyMzUzQzEyLjA1NjYgMi4yMjM1MyAxMi4xMDc1IDIuMjM5NzcgMTIuMTUgMi4yN0MxMy42NTI5IDMuMzkzMDcgMTQuODE1OCA0LjkxMDAyIDE1LjUxIDYuNjUzQzE1LjUyNiA2LjY5MTA1IDE1LjUzMjQgNi43MzI0OCAxNS41Mjg1IDYuNzczNThDMTUuNTI0NiA2LjgxNDY4IDE1LjUxMDYgNi44NTQxNyAxNS40ODc3IDYuODg4NTRDMTUuNDY0OCA2LjkyMjkgMTUuNDMzOCA2Ljk1MTA3IDE1LjM5NzQgNi45NzA1MkMxNS4zNjA5IDYuOTg5OTcgMTUuMzIwMyA3LjAwMDEgMTUuMjc5IDdIOC43MjlDOC42ODc5OSA3LjAwMDE0IDguNjQ3NiA2Ljk5MDA2IDguNjExNDYgNi45NzA2OEM4LjU3NTMyIDYuOTUxMyA4LjU0NDU4IDYuOTIzMjMgOC41MjIgNi44ODlDOC40OTkwOSA2Ljg1NDU1IDguNDg1MDkgNi44MTQ5NiA4LjQ4MTI1IDYuNzczNzdDOC40Nzc0MSA2LjczMjU5IDguNDgzODUgNi42OTEwOSA4LjUgNi42NTNDOS4xODkxIDQuOTA3MzkgMTAuMzUyNiAzLjM4OTI0IDExLjg1OSAyLjI3VjIuMjdaTTIwLjQ0IDYuNjE0QzIwLjQ2NDUgNi42NTE4MyAyMC40Nzg0IDYuNjk1NTkgMjAuNDgwMSA2Ljc0MDY0QzIwLjQ4MTcgNi43ODU2OSAyMC40NzEyIDYuODMwMzYgMjAuNDQ5NiA2Ljg2OTkyQzIwLjQyOCA2LjkwOTQ3IDIwLjM5NjEgNi45NDI0NSAyMC4zNTcyIDYuOTY1MzVDMjAuMzE4NCA2Ljk4ODI1IDIwLjI3NDEgNy4wMDAyMiAyMC4yMjkgN0gxNy45NDZDMTcuODkzNCA3LjAwMDAyIDE3Ljg0MjIgNi45ODM1MiAxNy43OTk0IDYuOTUyODRDMTcuNzU2NyA2LjkyMjE2IDE3LjcyNDggNi44Nzg4NCAxNy43MDggNi44MjlDMTcuMjk2NiA1LjU3MjYyIDE2LjY5NzkgNC4zODU1NyAxNS45MzIgMy4zMDhDMTUuODk5OSAzLjI2MzA2IDE1Ljg4MzUgMy4yMDg3NSAxNS44ODU1IDMuMTUzNTRDMTUuODg3NSAzLjA5ODMzIDE1LjkwNzcgMy4wNDUzNCAxNS45NDMgMy4wMDI4NEMxNS45NzgzIDIuOTYwMzUgMTYuMDI2NyAyLjkzMDc0IDE2LjA4MDYgMi45MTg2NUMxNi4xMzQ1IDIuOTA2NTUgMTYuMTkwOSAyLjkxMjY2IDE2LjI0MSAyLjkzNkMxNy45NjQ1IDMuNzMzODYgMTkuNDIyMSA1LjAxMDYyIDIwLjQ0IDYuNjE0VjYuNjE0Wk03Ljc0IDIuOTY4QzcuNzkwMDIgMi45NDQxNSA3Ljg0NjU2IDIuOTM3NiA3LjkwMDcxIDIuOTQ5MzhDNy45NTQ4NiAyLjk2MTE2IDguMDAzNTcgMi45OTA1OSA4LjAzOTE3IDMuMDMzMDdDOC4wNzQ3NyAzLjA3NTU0IDguMDk1MjUgMy4xMjg2MyA4LjA5NzM5IDMuMTg0MDFDOC4wOTk1NCAzLjIzOTM5IDguMDgzMjEgMy4yOTM5MSA4LjA1MSAzLjMzOUM3LjI5ODQ1IDQuNDA4MTggNi43MDk5NSA1LjU4MzgzIDYuMzA1IDYuODI3QzYuMjg4NzcgNi44NzcxNCA2LjI1NzExIDYuOTIwODYgNi4yMTQ1NSA2Ljk1MTkzQzYuMTcxOTkgNi45ODMgNi4xMjA2OSA2Ljk5OTgyIDYuMDY4IDdIMy44MDVDMy43NjAxNiA2Ljk5OTkzIDMuNzE2MTYgNi45ODc3OSAzLjY3NzYyIDYuOTY0ODdDMy42MzkwOCA2Ljk0MTk1IDMuNjA3NDEgNi45MDkwOCAzLjU4NTk0IDYuODY5NzFDMy41NjQ0NyA2LjgzMDM1IDMuNTUzOTggNi43ODU5MyAzLjU1NTU3IDYuNzQxMTJDMy41NTcxNyA2LjY5NjMgMy41NzA3OCA2LjY1Mjc0IDMuNTk1IDYuNjE1QzQuNjA5NDMgNS4wMzY1IDYuMDQ1MiAzLjc3MzI0IDcuNzQgMi45NjhWMi45NjhaTTguMDkxIDIwLjdDOC4xMjMxMyAyMC43NDQ5IDguMTM5NDggMjAuNzk5MyA4LjEzNzQ4IDIwLjg1NDVDOC4xMzU0OCAyMC45MDk3IDguMTE1MjUgMjAuOTYyNyA4LjA3OTk1IDIxLjAwNTJDOC4wNDQ2NSAyMS4wNDc3IDcuOTk2MjcgMjEuMDc3MyA3Ljk0MjM3IDIxLjA4OTRDNy44ODg0NiAyMS4xMDE1IDcuODMyMDcgMjEuMDk1MyA3Ljc4MiAyMS4wNzJDNi4yNDcxNiAyMC4zNTkxIDQuOTE4ODUgMTkuMjY3NiAzLjkyMiAxNy45QzMuODk0MTQgMTcuODYyOSAzLjg3NzE4IDE3LjgxODcgMy44NzMwMSAxNy43NzI1QzMuODY4ODQgMTcuNzI2MiAzLjg3NzYzIDE3LjY3OTcgMy44OTgzOSAxNy42MzgyQzMuOTE5MTUgMTcuNTk2NyAzLjk1MTA3IDE3LjU2MTcgMy45OTA1NyAxNy41MzczQzQuMDMwMDYgMTcuNTEyOSA0LjA3NTU3IDE3LjUgNC4xMjIgMTcuNUg2LjI0NkM2LjI5NjkzIDE3LjUwMDIgNi4zNDY2IDE3LjUxNTkgNi4zODg0IDE3LjU0NUM2LjQzMDE5IDE3LjU3NDIgNi40NjIxNCAxNy42MTUzIDYuNDggMTcuNjYzQzYuODgxNyAxOC43NDE1IDcuNDIzMzMgMTkuNzYyNiA4LjA5MSAyMC43VjIwLjdaXCIvPjxwYXRoIGQ9XCJNMTguNzY5IDE3LjdDMTkuNDQ0MSAxNy43MDAyIDIwLjEwNDEgMTcuNTAwMiAyMC42NjU1IDE3LjEyNTJDMjEuMjI3IDE2Ljc1MDMgMjEuNjY0NiAxNi4yMTcyIDIxLjkyMyAxNS41OTM2QzIyLjE4MTUgMTQuOTY5OSAyMi4yNDkxIDE0LjI4MzYgMjIuMTE3NSAxMy42MjE0QzIxLjk4NTggMTIuOTU5MyAyMS42NjA3IDEyLjM1MSAyMS4xODM0IDExLjg3MzZDMjAuNzA2IDExLjM5NjMgMjAuMDk3OCAxMS4wNzEyIDE5LjQzNTYgMTAuOTM5NUMxOC43NzM0IDEwLjgwNzkgMTguMDg3MSAxMC44NzU1IDE3LjQ2MzQgMTEuMTM0QzE2LjgzOTggMTEuMzkyNCAxNi4zMDY3IDExLjgzIDE1LjkzMTggMTIuMzkxNUMxNS41NTY4IDEyLjk1MjkgMTUuMzU2OCAxMy42MTI5IDE1LjM1NyAxNC4yODhDMTUuMzU3IDE1LjE5MjkgMTUuNzE2NSAxNi4wNjA4IDE2LjM1NjQgMTYuNzAwN0MxNi45OTYyIDE3LjM0MDUgMTcuODY0MSAxNy43IDE4Ljc2OSAxNy43WlwiLz48cGF0aCBkPVwiTTEzLjU0OCAyMy40NDVDMTMuNTQwNSAyMy41MTUgMTMuNTQ3OSAyMy41ODU3IDEzLjU2OTcgMjMuNjUyNkMxMy41OTE1IDIzLjcxOTYgMTMuNjI3MSAyMy43ODExIDEzLjY3NDMgMjMuODMzM0MxMy43MjE1IDIzLjg4NTUgMTMuNzc5MiAyMy45MjcyIDEzLjg0MzYgMjMuOTU1NkMxMy45MDggMjMuOTgzOSAxMy45Nzc2IDIzLjk5ODQgMTQuMDQ4IDIzLjk5OEgyMy40OTVDMjMuNTY1NCAyMy45OTg0IDIzLjYzNSAyMy45ODM5IDIzLjY5OTQgMjMuOTU1NkMyMy43NjM4IDIzLjkyNzIgMjMuODIxNSAyMy44ODU1IDIzLjg2ODcgMjMuODMzM0MyMy45MTU5IDIzLjc4MTEgMjMuOTUxNSAyMy43MTk2IDIzLjk3MzMgMjMuNjUyNkMyMy45OTUxIDIzLjU4NTcgMjQuMDAyNSAyMy41MTUgMjMuOTk1IDIzLjQ0NUMyMy44NTg5IDIyLjE1NTIgMjMuMjUwMSAyMC45NjE0IDIyLjI4NjEgMjAuMDkzOEMyMS4zMjIxIDE5LjIyNjEgMjAuMDcxIDE4Ljc0NiAxOC43NzQgMTguNzQ2QzE3LjQ3NyAxOC43NDYgMTYuMjI1OSAxOS4yMjYxIDE1LjI2MTkgMjAuMDkzOEMxNC4yOTc5IDIwLjk2MTQgMTMuNjg5MSAyMi4xNTUyIDEzLjU1MyAyMy40NDVIMTMuNTQ4WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNoZXZyb24tZG93blwiIGRhdGEtbmFtZT1cImNoZXZyb24tZG93blwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xLjI0OSA3LjIwN0wxMi4yMzMgMTkuNjc4QzEyLjMzMjUgMTkuNzgxOCAxMi40NTIgMTkuODY0NCAxMi41ODQyIDE5LjkyMDhDMTIuNzE2NCAxOS45NzcyIDEyLjg1ODcgMjAuMDA2MyAxMy4wMDI1IDIwLjAwNjNDMTMuMTQ2MyAyMC4wMDYzIDEzLjI4ODYgMTkuOTc3MiAxMy40MjA4IDE5LjkyMDhDMTMuNTUzIDE5Ljg2NDQgMTMuNjcyNSAxOS43ODE4IDEzLjc3MiAxOS42NzhMMjQuNzUxIDcuMjA3QzI0LjgzODggNy4xMDgwNyAyNC45MDU4IDYuOTkyNSAyNC45NDgxIDYuODY3MTVDMjQuOTkwNCA2Ljc0MTggMjUuMDA3IDYuNjA5MjQgMjQuOTk3IDYuNDc3MzRDMjQuOTg3IDYuMzQ1NDMgMjQuOTUwNiA2LjIxNjg4IDI0Ljg5IDYuMDk5MzJDMjQuODI5NCA1Ljk4MTc2IDI0Ljc0NTcgNS44Nzc1OSAyNC42NDQgNS43OTNMMjIuNzk0IDQuMjM2QzIyLjU4NzcgNC4wNjIwOCAyMi4zMjEzIDMuOTc2MjQgMjIuMDUyMyAzLjk5N0MyMS43ODMyIDQuMDE3NzcgMjEuNTMzMiA0LjE0MzQ4IDIxLjM1NiA0LjM0N0wxMy4xOTEgMTMuOEMxMy4xNjc1IDEzLjgyNzMgMTMuMTM4NCAxMy44NDkyIDEzLjEwNTcgMTMuODY0MkMxMy4wNzMgMTMuODc5MiAxMy4wMzc1IDEzLjg4NjkgMTMuMDAxNSAxMy44ODY5QzEyLjk2NTUgMTMuODg2OSAxMi45MyAxMy44NzkyIDEyLjg5NzMgMTMuODY0MkMxMi44NjQ2IDEzLjg0OTIgMTIuODM1NSAxMy44MjczIDEyLjgxMiAxMy44TDQuNjQ0IDQuMzQ2QzQuNDY2NjkgNC4xNDM0MiA0LjIxNjU0IDQuMDE5MDYgMy45NDggNEMzLjgxNDg1IDMuOTg4MTMgMy42ODA2NyA0LjAwMzA4IDMuNTUzNCA0LjA0Mzk2QzMuNDI2MTIgNC4wODQ4MyAzLjMwODM0IDQuMTUwODIgMy4yMDcgNC4yMzhMMS4zNTYgNS43OTNDMS4yNTM3MiA1Ljg3NzQ0IDEuMTY5NDkgNS45ODE2MSAxLjEwODMzIDYuMDk5MjlDMS4wNDcxNyA2LjIxNjk4IDEuMDEwMzIgNi4zNDU3NyAxIDYuNDc4QzAuOTg5OTkgNi42MTAwNCAxLjAwNjkgNi43NDI3NCAxLjA0OTcgNi44NjgwNUMxLjA5MjUgNi45OTMzNiAxLjE2MDMxIDcuMTA4NjggMS4yNDkgNy4yMDdaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2hldnJvbi11cFwiIGRhdGEtbmFtZT1cImNoZXZyb24tdXBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjMuNzUxIDE2Ljc5M0wxMi43NjcgNC4zMjJDMTIuNjY3NSA0LjIxODIyIDEyLjU0OCA0LjEzNTYzIDEyLjQxNTggNC4wNzkyMkMxMi4yODM2IDQuMDIyOCAxMi4xNDEzIDMuOTkzNzIgMTEuOTk3NSAzLjk5MzcyQzExLjg1MzcgMy45OTM3MiAxMS43MTE0IDQuMDIyOCAxMS41NzkyIDQuMDc5MjJDMTEuNDQ3IDQuMTM1NjMgMTEuMzI3NSA0LjIxODIyIDExLjIyOCA0LjMyMkwwLjI0ODk5OCAxNi43OTNDMC4xNjExODggMTYuODkxOSAwLjA5NDE1OTkgMTcuMDA3NSAwLjA1MTg5NzUgMTcuMTMyOUMwLjAwOTYzNTE1IDE3LjI1ODIgLTAuMDA2OTk5NiAxNy4zOTA4IDAuMDAyOTgxNzMgMTcuNTIyN0MwLjAxMjk2MzEgMTcuNjU0NiAwLjA0OTM1NjggMTcuNzgzMSAwLjExIDE3LjkwMDdDMC4xNzA2NDQgMTguMDE4MiAwLjI1NDMgMTguMTIyNCAwLjM1NTk5OCAxOC4yMDdMMi4yMDYgMTkuNzY0QzIuNDEyMjkgMTkuOTM3OSAyLjY3ODcgMjAuMDIzOCAyLjk0NzczIDIwLjAwM0MzLjIxNjc2IDE5Ljk4MjIgMy40NjY4NCAxOS44NTY1IDMuNjQ0IDE5LjY1M0wxMS44MDkgMTAuMkMxMS44MzI1IDEwLjE3MjcgMTEuODYxNSAxMC4xNTA4IDExLjg5NDMgMTAuMTM1OEMxMS45MjcgMTAuMTIwOCAxMS45NjI1IDEwLjExMzEgMTEuOTk4NSAxMC4xMTMxQzEyLjAzNDUgMTAuMTEzMSAxMi4wNyAxMC4xMjA4IDEyLjEwMjcgMTAuMTM1OEMxMi4xMzU0IDEwLjE1MDggMTIuMTY0NSAxMC4xNzI3IDEyLjE4OCAxMC4yTDIwLjM1NiAxOS42NUMyMC40NDQgMTkuNzUxMyAyMC41NTExIDE5LjgzNDMgMjAuNjcxMyAxOS44OTQyQzIwLjc5MTQgMTkuOTU0MSAyMC45MjIxIDE5Ljk4OTcgMjEuMDU2IDE5Ljk5OUMyMS4xODkxIDIwLjAxMDkgMjEuMzIzMyAxOS45OTU5IDIxLjQ1MDYgMTkuOTU1QzIxLjU3NzkgMTkuOTE0MiAyMS42OTU3IDE5Ljg0ODIgMjEuNzk3IDE5Ljc2MUwyMy42NDggMTguMjAzQzIzLjc0OTUgMTguMTE4MiAyMy44MzI5IDE4LjAxNCAyMy44OTM0IDE3Ljg5NjVDMjMuOTUzOSAxNy43Nzg5IDIzLjk5MDIgMTcuNjUwNCAyNC4wMDAxIDE3LjUxODZDMjQuMDEwMSAxNy4zODY4IDIzLjk5MzYgMTcuMjU0MyAyMy45NTE1IDE3LjEyOUMyMy45MDk0IDE3LjAwMzcgMjMuODQyNSAxNi44ODgxIDIzLjc1NSAxNi43ODlMMjMuNzUxIDE2Ljc5M1pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jbG9zZVwiIGRhdGEtbmFtZT1cImNsb3NlXCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIHdpZHRoPVwiMjVcIiBoZWlnaHQ9XCIyNVwiID48cGF0aCBkPVwiTTAuNDM5MDA1IDIxLjQ0QzAuMTU3NzQzIDIxLjcyMTQgLTAuMDAwMjE1NzcxIDIyLjEwMyAtMC4wMDAxMjE5OTcgMjIuNTAwOUMtMi44MjIyOWUtMDUgMjIuODk4NyAwLjE1ODExIDIzLjI4MDIgMC40Mzk1MDUgMjMuNTYxNUMwLjcyMDkgMjMuODQyOCAxLjEwMjUgMjQuMDAwNyAxLjUwMDM2IDI0LjAwMDZDMS44OTgyMiAyNC4wMDA1IDIuMjc5NzQgMjMuODQyNCAyLjU2MTAxIDIzLjU2MUwxMS44MjMgMTQuM0MxMS44NDYyIDE0LjI3NjcgMTEuODczOCAxNC4yNTgyIDExLjkwNDIgMTQuMjQ1NkMxMS45MzQ2IDE0LjIzMyAxMS45NjcxIDE0LjIyNjYgMTIgMTQuMjI2NkMxMi4wMzI5IDE0LjIyNjYgMTIuMDY1NCAxNC4yMzMgMTIuMDk1OCAxNC4yNDU2QzEyLjEyNjIgMTQuMjU4MiAxMi4xNTM4IDE0LjI3NjcgMTIuMTc3IDE0LjNMMjEuNDM5IDIzLjU2M0MyMS41NzgzIDIzLjcwMjMgMjEuNzQzNiAyMy44MTI5IDIxLjkyNTYgMjMuODg4M0MyMi4xMDc2IDIzLjk2MzcgMjIuMzAyNyAyNC4wMDI2IDIyLjQ5OTcgMjQuMDAyNkMyMi42OTY3IDI0LjAwMjcgMjIuODkxNyAyMy45NjM5IDIzLjA3MzggMjMuODg4NkMyMy4yNTU4IDIzLjgxMzIgMjMuNDIxMiAyMy43MDI4IDIzLjU2MDUgMjMuNTYzNUMyMy42OTk4IDIzLjQyNDIgMjMuODEwNCAyMy4yNTg5IDIzLjg4NTggMjMuMDc2OUMyMy45NjEyIDIyLjg5NDkgMjQuMDAwMSAyMi42OTk5IDI0LjAwMDEgMjIuNTAyOUMyNC4wMDAyIDIyLjMwNTkgMjMuOTYxNCAyMi4xMTA4IDIzLjg4NjEgMjEuOTI4OEMyMy44MTA3IDIxLjc0NjcgMjMuNzAwMyAyMS41ODEzIDIzLjU2MSAyMS40NDJMMTQuMyAxMi4xNzdDMTQuMjc2NyAxMi4xNTM4IDE0LjI1ODMgMTIuMTI2MiAxNC4yNDU2IDEyLjA5NThDMTQuMjMzIDEyLjA2NTQgMTQuMjI2NiAxMi4wMzI5IDE0LjIyNjYgMTJDMTQuMjI2NiAxMS45NjcxIDE0LjIzMyAxMS45MzQ2IDE0LjI0NTYgMTEuOTA0MkMxNC4yNTgzIDExLjg3MzggMTQuMjc2NyAxMS44NDYyIDE0LjMgMTEuODIzTDIzLjU2MyAyLjU2MUMyMy44NDQzIDIuMjc5MzQgMjQuMDAyMSAxLjg5NzQ5IDI0LjAwMTggMS40OTk0NEMyNC4wMDE2IDEuMTAxMzkgMjMuODQzMiAwLjcxOTc2MiAyMy41NjE1IDAuNDM4NUMyMy4yNzk4IDAuMTU3MjM4IDIyLjg5OCAtMC4wMDA2MTU2NjQgMjIuNDk5OSAtMC4wMDAzMzQzNjRDMjIuMTAxOSAtNS4zMDY0OWUtMDUgMjEuNzIwMyAwLjE1ODM0IDIxLjQzOSAwLjQ0TDEyLjE3NyA5LjdDMTIuMTUzOCA5LjcyMzI4IDEyLjEyNjIgOS43NDE3NSAxMi4wOTU4IDkuNzU0MzZDMTIuMDY1NCA5Ljc2Njk2IDEyLjAzMjkgOS43NzM0NSAxMiA5Ljc3MzQ1QzExLjk2NzEgOS43NzM0NSAxMS45MzQ2IDkuNzY2OTYgMTEuOTA0MiA5Ljc1NDM2QzExLjg3MzggOS43NDE3NSAxMS44NDYyIDkuNzIzMjggMTEuODIzIDkuN0wyLjU2MTAxIDAuNDRDMi40MjE3NCAwLjMwMDY2NyAyLjI1NjM5IDAuMTkwMTMgMi4wNzQ0MSAwLjExNDY5OEMxLjg5MjQyIDAuMDM5MjY3IDEuNjk3MzYgMC4wMDA0MTkxNDQgMS41MDAzNiAwLjAwMDM3MjcxNUMxLjEwMjUgMC4wMDAyNzg5NDcgMC43MjA5IDAuMTU4MjM4IDAuNDM5NTA1IDAuNDM5NUMwLjE1ODExIDAuNzIwNzYyIC0yLjgyNjA0ZS0wNSAxLjEwMjI5IC0wLjAwMDEyMjAyOSAxLjUwMDE1Qy0wLjAwMDIxNTc5NyAxLjg5OCAwLjE1Nzc0MyAyLjI3OTYxIDAuNDM5MDA1IDIuNTYxTDkuNyAxMS44MjNDOS43MjMyOSAxMS44NDYyIDkuNzQxNzYgMTEuODczOCA5Ljc1NDM2IDExLjkwNDJDOS43NjY5NiAxMS45MzQ2IDkuNzczNDUgMTEuOTY3MSA5Ljc3MzQ1IDEyQzkuNzczNDUgMTIuMDMyOSA5Ljc2Njk2IDEyLjA2NTQgOS43NTQzNiAxMi4wOTU4QzkuNzQxNzYgMTIuMTI2MiA5LjcyMzI5IDEyLjE1MzggOS43IDEyLjE3N0wwLjQzOTAwNSAyMS40NFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jb250YWN0XCIgZGF0YS1uYW1lPVwiY29udGFjdFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yNC4wMDAxIDIxQzIzLjk5NzkgMTkuMDExNSAyMy4yMDcxIDE3LjEwNTEgMjEuODAxIDE1LjY5OUMyMC4zOTUgMTQuMjkzIDE4LjQ4ODUgMTMuNTAyMSAxNi41MDAxIDEzLjVDMTUuNjkxNiAxMy41MDAzIDE0Ljg4ODYgMTMuNjMzIDE0LjEyMzEgMTMuODkzQzE0LjA0MjggMTMuOTE5OCAxMy45NzA2IDEzLjk2NjUgMTMuOTEzMyAxNC4wMjg4QzEzLjg1NiAxNC4wOTExIDEzLjgxNTUgMTQuMTY3IDEzLjc5NTUgMTQuMjQ5MkMxMy43NzU1IDE0LjMzMTQgMTMuNzc2NyAxNC40MTc0IDEzLjc5OTEgMTQuNDk5MUMxMy44MjE0IDE0LjU4MDcgMTMuODY0IDE0LjY1NTMgMTMuOTIzMSAxNC43MTZDMTUuNTczNyAxNi4zOTExIDE2LjQ5OTMgMTguNjQ4MyAxNi41MDAxIDIxVjIxLjAyNEMxNi40OTkxIDIxLjA4NjIgMTYuNTEwNiAyMS4xNDc5IDE2LjUzMzcgMjEuMjA1NkMxNi41NTY5IDIxLjI2MzMgMTYuNTkxMyAyMS4zMTU5IDE2LjYzNDkgMjEuMzYwMkMxNi42Nzg2IDIxLjQwNDUgMTYuNzMwNiAyMS40Mzk2IDE2Ljc4NzkgMjEuNDYzNkMxNi44NDUzIDIxLjQ4NzYgMTYuOTA2OSAyMS41IDE2Ljk2OTEgMjEuNUgyMy41MDAxQzIzLjYzMjcgMjEuNSAyMy43NTk4IDIxLjQ0NzMgMjMuODUzNiAyMS4zNTM2QzIzLjk0NzQgMjEuMjU5OCAyNC4wMDAxIDIxLjEzMjYgMjQuMDAwMSAyMVpcIi8+PHBhdGggZD1cIk0xMy42NzUgNS41MzAwMUMxMy44MDc4IDUuOTQwNTQgMTMuOTAxMiA2LjM2Mjc4IDEzLjk1NCA2Ljc5MTAxQzEzLjk2MzQgNi44Njk0MSAxMy45OTEyIDYuOTQ0NDYgMTQuMDM1MiA3LjAxMDAzQzE0LjA3OTIgNy4wNzU2MSAxNC4xMzgxIDcuMTI5ODMgMTQuMjA3MSA3LjE2ODI2QzE0LjI3NiA3LjIwNjcgMTQuMzUzMSA3LjIyODI2IDE0LjQzMiA3LjIzMTE3QzE0LjUxMDkgNy4yMzQwOCAxNC41ODk0IDcuMjE4MjYgMTQuNjYxIDcuMTg1MDFDMTUuMzI3NSA2Ljg3NTk3IDE1LjkzMDIgNi40NDQ4OCAxNi40MzggNS45MTQwMUMxNi40NjE0IDUuODg5NjMgMTYuNDg5NiA1Ljg3MDI0IDE2LjUyMDcgNS44NTY5OUMxNi41NTE4IDUuODQzNzQgMTYuNTg1MiA1LjgzNjkxIDE2LjYxOSA1LjgzNjkxQzE2LjY1MjggNS44MzY5MSAxNi42ODYzIDUuODQzNzQgMTYuNzE3NCA1Ljg1Njk5QzE2Ljc0ODUgNS44NzAyNCAxNi43NzY2IDUuODg5NjMgMTYuOCA1LjkxNDAxQzE3LjQ4MDUgNi42MjY2MiAxOC4zMjkyIDcuMTU2ODUgMTkuMjY4IDcuNDU2MDFDMTkuMzgxNCA3LjQ5MjI1IDE5LjQ3ODEgNy41Njc3NSAxOS41NDA4IDcuNjY4OTRDMTkuNjAzNSA3Ljc3MDEyIDE5LjYyODEgNy44OTAzNSAxOS42MSA4LjAwODAxQzE5LjQ5OTEgOC43MjcwOSAxOS4xMzQ4IDkuMzgyODIgMTguNTgyOCA5Ljg1Njg1QzE4LjAzMDggMTAuMzMwOSAxNy4zMjc2IDEwLjU5MiAxNi42IDEwLjU5M0MxNi4xODc5IDEwLjU5MzQgMTUuNzggMTAuNTA5NCAxNS40MDE2IDEwLjM0NkMxNS4wMjMyIDEwLjE4MjYgMTQuNjgyMyA5Ljk0MzMzIDE0LjQgOS42NDMwMUMxNC4zNDE5IDkuNTgxNjQgMTQuMjY5MiA5LjUzNiAxNC4xODg2IDkuNTEwMzZDMTQuMTA4MSA5LjQ4NDcyIDE0LjAyMjQgOS40Nzk5MSAxMy45Mzk1IDkuNDk2NEMxMy44NTY2IDkuNTEyODggMTMuNzc5MiA5LjU1MDEgMTMuNzE0NiA5LjYwNDZDMTMuNjUgOS42NTkwOSAxMy42MDAyIDkuNzI5MDggMTMuNTcgOS44MDgwMUMxMy40NTM0IDEwLjExMjQgMTMuMzE0IDEwLjQwNzYgMTMuMTUzIDEwLjY5MUMxMy4wOTYzIDEwLjc5MDIgMTMuMDc1MyAxMC45MDU5IDEzLjA5MzUgMTEuMDE4N0MxMy4xMTE3IDExLjEzMTUgMTMuMTY4IDExLjIzNDcgMTMuMjUzIDExLjMxMUMxNC4xMzk2IDEyLjEwOTEgMTUuMjgyOCAxMi41NjMgMTYuNDc1NCAxMi41OTA0QzE3LjY2OCAxMi42MTc3IDE4LjgzMDggMTIuMjE2NyAxOS43NTMgMTEuNDZDMTkuNzgzNCAxMS40MzUgMTkuODE5MiAxMS40MTc1IDE5Ljg1NzYgMTEuNDA5QzE5Ljg5NiAxMS40MDA0IDE5LjkzNTggMTEuNDAxIDE5Ljk3MzkgMTEuNDEwOEMyMC4wMTIgMTEuNDIwNSAyMC4wNDczIDExLjQzOTEgMjAuMDc2OCAxMS40NjVDMjAuMTA2NCAxMS40OTEgMjAuMTI5NCAxMS41MjM1IDIwLjE0NCAxMS41NkMyMC4yNzE1IDExLjg5NjkgMjAuNDMzIDEyLjIxOTkgMjAuNjI2IDEyLjUyNEMyMC42OTU1IDEyLjYzNzkgMjAuNzg3MSAxMi43MzY4IDIwLjg5NTQgMTIuODE0OEMyMS4wMDM3IDEyLjg5MjcgMjEuMTI2NSAxMi45NDgyIDIxLjI1NjYgMTIuOTc4QzIxLjM4NjcgMTMuMDA3OCAyMS41MjE0IDEzLjAxMTIgMjEuNjUyOCAxMi45ODgxQzIxLjc4NDMgMTIuOTY1IDIxLjkwOTcgMTIuOTE1OCAyMi4wMjE5IDEyLjg0MzVDMjIuMTM0IDEyLjc3MTEgMjIuMjMwNSAxMi42NzcxIDIyLjMwNTcgMTIuNTY2OEMyMi4zODA5IDEyLjQ1NjYgMjIuNDMzMyAxMi4zMzI0IDIyLjQ1OTggMTIuMjAxNkMyMi40ODYzIDEyLjA3MDkgMjIuNDg2MyAxMS45MzYxIDIyLjQ1OTkgMTEuODA1M0MyMi40MzM1IDExLjY3NDUgMjIuMzgxMiAxMS41NTAzIDIyLjMwNiAxMS40NEMyMS44MzYyIDEwLjY1MzQgMjEuNjA0MiA5Ljc0NzYxIDIxLjYzOCA4LjgzMjAxVjcuNTQ2MDFDMjEuNjQgNi41NzYxOSAyMS4zNjE5IDUuNjI2NDIgMjAuODM3MSA0LjgxMDg3QzIwLjMxMjMgMy45OTUzMSAxOS41NjMxIDMuMzQ4NjkgMTguNjc5NiAyLjk0ODcxQzE3Ljc5NjEgMi41NDg3MyAxNi44MTU5IDIuNDEyNDIgMTUuODU2OCAyLjU1NjE3QzE0Ljg5NzYgMi42OTk5MSAxNC4wMDA0IDMuMTE3NiAxMy4yNzMgMy43NTkwMUMxMy4xODY4IDMuODM1NjYgMTMuMTI5OCAzLjkzOTc3IDEzLjExMTUgNC4wNTM2N0MxMy4wOTMzIDQuMTY3NTggMTMuMTE1IDQuMjg0MjkgMTMuMTczIDQuMzg0MDFDMTMuMzgxMiA0Ljc0Njc5IDEzLjU0OTUgNS4xMzEwMyAxMy42NzUgNS41MzAwMVY1LjUzMDAxWlwiLz48cGF0aCBkPVwiTTEyLjUgNy41QzEyLjUgNi41MTExIDEyLjIwNjggNS41NDQ0IDExLjY1NzMgNC43MjIxNUMxMS4xMDc5IDMuODk5OTEgMTAuMzI3IDMuMjU5MDQgOS40MTM0MiAyLjg4MDZDOC40OTk3OSAyLjUwMjE3IDcuNDk0NDYgMi40MDMxNSA2LjUyNDU1IDIuNTk2MDhDNS41NTQ2NSAyLjc4OSA0LjY2MzczIDMuMjY1MjEgMy45NjQ0NyAzLjk2NDQ3QzMuMjY1MjEgNC42NjM3MyAyLjc4OSA1LjU1NDY1IDIuNTk2MDggNi41MjQ1NUMyLjQwMzE1IDcuNDk0NDYgMi41MDIxNyA4LjQ5OTc5IDIuODgwNiA5LjQxMzQyQzMuMjU5MDQgMTAuMzI3IDMuODk5OTEgMTEuMTA3OSA0LjcyMjE1IDExLjY1NzNDNS41NDQ0IDEyLjIwNjggNi41MTExIDEyLjUgNy41IDEyLjVDOC44MjU2IDEyLjQ5ODQgMTAuMDk2NCAxMS45NzExIDExLjAzMzggMTEuMDMzOEMxMS45NzExIDEwLjA5NjQgMTIuNDk4NCA4LjgyNTYgMTIuNSA3LjVWNy41Wk00LjYgNi43NTdDNC42MTk5MiA2LjY4MjA2IDQuNjU2OTkgNi42MTI3OCA0LjcwODI5IDYuNTU0NjRDNC43NTk2IDYuNDk2NDkgNC44MjM3MiA2LjQ1MTA3IDQuODk1NTkgNi40MjE5N0M0Ljk2NzQ3IDYuMzkyODcgNS4wNDUxMiA2LjM4MDg5IDUuMTIyNDMgNi4zODY5N0M1LjE5OTczIDYuMzkzMDUgNS4yNzQ1NiA2LjQxNzAzIDUuMzQxIDYuNDU3QzYuNDI4NTMgNy4xMzA3MSA3LjY4MDczIDcuNDkxNTkgOC45NiA3LjVDOS4yNzA5NiA3LjQ5OTQxIDkuNTgxNDYgNy40NzYwMiA5Ljg4OSA3LjQzQzkuOTY1OTQgNy40MTg1MSAxMC4wNDQ1IDcuNDI1MTMgMTAuMTE4NCA3LjQ0OTMzQzEwLjE5MjMgNy40NzM1MyAxMC4yNTk2IDcuNTE0NjUgMTAuMzE0OCA3LjU2OTQxQzEwLjM3MDEgNy42MjQxNyAxMC40MTE4IDcuNjkxMDYgMTAuNDM2NiA3Ljc2NDc3QzEwLjQ2MTUgNy44Mzg0OCAxMC40Njg4IDcuOTE2OTcgMTAuNDU4IDcuOTk0QzEwLjMzMjcgOC43MzUxNSA5LjkzMzY5IDkuNDAyMjQgOS4zNDAwMSA5Ljg2MzI3QzguNzQ2MzIgMTAuMzI0MyA4LjAwMTIgMTAuNTQ1NyA3LjI1MjExIDEwLjQ4MzVDNi41MDMwMSAxMC40MjE0IDUuODA0NTIgMTAuMDgwNCA1LjI5NDg3IDkuNTI3ODdDNC43ODUyMiA4Ljk3NTM2IDQuNTAxNTYgOC4yNTE2NyA0LjUgNy41QzQuNTAwMzcgNy4yNDkwMSA0LjUzMzk5IDYuOTk5MTYgNC42IDYuNzU3VjYuNzU3WlwiLz48cGF0aCBkPVwiTTE1IDIxQzE1IDE5LjAxMDkgMTQuMjA5OCAxNy4xMDMyIDEyLjgwMzMgMTUuNjk2N0MxMS4zOTY4IDE0LjI5MDIgOS40ODkxMiAxMy41IDcuNSAxMy41QzUuNTEwODggMTMuNSAzLjYwMzIyIDE0LjI5MDIgMi4xOTY3IDE1LjY5NjdDMC43OTAxNzYgMTcuMTAzMiAwIDE5LjAxMDkgMCAyMUMwIDIxLjEzMjYgMC4wNTI2Nzg0IDIxLjI1OTggMC4xNDY0NDcgMjEuMzUzNkMwLjI0MDIxNSAyMS40NDczIDAuMzY3MzkyIDIxLjUgMC41IDIxLjVIMTQuNUMxNC42MzI2IDIxLjUgMTQuNzU5OCAyMS40NDczIDE0Ljg1MzYgMjEuMzUzNkMxNC45NDczIDIxLjI1OTggMTUgMjEuMTMyNiAxNSAyMVpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1kYXNoYm9hcmRcIiBkYXRhLW5hbWU9XCJkYXNoYm9hcmRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMTIgMEM5LjYyNjYzIDAgNy4zMDY1NSAwLjcwMzc4OCA1LjMzMzE2IDIuMDIyMzZDMy4zNTk3NyAzLjM0MDk0IDEuODIxNyA1LjIxNTA5IDAuOTEzNDUxIDcuNDA3OEMwLjAwNTE5OTQzIDkuNjAwNTEgLTAuMjMyNDQxIDEyLjAxMzMgMC4yMzA1ODIgMTQuMzQxMUMwLjY5MzYwNSAxNi42Njg5IDEuODM2NDkgMTguODA3MSAzLjUxNDcyIDIwLjQ4NTNDNS4xOTI5NSAyMi4xNjM1IDcuMzMxMTUgMjMuMzA2NCA5LjY1ODkyIDIzLjc2OTRDMTEuOTg2NyAyNC4yMzI0IDE0LjM5OTUgMjMuOTk0OCAxNi41OTIyIDIzLjA4NjZDMTguNzg0OSAyMi4xNzgzIDIwLjY1OTEgMjAuNjQwMiAyMS45Nzc2IDE4LjY2NjhDMjMuMjk2MiAxNi42OTM1IDI0IDE0LjM3MzQgMjQgMTJDMjMuOTk2NiA4LjgxODQ2IDIyLjczMTIgNS43NjgyMSAyMC40ODE1IDMuNTE4NTJDMTguMjMxOCAxLjI2ODgzIDE1LjE4MTUgMC4wMDM0NDEwOCAxMiAwVjBaTTUuMTQ1MDEgOC45MUw0LjI3OTAxIDguNDFDNC4xMDY2MSA4LjMxMDU0IDMuOTgwNzkgOC4xNDY2OCAzLjkyOTIyIDcuOTU0NDVDMy44Nzc2NSA3Ljc2MjIzIDMuOTA0NTUgNy41NTczOSA0LjAwNDAxIDcuMzg1QzQuMTAzNDYgNy4yMTI2MSA0LjI2NzMzIDcuMDg2NzkgNC40NTk1NSA3LjAzNTIyQzQuNjUxNzggNi45ODM2NCA0Ljg1NjYxIDcuMDEwNTQgNS4wMjkwMSA3LjExTDUuODk1MDEgNy42MUM2LjAzODMgNy42OTI0OSA2LjE1MDMyIDcuODIwMDEgNi4yMTM2NSA3Ljk3Mjc0QzYuMjc2OTggOC4xMjU0OCA2LjI4ODA2IDguMjk0ODYgNi4yNDUxNyA4LjQ1NDU0QzYuMjAyMjkgOC42MTQyMiA2LjEwNzg0IDguNzU1MjUgNS45NzY1MSA4Ljg1NTcxQzUuODQ1MTkgOC45NTYxNiA1LjY4NDM1IDkuMDEwNDEgNS41MTkwMSA5LjAxQzUuMzg3NjYgOS4wMTA1NCA1LjI1ODU1IDguOTc2MDIgNS4xNDUwMSA4LjkxVjguOTFaTTUuMjUwMDEgMTEuOTkxQzUuMjUwMDEgMTIuMTg5OSA1LjE3MDk5IDEyLjM4MDcgNS4wMzAzNCAxMi41MjEzQzQuODg5NjggMTIuNjYyIDQuNjk4OTIgMTIuNzQxIDQuNTAwMDEgMTIuNzQxSDMuNTAwMDFDMy4zMDEwOSAxMi43NDEgMy4xMTAzMyAxMi42NjIgMi45Njk2OCAxMi41MjEzQzIuODI5MDIgMTIuMzgwNyAyLjc1MDAxIDEyLjE4OTkgMi43NTAwMSAxMS45OTFDMi43NTAwMSAxMS43OTIxIDIuODI5MDIgMTEuNjAxMyAyLjk2OTY4IDExLjQ2MDdDMy4xMTAzMyAxMS4zMiAzLjMwMTA5IDExLjI0MSAzLjUwMDAxIDExLjI0MUg0LjUwMDAxQzQuNjk4OTIgMTEuMjQxIDQuODg5NjggMTEuMzIgNS4wMzAzNCAxMS40NjA3QzUuMTcwOTkgMTEuNjAxMyA1LjI1MDAxIDExLjc5MjEgNS4yNTAwMSAxMS45OTFaTTE0LjI0IDEyQzE0LjI0IDEyLjQ0NSAxNC4xMDggMTIuODggMTMuODYwOCAxMy4yNUMxMy42MTM2IDEzLjYyIDEzLjI2MjIgMTMuOTA4NCAxMi44NTEgMTQuMDc4N0MxMi40Mzk5IDE0LjI0OSAxMS45ODc1IDE0LjI5MzYgMTEuNTUxMSAxNC4yMDY4QzExLjExNDYgMTQuMTIgMTAuNzEzNyAxMy45MDU3IDEwLjM5OSAxMy41OTFDMTAuMDg0MyAxMy4yNzYzIDkuODcwMDYgMTIuODc1NCA5Ljc4MzI0IDEyLjQzOUM5LjY5NjQyIDEyLjAwMjUgOS43NDA5OCAxMS41NTAxIDkuOTExMjggMTEuMTM5QzEwLjA4MTYgMTAuNzI3OCAxMC4zNyAxMC4zNzY0IDEwLjc0IDEwLjEyOTJDMTEuMTEgOS44ODE5NiAxMS41NDUgOS43NSAxMS45OSA5Ljc1QzEyLjAxNTQgOS43NTAxNCAxMi4wNDA4IDkuNzUxODEgMTIuMDY2IDkuNzU1QzEyLjExMTIgOS43NTk1NSAxMi4xNTY3IDkuNzUxNzEgMTIuMTk3OCA5LjczMjMzQzEyLjIzODggOS43MTI5NSAxMi4yNzM4IDkuNjgyNzYgMTIuMjk5IDkuNjQ1TDE1LjY5OSA0LjU3MUMxNS43NzE5IDQuNDYxMjggMTUuODY1NyA0LjM2NzA0IDE1Ljk3NTEgNC4yOTM2OUMxNi4wODQ1IDQuMjIwMzMgMTYuMjA3MyA0LjE2OTMgMTYuMzM2NCA0LjE0MzU0QzE2LjQ2NTYgNC4xMTc3NyAxNi41OTg2IDQuMTE3NzggMTYuNzI3NyA0LjE0MzU1QzE2Ljg1NjkgNC4xNjkzMiAxNi45Nzk3IDQuMjIwMzUgMTcuMDg5IDQuMjkzNzFDMTcuMTk4NCA0LjM2NzA3IDE3LjI5MjIgNC40NjEzMSAxNy4zNjUxIDQuNTcxMDNDMTcuNDM4IDQuNjgwNzUgMTcuNDg4NCA0LjgwMzc4IDE3LjUxMzYgNC45MzMwNkMxNy41Mzg4IDUuMDYyMzMgMTcuNTM4MiA1LjE5NTMxIDE3LjUxMTggNS4zMjQzNUMxNy40ODU1IDUuNDUzMzkgMTcuNDMzOSA1LjU3NTk1IDE3LjM2IDUuNjg1TDEzLjk5MyAxMC43MUMxMy45Njc5IDEwLjc0NzUgMTMuOTUzNSAxMC43OTExIDEzLjk1MTIgMTAuODM2MkMxMy45NDg5IDEwLjg4MTMgMTMuOTU4OSAxMC45MjYxIDEzLjk4IDEwLjk2NkMxNC4xNDk2IDExLjI4NDMgMTQuMjM4OSAxMS42MzkzIDE0LjI0IDEyVjEyWk0xMi43NTggNC41NThDMTIuNzU4IDQuNzU2OTEgMTIuNjc5IDQuOTQ3NjggMTIuNTM4MyA1LjA4ODMzQzEyLjM5NzcgNS4yMjg5OCAxMi4yMDY5IDUuMzA4IDEyLjAwOCA1LjMwOEMxMS44MDkxIDUuMzA4IDExLjYxODMgNS4yMjg5OCAxMS40Nzc3IDUuMDg4MzNDMTEuMzM3IDQuOTQ3NjggMTEuMjU4IDQuNzU2OTEgMTEuMjU4IDQuNTU4VjMuNTU4QzExLjI1OCAzLjM1OTA5IDExLjMzNyAzLjE2ODMyIDExLjQ3NzcgMy4wMjc2N0MxMS42MTgzIDIuODg3MDIgMTEuODA5MSAyLjgwOCAxMi4wMDggMi44MDhDMTIuMjA2OSAyLjgwOCAxMi4zOTc3IDIuODg3MDIgMTIuNTM4MyAzLjAyNzY3QzEyLjY3OSAzLjE2ODMyIDEyLjc1OCAzLjM1OTA5IDEyLjc1OCAzLjU1OFY0LjU1OFpNNy4zOTMwMSA0LjAyNUM3LjQ3ODI0IDMuOTc1NTkgNy41NzI0IDMuOTQzNSA3LjY3MDA3IDMuOTMwNTlDNy43Njc3NCAzLjkxNzY3IDcuODY3IDMuOTI0MTcgNy45NjIxNSAzLjk0OTczQzguMDU3MyAzLjk3NTI4IDguMTQ2NDYgNC4wMTkzOCA4LjIyNDUyIDQuMDc5NDlDOC4zMDI1OCA0LjEzOTYgOC4zNjc5OSA0LjIxNDU0IDguNDE3MDEgNC4zTDguOTE3MDEgNS4xNjZDOC45NjY0NiA1LjI1MTE4IDguOTk4NiA1LjM0NTI4IDkuMDExNTkgNS40NDI5MUM5LjAyNDU4IDUuNTQwNTQgOS4wMTgxNiA1LjYzOTc3IDguOTkyNzEgNS43MzQ5MUM4Ljk2NzI1IDUuODMwMDYgOC45MjMyNSA1LjkxOTI0IDguODYzMjQgNS45OTczM0M4LjgwMzIzIDYuMDc1NDMgOC43MjgzOSA2LjE0MDkgOC42NDMwMSA2LjE5QzguNTI5NDYgNi4yNTYwMiA4LjQwMDM1IDYuMjkwNTQgOC4yNjkwMSA2LjI5QzguMTM3MjMgNi4yOTAyOSA4LjAwNzcyIDYuMjU1NzYgNy44OTM1OCA2LjE4OTkxQzcuNzc5NDQgNi4xMjQwNiA3LjY4NDcyIDYuMDI5MjIgNy42MTkwMSA1LjkxNUw3LjExOTAxIDUuMDQ5QzcuMDY5NjkgNC45NjM3OSA3LjAzNzY1IDQuODY5NjkgNy4wMjQ3MyA0Ljc3MjA5QzcuMDExODEgNC42NzQ0OSA3LjAxODI2IDQuNTc1MyA3LjA0MzcxIDQuNDgwMTlDNy4wNjkxNiA0LjM4NTA5IDcuMTEzMSA0LjI5NTkzIDcuMTczMDQgNC4yMTc4MkM3LjIzMjk4IDQuMTM5NzIgNy4zMDc3MiA0LjA3NDE5IDcuMzkzMDEgNC4wMjVWNC4wMjVaTTcuNTAwMDEgMTdDNy41MDAwMSAxNi44Njc0IDcuNTUyNjggMTYuNzQwMiA3LjY0NjQ1IDE2LjY0NjRDNy43NDAyMiAxNi41NTI3IDcuODY3NCAxNi41IDguMDAwMDEgMTYuNUgxNkMxNi4xMzI2IDE2LjUgMTYuMjU5OCAxNi41NTI3IDE2LjM1MzYgMTYuNjQ2NEMxNi40NDczIDE2Ljc0MDIgMTYuNSAxNi44Njc0IDE2LjUgMTdWMTlDMTYuNSAxOS4xMzI2IDE2LjQ0NzMgMTkuMjU5OCAxNi4zNTM2IDE5LjM1MzZDMTYuMjU5OCAxOS40NDczIDE2LjEzMjYgMTkuNSAxNiAxOS41SDguMDAwMDFDNy44Njc0IDE5LjUgNy43NDAyMiAxOS40NDczIDcuNjQ2NDUgMTkuMzUzNkM3LjU1MjY4IDE5LjI1OTggNy41MDAwMSAxOS4xMzI2IDcuNTAwMDEgMTlWMTdaTTE3LjgwOSA4LjdDMTcuNzA5NyA4LjUyNzg1IDE3LjY4MjcgOC4zMjMzIDE3LjczNDEgOC4xMzEzQzE3Ljc4NTUgNy45MzkzIDE3LjkxMSA3Ljc3NTU0IDE4LjA4MyA3LjY3NkwxOC45NDkgNy4xNzZDMTkuMTIxNCA3LjA3NjU0IDE5LjMyNjIgNy4wNDk2NCAxOS41MTg1IDcuMTAxMjJDMTkuNzEwNyA3LjE1Mjc5IDE5Ljg3NDYgNy4yNzg2MSAxOS45NzQgNy40NTFDMjAuMDczNSA3LjYyMzM5IDIwLjEwMDQgNy44MjgyMyAyMC4wNDg4IDguMDIwNDVDMTkuOTk3MiA4LjIxMjY4IDE5Ljg3MTQgOC4zNzY1NCAxOS42OTkgOC40NzZMMTguODMyIDguOTc2QzE4LjY1OTcgOS4wNzQ4NSAxOC40NTUyIDkuMTAxMzEgMTguMjYzNCA5LjA0OTU2QzE4LjA3MTYgOC45OTc4MiAxNy45MDgyIDguODcyMSAxNy44MDkgOC43Wk0xOC42OSAxMi4wNjVDMTguNjkgMTEuODY2MSAxOC43NjkgMTEuNjc1MyAxOC45MDk3IDExLjUzNDdDMTkuMDUwMyAxMS4zOTQgMTkuMjQxMSAxMS4zMTUgMTkuNDQgMTEuMzE1SDIwLjQ0QzIwLjYzODkgMTEuMzE1IDIwLjgyOTcgMTEuMzk0IDIwLjk3MDMgMTEuNTM0N0MyMS4xMTEgMTEuNjc1MyAyMS4xOSAxMS44NjYxIDIxLjE5IDEyLjA2NUMyMS4xOSAxMi4yNjM5IDIxLjExMSAxMi40NTQ3IDIwLjk3MDMgMTIuNTk1M0MyMC44Mjk3IDEyLjczNiAyMC42Mzg5IDEyLjgxNSAyMC40NCAxMi44MTVIMTkuNDRDMTkuMjQxMyAxMi44MTUgMTkuMDUwNyAxMi43MzYxIDE4LjkxIDEyLjU5NTdDMTguNzY5NCAxMi40NTUyIDE4LjY5MDMgMTIuMjY0NyAxOC42OSAxMi4wNjZWMTIuMDY1WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWZ1ZWxcIiBkYXRhLW5hbWU9XCJmdWVsXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMjMuOTkgMy4zNTg1OEMyNC4wMjc1IDMuNjIxMTMgMjMuOTU5MSAzLjg4NzgzIDIzLjggNC4xTDIxLjc1IDYuODMzVjhIMjNDMjMuMTMyNiA4IDIzLjI1OTggOC4wNTI2OCAyMy4zNTM2IDguMTQ2NDVDMjMuNDQ3MyA4LjI0MDIxIDIzLjUgOC4zNjczOSAyMy41IDguNVYxMUMyMy41IDExLjA4MjMgMjMuNDc5NiAxMS4xNjM0IDIzLjQ0MDcgMTEuMjM2QzIzLjQwMTggMTEuMzA4NSAyMy4zNDU2IDExLjM3MDQgMjMuMjc3IDExLjQxNkwyMS43NzcgMTIuNDE2TDIxLjc1IDEyLjQzM1YxNS41QzIxLjc1IDE2LjI5NTYgMjEuNDMzOSAxNy4wNTg3IDIwLjg3MTMgMTcuNjIxM0MyMC4zMDg3IDE4LjE4MzkgMTkuNTQ1NiAxOC41IDE4Ljc1IDE4LjVIMTguNUMxOC4zNjc0IDE4LjUgMTguMjQwMiAxOC41NTI3IDE4LjE0NjQgMTguNjQ2NEMxOC4wNTI3IDE4Ljc0MDIgMTggMTguODY3NCAxOCAxOVYyMi41QzE4IDIyLjg5NzggMTcuODQyIDIzLjI3OTQgMTcuNTYwNyAyMy41NjA3QzE3LjI3OTQgMjMuODQyIDE2Ljg5NzggMjQgMTYuNSAyNEgzLjVDMy4xMDIxOCAyNCAyLjcyMDY0IDIzLjg0MiAyLjQzOTM0IDIzLjU2MDdDMi4xNTgwNCAyMy4yNzk0IDIgMjIuODk3OCAyIDIyLjVWMS41QzIgMS4xMDIxOCAyLjE1ODA0IDAuNzIwNjQ0IDIuNDM5MzQgMC40MzkzNEMyLjcyMDY0IDAuMTU4MDM1IDMuMTAyMTggMCAzLjUgMEgxNi41QzE2Ljg5NzggMCAxNy4yNzk0IDAuMTU4MDM1IDE3LjU2MDcgMC40MzkzNEMxNy44NDIgMC43MjA2NDQgMTggMS4xMDIxOCAxOCAxLjVWMTZDMTggMTYuMTMyNiAxOC4wNTI3IDE2LjI1OTggMTguMTQ2NCAxNi4zNTM2QzE4LjI0MDIgMTYuNDQ3MyAxOC4zNjc0IDE2LjUgMTguNSAxNi41SDE4Ljc1QzE5LjAxNTIgMTYuNSAxOS4yNjk2IDE2LjM5NDYgMTkuNDU3MSAxNi4yMDcxQzE5LjY0NDYgMTYuMDE5NiAxOS43NSAxNS43NjUyIDE5Ljc1IDE1LjVWNi41QzE5Ljc1IDYuMjgzNjMgMTkuODIwMiA2LjA3MzEgMTkuOTUgNS45TDIyLjIgMi45QzIyLjM1OTEgMi42ODc4MyAyMi41OTYgMi41NDc1NiAyMi44NTg2IDIuNTEwMDVDMjIuOTg4NiAyLjQ5MTQ4IDIzLjEyMSAyLjQ5ODY5IDIzLjI0ODIgMi41MzEyOUMyMy4zNzU0IDIuNTYzODggMjMuNDk0OSAyLjYyMTIxIDIzLjYgMi43QzIzLjgxMjIgMi44NTkxMyAyMy45NTI0IDMuMDk2MDMgMjMuOTkgMy4zNTg1OFpNMTUuODUzNiA3Ljg1MzU1QzE1Ljk0NzMgNy43NTk3OSAxNiA3LjYzMjYxIDE2IDcuNVYyLjVDMTYgMi4zNjczOSAxNS45NDczIDIuMjQwMjEgMTUuODUzNiAyLjE0NjQ1QzE1Ljc1OTggMi4wNTI2OCAxNS42MzI2IDIgMTUuNSAySDQuNUM0LjM2NzM5IDIgNC4yNDAyMSAyLjA1MjY4IDQuMTQ2NDUgMi4xNDY0NUM0LjA1MjY4IDIuMjQwMjEgNCAyLjM2NzM5IDQgMi41VjcuNUM0IDcuNjMyNjEgNC4wNTI2OCA3Ljc1OTc5IDQuMTQ2NDUgNy44NTM1NUM0LjI0MDIxIDcuOTQ3MzIgNC4zNjczOSA4IDQuNSA4SDE1LjVDMTUuNjMyNiA4IDE1Ljc1OTggNy45NDczMiAxNS44NTM2IDcuODUzNTVaTTEzIDExQzEyLjQ0NzcgMTEgMTIgMTEuNDQ3NyAxMiAxMlYxNkMxMiAxNi41NTIzIDEyLjQ0NzcgMTcgMTMgMTdIMTRDMTQuNTUyMyAxNyAxNSAxNi41NTIzIDE1IDE2VjEyQzE1IDExLjQ0NzcgMTQuNTUyMyAxMSAxNCAxMUgxM1pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1pbnNwZWN0aW9uXCIgZGF0YS1uYW1lPVwiaW5zcGVjdGlvblwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xMiAwQzkuNjI2NjMgMCA3LjMwNjU1IDAuNzAzNzg4IDUuMzMzMTYgMi4wMjIzNkMzLjM1OTc3IDMuMzQwOTQgMS44MjE3IDUuMjE1MDkgMC45MTM0NTEgNy40MDc4QzAuMDA1MTk5NDMgOS42MDA1MSAtMC4yMzI0NDEgMTIuMDEzMyAwLjIzMDU4MiAxNC4zNDExQzAuNjkzNjA1IDE2LjY2ODkgMS44MzY0OSAxOC44MDcxIDMuNTE0NzIgMjAuNDg1M0M1LjE5Mjk1IDIyLjE2MzUgNy4zMzExNSAyMy4zMDY0IDkuNjU4OTIgMjMuNzY5NEMxMS45ODY3IDI0LjIzMjQgMTQuMzk5NSAyMy45OTQ4IDE2LjU5MjIgMjMuMDg2NkMxOC43ODQ5IDIyLjE3ODMgMjAuNjU5MSAyMC42NDAyIDIxLjk3NzYgMTguNjY2OEMyMy4yOTYyIDE2LjY5MzUgMjQgMTQuMzczNCAyNCAxMkMyMy45OTYzIDguODE4NTQgMjIuNzMwOCA1Ljc2ODQ0IDIwLjQ4MTIgMy41MTg4MUMxOC4yMzE2IDEuMjY5MTggMTUuMTgxNSAwLjAwMzcwNTIyIDEyIDBWMFpNMTguOTI3IDguMkwxMi4wODIgMTcuNDg5QzEyLjAwMTIgMTcuNTk2MiAxMS44OTk4IDE3LjY4NjMgMTEuNzgzOCAxNy43NTM5QzExLjY2NzggMTcuODIxNSAxMS41Mzk1IDE3Ljg2NTQgMTEuNDA2NCAxNy44ODI5QzExLjI3MzMgMTcuOTAwNCAxMS4xMzggMTcuODkxMiAxMS4wMDg1IDE3Ljg1NThDMTAuODc5IDE3LjgyMDUgMTAuNzU3OCAxNy43NTk3IDEwLjY1MiAxNy42NzdMNS43NjQwMSAxMy43NjlDNS42NjE0NCAxMy42ODY5IDUuNTc2MDUgMTMuNTg1NSA1LjUxMjcgMTMuNDcwNEM1LjQ0OTM2IDEzLjM1NTMgNS40MDkzIDEzLjIyODkgNS4zOTQ4MSAxMy4wOTgzQzUuMzY1NTYgMTIuODM0NiA1LjQ0MjI0IDEyLjU3MDEgNS42MDgwMSAxMi4zNjNDNS43NzM3NyAxMi4xNTU5IDYuMDE1MDIgMTIuMDIzMSA2LjI3ODcgMTEuOTkzOEM2LjU0MjM3IDExLjk2NDYgNi44MDY4NyAxMi4wNDEyIDcuMDE0MDEgMTIuMjA3TDExLjA5IDE1LjQ2OEwxNy4zMTcgNy4wMTdDMTcuMzkyIDYuOTA0NTEgMTcuNDg5IDYuODA4MzggMTcuNjAyMSA2LjczNDQzQzE3LjcxNTMgNi42NjA0OCAxNy44NDIzIDYuNjEwMjUgMTcuOTc1NCA2LjU4Njc2QzE4LjEwODUgNi41NjMyNyAxOC4yNDUgNi41NjcwMiAxOC4zNzY3IDYuNTk3NzdDMTguNTA4MyA2LjYyODUzIDE4LjYzMjMgNi42ODU2NSAxOC43NDEzIDYuNzY1N0MxOC44NTAyIDYuODQ1NzQgMTguOTQxOCA2Ljk0NzA1IDE5LjAxMDUgNy4wNjM0OEMxOS4wNzkyIDcuMTc5OTIgMTkuMTIzNSA3LjMwOTA3IDE5LjE0MDkgNy40NDMxM0MxOS4xNTgyIDcuNTc3MTkgMTkuMTQ4MiA3LjcxMzM5IDE5LjExMTUgNy44NDM0N0MxOS4wNzQ3IDcuOTczNTYgMTkuMDEyIDguMDk0ODUgMTguOTI3IDguMlpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1pc3N1ZVwiIGRhdGEtbmFtZT1cImlzc3VlXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTIzIDEwLjU4NkwxMy40MTQgMUMxMy4wMzg5IDAuNjI1MDU5IDEyLjUzMDMgMC40MTQ0MjkgMTIgMC40MTQ0MjlDMTEuNDY5NyAwLjQxNDQyOSAxMC45NjExIDAuNjI1MDU5IDEwLjU4NiAxTDEgMTAuNTg3QzAuNjI1MDU5IDEwLjk2MjEgMC40MTQ0MjkgMTEuNDcwNyAwLjQxNDQyOSAxMi4wMDFDMC40MTQ0MjkgMTIuNTMxMyAwLjYyNTA1OSAxMy4wMzk5IDEgMTMuNDE1TDEwLjU4NiAyM0MxMC45NjExIDIzLjM3NDkgMTEuNDY5NyAyMy41ODU2IDEyIDIzLjU4NTZDMTIuNTMwMyAyMy41ODU2IDEzLjAzODkgMjMuMzc0OSAxMy40MTQgMjNMMjMgMTMuNDE1QzIzLjE4NTggMTMuMjI5MyAyMy4zMzMyIDEzLjAwODggMjMuNDMzOCAxMi43NjYxQzIzLjUzNDMgMTIuNTIzNCAyMy41ODYxIDEyLjI2MzIgMjMuNTg2MSAxMi4wMDA1QzIzLjU4NjEgMTEuNzM3OCAyMy41MzQzIDExLjQ3NzcgMjMuNDMzOCAxMS4yMzQ5QzIzLjMzMzIgMTAuOTkyMiAyMy4xODU4IDEwLjc3MTcgMjMgMTAuNTg2Wk0xMS4wNjggNi40MTdDMTEuMDY4IDYuMTUxNzggMTEuMTczNCA1Ljg5NzQzIDExLjM2MDkgNS43MDk4OUMxMS41NDg0IDUuNTIyMzYgMTEuODAyOCA1LjQxNyAxMi4wNjggNS40MTdDMTIuMzMzMiA1LjQxNyAxMi41ODc2IDUuNTIyMzYgMTIuNzc1MSA1LjcwOTg5QzEyLjk2MjYgNS44OTc0MyAxMy4wNjggNi4xNTE3OCAxMy4wNjggNi40MTdWMTIuNDE3QzEzLjA2OCAxMi42ODIyIDEyLjk2MjYgMTIuOTM2NiAxMi43NzUxIDEzLjEyNDFDMTIuNTg3NiAxMy4zMTE2IDEyLjMzMzIgMTMuNDE3IDEyLjA2OCAxMy40MTdDMTEuODAyOCAxMy40MTcgMTEuNTQ4NCAxMy4zMTE2IDExLjM2MDkgMTMuMTI0MUMxMS4xNzM0IDEyLjkzNjYgMTEuMDY4IDEyLjY4MjIgMTEuMDY4IDEyLjQxN1Y2LjQxN1pNMTIuMTE5IDE3LjkyN0gxMi4wOTFDMTEuNjk2NyAxNy45MjU1IDExLjMxODMgMTcuNzcxNyAxMS4wMzQ2IDE3LjQ5NzhDMTAuNzUxIDE3LjIyMzkgMTAuNTg0MiAxNi44NTEgMTAuNTY5IDE2LjQ1N0MxMC41NjE3IDE2LjI2MSAxMC41OTM1IDE2LjA2NTUgMTAuNjYyNiAxNS44ODE5QzEwLjczMTggMTUuNjk4MyAxMC44MzY4IDE1LjUzMDQgMTAuOTcxNyAxNS4zODc5QzExLjEwNjUgMTUuMjQ1NCAxMS4yNjg0IDE1LjEzMTMgMTEuNDQ3OSAxNS4wNTIxQzExLjYyNzQgMTQuOTczIDExLjgyMDkgMTQuOTMwNSAxMi4wMTcgMTQuOTI3SDEyLjA0NUMxMi40Mzk0IDE0LjkyOCAxMi44MTgyIDE1LjA4MTYgMTMuMTAxOSAxNS4zNTU2QzEzLjM4NTYgMTUuNjI5NyAxMy41NTIzIDE2LjAwMjggMTMuNTY3IDE2LjM5N0MxMy41NzQzIDE2LjU5MyAxMy41NDI1IDE2Ljc4ODUgMTMuNDczNCAxNi45NzIxQzEzLjQwNDIgMTcuMTU1NyAxMy4yOTkyIDE3LjMyMzYgMTMuMTY0MyAxNy40NjYxQzEzLjAyOTUgMTcuNjA4NiAxMi44Njc2IDE3LjcyMjcgMTIuNjg4MSAxNy44MDE5QzEyLjUwODYgMTcuODgxIDEyLjMxNTEgMTcuOTIzNSAxMi4xMTkgMTcuOTI3WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWxlYWRlcmJvYXJkXCIgZGF0YS1uYW1lPVwibGVhZGVyYm9hcmRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNNS41IDkuNUgxLjVDMS4xMDIxOCA5LjUgMC43MjA2NDQgOS42NTgwNCAwLjQzOTM0IDkuOTM5MzRDMC4xNTgwMzUgMTAuMjIwNiAwIDEwLjYwMjIgMCAxMUwwIDIwQzAgMjAuMzk3OCAwLjE1ODAzNSAyMC43Nzk0IDAuNDM5MzQgMjEuMDYwN0MwLjcyMDY0NCAyMS4zNDIgMS4xMDIxOCAyMS41IDEuNSAyMS41SDUuNUM1LjYzMjYxIDIxLjUgNS43NTk3OSAyMS40NDczIDUuODUzNTUgMjEuMzUzNkM1Ljk0NzMyIDIxLjI1OTggNiAyMS4xMzI2IDYgMjFWMTBDNiA5Ljg2NzM5IDUuOTQ3MzIgOS43NDAyMSA1Ljg1MzU1IDkuNjQ2NDVDNS43NTk3OSA5LjU1MjY4IDUuNjMyNjEgOS41IDUuNSA5LjVaXCIvPjxwYXRoIGQ9XCJNMjIuNSAxMy41SDE4LjVDMTguMzY3NCAxMy41IDE4LjI0MDIgMTMuNTUyNyAxOC4xNDY0IDEzLjY0NjRDMTguMDUyNyAxMy43NDAyIDE4IDEzLjg2NzQgMTggMTRWMjFDMTggMjEuMTMyNiAxOC4wNTI3IDIxLjI1OTggMTguMTQ2NCAyMS4zNTM2QzE4LjI0MDIgMjEuNDQ3MyAxOC4zNjc0IDIxLjUgMTguNSAyMS41SDIyLjVDMjIuODk3OCAyMS41IDIzLjI3OTQgMjEuMzQyIDIzLjU2MDcgMjEuMDYwN0MyMy44NDIgMjAuNzc5NCAyNCAyMC4zOTc4IDI0IDIwVjE1QzI0IDE0LjYwMjIgMjMuODQyIDE0LjIyMDYgMjMuNTYwNyAxMy45MzkzQzIzLjI3OTQgMTMuNjU4IDIyLjg5NzggMTMuNSAyMi41IDEzLjVaXCIvPjxwYXRoIGQ9XCJNMTUgMi41SDlDOC42MDIxOCAyLjUgOC4yMjA2NCAyLjY1ODA0IDcuOTM5MzQgMi45MzkzNEM3LjY1ODA0IDMuMjIwNjQgNy41IDMuNjAyMTggNy41IDRWMjFDNy41IDIxLjEzMjYgNy41NTI2OCAyMS4yNTk4IDcuNjQ2NDUgMjEuMzUzNkM3Ljc0MDIxIDIxLjQ0NzMgNy44NjczOSAyMS41IDggMjEuNUgxNkMxNi4xMzI2IDIxLjUgMTYuMjU5OCAyMS40NDczIDE2LjM1MzYgMjEuMzUzNkMxNi40NDczIDIxLjI1OTggMTYuNSAyMS4xMzI2IDE2LjUgMjFWNEMxNi41IDMuNjAyMTggMTYuMzQyIDMuMjIwNjQgMTYuMDYwNyAyLjkzOTM0QzE1Ljc3OTQgMi42NTgwNCAxNS4zOTc4IDIuNSAxNSAyLjVaTTEzIDEwLjc1SDExQzEwLjgwMTEgMTAuNzUgMTAuNjEwMyAxMC42NzEgMTAuNDY5NyAxMC41MzAzQzEwLjMyOSAxMC4zODk3IDEwLjI1IDEwLjE5ODkgMTAuMjUgMTBDMTAuMjUgOS44MDEwOSAxMC4zMjkgOS42MTAzMiAxMC40Njk3IDkuNDY5NjdDMTAuNjEwMyA5LjMyOTAyIDEwLjgwMTEgOS4yNSAxMSA5LjI1QzExLjA2NjMgOS4yNSAxMS4xMjk5IDkuMjIzNjYgMTEuMTc2OCA5LjE3Njc4QzExLjIyMzcgOS4xMjk4OSAxMS4yNSA5LjA2NjMgMTEuMjUgOVY3QzExLjI1IDYuOTMzNyAxMS4yMjM3IDYuODcwMTEgMTEuMTc2OCA2LjgyMzIyQzExLjEyOTkgNi43NzYzNCAxMS4wNjYzIDYuNzUgMTEgNi43NUMxMC44MDExIDYuNzUgMTAuNjEwMyA2LjY3MDk4IDEwLjQ2OTcgNi41MzAzM0MxMC4zMjkgNi4zODk2OCAxMC4yNSA2LjE5ODkxIDEwLjI1IDZDMTAuMjUgNS44MDEwOSAxMC4zMjkgNS42MTAzMiAxMC40Njk3IDUuNDY5NjdDMTAuNjEwMyA1LjMyOTAyIDEwLjgwMTEgNS4yNSAxMSA1LjI1SDExLjVDMTEuODMxNCA1LjI1MDUzIDEyLjE0OSA1LjM4MjM5IDEyLjM4MzMgNS42MTY3QzEyLjYxNzYgNS44NTEwMSAxMi43NDk1IDYuMTY4NjQgMTIuNzUgNi41VjlDMTIuNzUgOS4wNjYzIDEyLjc3NjMgOS4xMjk4OSAxMi44MjMyIDkuMTc2NzhDMTIuODcwMSA5LjIyMzY2IDEyLjkzMzcgOS4yNSAxMyA5LjI1QzEzLjE5ODkgOS4yNSAxMy4zODk3IDkuMzI5MDIgMTMuNTMwMyA5LjQ2OTY3QzEzLjY3MSA5LjYxMDMyIDEzLjc1IDkuODAxMDkgMTMuNzUgMTBDMTMuNzUgMTAuMTk4OSAxMy42NzEgMTAuMzg5NyAxMy41MzAzIDEwLjUzMDNDMTMuMzg5NyAxMC42NzEgMTMuMTk4OSAxMC43NSAxMyAxMC43NVpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1sb2dvXCIgZGF0YS1uYW1lPVwibG9nb1wiIHZpZXdCb3g9XCIwIDAgODguNDIgNTIuMjhcIiB3aWR0aD1cIjg4XCIgaGVpZ2h0PVwiNTJcIj48dGl0bGU+ZmxlZXRpby1sb2dvLW1hcmstb25seTwvdGl0bGU+PGc+PGc+PHBhdGggZD1cIk03Ni40NCwxNi4xNUE0LjQ5LDQuNDksMCwwLDAsNzIsMTkuODlMNjQuMywwSDE3Ljc2TDEwLDE5Ljg5YTQuNDksNC40OSwwLDEsMC00LjQyLDUuMjZWNDhsMTAuNjctNy43NGgtLjIzYTYsNiwwLDEsMSw1LjYyLTMuOTJsLjExLS4wOEw1NCw0OC41N2wyMi40Ni0xM1YyNS4xNWE0LjUsNC41LDAsMCwwLDAtOVptLTMzLDQuNUgxNEwyMC41LDRINjEuNTZMNjgsMjAuNjVINjQuNDVjMC0uMDYsMC0uMTIsMC0uMThhMTAuNSwxMC41LDAsMSwwLTIxLDBDNDMuNDYsMjAuNTMsNDMuNDcsMjAuNTksNDMuNDcsMjAuNjVabTMuNSwwYzAtLjA2LDAtLjEyLDAtLjE4YTcsNywwLDAsMSwxNCwwYzAsLjA2LDAsLjEyLDAsLjE4Wk02Niw0MC4zMmE2LDYsMCwxLDEsNi02QTYsNiwwLDAsMSw2Niw0MC4zMlpcIiBmaWxsPVwiIzI0MmIyZVwiLz48cG9seWdvbiBwb2ludHM9XCI4OC40MiAyOC4zNCA4NC42OCAzNy41NiA4My4xOSAzNS4wNyA1My45NiA1Mi4yOCAyMS43MyAzOS41MSAwIDUyLjI4IDIxLjczIDMyLjM3IDUzLjk2IDQ1LjEyIDc5Ljk3IDI5LjcxIDc4LjUyIDI3LjI3IDg4LjQyIDI4LjM0XCIgZmlsbD1cIiMxOGNjNmNcIi8+PC9nPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLW1hcFwiIGRhdGEtbmFtZT1cIm1hcFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xLjc5OTk3IDE4LjAyNUwwLjQ2Njk2NiAyMi4wMjVDMC4zOTE3NTggMjIuMjUwMyAwLjM3MTExNyAyMi40OTAyIDAuNDA2NzQyIDIyLjcyNUMwLjQ0MjM2OCAyMi45NTk4IDAuNTMzMjQxIDIzLjE4MjggMC42NzE4ODUgMjMuMzc1NkMwLjgxMDUyOCAyMy41Njg1IDAuOTkyOTc5IDIzLjcyNTYgMS4yMDQyMiAyMy44MzQyQzEuNDE1NDcgMjMuOTQyNyAxLjY0OTQ3IDIzLjk5OTYgMS44ODY5NyAyNEgyMi4xMTNDMjIuMzUwNiAyMy45OTk5IDIyLjU4NDkgMjMuOTQzMyAyMi43OTY0IDIzLjgzNDlDMjMuMDA3OSAyMy43MjY0IDIzLjE5MDYgMjMuNTY5MyAyMy4zMjk1IDIzLjM3NjVDMjMuNDY4MyAyMy4xODM2IDIzLjU1OTQgMjIuOTYwNSAyMy41OTUxIDIyLjcyNTVDMjMuNjMwOCAyMi40OTA1IDIzLjYxMDIgMjIuMjUwNCAyMy41MzUgMjIuMDI1TDIyLjIwMiAxOC4wMjVDMjIuMTAyNCAxNy43MjY2IDIxLjkxMTUgMTcuNDY3MSAyMS42NTYzIDE3LjI4MzJDMjEuNDAxMSAxNy4wOTkyIDIxLjA5NDUgMTcuMDAwMiAyMC43OCAxN0gxNS4yMTFDMTUuMTY4NCAxNy4wMDAxIDE1LjEyNjUgMTcuMDEwOSAxNS4wODkzIDE3LjAzMTZDMTUuMDUyIDE3LjA1MjIgMTUuMDIwNiAxNy4wODE5IDE0Ljk5OCAxNy4xMThDMTQuMjEyIDE4LjM4OCAxMy41NTQgMTkuMzggMTMuMjQ0IDE5Ljg0QzEzLjEwNjcgMjAuMDQzOCAxMi45MjE0IDIwLjIxMDcgMTIuNzA0NSAyMC4zMjYxQzEyLjQ4NzYgMjAuNDQxNSAxMi4yNDU3IDIwLjUwMTkgMTIgMjAuNTAxOUMxMS43NTQzIDIwLjUwMTkgMTEuNTEyMyAyMC40NDE1IDExLjI5NTQgMjAuMzI2MUMxMS4wNzg1IDIwLjIxMDcgMTAuODkzMyAyMC4wNDM4IDEwLjc1NiAxOS44NEMxMC40NDYgMTkuMzggOS43ODc5NyAxOC4zODggOS4wMDE5NyAxNy4xMThDOC45NzkyNSAxNy4wODIgOC45NDc4MyAxNy4wNTIzIDguOTEwNiAxNy4wMzE3QzguODczMzYgMTcuMDExMSA4LjgzMTUzIDE3LjAwMDIgOC43ODg5NyAxN0gzLjIyMDk3QzIuOTA2NTcgMTcuMDAwNCAyLjYwMDI0IDE3LjA5OTUgMi4zNDUyNiAxNy4yODM1QzIuMDkwMjcgMTcuNDY3NCAxLjg5OTUzIDE3LjcyNjggMS43OTk5NyAxOC4wMjVWMTguMDI1WlwiLz48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTIuMTE4NCAxOC43NzAxQzEyLjA4MiAxOC43ODk2IDEyLjA0MTMgMTguNzk5OSAxMiAxOC44QzExLjk1ODkgMTguOCAxMS45MTg0IDE4Ljc5MDIgMTEuODgyIDE4Ljc3MTJDMTEuODQ1NiAxOC43NTIyIDExLjgxNDQgMTguNzI0NyAxMS43OTEgMTguNjkxQzEwLjY5NyAxNy4wMzEgNS42NzM5NSA5LjI0ODk3IDUuNjczOTUgNi4xOTk5N0M1LjY4MTkyIDUuMzc3NDIgNS44NTE5IDQuNTY0NDkgNi4xNzQxOSAzLjgwNzY2QzYuNDk2NDcgMy4wNTA4MiA2Ljk2NDczIDIuMzY0OTEgNy41NTIyMiAxLjc4OTEzQzguMTM5NyAxLjIxMzM1IDguODM0ODkgMC43NTg5NzcgOS41OTgwNSAwLjQ1MTk4NEMxMC4zNjEyIDAuMTQ0OTkyIDExLjE3NzQgLTAuMDA4NjA0MjkgMTIgLTIuNTcxMTFlLTA1QzEyLjgyMjUgLTAuMDA4NDcyNDcgMTMuNjM4NiAwLjE0NTIxNCAxNC40MDE3IDAuNDUyMjUzQzE1LjE2NDggMC43NTkyOTMgMTUuODU5OSAxLjIxMzY3IDE2LjQ0NzQgMS43ODk0M0MxNy4wMzQ5IDIuMzY1MTggMTcuNTAzMSAzLjA1MTA0IDE3LjgyNTQgMy44MDc4MkMxOC4xNDc4IDQuNTY0NTkgMTguMzE3OSA1LjM3NzQ1IDE4LjMyNiA2LjE5OTk3QzE4LjMyNiA5LjI0NTk3IDEzLjMgMTcuMDI5IDEyLjIwOSAxOC42ODhDMTIuMTg2IDE4LjcyMjQgMTIuMTU0OSAxOC43NTA2IDEyLjExODQgMTguNzcwMVpNMTIgOC45OTk5N0MxMy42NTY5IDguOTk5OTcgMTUgNy42NTY4MiAxNSA1Ljk5OTk3QzE1IDQuMzQzMTIgMTMuNjU2OSAyLjk5OTk3IDEyIDIuOTk5OTdDMTAuMzQzMSAyLjk5OTk3IDkgNC4zNDMxMiA5IDUuOTk5OTdDOSA3LjY1NjgyIDEwLjM0MzEgOC45OTk5NyAxMiA4Ljk5OTk3WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLW5hdi1tZW51XCIgZGF0YS1uYW1lPVwibmF2LW1lbnVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjIuOTU2NSAzSDEuMDQzNDhDMC40NjcxODEgMyAwIDMuNDQ3NzIgMCA0VjVDMCA1LjU1MjI4IDAuNDY3MTgxIDYgMS4wNDM0OCA2SDIyLjk1NjVDMjMuNTMyOCA2IDI0IDUuNTUyMjggMjQgNVY0QzI0IDMuNDQ3NzIgMjMuNTMyOCAzIDIyLjk1NjUgM1pcIi8+PHBhdGggZD1cIk0yMi45NTY1IDEwLjVIMS4wNDM0OEMwLjQ2NzE4MSAxMC41IDAgMTAuOTQ3NyAwIDExLjVWMTIuNUMwIDEzLjA1MjMgMC40NjcxODEgMTMuNSAxLjA0MzQ4IDEzLjVIMjIuOTU2NUMyMy41MzI4IDEzLjUgMjQgMTMuMDUyMyAyNCAxMi41VjExLjVDMjQgMTAuOTQ3NyAyMy41MzI4IDEwLjUgMjIuOTU2NSAxMC41WlwiLz48cGF0aCBkPVwiTTIyLjk1NjUgMThIMS4wNDM0OEMwLjQ2NzE4MSAxOCAwIDE4LjQ0NzcgMCAxOVYyMEMwIDIwLjU1MjMgMC40NjcxODEgMjEgMS4wNDM0OCAyMUgyMi45NTY1QzIzLjUzMjggMjEgMjQgMjAuNTUyMyAyNCAyMFYxOUMyNCAxOC40NDc3IDIzLjUzMjggMTggMjIuOTU2NSAxOFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1wYXJ0XCIgZGF0YS1uYW1lPVwicGFydFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xNS45NzMgOC4yNzFDMTYuMDE2NiA4LjI1MTExIDE2LjA1MzYgOC4yMTkwOSAxNi4wNzk2IDguMTc4NzVDMTYuMTA1NSA4LjEzODQxIDE2LjExOTMgOC4wOTE0NiAxNi4xMTkzIDguMDQzNUMxNi4xMTkzIDcuOTk1NTQgMTYuMTA1NSA3Ljk0ODU4IDE2LjA3OTYgNy45MDgyNUMxNi4wNTM2IDcuODY3OTEgMTYuMDE2NiA3LjgzNTg5IDE1Ljk3MyA3LjgxNkw2LjIxNTk2IDMuMzY4QzYuMTUyMDUgMy4zMzk2MSA2LjA4MjkgMy4zMjQ5NCA2LjAxMjk2IDMuMzI0OTRDNS45NDMwMyAzLjMyNDk0IDUuODczODcgMy4zMzk2MSA1LjgwOTk2IDMuMzY4TDEuOTkyOTYgNS4wMjRDMS45NDc4NyA1LjA0MzIxIDEuOTA5NDEgNS4wNzUyNiAxLjg4MjM4IDUuMTE2MTVDMS44NTUzNSA1LjE1NzA0IDEuODQwOTQgNS4yMDQ5OCAxLjg0MDk0IDUuMjU0QzEuODQwOTQgNS4zMDMwMiAxLjg1NTM1IDUuMzUwOTYgMS44ODIzOCA1LjM5MTg1QzEuOTA5NDEgNS40MzI3NCAxLjk0Nzg3IDUuNDY0NzkgMS45OTI5NiA1LjQ4NEwxMi4yODMgOS43NzJDMTIuMzQ2NSA5Ljc5ODU5IDEyLjQxNDggOS44MTE3OCAxMi40ODM2IDkuODEwNzVDMTIuNTUyNCA5LjgwOTcxIDEyLjYyMDMgOS43OTQ0OCAxMi42ODMgOS43NjZMMTUuOTczIDguMjcxWlwiLz48cGF0aCBkPVwiTTIyLjA2MiA1LjVDMjIuMTA1OSA1LjQ4MDI1IDIyLjE0MzIgNS40NDgyMiAyMi4xNjk0IDUuNDA3NzdDMjIuMTk1NiA1LjM2NzMyIDIyLjIwOTUgNS4zMjAxNyAyMi4yMDk1IDUuMjcyQzIyLjIwOTUgNS4yMjM4MyAyMi4xOTU2IDUuMTc2NjkgMjIuMTY5NCA1LjEzNjI0QzIyLjE0MzIgNS4wOTU3OSAyMi4xMDU5IDUuMDYzNzYgMjIuMDYyIDUuMDQ0TDEyLjQgMC44NDcwMDRDMTIuMjczOSAwLjc5MTk0MSAxMi4xMzc3IDAuNzYzNTE5IDEyIDAuNzYzNTE5QzExLjg2MjQgMC43NjM1MTkgMTEuNzI2MiAwLjc5MTk0MSAxMS42IDAuODQ3MDA0TDguMzgwMDIgMi4yNDdDOC4zMzU4IDIuMjY2NjMgOC4yOTgyMyAyLjI5ODY3IDguMjcxODUgMi4zMzkyM0M4LjI0NTQ4IDIuMzc5NzkgOC4yMzE0NSAyLjQyNzEzIDguMjMxNDUgMi40NzU1QzguMjMxNDUgMi41MjM4OCA4LjI0NTQ4IDIuNTcxMjIgOC4yNzE4NSAyLjYxMTc4QzguMjk4MjMgMi42NTIzNCA4LjMzNTggMi42ODQzOCA4LjM4MDAyIDIuNzA0TDE4LjA4IDcuMTI2QzE4LjE0NSA3LjE1NTU3IDE4LjIxNTYgNy4xNzA4NyAxOC4yODcgNy4xNzA4N0MxOC4zNTg0IDcuMTcwODcgMTguNDI5IDcuMTU1NTcgMTguNDk0IDcuMTI2TDIyLjA2MiA1LjVaXCIvPjxwYXRoIGQ9XCJNMC44NDYgNi42MzAwMUMwLjgwNzk5OCA2LjYxNDIgMC43NjY2ODMgNi42MDgwMiAwLjcyNTcyIDYuNjEyMDJDMC42ODQ3NTggNi42MTYwMiAwLjY0NTQxNiA2LjYzMDA3IDAuNjExMTg2IDYuNjUyOTJDMC41NzY5NTcgNi42NzU3NyAwLjU0ODg5OSA2LjcwNjcyIDAuNTI5NTAzIDYuNzQzMDJDMC41MTAxMDcgNi43NzkzMiAwLjQ5OTk3MyA2LjgxOTg1IDAuNSA2Ljg2MTAxVjE4LjAwN0MwLjQ5OTk4NCAxOC4yMDQ0IDAuNTU4MzcyIDE4LjM5NzMgMC42Njc4MTEgMTguNTYxNkMwLjc3NzI1IDE4LjcyNTggMC45MzI4NDYgMTguODU0IDEuMTE1IDE4LjkzTDExLjQgMjMuMjE3QzExLjQzOCAyMy4yMzI4IDExLjQ3OTMgMjMuMjM5IDExLjUyMDMgMjMuMjM1QzExLjU2MTIgMjMuMjMxIDExLjYwMDYgMjMuMjE2OSAxMS42MzQ4IDIzLjE5NDFDMTEuNjY5IDIzLjE3MTIgMTEuNjk3MSAyMy4xNDAzIDExLjcxNjUgMjMuMTA0QzExLjczNTkgMjMuMDY3NyAxMS43NDYgMjMuMDI3MiAxMS43NDYgMjIuOTg2VjExLjM0QzExLjc0NTkgMTEuMjkwNiAxMS43MzEyIDExLjI0MjQgMTEuNzAzOCAxMS4yMDEzQzExLjY3NjUgMTEuMTYwMiAxMS42Mzc1IDExLjEyODEgMTEuNTkyIDExLjEwOUwwLjg0NiA2LjYzMDAxWlwiLz48cGF0aCBkPVwiTTEzLjI1IDIyLjk0NEMxMy4yNTAyIDIyLjk4NTcgMTMuMjYwOCAyMy4wMjY3IDEzLjI4MDkgMjMuMDYzM0MxMy4zMDA5IDIzLjA5OTkgMTMuMzI5OCAyMy4xMzA5IDEzLjM2NDggMjMuMTUzNUMxMy4zOTk5IDIzLjE3NjEgMTMuNDQgMjMuMTg5NyAxMy40ODE2IDIzLjE5MjlDMTMuNTIzMiAyMy4xOTYxIDEzLjU2NDkgMjMuMTg5IDEzLjYwMyAyMy4xNzJMMjIuOTE0IDE4Ljk0QzIzLjA4ODcgMTguODYwNiAyMy4yMzY4IDE4LjczMjUgMjMuMzQwOCAxOC41NzExQzIzLjQ0NDcgMTguNDA5OCAyMy40OTk5IDE4LjIyMTkgMjMuNSAxOC4wM1Y2Ljg4NjAxQzIzLjUgNi44NDQyIDIzLjQ4OTYgNi44MDMwNSAyMy40Njk2IDYuNzY2MzNDMjMuNDQ5NiA2LjcyOTYxIDIzLjQyMDggNi42OTg0OCAyMy4zODU2IDYuNjc1OEMyMy4zNTA1IDYuNjUzMTIgMjMuMzEwMyA2LjYzOTYgMjMuMjY4NiA2LjYzNjVDMjMuMjI2OSA2LjYzMzM5IDIzLjE4NTEgNi42NDA3OCAyMy4xNDcgNi42NTgwMUwxMy40IDExLjA5QzEzLjM1NjIgMTEuMTA5NiAxMy4zMTg5IDExLjE0MTQgMTMuMjkyOCAxMS4xODE3QzEzLjI2NjcgMTEuMjIyIDEzLjI1MjkgMTEuMjY5IDEzLjI1MyAxMS4zMTdMMTMuMjUgMjIuOTQ0WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXBsYWNlXCIgZGF0YS1uYW1lPVwicGxhY2VcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNOCAwQzUuODc5IDAuMDAyMzgyMTEgMy44NDU1NSAwLjg0NjAwMiAyLjM0NTc4IDIuMzQ1NzhDMC44NDYwMDIgMy44NDU1NSAwLjAwMjM4MjExIDUuODc5IDAgOEMwIDExLjM0MyA0LjUwOSAxOC45MTIgNi41NzYgMjIuMkM2LjYzMzMxIDIyLjI5MTcgNi43MTg4MSAyMi4zNjI0IDYuODE5NjggMjIuNDAxNEM2LjkyMDU1IDIyLjQ0MDQgNy4wMzEzNSAyMi40NDU2IDcuMTM1NDYgMjIuNDE2M0M3LjIzOTU2IDIyLjM4NzEgNy4zMzEzNyAyMi4zMjQ4IDcuMzk3MDkgMjIuMjM4OUM3LjQ2MjgyIDIyLjE1MyA3LjQ5ODkzIDIyLjA0ODEgNy41IDIxLjk0VjE2QzcuNDk5OTIgMTUuNjI4NiA3LjYwMzI1IDE1LjI2NDUgNy43OTg0MiAxNC45NDg2QzcuOTkzNTggMTQuNjMyNiA4LjI3Mjg3IDE0LjM3NzIgOC42MDUgMTQuMjExTDExLjYwNSAxMi43MTFDMTEuODgzIDEyLjU3MjQgMTIuMTg5NCAxMi41MDAzIDEyLjUgMTIuNTAwM0MxMi44MTA2IDEyLjUwMDMgMTMuMTE3IDEyLjU3MjQgMTMuMzk1IDEyLjcxMUwxMy45NCAxMi45ODRDMTQuMDAwNiAxMy4wMTQ0IDE0LjA2NjggMTMuMDMyMiAxNC4xMzQ1IDEzLjAzNjJDMTQuMjAyMiAxMy4wNDAyIDE0LjI3IDEzLjAzMDQgMTQuMzMzOCAxMy4wMDc0QzE0LjM5NzYgMTIuOTg0NCAxNC40NTYxIDEyLjk0ODYgMTQuNTA1NiAxMi45MDIzQzE0LjU1NTEgMTIuODU2IDE0LjU5NDcgMTIuODAwMSAxNC42MjIgMTIuNzM4QzE1LjM2NzkgMTEuMjU2NSAxNS44MzUgOS42NTA0NSAxNiA4QzE1Ljk5NzYgNS44NzkgMTUuMTU0IDMuODQ1NTUgMTMuNjU0MiAyLjM0NTc4QzEyLjE1NDQgMC44NDYwMDIgMTAuMTIxIDAuMDAyMzgyMTEgOCAwVjBaTTggMTFDNy40MDY2NiAxMSA2LjgyNjY0IDEwLjgyNDEgNi4zMzMyOSAxMC40OTQ0QzUuODM5OTQgMTAuMTY0OCA1LjQ1NTQyIDkuNjk2MjMgNS4yMjgzNiA5LjE0ODA1QzUuMDAxMyA4LjU5OTg3IDQuOTQxODkgNy45OTY2NyA1LjA1NzY0IDcuNDE0NzNDNS4xNzM0IDYuODMyNzkgNS40NTkxMiA2LjI5ODI0IDUuODc4NjggNS44Nzg2OEM2LjI5ODI0IDUuNDU5MTIgNi44MzI3OSA1LjE3MzQgNy40MTQ3MyA1LjA1NzY0QzcuOTk2NjcgNC45NDE4OSA4LjU5OTg3IDUuMDAxMyA5LjE0ODA1IDUuMjI4MzZDOS42OTYyMyA1LjQ1NTQyIDEwLjE2NDggNS44Mzk5NCAxMC40OTQ0IDYuMzMzMjlDMTAuODI0MSA2LjgyNjY0IDExIDcuNDA2NjYgMTEgOEMxMSA4Ljc5NTY1IDEwLjY4MzkgOS41NTg3MSAxMC4xMjEzIDEwLjEyMTNDOS41NTg3MSAxMC42ODM5IDguNzk1NjUgMTEgOCAxMVpcIi8+PHBhdGggZD1cIk0xNS43MjQgMTUuNTUzTDEyLjcyNCAxNC4wNTNDMTIuNjU0NSAxNC4wMTgyIDEyLjU3NzggMTQgMTIuNSAxNEMxMi40MjIyIDE0IDEyLjM0NTUgMTQuMDE4MiAxMi4yNzYgMTQuMDUzTDkuMjc2IDE1LjU1M0M5LjE5MzA1IDE1LjU5NDYgOS4xMjMzMSAxNS42NTg0IDkuMDc0NTYgMTUuNzM3M0M5LjAyNTgyIDE1LjgxNjMgOSAxNS45MDcyIDkgMTZWMjMuNUM5IDIzLjYzMjYgOS4wNTI2OCAyMy43NTk4IDkuMTQ2NDUgMjMuODUzNkM5LjI0MDIxIDIzLjk0NzMgOS4zNjczOSAyNCA5LjUgMjRIMTFDMTEuMTMyNiAyNCAxMS4yNTk4IDIzLjk0NzMgMTEuMzUzNiAyMy44NTM2QzExLjQ0NzMgMjMuNzU5OCAxMS41IDIzLjYzMjYgMTEuNSAyMy41VjIyLjVDMTEuNSAyMi4zNjc0IDExLjU1MjcgMjIuMjQwMiAxMS42NDY0IDIyLjE0NjRDMTEuNzQwMiAyMi4wNTI3IDExLjg2NzQgMjIgMTIgMjJIMTNDMTMuMTMyNiAyMiAxMy4yNTk4IDIyLjA1MjcgMTMuMzUzNiAyMi4xNDY0QzEzLjQ0NzMgMjIuMjQwMiAxMy41IDIyLjM2NzQgMTMuNSAyMi41VjIzLjVDMTMuNSAyMy42MzI2IDEzLjU1MjcgMjMuNzU5OCAxMy42NDY0IDIzLjg1MzZDMTMuNzQwMiAyMy45NDczIDEzLjg2NzQgMjQgMTQgMjRIMTUuNUMxNS42MzI2IDI0IDE1Ljc1OTggMjMuOTQ3MyAxNS44NTM2IDIzLjg1MzZDMTUuOTQ3MyAyMy43NTk4IDE2IDIzLjYzMjYgMTYgMjMuNVYxNkMxNiAxNS45MDcyIDE1Ljk3NDIgMTUuODE2MyAxNS45MjU0IDE1LjczNzNDMTUuODc2NyAxNS42NTg0IDE1LjgwNjkgMTUuNTk0NiAxNS43MjQgMTUuNTUzWk0xNCAyMEgxMUMxMC44Njc0IDIwIDEwLjc0MDIgMTkuOTQ3MyAxMC42NDY0IDE5Ljg1MzZDMTAuNTUyNyAxOS43NTk4IDEwLjUgMTkuNjMyNiAxMC41IDE5LjVDMTAuNSAxOS4zNjc0IDEwLjU1MjcgMTkuMjQwMiAxMC42NDY0IDE5LjE0NjRDMTAuNzQwMiAxOS4wNTI3IDEwLjg2NzQgMTkgMTEgMTlIMTRDMTQuMTMyNiAxOSAxNC4yNTk4IDE5LjA1MjcgMTQuMzUzNiAxOS4xNDY0QzE0LjQ0NzMgMTkuMjQwMiAxNC41IDE5LjM2NzQgMTQuNSAxOS41QzE0LjUgMTkuNjMyNiAxNC40NDczIDE5Ljc1OTggMTQuMzUzNiAxOS44NTM2QzE0LjI1OTggMTkuOTQ3MyAxNC4xMzI2IDIwIDE0IDIwWk0xNCAxNy41SDExQzEwLjg2NzQgMTcuNSAxMC43NDAyIDE3LjQ0NzMgMTAuNjQ2NCAxNy4zNTM2QzEwLjU1MjcgMTcuMjU5OCAxMC41IDE3LjEzMjYgMTAuNSAxN0MxMC41IDE2Ljg2NzQgMTAuNTUyNyAxNi43NDAyIDEwLjY0NjQgMTYuNjQ2NEMxMC43NDAyIDE2LjU1MjcgMTAuODY3NCAxNi41IDExIDE2LjVIMTRDMTQuMTMyNiAxNi41IDE0LjI1OTggMTYuNTUyNyAxNC4zNTM2IDE2LjY0NjRDMTQuNDQ3MyAxNi43NDAyIDE0LjUgMTYuODY3NCAxNC41IDE3QzE0LjUgMTcuMTMyNiAxNC40NDczIDE3LjI1OTggMTQuMzUzNiAxNy4zNTM2QzE0LjI1OTggMTcuNDQ3MyAxNC4xMzI2IDE3LjUgMTQgMTcuNVpcIi8+PHBhdGggZD1cIk0yMy42OTIgMTIuMDM4TDE3LjY5MiA5LjUzOEMxNy42MTYgOS41MDYzOSAxNy41MzM0IDkuNDk0MDMgMTcuNDUxNCA5LjUwMjAzQzE3LjM2OTUgOS41MTAwMiAxNy4yOTA4IDkuNTM4MTIgMTcuMjIyNCA5LjU4MzgyQzE3LjE1MzkgOS42Mjk1MyAxNy4wOTc4IDkuNjkxNDMgMTcuMDU5IDkuNzY0MDNDMTcuMDIwMiA5LjgzNjYzIDE2Ljk5OTkgOS45MTc2OCAxNyAxMFYyMy41QzE3IDIzLjYzMjYgMTcuMDUyNyAyMy43NTk4IDE3LjE0NjQgMjMuODUzNkMxNy4yNDAyIDIzLjk0NzMgMTcuMzY3NCAyNCAxNy41IDI0SDIzLjVDMjMuNjMyNiAyNCAyMy43NTk4IDIzLjk0NzMgMjMuODUzNiAyMy44NTM2QzIzLjk0NzMgMjMuNzU5OCAyNCAyMy42MzI2IDI0IDIzLjVWMTIuNUMyNC4wMDAxIDEyLjQwMTIgMjMuOTcwOCAxMi4zMDQ1IDIzLjkxNiAxMi4yMjIzQzIzLjg2MTIgMTIuMTQwMSAyMy43ODMyIDEyLjA3NTkgMjMuNjkyIDEyLjAzOFpNMjIgMjBIMTlDMTguODY3NCAyMCAxOC43NDAyIDE5Ljk0NzMgMTguNjQ2NCAxOS44NTM2QzE4LjU1MjcgMTkuNzU5OCAxOC41IDE5LjYzMjYgMTguNSAxOS41QzE4LjUgMTkuMzY3NCAxOC41NTI3IDE5LjI0MDIgMTguNjQ2NCAxOS4xNDY0QzE4Ljc0MDIgMTkuMDUyNyAxOC44Njc0IDE5IDE5IDE5SDIyQzIyLjEzMjYgMTkgMjIuMjU5OCAxOS4wNTI3IDIyLjM1MzYgMTkuMTQ2NEMyMi40NDczIDE5LjI0MDIgMjIuNSAxOS4zNjc0IDIyLjUgMTkuNUMyMi41IDE5LjYzMjYgMjIuNDQ3MyAxOS43NTk4IDIyLjM1MzYgMTkuODUzNkMyMi4yNTk4IDE5Ljk0NzMgMjIuMTMyNiAyMCAyMiAyMFpNMjIgMTcuNUgxOUMxOC44Njc0IDE3LjUgMTguNzQwMiAxNy40NDczIDE4LjY0NjQgMTcuMzUzNkMxOC41NTI3IDE3LjI1OTggMTguNSAxNy4xMzI2IDE4LjUgMTdDMTguNSAxNi44Njc0IDE4LjU1MjcgMTYuNzQwMiAxOC42NDY0IDE2LjY0NjRDMTguNzQwMiAxNi41NTI3IDE4Ljg2NzQgMTYuNSAxOSAxNi41SDIyQzIyLjEzMjYgMTYuNSAyMi4yNTk4IDE2LjU1MjcgMjIuMzUzNiAxNi42NDY0QzIyLjQ0NzMgMTYuNzQwMiAyMi41IDE2Ljg2NzQgMjIuNSAxN0MyMi41IDE3LjEzMjYgMjIuNDQ3MyAxNy4yNTk4IDIyLjM1MzYgMTcuMzUzNkMyMi4yNTk4IDE3LjQ0NzMgMjIuMTMyNiAxNy41IDIyIDE3LjVaTTIyIDE1SDE5QzE4Ljg2NzQgMTUgMTguNzQwMiAxNC45NDczIDE4LjY0NjQgMTQuODUzNkMxOC41NTI3IDE0Ljc1OTggMTguNSAxNC42MzI2IDE4LjUgMTQuNUMxOC41IDE0LjM2NzQgMTguNTUyNyAxNC4yNDAyIDE4LjY0NjQgMTQuMTQ2NEMxOC43NDAyIDE0LjA1MjcgMTguODY3NCAxNCAxOSAxNEgyMkMyMi4xMzI2IDE0IDIyLjI1OTggMTQuMDUyNyAyMi4zNTM2IDE0LjE0NjRDMjIuNDQ3MyAxNC4yNDAyIDIyLjUgMTQuMzY3NCAyMi41IDE0LjVDMjIuNSAxNC42MzI2IDIyLjQ0NzMgMTQuNzU5OCAyMi4zNTM2IDE0Ljg1MzZDMjIuMjU5OCAxNC45NDczIDIyLjEzMjYgMTUgMjIgMTVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcXVlc3Rpb25cIiBkYXRhLW5hbWU9XCJxdWVzdGlvblwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PGcgY2xpcC1wYXRoPVwidXJsKCNkZWYtc3ZnLXF1ZXN0aW9uLTApXCI+PHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEwLjE2MTggMy40NDc0N0MxMC44MTMyIDMuMTEwNDUgMTEuNTQ0NiAyLjk1ODk1IDEyLjI3NjIgMy4wMDk1M0MxMy4wMDc4IDMuMDYwMTEgMTMuNzExNCAzLjMxMDgzIDE0LjMxMDEgMy43MzQyOUMxNC45MDg5IDQuMTU3NzQgMTUuMzc5NyA0LjczNzYzIDE1LjY3MTEgNS40MTA1OEMxNS45NjI1IDYuMDgzNTMgMTYuMDYzNCA2LjgyMzY1IDE1Ljk2MjYgNy41NTAwM0MxNS44NjE4IDguMjc2NDIgMTUuNTYzMyA4Ljk2MTEyIDE1LjA5OTYgOS41MjkzMUMxNC42MzYgMTAuMDk3NSAxNC4wMjUxIDEwLjUyNzMgMTMuMzMzNyAxMC43NzE3QzEyLjUwNDcgMTEuMDY0OCAxMS43ODcgMTEuNjA3OCAxMS4yNzk1IDEyLjMyNTlDMTAuNzcyMiAxMy4wNDM4IDEwLjUgMTMuOTAyIDEwLjUwMDMgMTQuNzgxTDEwLjUgMTUuNUMxMC41IDE2LjMyODQgMTEuMTcxNiAxNyAxMiAxN0MxMi44Mjg0IDE3IDEzLjUgMTYuMzI4NCAxMy41IDE1LjVMMTMuNTAwMyAxNC43Nzk1QzEzLjUwMDEgMTQuNTIwOCAxMy41ODAyIDE0LjI2ODUgMTMuNzI5NSAxNC4wNTczQzEzLjg3ODcgMTMuODQ2MSAxNC4wODk4IDEzLjY4NjQgMTQuMzMzNyAxMy42MDAyQzE1LjU0MzYgMTMuMTcyNCAxNi42MTI3IDEyLjQyMDMgMTcuNDI0IDExLjQyNkMxOC4yMzUzIDEwLjQzMTcgMTguNzU3NyA5LjIzMzQ3IDE4LjkzNDEgNy45NjIzM0MxOS4xMTA1IDYuNjkxMTkgMTguOTM0IDUuMzk2MDMgMTguNDI0IDQuMjE4NEMxNy45MTQxIDMuMDQwNzcgMTcuMDkwMiAyLjAyNTk4IDE2LjA0MjQgMS4yODQ5NkMxNC45OTQ3IDAuNTQzOTM4IDEzLjc2MzQgMC4xMDUxOTIgMTIuNDgzMSAwLjAxNjY3NDVDMTEuMjAyOCAtMC4wNzE4NDI2IDkuOTIyODkgMC4xOTMyNzcgOC43ODMxMyAwLjc4MzA1NUM3LjY0MzM2IDEuMzcyODMgNi42ODc2NSAyLjI2NDU3IDYuMDIwNDYgMy4zNjA4MkM1LjM1MzI2IDQuNDU3MDYgNS4wMDAyNSA1LjcxNTYxIDUgNi45OTg5M0M0Ljk5OTg0IDcuODI3MzYgNS42NzEyOSA4LjQ5OTA2IDYuNDk5NzEgOC40OTkyMkM3LjMyODE0IDguNDk5MzcgNy45OTk4NCA3LjgyNzkzIDggNi45OTk1QzguMDAwMTQgNi4yNjYxNiA4LjIwMTg3IDUuNTQ2OTYgOC41ODMxMyA0LjkyMDUyQzguOTY0NCA0LjI5NDA4IDkuNTEwNTMgMy43ODQ1IDEwLjE2MTggMy40NDc0N1pNMTIgMjRDMTMuMjQyNiAyNCAxNC4yNSAyMi45OTI2IDE0LjI1IDIxLjc1QzE0LjI1IDIwLjUwNzQgMTMuMjQyNiAxOS41IDEyIDE5LjVDMTAuNzU3NCAxOS41IDkuNzUgMjAuNTA3NCA5Ljc1IDIxLjc1QzkuNzUgMjIuOTkyNiAxMC43NTc0IDI0IDEyIDI0WlwiLz48L2c+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1yZW1pbmRlclwiIGRhdGEtbmFtZT1cInJlbWluZGVyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTMuNSAzLjE4MjYyVjEuNUMxMy41IDEuMTAyMTggMTMuMzQyIDAuNzIwNjQ0IDEzLjA2MDcgMC40MzkzNEMxMi43Nzk0IDAuMTU4MDM1IDEyLjM5NzggMCAxMiAwQzExLjYwMjIgMCAxMS4yMjA2IDAuMTU4MDM1IDEwLjkzOTMgMC40MzkzNEMxMC42NTggMC43MjA2NDQgMTAuNSAxLjEwMjE4IDEwLjUgMS41VjMuMTgyNjJDOC44MzMxMiAzLjYwNDY5IDcuMzQyNzQgNC41NTcwNiA2LjI1Nzk4IDUuOTAzQzUuMDY1ODMgNy4zODIxOCA0LjQ0MjI2IDkuMjM5MDkgNC41IDExLjEzOFYxNkM0LjUgMTYuMzk3OCA0LjM0MTk2IDE2Ljc3OTQgNC4wNjA2NiAxNy4wNjA3QzMuNzc5MzYgMTcuMzQyIDMuMzk3ODIgMTcuNSAzIDE3LjVDMi43MzQ3OCAxNy41IDIuNDgwNDMgMTcuNjA1NCAyLjI5Mjg5IDE3Ljc5MjlDMi4xMDUzNiAxNy45ODA0IDIgMTguMjM0OCAyIDE4LjVDMiAxOC43NjUyIDIuMTA1MzYgMTkuMDE5NiAyLjI5Mjg5IDE5LjIwNzFDMi40ODA0MyAxOS4zOTQ2IDIuNzM0NzggMTkuNSAzIDE5LjVIMjFDMjEuMjY1MiAxOS41IDIxLjUxOTYgMTkuMzk0NiAyMS43MDcxIDE5LjIwNzFDMjEuODk0NiAxOS4wMTk2IDIyIDE4Ljc2NTIgMjIgMTguNUMyMiAxOC4yMzQ4IDIxLjg5NDYgMTcuOTgwNCAyMS43MDcxIDE3Ljc5MjlDMjEuNTE5NiAxNy42MDU0IDIxLjI2NTIgMTcuNSAyMSAxNy41QzIwLjYwMjIgMTcuNSAyMC4yMjA2IDE3LjM0MiAxOS45MzkzIDE3LjA2MDdDMTkuNjU4IDE2Ljc3OTQgMTkuNSAxNi4zOTc4IDE5LjUgMTZWMTEuMTM4QzE5LjU1NzcgOS4yMzkwOSAxOC45MzQyIDcuMzgyMTggMTcuNzQyIDUuOTAzQzE2LjY1NzMgNC41NTcwNiAxNS4xNjY5IDMuNjA0NjkgMTMuNSAzLjE4MjYyWk0xNC4yMzYgMjFIOS43NjQwMUM5LjcwMjYzIDIxLjAwMDEgOS42NDM0MyAyMS4wMjI4IDkuNTk3NjkgMjEuMDYzN0M5LjU1MTk2IDIxLjEwNDcgOS41MjI4OCAyMS4xNjEgOS41MTYwMSAyMS4yMjJDOS41MDUxMSAyMS4zMTQzIDkuNDk5NzcgMjEuNDA3MSA5LjUwMDAxIDIxLjVDOS41MDAwMSAyMi4xNjMgOS43NjM0IDIyLjc5ODkgMTAuMjMyMiAyMy4yNjc4QzEwLjcwMTEgMjMuNzM2NiAxMS4zMzcgMjQgMTIgMjRDMTIuNjYzIDI0IDEzLjI5ODkgMjMuNzM2NiAxMy43Njc4IDIzLjI2NzhDMTQuMjM2NiAyMi43OTg5IDE0LjUgMjIuMTYzIDE0LjUgMjEuNUMxNC41MDAyIDIxLjQwNzEgMTQuNDk0OSAyMS4zMTQzIDE0LjQ4NCAyMS4yMjJDMTQuNDc3NiAyMS4xNjA4IDE0LjQ0ODYgMjEuMTA0MiAxNC40MDI4IDIxLjA2MzJDMTQuMzU3IDIxLjAyMjIgMTQuMjk3NSAyMC45OTk3IDE0LjIzNiAyMVpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1yZXBvcnRcIiBkYXRhLW5hbWU9XCJyZXBvcnRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjMgMTAuNUMyMy4xMzI2IDEwLjUgMjMuMjU5OCAxMC40NDczIDIzLjM1MzYgMTAuMzUzNkMyMy40NDczIDEwLjI1OTggMjMuNSAxMC4xMzI2IDIzLjUgMTBDMjMuNDk2OCA3LjM0ODgxIDIyLjQ0MjIgNC44MDcxMiAyMC41Njc2IDIuOTMyNDRDMTguNjkyOSAxLjA1Nzc2IDE2LjE1MTIgMC4wMDMxNzU3MiAxMy41IDBDMTMuMzY3NCAwIDEzLjI0MDIgMC4wNTI2Nzg0IDEzLjE0NjQgMC4xNDY0NDdDMTMuMDUyNyAwLjI0MDIxNSAxMyAwLjM2NzM5MiAxMyAwLjVWOS41MjVDMTMuMDAwMyA5Ljc4MzYgMTMuMTAzIDEwLjAzMTUgMTMuMjg1OCAxMC4yMTQ1QzEzLjQ2ODYgMTAuMzk3NCAxMy43MTY0IDEwLjUwMDUgMTMuOTc1IDEwLjUwMUwyMyAxMC41WlwiLz48cGF0aCBkPVwiTTIzLjUgMTJIMTRDMTMuODUyNyAxMS45ODEyIDEzLjcwMzIgMTIuMDExNCAxMy41NzQ3IDEyLjA4NTlDMTMuNDQ2MSAxMi4xNjA1IDEzLjM0NTcgMTIuMjc1MiAxMy4yODg4IDEyLjQxMjVDMTMuMjMyIDEyLjU0OTcgMTMuMjIxOSAxMi43MDE5IDEzLjI2IDEyLjg0NTVDMTMuMjk4MiAxMi45ODkgMTMuMzgyNSAxMy4xMTYxIDEzLjUgMTMuMjA3TDIwLjIxOCAxOS45MjVDMjAuMzExOCAyMC4wMTg3IDIwLjQzODkgMjAuMDcxNCAyMC41NzE1IDIwLjA3MTRDMjAuNzA0MSAyMC4wNzE0IDIwLjgzMTMgMjAuMDE4NyAyMC45MjUgMTkuOTI1QzIxLjkwMyAxOC45NTIxIDIyLjY3ODMgMTcuNzk1IDIzLjIwNjIgMTYuNTIwNUMyMy43MzQgMTUuMjQ2IDI0LjAwMzggMTMuODc5NSAyNCAxMi41QzI0IDEyLjM2NzQgMjMuOTQ3NCAxMi4yNDAyIDIzLjg1MzYgMTIuMTQ2NEMyMy43NTk4IDEyLjA1MjcgMjMuNjMyNiAxMiAyMy41IDEyWlwiLz48cGF0aCBkPVwiTTEwLjU4OCAyNEMxMS45NTQyIDIzLjk5NzEgMTMuMzA2MiAyMy43MjMgMTQuNTY1NyAyMy4xOTM2QzE1LjgyNTIgMjIuNjY0MiAxNi45NjcgMjEuODkgMTcuOTI1IDIwLjkxNkMxOC4wMTg4IDIwLjgyMjIgMTguMDcxNCAyMC42OTUxIDE4LjA3MTQgMjAuNTYyNUMxOC4wNzE0IDIwLjQyOTkgMTguMDE4OCAyMC4zMDI4IDE3LjkyNSAyMC4yMDlMMTEuMjA3IDEzLjQ5MUMxMS4wODg5IDEzLjM0OTIgMTEuMDE2NyAxMy4xNzQ4IDExIDEyLjk5MVYzLjQ5MUMxMSAzLjM1ODM5IDEwLjk0NzMgMy4yMzEyMSAxMC44NTM2IDMuMTM3NDRDMTAuNzU5OCAzLjA0MzY4IDEwLjYzMjYgMi45OTEgMTAuNSAyLjk5MUM3LjcxNDA1IDMuMDAyNjcgNS4wNDY4MyA0LjEyMDU4IDMuMDg1MTEgNi4wOTg4MUMxLjEyMzM4IDguMDc3MDMgMC4wMjc4NTE1IDEwLjc1MzUgMC4wMzk1MjEgMTMuNTM5NUMwLjA1MTE5MDUgMTYuMzI1NSAxLjE2OTEgMTguOTkyNyAzLjE0NzMzIDIwLjk1NDRDNS4xMjU1NiAyMi45MTYxIDcuODAyMDUgMjQuMDExNyAxMC41ODggMjRWMjRaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc2VhcmNoXCIgZGF0YS1uYW1lPVwic2VhcmNoXCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIHdpZHRoPVwiMjVcIiBoZWlnaHQ9XCIyNVwiID48cGF0aCBkPVwiTTI0LjQxNCAyMS41OTFMMTkuNzY5IDE2Ljk0NkMyMS4xODMzIDE0LjgyODkgMjEuNzU5NiAxMi4yNjEzIDIxLjM4NTcgOS43NDI4NUMyMS4wMTE4IDcuMjI0MzUgMTkuNzE0NSA0LjkzNDk3IDE3Ljc0NjEgMy4zMjAwMkMxNS43Nzc4IDEuNzA1MDYgMTMuMjc5IDAuODgwMDA4IDEwLjczNiAxLjAwNTM0QzguMTkzMDMgMS4xMzA2NyA1Ljc4NzU2IDIuMTk3NDIgMy45ODc1MiAzLjk5ODFDMi4xODc0OCA1Ljc5ODc4IDEuMTIxNTcgOC4yMDQ2MyAwLjk5NzE0MyAxMC43NDc3QzAuODcyNzEyIDEzLjI5MDcgMS42OTg2NSAxNS43ODkxIDMuMzE0MyAxNy43NTdDNC45Mjk5NSAxOS43MjQ4IDcuMjE5NzkgMjEuMDIxMyA5LjczODQxIDIxLjM5NDNDMTIuMjU3IDIxLjc2NzIgMTQuODI0NCAyMS4xOTAxIDE2Ljk0MSAxOS43NzVMMjEuNTg2IDI0LjQxOUMyMS45NjQyIDI0Ljc4NzkgMjIuNDcxNiAyNC45OTQ0IDIzIDI0Ljk5NDRDMjMuNTI4NCAyNC45OTQ0IDI0LjAzNTggMjQuNzg3OSAyNC40MTQgMjQuNDE5QzI0Ljc4ODkgMjQuMDQzOSAyNC45OTk2IDIzLjUzNTMgMjQuOTk5NiAyMy4wMDVDMjQuOTk5NiAyMi40NzQ3IDI0Ljc4ODkgMjEuOTY2MSAyNC40MTQgMjEuNTkxWk0xMS4yNSA0LjAwNUMxMi42ODM5IDQuMDA1IDE0LjA4NTYgNC40MzAyMSAxNS4yNzc5IDUuMjI2ODVDMTYuNDcwMSA2LjAyMzQ5IDE3LjM5OTQgNy4xNTU3OCAxNy45NDgxIDguNDgwNTVDMTguNDk2OSA5LjgwNTMxIDE4LjY0MDQgMTEuMjYzIDE4LjM2MDcgMTIuNjY5NEMxOC4wODA5IDE0LjA3NTggMTcuMzkwNSAxNS4zNjc2IDE2LjM3NjUgMTYuMzgxNUMxNS4zNjI2IDE3LjM5NTUgMTQuMDcwOCAxOC4wODU5IDEyLjY2NDQgMTguMzY1N0MxMS4yNTggMTguNjQ1NCA5LjgwMDMxIDE4LjUwMTkgOC40NzU1NCAxNy45NTMxQzcuMTUwNzggMTcuNDA0NCA2LjAxODQ4IDE2LjQ3NTEgNS4yMjE4NCAxNS4yODI5QzQuNDI1MiAxNC4wOTA2IDQgMTIuNjg4OSA0IDExLjI1NUM0LjAwMjExIDkuMzMyODMgNC43NjY2MyA3LjQ4OTk5IDYuMTI1ODEgNi4xMzA4MUM3LjQ4NDk5IDQuNzcxNjMgOS4zMjc4MyA0LjAwNzEyIDExLjI1IDQuMDA1WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNlcnZpY2VcIiBkYXRhLW5hbWU9XCJzZXJ2aWNlXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTIzLjU4MiA0Ljk4NkMyMy41NTU4IDQuOTA0MiAyMy41MDkgNC44MzA1MSAyMy40NDYxIDQuNzcyMDVDMjMuMzgzMiA0LjcxMzU4IDIzLjMwNjMgNC42NzIzMSAyMy4yMjI4IDQuNjUyMjFDMjMuMTM5MyA0LjYzMjEyIDIzLjA1MiA0LjYzMzg3IDIyLjk2OTQgNC42NTczQzIyLjg4NjcgNC42ODA3NCAyMi44MTE1IDQuNzI1MDYgMjIuNzUxIDQuNzg2TDE5LjE5NCA4LjM0MUMxOS4xNDIgOC4zOTI5MiAxOS4wNzkyIDguNDMyNzQgMTkuMDEwMSA4LjQ1NzYzQzE4Ljk0MDkgOC40ODI1MiAxOC44NjcyIDguNDkxODYgMTguNzk0IDguNDg1TDE2LjIgOC4yNDlDMTYuMDgzNiA4LjIzODUxIDE1Ljk3NDUgOC4xODc1NCAxNS44OTE3IDguMTA0OTZDMTUuODA5IDguMDIyMzkgMTUuNzU3OCA3LjkxMzQyIDE1Ljc0NyA3Ljc5N0wxNS41MTMgNS4yQzE1LjUwNjMgNS4xMjY3NyAxNS41MTU4IDUuMDUyOTUgMTUuNTQwOCA0Ljk4MzgxQzE1LjU2NTkgNC45MTQ2NyAxNS42MDU5IDQuODUxOTEgMTUuNjU4IDQuOEwxOS4yMTYgMS4yNDJDMTkuMjc2NyAxLjE4MTQ2IDE5LjMyMDggMS4xMDYzMyAxOS4zNDQxIDEuMDIzODJDMTkuMzY3NCAwLjk0MTMxMyAxOS4zNjkxIDAuODU0MjA0IDE5LjM0OSAwLjc3MDg1OEMxOS4zMjg5IDAuNjg3NTEyIDE5LjI4NzcgMC42MTA3MzEgMTkuMjI5NCAwLjU0Nzg4OEMxOS4xNzExIDAuNDg1MDQ0IDE5LjA5NzYgMC40MzgyNTEgMTkuMDE2IDAuNDEyMDAxQzE3Ljc3MDcgMC4wNDYyMDY3IDE2LjQ0OTYgMC4wMjQ2ODc5IDE1LjE5MzEgMC4zNDk3MzNDMTMuOTM2NiAwLjY3NDc3NyAxMi43OTE3IDEuMzM0MjQgMTEuODggMi4yNThDMTAuOTEzIDMuMjE3MjIgMTAuMjQ3NSA0LjQzODIgOS45NjUzMyA1Ljc3MDcyQzkuNjgzMTkgNy4xMDMyNCA5Ljc5Njc0IDguNDg5MTcgMTAuMjkyIDkuNzU4QzEwLjMyOTQgOS44NDY2OSAxMC4zMzk5IDkuOTQ0NDUgMTAuMzIyMSAxMC4wMzkxQzEwLjMwNDMgMTAuMTMzNyAxMC4yNTkxIDEwLjIyMSAxMC4xOTIgMTAuMjlMMC45MTIwMDEgMTkuNTYzQzAuNTM3NDM2IDE5LjkyMjMgMC4yNzk4MzggMjAuMzg2MSAwLjE3MjgwOCAyMC44OTM5QzAuMDY1Nzc4MyAyMS40MDE4IDAuMTE0Mjg1IDIxLjkzMDEgMC4zMTIwMDEgMjIuNDFDMC40Nzg0OTQgMjIuNzc5MSAwLjczMTY2NCAyMy4xMDI1IDEuMDQ5OTggMjMuMzUyN0MxLjM2ODI5IDIzLjYwMjkgMS43NDIzMiAyMy43NzI1IDIuMTQwMjcgMjMuODQ3MUMyLjUzODIyIDIzLjkyMTggMi45NDgzIDIzLjg5OTIgMy4zMzU2NCAyMy43ODEzQzMuNzIyOTggMjMuNjYzNCA0LjA3NjExIDIzLjQ1MzcgNC4zNjUgMjMuMTdMMTMuNyAxMy44MzRDMTMuNzY5MyAxMy43NjczIDEzLjg1NjUgMTMuNzIyMiAxMy45NTEgMTMuNzA0NUMxNC4wNDU2IDEzLjY4NjcgMTQuMTQzMiAxMy42OTcgMTQuMjMyIDEzLjczNEMxNS40OTg1IDE0LjIzMzcgMTYuODgzNiAxNC4zNTE3IDE4LjIxNjQgMTQuMDczNEMxOS41NDkxIDEzLjc5NTEgMjAuNzcxMyAxMy4xMzI3IDIxLjczMiAxMi4xNjhDMjIuNjYxIDExLjI1MDEgMjMuMzIzNyAxMC4wOTc0IDIzLjY0OTUgOC44MzI2NUMyMy45NzUzIDcuNTY3OTMgMjMuOTUxOSA2LjIzODUyIDIzLjU4MiA0Ljk4NlY0Ljk4NlpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zZXR0aW5nc1wiIGRhdGEtbmFtZT1cInNldHRpbmdzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTIyLjUgOS41SDIwLjYzOEMyMC40NTI5IDguODYwMiAyMC4xOTcgOC4yNDMwNSAxOS44NzUgNy42NkwyMS4xOTIgNi4zNDRDMjEuMzMxNCA2LjIwNDcgMjEuNDQyIDYuMDM5MyAyMS41MTc0IDUuODU3MjVDMjEuNTkyOCA1LjY3NTIgMjEuNjMxNyA1LjQ4MDA2IDIxLjYzMTcgNS4yODNDMjEuNjMxNyA1LjA4NTk0IDIxLjU5MjggNC44OTA4IDIxLjUxNzQgNC43MDg3NUMyMS40NDIgNC41MjY3IDIxLjMzMTQgNC4zNjEzIDIxLjE5MiA0LjIyMkwxOS43NzcgMi44MDlDMTkuNDk1NyAyLjUyNzc5IDE5LjExNDIgMi4zNjk4MiAxOC43MTY1IDIuMzY5ODJDMTguMzE4OCAyLjM2OTgyIDE3LjkzNzMgMi41Mjc3OSAxNy42NTYgMi44MDlMMTYuMzM4IDQuMTI2QzE1Ljc1NTggMy44MDM4IDE1LjEzOTIgMy41NDc4NyAxNC41IDMuMzYzVjEuNUMxNC41IDEuMTAyMTggMTQuMzQyIDAuNzIwNjQ0IDE0LjA2MDcgMC40MzkzNEMxMy43Nzk0IDAuMTU4MDM1IDEzLjM5NzggMCAxMyAwTDExIDBDMTAuNjAyMiAwIDEwLjIyMDYgMC4xNTgwMzUgOS45MzkzNCAwLjQzOTM0QzkuNjU4MDQgMC43MjA2NDQgOS41IDEuMTAyMTggOS41IDEuNVYzLjM2M0M4Ljg2MDU4IDMuNTQ4MyA4LjI0Mzc4IDMuODA0MiA3LjY2MSA0LjEyNkw2LjM0MyAyLjgwOUM2LjA2MTcxIDIuNTI3NzkgNS42ODAyNSAyLjM2OTgyIDUuMjgyNSAyLjM2OTgyQzQuODg0NzUgMi4zNjk4MiA0LjUwMzI5IDIuNTI3NzkgNC4yMjIgMi44MDlMMi44MDcgNC4yMjNDMi42Njc2MSA0LjM2MjMgMi41NTcwNCA0LjUyNzcgMi40ODE1OSA0LjcwOTc1QzIuNDA2MTUgNC44OTE4IDIuMzY3MzIgNS4wODY5NCAyLjM2NzMyIDUuMjg0QzIuMzY3MzIgNS40ODEwNiAyLjQwNjE1IDUuNjc2MiAyLjQ4MTU5IDUuODU4MjVDMi41NTcwNCA2LjA0MDMgMi42Njc2MSA2LjIwNTcgMi44MDcgNi4zNDVMNC4xMjUgNy42NjJDMy44MDI1OSA4LjI0NDE0IDMuNTQ2NjUgOC44NjA2NyAzLjM2MiA5LjVIMS41QzEuMTAyMTggOS41IDAuNzIwNjQ0IDkuNjU4MDQgMC40MzkzNCA5LjkzOTM0QzAuMTU4MDM1IDEwLjIyMDYgMCAxMC42MDIyIDAgMTFMMCAxM0MwIDEzLjM5NzggMC4xNTgwMzUgMTMuNzc5NCAwLjQzOTM0IDE0LjA2MDdDMC43MjA2NDQgMTQuMzQyIDEuMTAyMTggMTQuNSAxLjUgMTQuNUgzLjM2MkMzLjU0NjU3IDE1LjEzOTcgMy44MDI1MiAxNS43NTY1IDQuMTI1IDE2LjMzOUwyLjgwNiAxNy42NThDMi41MjQ3OSAxNy45MzkzIDIuMzY2ODIgMTguMzIwOCAyLjM2NjgyIDE4LjcxODVDMi4zNjY4MiAxOS4xMTYyIDIuNTI0NzkgMTkuNDk3NyAyLjgwNiAxOS43NzlMNC4yMiAyMS4xOTNDNC41MDY4MiAyMS40NjQgNC44ODY0MyAyMS42MTQ5IDUuMjgxIDIxLjYxNDlDNS42NzU1NyAyMS42MTQ5IDYuMDU1MTggMjEuNDY0IDYuMzQyIDIxLjE5M0w3LjY2IDE5Ljg3NkM4LjI0MzA5IDIwLjE5ODEgOC44NjAyMiAyMC40NTQ0IDkuNSAyMC42NFYyMi41QzkuNSAyMi44OTc4IDkuNjU4MDQgMjMuMjc5NCA5LjkzOTM0IDIzLjU2MDdDMTAuMjIwNiAyMy44NDIgMTAuNjAyMiAyNCAxMSAyNEgxM0MxMy4zOTc4IDI0IDEzLjc3OTQgMjMuODQyIDE0LjA2MDcgMjMuNTYwN0MxNC4zNDIgMjMuMjc5NCAxNC41IDIyLjg5NzggMTQuNSAyMi41VjIwLjY0QzE1LjEzOTQgMjAuNDU0NyAxNS43NTYyIDIwLjE5ODggMTYuMzM5IDE5Ljg3N0wxNy42NTcgMjEuMTk0QzE3LjkzODMgMjEuNDc1MiAxOC4zMTk4IDIxLjYzMzIgMTguNzE3NSAyMS42MzMyQzE5LjExNTIgMjEuNjMzMiAxOS40OTY3IDIxLjQ3NTIgMTkuNzc4IDIxLjE5NEwyMS4xOTIgMTkuNzhDMjEuNDczMiAxOS40OTg3IDIxLjYzMTIgMTkuMTE3MiAyMS42MzEyIDE4LjcxOTVDMjEuNjMxMiAxOC4zMjE4IDIxLjQ3MzIgMTcuOTQwMyAyMS4xOTIgMTcuNjU5TDE5Ljg3NSAxNi4zNDJDMjAuMTk3MyAxNS43NTkxIDIwLjQ1MzIgMTUuMTQxOSAyMC42MzggMTQuNTAySDIyLjVDMjIuNjk3MiAxNC41MDIgMjIuODkyNCAxNC40NjMxIDIzLjA3NDUgMTQuMzg3NkMyMy4yNTY2IDE0LjMxMjEgMjMuNDIyMSAxNC4yMDE1IDIzLjU2MTQgMTQuMDYyQzIzLjcwMDcgMTMuOTIyNSAyMy44MTExIDEzLjc1NjkgMjMuODg2NCAxMy41NzQ2QzIzLjk2MTcgMTMuMzkyNCAyNC4wMDAzIDEzLjE5NzIgMjQgMTNWMTFDMjQgMTAuNjAyMiAyMy44NDIgMTAuMjIwNiAyMy41NjA3IDkuOTM5MzRDMjMuMjc5NCA5LjY1ODA0IDIyLjg5NzggOS41IDIyLjUgOS41Wk0xMiAxN0MxMS4wMTExIDE3IDEwLjA0NDQgMTYuNzA2OCA5LjIyMjE1IDE2LjE1NzNDOC4zOTk5IDE1LjYwNzkgNy43NTkwNCAxNC44MjcgNy4zODA2IDEzLjkxMzRDNy4wMDIxNiAxMi45OTk4IDYuOTAzMTUgMTEuOTk0NSA3LjA5NjA3IDExLjAyNDVDNy4yODkgMTAuMDU0NiA3Ljc2NTIgOS4xNjM3MyA4LjQ2NDQ3IDguNDY0NDdDOS4xNjM3MyA3Ljc2NTIgMTAuMDU0NiA3LjI4OSAxMS4wMjQ1IDcuMDk2MDdDMTEuOTk0NSA2LjkwMzE1IDEyLjk5OTggNy4wMDIxNiAxMy45MTM0IDcuMzgwNkMxNC44MjcgNy43NTkwNCAxNS42MDc5IDguMzk5OSAxNi4xNTczIDkuMjIyMTVDMTYuNzA2OCAxMC4wNDQ0IDE3IDExLjAxMTEgMTcgMTJDMTYuOTk4NCAxMy4zMjU2IDE2LjQ3MTEgMTQuNTk2NCAxNS41MzM4IDE1LjUzMzhDMTQuNTk2NCAxNi40NzExIDEzLjMyNTYgMTYuOTk4NCAxMiAxN1YxN1pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy10cmlwXCIgZGF0YS1uYW1lPVwidHJpcFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xOS4wMTIgMTQuNTUyQzE4Ljk5ODggMTQuNTE5OCAxOC45Nzg3IDE0LjQ5MDggMTguOTUzMSAxNC40NjcxQzE4LjkyNzYgMTQuNDQzNSAxOC44OTcxIDE0LjQyNTcgMTguODY0IDE0LjQxNUMxOC41NTAxIDE0LjMxMzQgMTguMjY2NyAxNC4xMzQ2IDE4LjA0IDEzLjg5NUMxNi4zNCAxMi4wOCAxMy41IDguNjA5IDEzLjUgNS43NUMxMy41IDUuNTc5IDEzLjUwOSA1LjQxMSAxMy41MjQgNS4yNDRDMTMuNTM5IDUuMDc3IDEzLjYwNCA0Ljc1IDEzLjI3NSA0Ljc1SDEyQzExLjkzMzcgNC43NSAxMS44NzAxIDQuNzc2MzQgMTEuODIzMiA0LjgyMzIyQzExLjc3NjMgNC44NzAxMSAxMS43NSA0LjkzMzcgMTEuNzUgNVY3Ljc1QzExLjc1IDcuOTQ4OTEgMTEuNjcwOSA4LjEzOTY4IDExLjUzMDMgOC4yODAzM0MxMS4zODk2IDguNDIwOTggMTEuMTk4OSA4LjUgMTEgOC41QzEwLjgwMSA4LjUgMTAuNjEwMyA4LjQyMDk4IDEwLjQ2OTYgOC4yODAzM0MxMC4zMjkgOC4xMzk2OCAxMC4yNSA3Ljk0ODkxIDEwLjI1IDcuNzVWNUMxMC4yNSA0LjkzMzcgMTAuMjIzNiA0Ljg3MDExIDEwLjE3NjcgNC44MjMyMkMxMC4xMjk5IDQuNzc2MzQgMTAuMDY2MyA0Ljc1IDkuOTk5OTYgNC43NUg3LjE4MDk2QzcuMDgwNTkgNC43NTAwNiA2Ljk4MjU2IDQuNzgwMzMgNi44OTk2MyA0LjgzNjg3QzYuODE2NjkgNC44OTM0IDYuNzUyNyA0Ljk3MzU5IDYuNzE1OTYgNS4wNjdMMC4wMzM5NjA1IDIyLjA2N0MwLjAwNDEyMjkxIDIyLjE0MjkgLTAuMDA2NzExNDYgMjIuMjI0OSAwLjAwMjQwMTIyIDIyLjMwNTlDMC4wMTE1MTM5IDIyLjM4NjkgMC4wNDAyOTcyIDIyLjQ2NDUgMC4wODYyNDM2IDIyLjUzMThDMC4xMzIxOSAyMi41OTkxIDAuMTkzOTA2IDIyLjY1NDIgMC4yNjYwMTQgMjIuNjkyM0MwLjMzODEyMyAyMi43MzAzIDAuNDE4NDM3IDIyLjc1MDEgMC40OTk5NiAyMi43NUg5Ljk5OTk2QzEwLjA2NjMgMjIuNzUgMTAuMTI5OSAyMi43MjM3IDEwLjE3NjcgMjIuNjc2OEMxMC4yMjM2IDIyLjYyOTkgMTAuMjUgMjIuNTY2MyAxMC4yNSAyMi41VjE5Ljc1QzEwLjI1IDE5LjU1MTEgMTAuMzI5IDE5LjM2MDMgMTAuNDY5NiAxOS4yMTk3QzEwLjYxMDMgMTkuMDc5IDEwLjgwMSAxOSAxMSAxOUMxMS4xOTg5IDE5IDExLjM4OTYgMTkuMDc5IDExLjUzMDMgMTkuMjE5N0MxMS42NzA5IDE5LjM2MDMgMTEuNzUgMTkuNTUxMSAxMS43NSAxOS43NVYyMi41QzExLjc1IDIyLjU2NjMgMTEuNzc2MyAyMi42Mjk5IDExLjgyMzIgMjIuNjc2OEMxMS44NzAxIDIyLjcyMzcgMTEuOTMzNyAyMi43NSAxMiAyMi43NUgyMS41QzIxLjU4MTUgMjIuNzUwMSAyMS42NjE4IDIyLjczMDMgMjEuNzMzOSAyMi42OTIzQzIxLjgwNiAyMi42NTQyIDIxLjg2NzcgMjIuNTk5MSAyMS45MTM3IDIyLjUzMThDMjEuOTU5NiAyMi40NjQ1IDIxLjk4ODQgMjIuMzg2OSAyMS45OTc1IDIyLjMwNTlDMjIuMDA2NiAyMi4yMjQ5IDIxLjk5NTggMjIuMTQyOSAyMS45NjYgMjIuMDY3TDE5LjAxMiAxNC41NTJaTTExLjc1IDE1Ljc1MkMxMS43NSAxNS45NTA5IDExLjY3MDkgMTYuMTQxNyAxMS41MzAzIDE2LjI4MjNDMTEuMzg5NiAxNi40MjMgMTEuMTk4OSAxNi41MDIgMTEgMTYuNTAyQzEwLjgwMSAxNi41MDIgMTAuNjEwMyAxNi40MjMgMTAuNDY5NiAxNi4yODIzQzEwLjMyOSAxNi4xNDE3IDEwLjI1IDE1Ljk1MDkgMTAuMjUgMTUuNzUyVjExLjc1MkMxMC4yNSAxMS41NTMxIDEwLjMyOSAxMS4zNjIzIDEwLjQ2OTYgMTEuMjIxN0MxMC42MTAzIDExLjA4MSAxMC44MDEgMTEuMDAyIDExIDExLjAwMkMxMS4xOTg5IDExLjAwMiAxMS4zODk2IDExLjA4MSAxMS41MzAzIDExLjIyMTdDMTEuNjcwOSAxMS4zNjIzIDExLjc1IDExLjU1MzEgMTEuNzUgMTEuNzUyVjE1Ljc1MlpcIi8+PHBhdGggZD1cIk0xOS44NjQgMTIuODdDMjAuOTM1IDExLjcyMyAyNCA4LjIyNiAyNCA1Ljc1QzI0IDQuNTU2NTMgMjMuNTI1OSAzLjQxMTkzIDIyLjY4MiAyLjU2ODAyQzIxLjgzODEgMS43MjQxMSAyMC42OTM1IDEuMjUgMTkuNSAxLjI1QzE4LjMwNjUgMS4yNSAxNy4xNjE5IDEuNzI0MTEgMTYuMzE4IDIuNTY4MDJDMTUuNDc0MSAzLjQxMTkzIDE1IDQuNTU2NTMgMTUgNS43NUMxNSA4LjIyNiAxOC4wNjUgMTEuNzIzIDE5LjEzNiAxMi44N0MxOS4xODI3IDEyLjkxOTYgMTkuMjM5MiAxMi45NTkyIDE5LjMwMTggMTIuOTg2MkMxOS4zNjQzIDEzLjAxMzMgMTkuNDMxOCAxMy4wMjcyIDE5LjUgMTMuMDI3MkMxOS41NjgyIDEzLjAyNzIgMTkuNjM1NyAxMy4wMTMzIDE5LjY5ODIgMTIuOTg2MkMxOS43NjA4IDEyLjk1OTIgMTkuODE3MyAxMi45MTk2IDE5Ljg2NCAxMi44N1YxMi44N1pNMTggNS43NUMxOCA1LjQ1MzMzIDE4LjA4OCA1LjE2MzMyIDE4LjI1MjggNC45MTY2NEMxOC40MTc2IDQuNjY5OTcgMTguNjUxOSA0LjQ3NzcxIDE4LjkyNiA0LjM2NDE4QzE5LjIwMDEgNC4yNTA2NSAxOS41MDE3IDQuMjIwOTQgMTkuNzkyNiA0LjI3ODgyQzIwLjA4MzYgNC4zMzY3IDIwLjM1MDkgNC40Nzk1NiAyMC41NjA3IDQuNjg5MzRDMjAuNzcwNCA0Ljg5OTEyIDIwLjkxMzMgNS4xNjYzOSAyMC45NzEyIDUuNDU3MzZDMjEuMDI5MSA1Ljc0ODM0IDIwLjk5OTMgNi4wNDk5NCAyMC44ODU4IDYuMzI0MDNDMjAuNzcyMyA2LjU5ODExIDIwLjU4IDYuODMyMzggMjAuMzMzNCA2Ljk5NzJDMjAuMDg2NyA3LjE2MjAzIDE5Ljc5NjcgNy4yNSAxOS41IDcuMjVDMTkuMTAyMiA3LjI1IDE4LjcyMDYgNy4wOTE5NiAxOC40MzkzIDYuODEwNjZDMTguMTU4IDYuNTI5MzYgMTggNi4xNDc4MiAxOCA1Ljc1WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXZlaGljbGVcIiBkYXRhLW5hbWU9XCJ2ZWhpY2xlXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMjIuMTkyOSAxMC4zMzA4QzIyLjIwNDggMTAuMzU3OCAyMi4yMjE0IDEwLjM4MjYgMjIuMjQyIDEwLjQwNEMyMy4wNDggMTEuMjMzOSAyMy40OTkyIDEyLjM0NTEgMjMuNSAxMy41MDJWMTUuNTAyQzIzLjQ5ODQgMTYuMDAzMiAyMy4zNDU3IDE2LjQ5MjQgMjMuMDYxOCAxNi45MDU1QzIyLjc5NjYgMTcuMjkxNiAyMi40Mjg0IDE3LjU5NDYgMjIgMTcuNzgwNlYyMEMyMiAyMC41NTIzIDIxLjU1MjMgMjEgMjEgMjFIMTlDMTguNDQ3NyAyMSAxOCAyMC41NTIzIDE4IDIwVjE3LjgxNzJMNiAxNy44MTQ4VjIwQzYgMjAuNTUyMyA1LjU1MjI4IDIxIDUgMjFIM0MyLjQ0NzcyIDIxIDIgMjAuNTUyMyAyIDIwVjE3Ljc3NjZDMS41NzE1NiAxNy41OTA2IDEuMjAzMzQgMTcuMjg3NiAwLjkzODExNSAxNi45MDE1QzAuNjU0Mjk5IDE2LjQ4ODQgMC41MDE2MTMgMTUuOTk5MiAwLjQ5OTk4MyAxNS40OThWMTMuNDk4QzAuNTAxNTE0IDEyLjM0MzYgMC45NTE1MDYgMTEuMjM0OSAxLjc1NDk4IDEwLjQwNkMxLjc4MTM3IDEwLjM3ODYgMS44MDExOSAxMC4zNDU1IDEuODEyOTcgMTAuMzA5M0wxLjgxMzQxIDEwLjMwODhDMS44MTQ1MyAxMC4zMDQyIDEuODE1NTMgMTAuMjk5NSAxLjgxNjM5IDEwLjI5NDdDMS44MjUxNyAxMC4yNDY1IDEuODE5NTYgMTAuMTk2NyAxLjgwMDI3IDEwLjE1MTdDMS43ODA5OCAxMC4xMDY2IDEuNzQ4ODUgMTAuMDY4MSAxLjcwNzg5IDEwLjA0MTJDMS42NjY5MyAxMC4wMTQyIDEuNjE4OTQgOS45OTk5IDEuNTY5OSAxMEgxLjI4MTk4QzEuMDE2NzcgMTAgMC43NjI0MTEgOS44OTQ2NCAwLjU3NDg3NSA5LjcwNzExQzAuMzg3MzM4IDkuNTE5NTcgMC4yODE5ODIgOS4yNjUyMiAwLjI4MTk4MiA5VjhDMC4yODE5ODIgNy43MzQ3OCAwLjM4NzMzOCA3LjQ4MDQzIDAuNTc0ODc1IDcuMjkyODlDMC43NjI0MTEgNy4xMDUzNiAxLjAxNjc3IDcgMS4yODE5OCA3SDIuNjMxOThDMi44NjQ3NCA3LjAwMDYyIDMuMDk0MiA3LjA1NTEgMy4zMDIzOCA3LjE1OTJDMy40ODM4IDcuMjQ5OTEgMy42NDQ3NyA3LjM3NjE0IDMuNzc1OTEgNy41MzAwN0wzLjc4NzU4IDcuNTAxNjVDMy44MTE5NyA3LjQ2OTQ1IDMuODI4MjMgNy40MzE4NCAzLjgzNDk4IDcuMzkyMDFMNC4yMzQ5OCA1LjAwOTAxQzQuMzQ5NTUgNC4zMDczNyA0LjcxMDI5IDMuNjY5NDggNS4yNTI1MyAzLjIwOTdDNS43OTQ3NyAyLjc0OTkyIDYuNDgzMDUgMi40OTgzMiA3LjE5Mzk4IDIuNTAwMDFIMTYuODAyQzE3LjUxMjYgMi40OTgyNSAxOC4yMDA3IDIuNzQ5NTYgMTguNzQyOSAzLjIwODk0QzE5LjI4NTEgMy42NjgzMiAxOS42NDYgNC4zMDU3NCAxOS43NjEgNS4wMDcwMUwyMC4xNjEgNy4zOTAwMUMyMC4xNjc2IDcuNDI5ODEgMjAuMTgzNyA3LjQ2NzQzIDIwLjIwOCA3LjQ5OTY0QzIwLjIxNDUgNy41MDgyOSAyMC4yMjE2IDcuNTE2NDggMjAuMjI5MSA3LjUyNDE3QzIwLjM1OTMgNy4zNzI5MSAyMC41MTg1IDcuMjQ4NzQgMjAuNjk3NiA3LjE1OTJDMjAuOTA1OCA3LjA1NTEgMjEuMTM1MiA3LjAwMDYyIDIxLjM2OCA3SDIyLjcxOEMyMi45ODMyIDcgMjMuMjM3NiA3LjEwNTM2IDIzLjQyNTEgNy4yOTI4OUMyMy42MTI2IDcuNDgwNDMgMjMuNzE4IDcuNzM0NzggMjMuNzE4IDhWOUMyMy43MTggOS4yNjUyMiAyMy42MTI2IDkuNTE5NTcgMjMuNDI1MSA5LjcwNzExQzIzLjIzNzYgOS44OTQ2NCAyMi45ODMyIDEwIDIyLjcxOCAxMEgyMi40MzAxQzIyLjM4MSA5Ljk5OTkgMjIuMzMzIDEwLjAxNDIgMjIuMjkyMSAxMC4wNDEyQzIyLjI1MTEgMTAuMDY4MSAyMi4yMTkgMTAuMTA2NiAyMi4xOTk3IDEwLjE1MTdDMjIuMTgwNCAxMC4xOTY3IDIyLjE3NDggMTAuMjQ2NSAyMi4xODM2IDEwLjI5NDdDMjIuMTg1OCAxMC4zMDcgMjIuMTg4OSAxMC4zMTkxIDIyLjE5MjkgMTAuMzMwOFpNNy4xOTM5OCA0LjUwMjAxSDE2LjgwNkMxNy4wNDI3IDQuNTAyMTIgMTcuMjcxNyA0LjU4NjE5IDE3LjQ1MjIgNC43MzkyN0MxNy42MzI4IDQuODkyMzUgMTcuNzUzMiA1LjEwNDUxIDE3Ljc5MiA1LjMzODAxTDE4LjI3MSA4LjIxMTAxQzE4LjI3NjMgOC4yNDY0MSAxOC4yNzQxIDguMjgyNTQgMTguMjY0NSA4LjMxNzAyQzE4LjI1NDggOC4zNTE1IDE4LjIzNzkgOC4zODM1MyAxOC4yMTUgOC40MTEwMUMxOC4xOTE1IDguNDM4NjcgMTguMTYyMiA4LjQ2MDg3IDE4LjEyOTIgOC40NzYwN0MxOC4wOTYyIDguNDkxMjcgMTguMDYwMyA4LjQ5OTA5IDE4LjAyNCA4LjQ5OTAxSDUuOTc1OThDNS45Mzk2NSA4LjQ5OTA3IDUuOTAzNzQgOC40OTEyIDUuODcwNzYgOC40NzU5N0M1LjgzNzc4IDguNDYwNzMgNS44MDg1MSA4LjQzODQ5IDUuNzg1IDguNDEwNzlDNS43NjE0OSA4LjM4MzA5IDUuNzQ0MyA4LjM1MDYgNS43MzQ2MiA4LjMxNTU4QzUuNzI0OTUgOC4yODA1NiA1LjcyMzAyIDguMjQzODUgNS43Mjg5OCA4LjIwODAxTDYuMjA3OTggNS4zMzUwMUM2LjI0NzQ0IDUuMTAyMDYgNi4zNjgxIDQuODkwNiA2LjU0ODU5IDQuNzM4MTJDNi43MjkwNyA0LjU4NTY1IDYuOTU3NzEgNC41MDIgNy4xOTM5OCA0LjUwMjAxWk03IDEzLjVDNyAxNC4zMjg0IDYuMzI4NDMgMTUgNS41IDE1QzQuNjcxNTcgMTUgNCAxNC4zMjg0IDQgMTMuNUM0IDEyLjY3MTYgNC42NzE1NyAxMiA1LjUgMTJDNi4zMjg0MyAxMiA3IDEyLjY3MTYgNyAxMy41Wk0xOC41IDE1QzE5LjMyODQgMTUgMjAgMTQuMzI4NCAyMCAxMy41QzIwIDEyLjY3MTYgMTkuMzI4NCAxMiAxOC41IDEyQzE3LjY3MTYgMTIgMTcgMTIuNjcxNiAxNyAxMy41QzE3IDE0LjMyODQgMTcuNjcxNiAxNSAxOC41IDE1WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXZlbmRvclwiIGRhdGEtbmFtZT1cInZlbmRvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMS4zNzkgMTEuOUMyMC44MDc0IDExLjg5MTUgMjAuMjQ1NSAxMS43NTA2IDE5LjczNzUgMTEuNDg4NEMxOS4yMjk1IDExLjIyNjMgMTguNzg5MSAxMC44NDk5IDE4LjQ1MSAxMC4zODlDMTguNDI3NyAxMC4zNTggMTguMzk3NSAxMC4zMzI4IDE4LjM2MjggMTAuMzE1NEMxOC4zMjgxIDEwLjI5OCAxOC4yODk4IDEwLjI4OSAxOC4yNTEgMTAuMjg5QzE4LjIxMjIgMTAuMjg5IDE4LjE3MzkgMTAuMjk4IDE4LjEzOTIgMTAuMzE1NEMxOC4xMDQ1IDEwLjMzMjggMTguMDc0MyAxMC4zNTggMTguMDUxIDEwLjM4OUMxNy43MTg5IDEwLjg1NjMgMTcuMjc5OSAxMS4yMzczIDE2Ljc3MDUgMTEuNTAwMkMxNi4yNjExIDExLjc2MzEgMTUuNjk2MiAxMS45MDAzIDE1LjEyMyAxMS45MDAzQzE0LjU0OTggMTEuOTAwMyAxMy45ODQ5IDExLjc2MzEgMTMuNDc1NSAxMS41MDAyQzEyLjk2NjEgMTEuMjM3MyAxMi41MjcgMTAuODU2MyAxMi4xOTUgMTAuMzg5QzEyLjE3MTcgMTAuMzU4IDEyLjE0MTUgMTAuMzMyOCAxMi4xMDY4IDEwLjMxNTRDMTIuMDcyMSAxMC4yOTggMTIuMDMzOCAxMC4yODkgMTEuOTk1IDEwLjI4OUMxMS45NTYyIDEwLjI4OSAxMS45MTc5IDEwLjI5OCAxMS44ODMyIDEwLjMxNTRDMTEuODQ4NSAxMC4zMzI4IDExLjgxODMgMTAuMzU4IDExLjc5NSAxMC4zODlDMTEuNDU3NiAxMC44NDkgMTEuMDE4MyAxMS4yMjQ4IDEwLjUxMTYgMTEuNDg2OUMxMC4wMDQ5IDExLjc0OSA5LjQ0NDQxIDExLjg5MDQgOC44NzM5OSAxMS45QzguMzAyMjEgMTEuODkxNiA3Ljc0MDE2IDExLjc1MDggNy4yMzE5NiAxMS40ODg2QzYuNzIzNzYgMTEuMjI2NSA2LjI4MzI0IDEwLjg1MDEgNS45NDQ5OSAxMC4zODlDNS45MjE3IDEwLjM1OCA1Ljg5MTUxIDEwLjMzMjggNS44NTY3OSAxMC4zMTU0QzUuODIyMDggMTAuMjk4IDUuNzgzOCAxMC4yODkgNS43NDQ5OSAxMC4yODlDNS43MDYxOCAxMC4yODkgNS42Njc5IDEwLjI5OCA1LjYzMzE5IDEwLjMxNTRDNS41OTg0NyAxMC4zMzI4IDUuNTY4MjggMTAuMzU4IDUuNTQ0OTkgMTAuMzg5QzUuMjA3MjUgMTAuODQ5NCA0Ljc2NzUzIDExLjIyNTQgNC4yNjAyNSAxMS40ODc1QzMuNzUyOTggMTEuNzQ5NyAzLjE5MTkyIDExLjg5MDggMi42MjA5OSAxMS45QzIuNDkyNjggMTEuODk5OCAyLjM2NDQ5IDExLjg5MjQgMi4yMzY5OSAxMS44NzhDMi4yMDE5NCAxMS44NzM5IDIuMTY2NDIgMTEuODc3MyAyLjEzMjc4IDExLjg4NzlDMi4wOTkxMyAxMS44OTg2IDIuMDY4MTQgMTEuOTE2MyAyLjA0MTg2IDExLjkzOThDMi4wMTU1NyAxMS45NjM0IDEuOTk0NTkgMTEuOTkyMiAxLjk4MDMgMTIuMDI0NUMxLjk2NjAxIDEyLjA1NjggMS45NTg3NSAxMi4wOTE3IDEuOTU4OTkgMTIuMTI3VjIxLjE1QzEuOTU4OTkgMjEuNTQ3OCAyLjExNzAzIDIxLjkyOTQgMi4zOTgzMyAyMi4yMTA3QzIuNjc5NjMgMjIuNDkyIDMuMDYxMTcgMjIuNjUgMy40NTg5OSAyMi42NUgyMC40NTlDMjAuODU2OCAyMi42NSAyMS4yMzgzIDIyLjQ5MiAyMS41MTk3IDIyLjIxMDdDMjEuODAxIDIxLjkyOTQgMjEuOTU5IDIxLjU0NzggMjEuOTU5IDIxLjE1VjEyLjEzNEMyMS45NTg4IDEyLjA5OTIgMjEuOTUxNSAxMi4wNjQ4IDIxLjkzNzQgMTIuMDMyOUMyMS45MjMzIDEyLjAwMTEgMjEuOTAyNyAxMS45NzI1IDIxLjg3NyAxMS45NDlDMjEuODUxNCAxMS45MjU2IDIxLjgyMTIgMTEuOTA3OCAyMS43ODgzIDExLjg5NjdDMjEuNzU1NCAxMS44ODU3IDIxLjcyMDUgMTEuODgxNyAyMS42ODYgMTEuODg1QzIxLjU4NCAxMS44OTQgMjEuNDgyIDExLjkgMjEuMzc5IDExLjlaTTE0Ljk1NyAxNS4wMUMxNC45NjI0IDE0LjkwOTIgMTUuMDA3NSAxNC44MTQ2IDE1LjA4MjUgMTQuNzQ3QzE1LjE1NzUgMTQuNjc5MyAxNS4yNTYxIDE0LjY0NDEgMTUuMzU3IDE0LjY0OUgxOC41NTdDMTguNjU3OCAxNC42NDQxIDE4Ljc1NjUgMTQuNjc5MyAxOC44MzE1IDE0Ljc0N0MxOC45MDY0IDE0LjgxNDYgMTguOTUxNiAxNC45MDkyIDE4Ljk1NyAxNS4wMVYyMC4xNDlDMTguOTU3IDIwLjI4MTYgMTguOTA0MyAyMC40MDg4IDE4LjgxMDUgMjAuNTAyNkMxOC43MTY4IDIwLjU5NjMgMTguNTg5NiAyMC42NDkgMTguNDU3IDIwLjY0OUgxNS40NTdDMTUuMzI0NCAyMC42NDkgMTUuMTk3MiAyMC41OTYzIDE1LjEwMzQgMjAuNTAyNkMxNS4wMDk3IDIwLjQwODggMTQuOTU3IDIwLjI4MTYgMTQuOTU3IDIwLjE0OVYxNS4wMVpNNS40NTY5OSAxNC45ODJDNS40NjI2NiAxNC44ODgzIDUuNTA1MTkgMTQuODAwNyA1LjU3NTI3IDE0LjczODNDNS42NDUzNiAxNC42NzU5IDUuNzM3MyAxNC42NDM4IDUuODMwOTkgMTQuNjQ5SDExLjA3OEMxMS4xNzE4IDE0LjY0MzggMTEuMjYzOCAxNC42NzU5IDExLjMzNDEgMTQuNzM4M0MxMS40MDQzIDE0LjgwMDYgMTEuNDQ3MSAxNC44ODgyIDExLjQ1MyAxNC45ODJWMTguMzE2QzExLjQ0NzEgMTguNDA5OCAxMS40MDQzIDE4LjQ5NzQgMTEuMzM0MSAxOC41NTk3QzExLjI2MzggMTguNjIyMSAxMS4xNzE4IDE4LjY1NDIgMTEuMDc4IDE4LjY0OUg1LjgzMDk5QzUuNzM3MyAxOC42NTQyIDUuNjQ1MzYgMTguNjIyMSA1LjU3NTI3IDE4LjU1OTdDNS41MDUxOSAxOC40OTczIDUuNDYyNjYgMTguNDA5NyA1LjQ1Njk5IDE4LjMxNlYxNC45ODJaXCIvPjxwYXRoIGQ9XCJNMjEuMzc5IDEwLjRDMjEuOTAxOCAxMC4zNjU4IDIyLjM5OTkgMTAuMTY1NCAyMi44MDA3IDkuODI4MTJDMjMuMjAxNiA5LjQ5MDgxIDIzLjQ4NDEgOS4wMzQyMSAyMy42MDcgOC41MjQ5OUMyMy43NDQzIDguMDc3OTQgMjMuNzM5OCA3LjU5OTM1IDIzLjU5NCA3LjE1NDk5TDIxLjc5NCAxLjY4NDk5QzIxLjc3NTcgMS42MDEwMSAyMS43MzI3IDEuNTI0NDMgMjEuNjcwNSAxLjQ2NTA5QzIxLjYwODMgMS40MDU3NSAyMS41Mjk4IDEuMzY2MzcgMjEuNDQ1IDEuMzUxOTlIMi41NTEwNEMyLjQ2NjI5IDEuMzY2MzcgMi4zODc3OCAxLjQwNTc1IDIuMzI1NTkgMS40NjUwOUMyLjI2MzQgMS41MjQ0MyAyLjIyMDM3IDEuNjAxMDEgMi4yMDIwNCAxLjY4NDk5TDAuNDA1MDM4IDcuMTUyOTlDMC4yNjAxNDkgNy41OTc4OCAwLjI1NTk1OSA4LjA3NjYzIDAuMzkzMDM4IDguNTIzOTlDMC41MTU4MjcgOS4wMzM0IDAuNzk4MjU5IDkuNDkwMjEgMS4xOTkwOSA5LjgyNzcyQzEuNTk5OTIgMTAuMTY1MiAyLjA5ODE2IDEwLjM2NTcgMi42MjEwNCAxMC40QzMuMzE1MzggMTAuMzI3NiAzLjk1MzU5IDkuOTg1NjQgNC4zOTg0NiA5LjQ0NzY0QzQuODQzMzMgOC45MDk2NSA1LjA1OTM0IDguMjE4NTcgNS4wMDAwNCA3LjUyMjk5QzUuMDAwMDQgNy4zMjQwOCA1LjA3OTA2IDcuMTMzMzEgNS4yMTk3MSA2Ljk5MjY2QzUuMzYwMzYgNi44NTIwMSA1LjU1MTEzIDYuNzcyOTkgNS43NTAwNCA2Ljc3Mjk5QzUuOTQ4OTUgNi43NzI5OSA2LjEzOTcyIDYuODUyMDEgNi4yODAzNyA2Ljk5MjY2QzYuNDIxMDIgNy4xMzMzMSA2LjUwMDA0IDcuMzI0MDggNi41MDAwNCA3LjUyMjk5QzYuNDQwNjcgOC4yMTc3OSA2LjY1NiA4LjkwODE4IDcuMDk5ODIgOS40NDYwNEM3LjU0MzY0IDkuOTgzOSA4LjE4MDYgMTAuMzI2NCA4Ljg3NDA0IDEwLjRDOS41Njc4NCAxMC4zMjY5IDEwLjIwNTMgOS45ODQ2IDEwLjY0OTUgOS40NDY2OEMxMS4wOTM4IDguOTA4NzcgMTEuMzA5NCA4LjIxODEgMTEuMjUgNy41MjI5OUMxMS4yNSA3LjMyNDA4IDExLjMyOTEgNy4xMzMzMSAxMS40Njk3IDYuOTkyNjZDMTEuNjEwNCA2Ljg1MjAxIDExLjgwMTEgNi43NzI5OSAxMiA2Ljc3Mjk5QzEyLjE5OSA2Ljc3Mjk5IDEyLjM4OTcgNi44NTIwMSAxMi41MzA0IDYuOTkyNjZDMTIuNjcxIDcuMTMzMzEgMTIuNzUgNy4zMjQwOCAxMi43NSA3LjUyMjk5QzEyLjY5MDcgOC4yMTgyNiAxMi45MDY0IDguOTA5MDYgMTMuMzUwOSA5LjQ0N0MxMy43OTUzIDkuOTg0OTQgMTQuNDMzMSAxMC4zMjcxIDE1LjEyNyAxMC40QzE1LjgyMDQgMTAuMzI2NCAxNi40NTczIDkuOTgzODcgMTYuOTAwOSA5LjQ0NTk4QzE3LjM0NDYgOC45MDgwOCAxNy41NTk3IDguMjE3NjkgMTcuNSA3LjUyMjk5QzE3LjUgNy4zMjQwOCAxNy41NzkxIDcuMTMzMzEgMTcuNzE5NyA2Ljk5MjY2QzE3Ljg2MDQgNi44NTIwMSAxOC4wNTExIDYuNzcyOTkgMTguMjUgNi43NzI5OUMxOC40NDkgNi43NzI5OSAxOC42Mzk3IDYuODUyMDEgMTguNzgwNCA2Ljk5MjY2QzE4LjkyMSA3LjEzMzMxIDE5IDcuMzI0MDggMTkgNy41MjI5OUMxOC45NDEgOC4yMTg1MSAxOS4xNTcxIDguOTA5NDUgMTkuNjAxOSA5LjQ0NzM5QzIwLjA0NjcgOS45ODUzMiAyMC42ODQ4IDEwLjMyNzMgMjEuMzc5IDEwLjRaXCIvPjwvc3ltYm9sPjwvc3ZnPicpXG4gICAgfVxuICB9XG5cbiAgLy8gSWYgRE9NIGlzIGFscmVhZHkgcmVhZHksIGVtYmVkIFNWR3NcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgeyBlbWJlZCgpIH1cblxuICAvLyBIYW5kbGUgVHVyYm9saW5rcyBwYWdlIGNoYW5nZSBldmVudHNcbiAgaWYgKCB3aW5kb3cuVHVyYm9saW5rcyApIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidHVyYm9saW5rczpsb2FkXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtYmVkKCkgfSlcbiAgfVxuXG4gIC8vIEhhbmRsZSBzdGFuZGFyZCBET00gcmVhZHkgZXZlbnRzXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uKGV2ZW50KSB7IGVtYmVkKCkgfSlcbn0pKCkiLCJ2YXIgdG9vbGJveCAgICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICAgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIEV2ZW50TWFuYWdlciA9IEV2ZW50LmNhbGxiYWNrTWFuYWdlcixcbiAgICBTdGFja01hbmFnZXIgPSByZXF1aXJlKCAnLi9fc3RhY2snIClcbiAgICBpbml0aWFsaXplZCAgPSBmYWxzZSxcbiAgICBNb2RhbHMgICAgICAgPSBbXSxcbiAgICBTdGFjayAgICAgICAgPSBbXSxcbiAgICBGb2N1c1N0YWNrICAgPSBbXVxuXG4vLyBDU1Mgc3R5bGVzIHRvIGhlbHAgcHJldmVudCBzdHJheSBtb2RhbCBjbGlja3MgKGRvZXNuJ3Qgd29yayBpbiBsZXNzIHRoYW4gSUUgMTEpXG52YXIgc3R5bGUgICAgICAgID0gJzxzdHlsZSBpZD1cIm1vZGFsLXRvZ2dsZS1zdHlsZVwiPmJvZHlbZGF0YS1hY3RpdmUtbW9kYWxdICogeyBwb2ludGVyLWV2ZW50czogbm9uZSB9IC5hY3RpdmUtbW9kYWwsIC5hY3RpdmUtbW9kYWwgKiB7IHBvaW50ZXItZXZlbnRzOiBhbGwgfTwvc3R5bGU+J1xuXG4vLyB0eXBlcyBvZiBtb2RhbHNcbi8vIE1lbnUgLSB0cmlnZ2VyIHRvZ2dsZXMsIGNsaWNraW5nIG91dHNpZGUgY2xvc2VzXG4vLyBQYW5lbCAtIHRyaWdnZXIgb3BlbnMsIGJ1dCBkb2VzIG5vdCBjbG9zZSwgY2xpY2tpbmcgb3V0c2lkZSBjbG9zZXNcbi8vIERpYWxvZyAtIHRyaWdnZXIgb3BlbnMsIGNsaWNraW5nIG91dHNpZGUgaXMgaWdub3JlZCwgbXVzdCBiZSBjbG9zZWQgYnkgY2xpY2tpbmcgYSBjbG9zZSBidXR0b24gb3IgdGhlIGVzY2FwZSBrZXlcblxuXG52YXIgTW9kYWwgPSB7XG4gIG5ldzogZnVuY3Rpb24oIGVsLCB0eXBlLCB0cmlnZ2VyICkge1xuXG4gICAgLy8gQ2hlY2sgaWYgYSBtb2RhbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHRyaWdnZXIgZm9yIGEgbW9kYWxcbiAgICB2YXIgbSA9IGdldE1vZGFsKCBlbCApXG4gICAgaWYgKCBtICkge1xuICAgICAgLy8gUmVnaXN0ZXIgdGhlIHRyaWdnZXIgYW5kIHJldHVyblxuICAgICAgaWYgKCB0cmlnZ2VyICkgbS50cmlnZ2Vycy5wdXNoKCB0cmlnZ2VyIClcbiAgICAgIHJldHVybiBnZXRNb2RhbCggZWwgKVxuICAgIH1cblxuICAgIHZhciBtb2RhbCA9IHtcbiAgICAgIHRyaWdnZXJzOiBbXSxcbiAgICAgIF9tb2RhbDogICB0cnVlLFxuICAgICAgdHlwZTogICAgIHR5cGUsXG4gICAgICBpZDogICAgICAgTW9kYWxzLmxlbmd0aCxcbiAgICAgIGVsOiAgICAgICBlbCxcblxuICAgICAgZXZlbnRzOiB7XG4gICAgICAgIG9wZW46IEV2ZW50TWFuYWdlci5uZXcoKSxcbiAgICAgICAgY2xvc2U6IEV2ZW50TWFuYWdlci5uZXcoKVxuICAgICAgfSxcblxuICAgICAgaXNPcGVuOiBmYWxzZVxuICAgIH1cblxuICAgIG1vZGFsWyB0eXBlIF0gPSB0cnVlIC8vIGNvbnZlbmllbmNlIHR5cGUgY2hlY2tcbiAgICBNb2RhbHMucHVzaCggbW9kYWwgKVxuXG4gICAgLy8gVGFnIG1vZGFsIGVsZW1lbnQgd2l0aCBhbiBpZFxuICAgIGVsLmRhdGFzZXQubW9kYWxJZCA9IG1vZGFsLmlkXG4gICAgLy8gSGlkZSBtb2RhbCBieSBkZWZhdWx0XG4gICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGRlbicgKVxuICAgIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgdHJ1ZSApXG4gICAgZWwuc2V0QXR0cmlidXRlKCAnYXJpYS1tb2RhbCcsIHRydWUgKVxuXG4gICAgLy8gUmVnaXN0ZXIgZWxlbWVudHMgd2hpY2ggdHJpZ2dlciB0aGUgbW9kYWxcbiAgICBpZiAoIHRyaWdnZXIgKSBtb2RhbC50cmlnZ2Vycy5wdXNoKCB0cmlnZ2VyIClcblxuICAgIG1vZGFsLm9uID0gZnVuY3Rpb24gKCB0eXBlLCBjYWxsYmFjayApIHtcbiAgICAgIGlmICggbW9kYWwuZXZlbnRzW3R5cGVdICkge1xuICAgICAgICBtb2RhbC5ldmVudHNbdHlwZV0uYWRkKCBjYWxsYmFjayApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGRlZmF1bHQgb3BlbmluZyBiZWhhdmlvclxuICAgIG1vZGFsLm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIG1vZGFsLmlzT3BlbiApIHJldHVyblxuICAgICAgbW9kYWwuaXNPcGVuID0gdHJ1ZVxuICAgICAgbW9kYWwuZXZlbnRzLm9wZW4uc3RhcnQoKVxuICAgICAgbW9kYWwuZXZlbnRzLmNsb3NlLnN0b3AoKVxuXG4gICAgICAvLyBMaXN0ZW4gdG8gZXNjYXBlIGtleSBwcmVzc2VzIGluICdtb2RhbC1hY3RpdmUnIHNjb3BlXG4gICAgICBpZiAoICFTdGFjay5sZW5ndGggKSBFdmVudC5vbiggZG9jdW1lbnQsICdrZXlkb3duJywga2V5UHJlc3MgKVxuXG4gICAgICBGb2N1c1N0YWNrLnB1c2goIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgKVxuICAgICAgU3RhY2sucHVzaCggbW9kYWwgKVxuXG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoICdtb2RhbC1hY3RpdmUnIClcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRkZW4nIClcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgZmFsc2UgKVxuXG4gICAgICAvLyBTZXQgc3RhdGUgb24gbW9kYWwgdHJpZ2dlcnNcbiAgICAgIG1vZGFsLnRyaWdnZXJzLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ21vZGFsLWFjdGl2ZScgKVxuICAgICAgfSlcblxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ21vZGFsLWlzLWNsb3NpbmcnIClcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdtb2RhbC1pcy1vcGVuaW5nJyApXG5cbiAgICAgIC8vIEFmdGVyIG9wZW5pbmcgYW5pbWF0aW9uLCByZW1vdmUgYW5pbWF0aW9uIGNsYXNzXG4gICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIG1vZGFsLmV2ZW50cy5vcGVuLmZpcmUsIDUwKVxuICAgIH1cblxuICAgIC8vIEFkZCBmaXJzdCBvcGVuIGNhbGxiYWNrXG4gICAgbW9kYWwuZXZlbnRzLm9wZW4uYWRkKCBmdW5jdGlvbiAoKSB7XG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtaXMtb3BlbmluZycgKVxuICAgIH0pXG5cbiAgICBtb2RhbC5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICggIW1vZGFsLmlzT3BlbiApIHJldHVyblxuXG4gICAgICAvLyBUb2dnbGUgZXZlbnQgY2FsbGJhY2tzXG4gICAgICBtb2RhbC5ldmVudHMub3Blbi5zdG9wKClcbiAgICAgIG1vZGFsLmV2ZW50cy5jbG9zZS5zdGFydCgpXG5cbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdtb2RhbC1pcy1vcGVuaW5nJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnbW9kYWwtaXMtY2xvc2luZycgKVxuICAgICAgXG4gICAgICAvLyBBZnRlciBjbG9zaW5nIGFuaW1hdGlvbiwgaGlkZSwgcG9wIHN0YWNrLCBmaXJlIGNsb3NlIGV2ZW50cy5cbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBlbCwgbW9kYWwuZXZlbnRzLmNsb3NlLmZpcmUsIDUwIClcbiAgICB9XG5cbiAgICAvLyBBZGQgZmlyc3QgY2xvc2UgY2FsbGJhY2tcbiAgICBtb2RhbC5ldmVudHMuY2xvc2UuYWRkKCBmdW5jdGlvbigpe1xuICAgICAgbW9kYWwuaXNPcGVuID0gZmFsc2VcblxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ21vZGFsLWlzLWNsb3NpbmcnIClcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdoaWRkZW4nIClcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgdHJ1ZSApXG5cbiAgICAgIC8vIFNldCBzdGF0ZSBvbiBtb2RhbCB0cmlnZ2Vyc1xuICAgICAgbW9kYWwudHJpZ2dlcnMuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkge1xuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtYWN0aXZlJyApXG4gICAgICB9KVxuICAgICAgXG4gICAgICAvLyBSZW1vdmUgdGhpcyBtb2RhbCBmcm9tIHRoZSBzdGFja1xuICAgICAgU3RhY2sucG9wKClcblxuICAgICAgLy8gUmVzdG9yZSBmb3VjcyBmb3IgZGlhbG9ncyBhbmQgbW9kYWwgbWVudXNcbiAgICAgIC8vIFRoaXMgcmV0dXJucyB1c2VycyB0byB0aGVpciBwbGFjZSBvbiB0aGUgcGFnZVxuICAgICAgLy8gVGhpcyBkb2Vzbid0IG9jY3VyIG9uIG1vZGFsIHBhbmVscyBiZWNhdXNlIGZvY3VzaW5nXG4gICAgICAvLyBvcGVucyBwYW5lbHMuIFRoZXJlIG1heSBiZSBhIGdvb2QgZml4IGZvciB0aGlzIGF0IHNvbWUgcG9pbnQuXG4gICAgICB2YXIgZm9jdXNFbCA9IEZvY3VzU3RhY2sucG9wKClcbiAgICAgIGlmICggbW9kYWwuZGlhbG9nIHx8IG1vZGFsLm1lbnUgKSBmb2N1c0VsLmZvY3VzKClcblxuICAgICAgLy8gSWYgaXQncyB0aGUgbGFzdCBtb2RhbCBvcGVuLCByZXN0b3JlIG5vbi1tb2RhbCBzdGF0ZVxuICAgICAgaWYgKCAhU3RhY2subGVuZ3RoICkge1xuICAgICAgICBFdmVudC5vZmYoIGRvY3VtZW50LCAna2V5ZG93bicsIGtleVByZXNzIClcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtYWN0aXZlJyApXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBtb2RhbFxuICB9XG59XG5cbi8vIEFkZCBldmVudHMgdG8gbW9kYWxcbmZ1bmN0aW9uIG9uICggc2VsZWN0b3IsIGV2ZW50LCBjYWxsYmFjayApIHtcbiAgdmFyIG1vZGFsID0gZ2V0TW9kYWwoIHNlbGVjdG9yIClcbiAgaWYgKCBtb2RhbCAmJiBtb2RhbC5ldmVudHNbZXZlbnRdICkge1xuICAgIG1vZGFsLmV2ZW50c1tldmVudF0uYWRkKCBjYWxsYmFjayApXG4gICAgcmV0dXJuIG1vZGFsXG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvc2UgKCBtb2RhbCApIHtcbiAgLy8gRGlkIHRoZXkgc3BlY2lmeSBhIG1vZGFsIHRvIGNsb3NlP1xuICBpZiAoIHR5cGVvZiBtb2RhbCAhPSAndW5kZWZpbmVkJyApIHtcbiAgICBtb2RhbCA9IGdldE1vZGFsKCBtb2RhbCApXG4gICAgaWYgKCBtb2RhbCApIG1vZGFsLmNsb3NlKClcblxuICAvLyBObz8gQXNzdW1lIGN1cnJlbnQgbW9kYWwgc2hvdWxkIGJlIGNsb3NlZFxuICB9IGVsc2Uge1xuICAgIG1vZGFsID0gYWN0aXZlTW9kYWwoKVxuICAgIGlmICggbW9kYWwgKSBtb2RhbC5jbG9zZSgpXG4gIH1cblxuICByZXR1cm4gbW9kYWxcbn1cblxuZnVuY3Rpb24gb3BlbiAoIG1vZGFsICkge1xuICBtb2RhbCA9IGdldE1vZGFsKCBtb2RhbCApXG4gIGlmICggbW9kYWwgKSBtb2RhbC5vcGVuKClcblxuICByZXR1cm4gbW9kYWxcbn1cblxuLy8gQ2xpY2tzIHdoaWNoIG9jY3VyIHdoZW4gYSBtb2RhbCBpcyBhY3RpdmVcbmZ1bmN0aW9uIGFjdGl2ZUNsaWNrICggZXZlbnQgKSB7XG4gIHZhciBtb2RhbCA9IGFjdGl2ZU1vZGFsKClcblxuICAvLyBEaWQgdGhlIGNsaWNrIGhhcHBlbiBpbiBzaWRlIHRoZSBtb2RhbCwgb3IgaW4gYSBtb2RhbCBzYWZlIGNvbnRyb2w/XG4gIHZhciBtb2RhbENsaWNrID0gdG9vbGJveC5nZXRDbG9zZXN0KCBldmVudC50YXJnZXQsICdbZGF0YS1tb2RhbC1pZD1cIicrbW9kYWwuaWQrJ1wiXScgKVxuICB2YXIgcGFuZWxDbGljayA9IG1vZGFsLnBhbmVsICYmIHRvb2xib3guZ2V0Q2xvc2VzdCggZXZlbnQudGFyZ2V0LCAnW2RhdGEtZm9yLW1vZGFsPVwiJyttb2RhbC5pZCsnXCJdJyApXG5cbiAgLy8gU3RvcCB0aGUgY2xpY2sgaWYgaXQgaGFwcGVuZWQgb3V0c2lkZSB0aGUgbW9kYWwgb3IgcGFuZWwgY29udHJvbFxuICBpZiAoICFtb2RhbENsaWNrICYmICFwYW5lbENsaWNrICkge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgaWYgKCBtb2RhbC5wYW5lbCApIG1vZGFsLmNsb3NlKClcbiAgfVxufVxuXG4vLyBVc2UgdGhlIHN0YWNrIHBvc2l0aW9uIHRvIGRldGVybWluZSB0aGUgY3VycmVudCBtb2RhbFxuZnVuY3Rpb24gYWN0aXZlTW9kYWwgKCkge1xuICByZXR1cm4gU3RhY2tbIFN0YWNrLmxlbmd0aCAtIDEgXVxufVxuXG5mdW5jdGlvbiBhY3RpdmVQYW5lbCAoKSB7XG4gIHJldHVybiBhY3RpdmVNb2RhbCgpLnF1ZXJ5U2VsZWN0b3IoICdbYXJpYS1tb2RhbD10cnVlXVthcmlhLWV4cGFuZGVkPXRydWVdJyApXG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCAoIGl0ZW0gKSB7XG4gIHJldHVybiBpdGVtLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkuc2VhcmNoKC9IVE1MLitFbGVtZW50LykgPiAtMVxufVxuXG4vLyBSZXR1cm5zIHRoZSBtb2RhbCBvYmplY3QgYnkgaWQgb3Igc2VsZWN0b3JcbmZ1bmN0aW9uIGdldE1vZGFsICggc2VhcmNoICkge1xuXG4gIC8vIERvbid0IGFjY2VwdCBnYXJiYWdlIGlucHV0XG4gIGlmICggIXNlYXJjaCApIHJldHVyblxuXG4gIC8vIFdhcyBhIG1vZGFsIG9iamVjdCBwYXNzZWQgaW4/IEp1c3QgcmV0dXJuIGl0XG4gIGlmICggc2VhcmNoLl9tb2RhbCApIHJldHVybiBzZWFyY2hcblxuICAvLyBJcyBpdCBhbHJlYWR5IHJlZ2lzdGVyZWQ/IChwYXNzZWQgYW4gaWQpXG4gIGlmICggTW9kYWxzWyBzZWFyY2ggXSApIHJldHVybiBNb2RhbHNbIHNlYXJjaCBdXG5cbiAgLy8gVHJ5IG1vZGFsIHRyaWdnZXJzXG4gIGlmICggaXNFbGVtZW50KCBzZWFyY2ggKSApIHtcbiAgICAvLyBJcyBpdCBhIG1vZGFsIHRyaWdnZXI/XG4gICAgaWYgKCBzZWFyY2guZGF0YXNldC5mb3JNb2RhbCApIHJldHVybiBNb2RhbHNbIHNlYXJjaC5kYXRhc2V0LmZvck1vZGFsIF1cbiAgICBcbiAgICAvLyBJcyBpdCB0aGUgY2hpbGQgb2YgYSBtb2RhbCB0cmlnZ2VyP1xuICAgIHZhciBwYXJlbnQgPSB0b29sYm94LmdldENsb3Nlc3QoIHNlYXJjaCAsICdbZGF0YS1mb3ItbW9kYWxdJyApXG4gICAgaWYgKCBwYXJlbnQgKSByZXR1cm4gTW9kYWxzWyBwYXJlbnQuZGF0YXNldC5mb3JNb2RhbCBdXG4gIH1cblxuICBpZiAoIHR5cGVvZiBzZWFyY2ggPT09ICdzdHJpbmcnICkge1xuXG4gICAgLy8gV2VsbCwgbGV0J3MgaG9wZSBpdCdzIGEgRE9NIHNlbGVjdG9yXG4gICAgdmFyIG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvciggc2VhcmNoIClcblxuICAgIC8vIElmIGl0IGlzIHdvbyBob29cbiAgICBpZiAoIG1vZGFsICYmIG1vZGFsLmRhdGFzZXQubW9kYWxJZCApIHtcbiAgICAgIHJldHVybiBNb2RhbHNbIG1vZGFsLmRhdGFzZXQubW9kYWxJZCBdXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKCkge1xuICAvLyBTZWFyY2ggZm9yIHRocmVlIHR5cGVzIG9mIG1vZGFsc1xuICBbJ3BhbmVsJywgJ21lbnUnLCAnZGlhbG9nJ10uZm9yRWFjaCggZnVuY3Rpb24oIHR5cGUgKSB7XG4gICAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtc2hvdy0nK3R5cGUrJ10nICksIGZ1bmN0aW9uKCB0cmlnZ2VyRWwgKSB7XG4gICAgICB2YXIgbW9kYWxFbFxuXG4gICAgICAvLyBHZXQgc2VsZWN0b3JcbiAgICAgIHZhciBzZWxlY3RvciA9IHRyaWdnZXJFbC5nZXRBdHRyaWJ1dGUoICdkYXRhLXNob3ctJyt0eXBlIClcbiAgICAgIGlmICggc2VsZWN0b3IgKSBtb2RhbEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvciggc2VsZWN0b3IgKVxuXG4gICAgICBpZiAoIG1vZGFsRWwgKSB7XG4gICAgICAgIHZhciBtb2RhbCA9IE1vZGFsLm5ldyggbW9kYWxFbCwgdHlwZSwgdHJpZ2dlckVsIClcblxuICAgICAgICAvLyBBc3NpZ24gdGhlIHRyaWdnZXIgdG8gdGhpcyBtb2RhbElkIGZvciBlYXN5IHJlZmVyZW5jZSBsYXRlclxuICAgICAgICB0cmlnZ2VyRWwuZGF0YXNldC5mb3JNb2RhbCA9IG1vZGFsLmlkXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBpZiAoIE1vZGFscy5sZW5ndGggPiAwICYmICFpbml0aWFsaXplZCApIHtcbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50SFRNTCggJ2FmdGVyYmVnaW4nLCBzdHlsZSApIFxuICAgIGluaXRpYWxpemVkID0gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJFdmVudCAoIGV2ZW50ICkge1xuICB2YXIgbW9kYWwgPSBnZXRNb2RhbCggZXZlbnQuY3VycmVudFRhcmdldCApXG4gIHZhciBlbCA9IGV2ZW50LmN1cnJlbnRUYXJnZXRcblxuICBpZiAoIGVsLnRhZ05hbWUgPT0gJ0lOUFVUJyApIHtcblxuICAgIC8vIERvbid0IG9wZW4gd2hlbiBpbnB1dCBpcyBmb2N1c2VkXG4gICAgLy9pZiAoIGV2ZW50LnR5cGUgPT0gJ2ZvY3VzaW4nICYmIGVsLnZhbHVlID09ICcnICkgcmV0dXJuXG5cbiAgICAvLyBEbyBub3QgdHJpZ2dlciBvcGVuIGlmIGlucHV0IGV2ZW50IGNsZWFycyBpbnB1dCB2YWx1ZVxuICAgIGlmICggZXZlbnQudHlwZSA9PSAnaW5wdXQnICYmIGVsLnZhbHVlID09ICcnICkgcmV0dXJuXG4gIH1cblxuICAvLyBEb24ndCBmb2xsb3cgbGlua3MgdXNlZCB0byB0cmlnZ2VyIG1vZGFsc1xuICBpZiAoIGVsLnRhZ05hbWUgPT0gJ0EnICkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG5cbiAgb3BlbiggbW9kYWwgKVxuXG59XG5cbmZ1bmN0aW9uIGtleVByZXNzICggZXZlbnQgKSB7XG4gIHZhciBhY3RpdmVFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcblxuICAvLyBFU0Mgd2FzIHByZXNzZWRcbiAgaWYgKCBFdmVudC5rZXkuaXNQcmVzc2VkKFwiZXNjXCIpICkge1xuICAgIC8vIEEgd2F5IHRvIHN0b3AgY2xlYXJpbmcgdGhlIGlucHV0IHZhbHVlXG4gICAgLy9pZiAoIGFjdGl2ZUVsLnRhZ05hbWUgPT0gJ0lOUFVUJyAmJiBhY3RpdmVFbC52YWx1ZSAhPSAnJyApIHtcbiAgICAgIC8vZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIC8vfVxuICAgIHJldHVybiBjbG9zZSgpXG4gIH1cblxuICBpZiAoIGFjdGl2ZU1vZGFsKCkubW9kYWwgJiYgRXZlbnQua2V5LmlzUHJlc3NlZChcInRhYlwiKSApIHtcbiAgICBmb2N1c05leHQoIGV2ZW50IClcbiAgfVxuXG4gIC8vIFxuICBpZiAoIGFjdGl2ZU1vZGFsKCkucGFuZWwgfHwgYWN0aXZlTW9kYWwoKS5tZW51ICkge1xuICAgIHZhciBsaW5rXG5cbiAgICBpZiAoIEV2ZW50LmtleS5pc1ByZXNzZWQoXCJkb3duXCIpICkge1xuICAgICAgLy8gUHJldmVudCBwYWdlIHNjcm9sbGluZyBhcyBhIHJlc3VsdCBvZiBrZXlwcmVzc1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgbGluayA9IGdldE5leHRMaW5rKClcbiAgICB9XG5cbiAgICBpZiAoIEV2ZW50LmtleS5pc1ByZXNzZWQoXCJ1cFwiKSApIHtcbiAgICAgIC8vIFByZXZlbnQgcGFnZSBzY3JvbGxpbmcgYXMgYSByZXN1bHQgb2Yga2V5cHJlc3NcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGxpbmsgPSBnZXRQcmV2aW91c0xpbmsoKVxuICAgIH1cblxuICAgIC8vIE9ubHkgZm9jdXMgaWYgdGhlcmUgaXMgYSBuZXh0IG9yIHByZXZpb3VzIGxpbmsgdG8gbW92ZSB0b1xuICAgIC8vIEF0IHRvcCBvciBib3R0b20gb2YgYSBsaXN0IHRoZXJlIGlzIG5vIFwibmV4dFwiIG9yIFwicHJldmlvdXNcIlxuICAgIGlmICggbGluayApIGxpbmsuZm9jdXMoKVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gZm9jdXNOZXh0KCBldmVudCApIHtcbiAgdmFyIG1vZGFsRWwgICAgID0gYWN0aXZlTW9kYWwoKS5lbCxcbiAgICAgIGZvY3VzYWJsZSAgID0gbW9kYWxFbC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dDpub3QoW3R5cGU9aGlkZGVuXSksIHRleHRhcmVhLCBzZWxlY3QsIGJ1dHRvbicpLFxuICAgICAgZmlyc3QgICAgICAgPSBmb2N1c2FibGVbMF0sXG4gICAgICBsYXN0ICAgICAgICA9IGZvY3VzYWJsZVtmb2N1c2FibGUubGVuZ3RoIC0gMV0sXG4gICAgICBmb2N1c2VkICAgICA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcblxuICAvLyBJZiBmb2N1c2VkIG9uIHRoZSBsYXN0IGZvY3VzYWJsZSBlbGVtZW50LCB0YWIgdG8gdGhlIGZpcnN0IGVsZW1lbnQuXG4gIGlmICggZm9jdXNlZCA9PSBsYXN0ICYmICFFdmVudC5rZXkuc2hpZnQgKSB7XG4gICAgaWYgKCBldmVudCApeyBldmVudC5wcmV2ZW50RGVmYXVsdCgpIH1cbiAgICBmaXJzdC5mb2N1cygpXG4gIH1cblxuICBpZiAoIGZvY3VzZWQgPT0gZmlyc3QgJiYgRXZlbnQua2V5LnNoaWZ0ICkge1xuICAgIGlmICggZXZlbnQgKXsgZXZlbnQucHJldmVudERlZmF1bHQoKSB9XG4gICAgbGFzdC5mb2N1cygpXG4gIH1cblxuICAvLyBGb2N1cyBvbiB0aGUgZmlyc3QgZWxlbWVudCBpZiB0aGUgZm9jdXNlZCBlbGVtZW50IGlzIG5vdCBhIGNoaWxkIG9mIHRoZSBtb2RhbFxuICBpZiAoICFmb2N1c2VkIHx8ICF0b29sYm94LmNoaWxkT2YoIGZvY3VzZWQsIG1vZGFsRWwgKSApIHtcbiAgICBmaXJzdC5mb2N1cygpXG4gIH1cbn1cblxuLy8gRmluZCB0aGUgbmV4dCBmb2N1c2FibGUgbGlua1xuZnVuY3Rpb24gZ2V0TmV4dExpbmsgKGVsKSB7XG4gIHZhciBpdGVtcyA9IGxpbmtzKClcbiAgdmFyIHBvcyA9IGFjdGl2ZVBvc2l0aW9uKClcblxuICAvLyBObyBhY3RpdmUgZWxlbWVudDogcmV0dXJuIGZpcnN0IGVsZW1lbnRcbiAgaWYgKCBwb3MgPT0gLTEgKSByZXR1cm4gaXRlbXNbIDAgXVxuXG4gIC8vIExhc3QgZWxlbWVudCBmb2N1c2VkLCByZXR1cm4gbm90aGluZyAobm8gbmV4dCBlbGVtZW50KVxuICBlbHNlIGlmICggcG9zID09IGl0ZW1zLmxlbmd0aCApIHJldHVyblxuXG4gIC8vIHJldHVybiBuZXh0IGZvY3VzYWJsZSBsaW5rXG4gIGVsc2UgcmV0dXJuIGl0ZW1zWyBwb3MgKyAxIF1cbn1cblxuLy8gRmluZCB0aGUgcHJldmlvdXMgZm9jdXNhYmxlIGxpbmtcbmZ1bmN0aW9uIGdldFByZXZpb3VzTGluayAoZWwpIHtcbiAgdmFyIGl0ZW1zID0gbGlua3MoKVxuICB2YXIgcG9zID0gYWN0aXZlUG9zaXRpb24oKVxuXG4gIC8vIE5vIHByZXZpb3VzIGVsZW1lbnQgdG8gc2VsZWN0XG4gIGlmICggcG9zID09IC0xIHx8IHBvcyA9PSAwICkgcmV0dXJuXG5cbiAgLy8gcmV0dXJuIHByZXZpb3VzIGZvY3VzYWJsZSBsaW5rXG4gIGVsc2UgcmV0dXJuIGl0ZW1zWyBwb3MgLSAxIF1cbn1cblxuLy8gU2VhcmNoIGxpbmtzIGluIHRoZSBjdXJyZW50IG1vZGFsIGZvciBhbiBhY3RpdmUgKGZvY3VzZWQpIGVsZW1lbnRcbmZ1bmN0aW9uIGFjdGl2ZVBvc2l0aW9uICgpIHtcbiAgcmV0dXJuIGxpbmtzKCkuaW5kZXhPZiggZG9jdW1lbnQuYWN0aXZlRWxlbWVudCApXG59XG5cbi8vIFJldHVybiBhbGwgbGlua3MgaW4gY3VycmVudCBtb2RhbFxuZnVuY3Rpb24gbGlua3MgKCkge1xuICByZXR1cm4gdG9vbGJveC5zbGljZSggYWN0aXZlTW9kYWwoKS5lbC5xdWVyeVNlbGVjdG9yQWxsKCAnYScgKSApLmZpbHRlciggZnVuY3Rpb24oIGEgKSB7XG4gICAgcmV0dXJuICF0b29sYm94LmdldENsb3Nlc3QoIGEsICdbYXJpYS1oaWRkZW49XCJ0cnVlXCJdJyApXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHNldHVwICgpIHtcbiAgRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICBpbml0KClcblxuICAgIC8vIENoZWNrIGFsbCBib2R5IGNsaWNrcyB0byBzZWUgaWYgdGhleSBzaG91bGQgYmUgcGVybWl0dGVkXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnYm9keS5tb2RhbC1hY3RpdmUnLCBhY3RpdmVDbGljaywgeyB1c2VDYXB0dXJlOiB0cnVlIH0pIFxuXG4gICAgLy8gVHJpZ2dlciBtb2RhbHMgb24gaW5wdXQgZXZlbnRzIChsaWtlIGEgc2VhcmNoIHJlc3VsdHMgcGFuZWwgdGhhdCB3YWl0cyB1bnRpbCB0eXBpbmcgdG8gc2hvdylcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdpbnB1dCcsICdpbnB1dFtkYXRhLWZvci1tb2RhbF0sIFtkYXRhLWZvci1tb2RhbF0gaW5wdXQnLCBFdmVudC5kZWJvdW5jZSggdHJpZ2dlckV2ZW50LCA1MCwgeyBsZWFkaW5nOiB0cnVlIH0pIClcbiAgICBcbiAgICAvLyBUcmlnZ2VyIG1vZGFscyBvbiBrZXl1cCBldmVudHMgaW4gaW5wdXRzIChsaWtlIGEgc2VhcmNoIHJlc3VsdHMgcGFuZWwgdGhhdCB3YWl0cyB1bnRpbCB0eXBpbmcgdG8gc2hvdylcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljayBmb2N1c2luJywgJ2lucHV0W2RhdGEtZm9yLW1vZGFsXSwgW2RhdGEtZm9yLW1vZGFsXSBpbnB1dCcsIHRyaWdnZXJFdmVudCApXG5cbiAgICAvLyBUcmlnZ2VyIG1vZGFscyBvbiBjbGljayBldmVudHMgZm9yIGFuY2hvcnMgYW5kIGJ1dHRvbnNcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdhW2RhdGEtZm9yLW1vZGFsXSwgYnV0dG9uW2RhdGEtZm9yLW1vZGFsXSwgW2RhdGEtZm9yLW1vZGFsXSBhLCBbZGF0YS1mb3ItbW9kYWxdIGJ1dHRvbicsIHRyaWdnZXJFdmVudCApXG5cbiAgICBFdmVudC5rZXlPbiggJ2VzYycsIGNsb3NlIClcbiAgfSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIG5ldzogTW9kYWwubmV3LFxuICBzZXR1cDogc2V0dXAsXG4gIG1vZGFsczogTW9kYWxzLFxuICBpbml0OiBpbml0LFxuICBnZXQ6IGdldE1vZGFsLFxuICBhY3RpdmU6IGFjdGl2ZU1vZGFsLFxuICBvbjogb24sXG4gIGlzRWxlbWVudDogaXNFbGVtZW50XG59XG4iLCJ2YXIgdG9vbGJveCAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ICAgID0gdG9vbGJveC5ldmVudCxcbiAgICBtb2RhbCAgICA9IHJlcXVpcmUoICcuL19tb2RhbCcgKSxcbiAgICBzdGFjayAgICA9IHJlcXVpcmUoICcuL19zdGFjaycgKVxuXG4vLyBGb2N1cyBvbiBzZWFyY2ggd2hlbiBgL2Aga2V5IGlzIHByZXNzZWRcbkV2ZW50LmtleU9uKCAnLycsIGZ1bmN0aW9uKGV2ZW50KXsgXG4gIHZhciBxID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9cV0nKVxuICBpZiAoIHEgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIHEuZm9jdXMoKVxuICB9XG59KVxuXG4vLyBSZXNldCBzZWFyY2ggcmVzdWx0cyBwYW5lbCB3aGVuIHF1ZXJ5IGlzIGNsZWFyZWRcbkV2ZW50LnJlYWR5KCBmdW5jdGlvbigpIHtcbiAgdmFyIHNlYXJjaFN0YWNrID0gc3RhY2suZ2V0KCAnI3NlYXJjaC1zdGFjaycgKVxuICB2YXIgcSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPXFdJylcbiAgdmFyIHNlYXJjaE1vZGFsID0gbW9kYWwuZ2V0KCAnI3NlYXJjaC1yZXN1bHRzJyApXG5cbiAgaWYgKCAhc2VhcmNoTW9kYWwgfHwgIXEgKSByZXR1cm5cblxuICBmdW5jdGlvbiBrZXlXYXRjaGVyICggZXZlbnQgKSB7XG4gICAgdmFyIGZvY3VzRWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG5cbiAgICAvLyBJZiBhIGxldHRlciwgbnVtYmVyLCBvciBiYWNrc3BhY2UgaXMgcHJlc3NlZCBmb2N1cyBvbiBzZWFyY2ggaW5wdXRcbiAgICBpZiAoIGZvY3VzRWwgIT0gcSAmJiBldmVudC5rZXkubGVuZ3RoID09PSAxIHx8IEV2ZW50LmtleS5pc1ByZXNzZWQoXCJiYWNrc3BhY2VcIikgKSB7XG4gICAgICBxLmZvY3VzKClcblxuICAgIC8vIFJlc3RvcmUgZGVmYXVsdCBzZWFyY2ggaW5wdXQgYmVoYXZpb3JcbiAgICAvLyBXaGVuIGZvdWNzZWQsIGVzYyBjbGVhcnMgaW5wdXRcbiAgICB9IGVsc2UgaWYgKCBmb2N1c0VsID09IHEgJiYgRXZlbnQua2V5LmlzUHJlc3NlZCggXCJlc2NcIiApICkge1xuICAgICAgcS52YWx1ZSA9ICcnXG4gICAgfVxuICB9XG5cbiAgLy8gU2Nyb2xsIGFsbCBuYXZzIGJhY2sgdG8gdG9wXG4gIGZ1bmN0aW9uIHJlc2V0U2Nyb2xsICgpIHtcbiAgICB0b29sYm94LmVhY2goIHNlYXJjaFN0YWNrLnJvb3QucXVlcnlTZWxlY3RvckFsbCggJ25hdicgKSwgZnVuY3Rpb24gKG5hdikge1xuICAgICAgbmF2LnNjcm9sbFRvcCA9IDBcbiAgICB9KVxuICB9XG5cbiAgc2VhcmNoTW9kYWwub24oICdvcGVuJywgZnVuY3Rpb24oKSB7XG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAna2V5ZG93bicsIGtleVdhdGNoZXIgKVxuICB9KVxuXG4gIC8vIFJlc2V0IHN0YWNrIHdoZW4gbW9kYWwgaXMgY2xvc2VkIGFuZCBxdWVyeSBpcyBjbGVhclxuICBzZWFyY2hNb2RhbC5vbiggJ2Nsb3NlJywgZnVuY3Rpb24oKSB7XG4gICAgLy8gUmVzdG9yZSBzdGF0ZSBvZiBzZWFyY2ggcGFuZWxcbiAgICBpZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICdpbnB1dFtuYW1lPXFdJyApLnZhbHVlID09ICcnICkge1xuICAgICAgc2VhcmNoU3RhY2sucmVzZXQoKVxuICAgICAgcmVzZXRTY3JvbGwoKVxuICAgIH1cblxuICAgIEV2ZW50Lm9mZiggZG9jdW1lbnQsICdrZXlkb3duJywga2V5V2F0Y2hlciApXG4gIH0pXG5cbiAgLy8gU2hvdyBmaXJzdCBwYW5lbCBzdGFjayB3aGVuIHF1ZXJ5IGlzIGNsZWFyZWRcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnaW5wdXQnLCAnW25hbWU9cV0nLCBFdmVudC5kZWJvdW5jZSggZnVuY3Rpb24gKCBldmVudCApIHtcbiAgICBpZiAoIGV2ZW50LmN1cnJlbnRUYXJnZXQudmFsdWUgPT0gJycgKSB7XG4gICAgICBzZWFyY2hTdGFjay5zaG93KCAwIClcbiAgICAgIHJlc2V0U2Nyb2xsKClcbiAgICB9XG4gIH0sIDUwICkpXG5cbiAgLy8gV2lyZSB1cCBjbGVhciBzZWFyY2ggaW5wdXQgYmVoYXZpb3JcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnLmNsZWFyLXNlYXJjaCcsIGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICB2YXIgYnV0dG9uID0gZXZlbnQuY3VycmVudFRhcmdldFxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXG4gICAgdmFyIHNlYXJjaElucHV0ID0gdG9vbGJveC5nZXRDbG9zZXN0KCBidXR0b24sICdsYWJlbCcgKS5xdWVyeVNlbGVjdG9yKCAnLmlucHV0LWNvbnRhaW5lciBpbnB1dCcgKVxuICAgIHNlYXJjaElucHV0LnZhbHVlID0gJydcbiAgICBFdmVudC5maXJlKCBzZWFyY2hJbnB1dCwgJ2lucHV0JyApXG5cbiAgICBzZWFyY2hJbnB1dC5mb2N1cygpXG4gIH0sIHsgdXNlQ2FwdHVyZTogdHJ1ZSB9KVxufSlcbiIsInZhciB0b29sYm94ICAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgY29va2llICAgICAgPSByZXF1aXJlKCAnLi9fY29va2llJyApLFxuICAgIEV2ZW50ICAgICAgID0gdG9vbGJveC5ldmVudFxuXG5FdmVudC5yZWFkeSggZnVuY3Rpb24oKSB7XG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJy5zaWRlYmFyLW5hdi10b2dnbGUnLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCAnaGlkZS1zaWRlYmFyJyApXG5cbiAgICB2YXIgdmlzaWJsZSA9ICFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyggJ2hpZGUtc2lkZWJhcicgKVxuICAgIGNvb2tpZS51cGRhdGUoICdzaWRlYmFyLW5hdicsIHsgc2lkZWJhcjogdmlzaWJsZSB9IClcbiAgfSlcbiAgaWYgKCBjb29raWUuZ2V0KCAnc2lkZWJhci1uYXYnICkuc2lkZWJhciA9PT0gZmFsc2UgKSBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoICdoaWRlLXNpZGViYXInIClcbn0pXG4iLCJ2YXIgdG9vbGJveCAgICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICAgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIFN0YWNrcyAgICAgICA9IFtdXG5cbnZhciBTdGFjayA9IHtcbiAgbmV3OiBmdW5jdGlvbiggcm9vdCApIHtcblxuICAgIGlmICggIWlzRWxlbWVudCggcm9vdCApICkgcm9vdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIHJvb3QgKVxuXG4gICAgLy8gRG9uJ3QgYWRkIGEgbmV3IHN0YWNrIGlmIG5vIGVsZW1lbnQgZm91bmQgb3IgaWYgc3RhY2sgYWxyZWFkeSBleGlzdHNcbiAgICBpZiAoICFpc0VsZW1lbnQoIHJvb3QgKSB8fCByb290LmRhdGFzZXQuc3RhY2tJZCApIHJldHVyblxuXG4gICAgLy8gU2V0IHVwIHN0YWNrIGJ5IHNlYXJjaGluZyBET00gbm9kZSB1bmRlciBpdC5cbiAgICAvLyBUaGUgZmlyc3QgY2hpbGQgZm91bmQgd2lsbCBiZSBzZXQgdXAgYXMgYSBkZWZhdWx0XG4gICAgLy8gQWZ0ZXIgdGhhdCBlYWNoIGNoaWxkIHdpbGwgYmUgYWRkZWQgYXMgYSBzdGFjayBwdXNoXG5cbiAgICB2YXIgc3RhY2sgPSB7XG4gICAgICByb290OiByb290LFxuICAgICAgY3VycmVudDogMCxcbiAgICAgIHBhbmVsczogW10sXG4gICAgICBmb2N1czogW10sXG5cbiAgICAgIGFkZDogZnVuY3Rpb24gKCBwYW5lbEVsLCBuYW1lICkge1xuICAgICAgICBwYW5lbEVsLmRhdGFzZXQuc3RhY2tJbmRleCA9IHN0YWNrLnBhbmVscy5sZW5ndGhcblxuICAgICAgICAvLyBIaWRlIGFsbCBwYW5lbHMgYnV0IHRoZSBmaXJzdCBwYW5lbFxuICAgICAgICBpZiAoIHN0YWNrLnBhbmVscy5sZW5ndGggPT0gMCApIHsgXG4gICAgICAgICAgc2hvd0VsKCBwYW5lbEVsIClcbiAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgaGlkZUVsKCBwYW5lbEVsIClcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWNrLnBhbmVscy5wdXNoKCBwYW5lbEVsIClcbiAgICAgIH0sXG5cbiAgICAgIC8vIFJlc2V0IHN0YWNrIHRvIGZpcnN0IHBhbmVsXG4gICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIEFscmVhZHkgcmVzZXQ/IFdlJ3JlIGRvbmUuXG4gICAgICAgIGlmICggc3RhY2suY3VycmVudCA9PSAwICkgcmV0dXJuXG5cbiAgICAgICAgLy8gSWYgaGlkZGVuLCBtYW51YWxseSByZXNldCBhbGxcbiAgICAgICAgaWYgKCBzdGFjay5yb290Lm9mZnNldFBhcmVudCA9PSBudWxsICkge1xuICAgICAgICAgIHN0YWNrLmZvY3VzID0gW10gLy8gQ2xlYXIgZm9jdXMgc3RhY2tcblxuICAgICAgICAgIC8vIEhpZGUgYW5kIHJlc2V0IHNjcm9sbCBvbiBhbGwgcGFuZWxzXG4gICAgICAgICAgc3RhY2sucGFuZWxzLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgXG4gICAgICAgICAgICBlbC5zY3JvbGxUb3AgPSAwXG4gICAgICAgICAgICBoaWRlRWwoIGVsIClcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gU2hvdyBmaXJzdCBwYW5lbFxuICAgICAgICAgIHN0YWNrLmN1cnJlbnQgPSAwXG4gICAgICAgICAgc2hvd0VsKCBzdGFjay5wYW5lbHNbMF0gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm90IGhpZGRlbiwgZGlzbWlzcyBjdXJyZW50IHBhbmVsIGFuZCByZXNldCB0byBmaXJzdCBwYW5lbFxuICAgICAgICBlbHNlIHN0YWNrLnNob3coIDAgKVxuICAgICAgfSxcblxuICAgICAgLy8gU2hvdyBhIHNwZWNpZmljIHBhbmVsLCBoaWRpbmcgYWxsIG90aGVyc1xuICAgICAgc2hvdzogZnVuY3Rpb24gKCBuYW1lICkge1xuICAgICAgICB2YXIgcGFuZWwgPSBzdGFjay5maW5kUGFuZWwoIG5hbWUgKVxuXG4gICAgICAgIC8vIElmIGEgcGFuZWwgaXNuJ3QgdGhlIGN1cnJlbnQgcGFuZWxcbiAgICAgICAgLy8gZGlzbWlzcyBpdCBiZWZvcmUgZ29pbmcgdG8gdGhlIHJlcXVlc3RlZCBwYW5lbFxuICAgICAgICBpZiAoIHBhbmVsICYmIHBhbmVsICE9IHN0YWNrLmN1cnJlbnRQYW5lbCgpICkge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIERpc21pc3MgdGhlIGN1cnJlbnQgcGFuZWwgYW5kIHdpdGggdGhlIGNhbGxiYWNrIGxvYWQgaW4gdGhlIG5leHQgcGFuZWxcbiAgICAgICAgICByZXR1cm4gc3RhY2suZGlzbWlzcyggc3RhY2suZGlyZWN0aW9uKCBwYW5lbCApLCBmdW5jdGlvbigpIHsgXG4gICAgICAgICAgICBzdGFjay5lbnRlciggcGFuZWwgKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZW50ZXI6IGZ1bmN0aW9uICggZWwgKSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBzdGFjay5kaXJlY3Rpb24oIGVsIClcbiAgICAgICAgZWwuZGF0YXNldC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cbiAgICAgICAgc3RhY2suY3VycmVudCA9IE51bWJlciggZWwuZGF0YXNldC5zdGFja0luZGV4IClcblxuICAgICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsLmRhdGFzZXQuZGlyZWN0aW9uID0gJydcbiAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnZW50ZXInIClcbiAgICAgICAgfSwgNTAgKVxuXG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdlbnRlcicgKVxuICAgICAgICBzaG93RWwoIGVsIClcblxuICAgICAgICBpZiAoIGRpcmVjdGlvbiA9PSAnZm9yd2FyZCcgKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGZvY3VzZWQgZWxlbWVudCB3YXMgaW4gdGhlIHN0YWNrXG4gICAgICAgICAgLy9pZiAoIHRvb2xib3guY2hpbGRPZiggc3RhY2subGFzdEZvY3VzKCksIHN0YWNrLnJvb3QgKSApIHtcblxuICAgICAgICAgICAgLy8gZm9jdXMgb24gdGhlIGZpcnN0IGlucHV0XG4gICAgICAgICAgICAvL3ZhciBmaXJzdEl0ZW0gPSBlbC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQ6bm90KFtoaWRkZW5dKSwgdGV4dGFyZWEsIHNlbGVjdCwgYVt0YWJpbmRleF0nIClcbiAgICAgICAgICAgIC8vaWYgKCBmaXJzdEl0ZW0gKSBmaXJzdEl0ZW0uZm9jdXMoKVxuICAgICAgICAgIFxuICAgICAgICAgIC8vfVxuXG4gICAgICAgIC8vIEZvY3VzIG9uIHRoZSBwcmV2aW91cyBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgfSBlbHNlIGlmICggZGlyZWN0aW9uID09ICdyZXZlcnNlJyAmJiBzdGFjay5mb2N1cy5sZW5ndGggPiAwICkge1xuICAgICAgICAgIHN0YWNrLmZvY3VzLnBvcCgpLmZvY3VzKClcbiAgICAgICAgfSAgICAgIFxuICAgICAgfSxcblxuICAgICAgZGlzbWlzczogZnVuY3Rpb24gKCBkaXJlY3Rpb24sIGNhbGxiYWNrICkge1xuXG4gICAgICAgIHZhciBlbCA9IHN0YWNrLmN1cnJlbnRQYW5lbCgpXG5cbiAgICAgICAgaWYgKCBkaXJlY3Rpb24gPT0gJ2ZvcndhcmQnIClcbiAgICAgICAgICBzdGFjay5mb2N1cy5wdXNoKCBkb2N1bWVudC5hY3RpdmVFbGVtZW50IClcblxuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnZW50ZXInIClcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2V4aXQnIClcbiAgICAgICAgZWwuZGF0YXNldC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cblxuICAgICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEVuc3VyZSBwYW5lbCBpcyBzY3JvbGxlZCB0byB0b3BcbiAgICAgICAgICBpZiAoIGRpcmVjdGlvbiA9PSAncmV2ZXJzZScgKSBlbC5zY3JvbGxUb3AgPSAwXG5cbiAgICAgICAgICBoaWRlRWwoIGVsIClcbiAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnZXhpdCcgKVxuICAgICAgICAgIGVsLmRhdGFzZXQuZGlyZWN0aW9uID0gJydcblxuICAgICAgICAgIGlmICggdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nICkgY2FsbGJhY2soKVxuXG4gICAgICAgIH0sIDUwIClcblxuICAgICAgfSxcblxuICAgICAgbGFzdEZvY3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLmZvY3VzWyBzdGFjay5mb2N1cy5sZW5ndGggLTEgXSBcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZpbmQgYSBwYW5lbCBieSBuYW1lIG9yIGluZGV4XG4gICAgICBmaW5kUGFuZWw6IGZ1bmN0aW9uICggbmFtZSApIHtcbiAgICAgICAgaWYgKCBpc0VsZW1lbnQoIG5hbWUgKSApIFxuICAgICAgICAgIHJldHVybiBuYW1lIFxuICAgICAgICBlbHNlIFxuICAgICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1zdGFjaz1cIicrbmFtZSsnXCJdLCBbZGF0YS1zdGFjay1pbmRleD1cIicrbmFtZSsnXCJdJyApXG4gICAgICB9LFxuXG4gICAgICAvLyBXYWxrIGJhY2t3YXJkcyBpbiB0aGUgc3RhY2ssIHNob3dpbmcgdGhlIHBhbmVsIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IHBhbmVsXG4gICAgICBiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0YWNrLnNob3coIHN0YWNrLnBhbmVsc1sgc3RhY2suY3VycmVudCAtIDEgXSApXG4gICAgICB9LFxuXG4gICAgICAvLyBhZGQgYXJpYS1oaWRkZW49ZmFsc2UgdG8gdGhlIGZpcnN0IGhpZGRlbiBlbGVtZW50XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0YWNrLnNob3coIHN0YWNrLnBhbmVsc1sgc3RhY2suY3VycmVudCArIDEgXSApXG4gICAgICB9LFxuXG4gICAgICBkaXJlY3Rpb246IGZ1bmN0aW9uKCBwYW5lbCApIHtcbiAgICAgICAgdmFyIGluZGV4ID0gc3RhY2sucGFuZWxJbmRleCggcGFuZWwgKVxuXG4gICAgICAgIGlmICggaW5kZXggPT0gc3RhY2suY3VycmVudCApIHJldHVybiAnbm9uZSdcbiAgICAgICAgZWxzZSByZXR1cm4gKCBzdGFjay5jdXJyZW50IDwgaW5kZXggKSA/ICdmb3J3YXJkJyA6ICdyZXZlcnNlJ1xuICAgICAgIFxuICAgICAgfSxcblxuICAgICAgY3VycmVudFBhbmVsOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG4gICAgICAgIGlmICggbmFtZSApIHtcbiAgICAgICAgICByZXR1cm4gc3RhY2sucGFuZWxzWyBzdGFjay5jdXJyZW50IF0gPT0gc3RhY2suZmluZFBhbmVsKCBuYW1lIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhY2sucGFuZWxzWyBzdGFjay5jdXJyZW50IF1cbiAgICAgIH0sXG5cbiAgICAgIHBhbmVsSW5kZXg6IGZ1bmN0aW9uICggcGFuZWwgKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIoIHBhbmVsLmRhdGFzZXQuc3RhY2tJbmRleCApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgcXVlcnlhYmxlIHN0YWNrIGlkXG4gICAgcm9vdC5kYXRhc2V0LnN0YWNrSWQgPSBTdGFja3MubGVuZ3RoXG5cbiAgICBTdGFja3MucHVzaCggc3RhY2sgKVxuICAgIHRvb2xib3guZWFjaCggcm9vdC5jaGlsZHJlbiwgc3RhY2suYWRkIClcblxuICAgIHJldHVybiBzdGFja1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dFbCAoIGVsICkge1xuICBlbC5zZXRBdHRyaWJ1dGUoICdhcmlhLWhpZGRlbicsIGZhbHNlIClcbn1cblxuZnVuY3Rpb24gaGlkZUVsICggZWwgKSB7XG4gIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgdHJ1ZSApXG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCAoIGl0ZW0gKSB7XG4gIHJldHVybiBpdGVtLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkuc2VhcmNoKC9IVE1MLitFbGVtZW50LykgPiAtMVxufVxuXG5mdW5jdGlvbiBuYXZDbGljayAoIGV2ZW50ICkge1xuICB2YXIgZWwgPSBldmVudC5jdXJyZW50VGFyZ2V0XG4gIHZhciBwYW5lbCA9IGVsLmRhdGFzZXQuc3RhY2tOYXZcbiAgdmFyIHN0YWNrID0gZ2V0U3RhY2soIHRvb2xib3guZ2V0Q2xvc2VzdCggZWwsICdbZGF0YS1zdGFjaz1cInJvb3RcIl0nICkgKVxuICBpZiAoICFzdGFjayApIHJldHVyblxuXG4gIGlmICggcGFuZWwgPT0gJ25leHQnICkgc3RhY2submV4dCgpXG4gIGVsc2UgaWYgKCBwYW5lbCA9PSAnYmFjaycgKSBzdGFjay5iYWNrKClcbiAgZWxzZSBpZiAoIHN0YWNrLmZpbmRQYW5lbCggcGFuZWwgKSApIHN0YWNrLnNob3coIHBhbmVsIClcbiAgZWxzZSByZXR1cm5cblxuICAvL2V2ZW50LnByZXZlbnREZWZhdWx0KClcbn1cblxuZnVuY3Rpb24gcHJldlBhbmVsICggZXZlbnQgKSB7XG4gIHZhciBzdGFjayA9IGdldFN0YWNrKCB0b29sYm94LmdldENsb3Nlc3QoIGV2ZW50LnRhcmdldCwgJ1tkYXRhLXN0YWNrPVwicm9vdFwiXScgKSApXG4gIHN0YWNrLmJhY2soKVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG5cbmZ1bmN0aW9uIHNldHVwICgpIHtcbiAgRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICB0b29sYm94LmVhY2goIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1zdGFjaz1cInJvb3RcIl0nKSwgU3RhY2submV3IClcbiAgfSlcblxuICAvLyBMb2NhbGlzZSBjbGlja3MgdG8gYSBzdGFjayByb290XG4gIC8vIEZ1dHVyZTogY29uc2lkZXIgZXhwYW5kaW5nIHRoaXMgdG8gYWxsb3cgY29udHJvbHMgdG8gbGl2ZSBhbnl3aGVyZSBhbmQgcG9pbnQgdG8gYSBzdGFja1xuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1zdGFjaz1cInJvb3RcIl0gW2RhdGEtc3RhY2stbmF2XScsIG5hdkNsaWNrIClcbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2sgKCBzZWFyY2ggKSB7XG5cbiAgaWYgKCBpc0VsZW1lbnQoIHNlYXJjaCApICkge1xuICAgIGlmICggc2VhcmNoLmRhdGFzZXQuc3RhY2tJZCApIHJldHVybiBTdGFja3NbIHNlYXJjaC5kYXRhc2V0LnN0YWNrSWQgXVxuICB9XG5cbiAgaWYgKCB0eXBlb2Ygc2VhcmNoID09PSAnc3RyaW5nJyApIHtcblxuICAgIC8vIFdlbGwsIGxldCdzIGhvcGUgaXQncyBhIERPTSBzZWxlY3RvclxuICAgIHZhciBzdGFjayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIHNlYXJjaCApXG5cbiAgICAvLyBJZiBpdCBpcyB3b28gaG9vXG4gICAgaWYgKCBzdGFjayAmJiBzdGFjay5kYXRhc2V0LnN0YWNrSWQgKSB7XG4gICAgICByZXR1cm4gU3RhY2tzWyBzdGFjay5kYXRhc2V0LnN0YWNrSWQgXVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmV3OiBTdGFjay5uZXcsXG4gIHNldHVwOiBzZXR1cCxcbiAgZ2V0OiBnZXRTdGFjayxcbiAgc3RhY2tzOiBTdGFja3Ncbn1cbiIsIi8vIFB1cnBvc2U6IFRvZ2dsZXMgZXhwYW5zaW9uIG9mIHRyZWUgbmF2IGFuZCBzdG9yZXMgY29va2llcyB0byByZXRhaW4gc3RhdGVcbi8vXG4vLyBVc2FnZTpcbi8vIC0gVHJlZXMgbXVzdCBoYXZlIGEgW2RhdGEtdHJlZT0ndHJlZS1rZXknXVxuLy8gLSBOb2RlcyBhcmUgbmFtZWQgYnkgW2RhdGEtbm9kZT0nbm9kZS1uYW1lJ11cbi8vXG4vLyBDb29raWVzIGFyZSBzdG9yZWQgYXMgdHJlZS1rZXkgPT4geyBub2RlLW5hbWU6IHRydWUgfVxuLy8gbm9kZSBib29sZWFuIG1hdGNoZXMgYXJpYS1leHBhbmRlZCBzdGF0ZVxuLy9cblxudmFyIHRvb2xib3ggICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBjb29raWUgICAgICA9IHJlcXVpcmUoICcuL19jb29raWUnICksXG4gICAgRXZlbnQgICAgICAgPSB0b29sYm94LmV2ZW50XG5cbmZ1bmN0aW9uIHNldENvb2tpZSAoIG5vZGUgKSB7XG4gIGlmICggbm9kZS5kYXRhc2V0Lm5vZGUgKSB7XG4gICAgdmFyIHRyZWUgPSB0b29sYm94LmdldENsb3Nlc3QoIG5vZGUsICdbZGF0YS10cmVlXScgKVxuICAgIGlmICggdHJlZSApIHtcbiAgICAgIGRhdGEgPSB7fVxuICAgICAgZGF0YVsgbm9kZS5kYXRhc2V0Lm5vZGUgXSA9IG5vZGUuZ2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcgKSA9PSAndHJ1ZSdcbiAgICAgIGNvb2tpZS51cGRhdGUoIHRyZWUuZGF0YXNldC50cmVlLCBkYXRhIClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xpY2sgKCBldmVudCApIHtcbiAgdmFyIHRhcmdldCAgID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgIHBhcmVudCAgID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQsXG4gICAgICBleHBhbmRlZCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoICdhcmlhLWV4cGFuZGVkJyApXG5cbiAgLy8gQWRkIGEgY2xhc3NuYW1lIHRvIGluZGljYXRlIHRoYXQgaXQgd2FzIG1hbnVhbGx5IHRyaWdnZXJlZFxuICAvLyBUaGlzIGFsbG93cyBmb3IgYW5pbWF0aW5nIGludGVyYWN0aW9ucywgYnV0IG5vdCBvdGhlciBhdHRyaWJ1dGUgY2hhbmdlc1xuICBwYXJlbnQuY2xhc3NMaXN0LmFkZCggJ3RyaWdnZXJlZCcgKVxuICBwYXJlbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcsIGV4cGFuZGVkICE9ICd0cnVlJyApXG5cbiAgc2V0Q29va2llKCBwYXJlbnQgKVxufVxuXG4vLyBTZXRzIHRyZWUgbmF2IHN0YXRlIGJhc2VkIG9mZiBvZiBjb29raWVzXG5mdW5jdGlvbiByZXN0b3JlTmF2ICgpIHtcbiAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtdHJlZV0nICksIGZ1bmN0aW9uKCB0cmVlICkge1xuICAgIHZhciBrZXkgPSB0cmVlLmRhdGFzZXQudHJlZVxuICAgIGlmICgga2V5ICkge1xuICAgICAgdmFyIGRhdGEgPSBjb29raWUuZ2V0KCBrZXkgKVxuXG4gICAgICBPYmplY3Qua2V5cyggZGF0YSApLmZvckVhY2goIGZ1bmN0aW9uKCBub2RlICkge1xuICAgICAgICB2YXIgbm9kZUVsID0gdHJlZS5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtbm9kZT0nK25vZGUrJ10nIClcbiAgICAgICAgLy8gVXNlIGNvb2tpZXMgdG8gZXhwYW5kLlxuICAgICAgICBpZiAoIG5vZGVFbCAmJiBkYXRhW25vZGVdID09ICd0cnVlJyApIG5vZGVFbC5zZXRBdHRyaWJ1dGUoICdhcmlhLWV4cGFuZGVkJywgZGF0YVtub2RlXSApXG4gICAgICB9KVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIEV2ZW50LnJlYWR5KCBmdW5jdGlvbigpIHtcblxuICAgIC8vIFRoZSBmaXJzdCBjaGlsZCBvZiBhIG5vZGUgaXMgdGhlIHRyaWdnZXJcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbYXJpYS1leHBhbmRlZF0gPiAqOmZpcnN0LWNoaWxkJywgY2xpY2sgKVxuXG4gICAgLy8gU2V0IHN0YXRlcyBhY2NvcmRpbmcgdG8gY29va2llc1xuICAgIC8vcmVzdG9yZU5hdigpXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXR1cDogc2V0dXBcbn1cbiIsIi8qKlxuICogQWRkIGRhdGFzZXQgc3VwcG9ydCB0byBlbGVtZW50c1xuICogTm8gZ2xvYmFscywgbm8gb3ZlcnJpZGluZyBwcm90b3R5cGUgd2l0aCBub24tc3RhbmRhcmQgbWV0aG9kcywgXG4gKiAgIGhhbmRsZXMgQ2FtZWxDYXNlIHByb3Blcmx5LCBhdHRlbXB0cyB0byB1c2Ugc3RhbmRhcmQgXG4gKiAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpIChhbmQgRnVuY3Rpb24gYmluZCgpKSBtZXRob2RzLCBcbiAqICAgZmFsbHMgYmFjayB0byBuYXRpdmUgaW1wbGVtZW50YXRpb24gd2hlbiBleGlzdGluZ1xuICogSW5zcGlyZWQgYnkgaHR0cDovL2NvZGUuZWxpZ3JleS5jb20vaHRtbDUvZGF0YXNldC8gXG4gKiAgICh2aWEgaHR0cHM6Ly9naXRodWIuY29tL2FkYWxnaXNvL2h0bWw1LWRhdGFzZXQvYmxvYi9tYXN0ZXIvaHRtbDUtZGF0YXNldC5qcyApXG4gKiBEZXBlbmRzIG9uIEZ1bmN0aW9uLmJpbmQgYW5kIE9iamVjdC5kZWZpbmVQcm9wZXJ0eS9PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIChzaGltcyBiZWxvdylcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBYMTEvTUlUIExpY2Vuc2VcbiovXG5cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCNDb21wYXRpYmlsaXR5XG5pZiAoIUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSB7XG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAob1RoaXMpIHtcbiAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8gY2xvc2VzdCB0aGluZyBwb3NzaWJsZSB0byB0aGUgRUNNQVNjcmlwdCA1IGludGVybmFsIElzQ2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAtIHdoYXQgaXMgdHJ5aW5nIHRvIGJlIGJvdW5kIGlzIG5vdCBjYWxsYWJsZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXG4gICAgICAgICAgICBmVG9CaW5kID0gdGhpcyxcbiAgICAgICAgICAgIEZOT1AgPSBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICAgIGZCb3VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZlRvQmluZC5hcHBseShcbiAgICAgICAgICAgICAgICAgICAgdGhpcyBpbnN0YW5jZW9mIEZOT1AgJiYgb1RoaXMgPyB0aGlzIDogb1RoaXMsXG4gICAgICAgICAgICAgICAgICAgYUFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICBGTk9QLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuICAgICAgICBmQm91bmQucHJvdG90eXBlID0gbmV3IEZOT1AoKTtcblxuICAgICAgICByZXR1cm4gZkJvdW5kO1xuICAgIH07XG59XG5cbi8qXG4gKiBYY2Nlc3NvcnMgU3RhbmRhcmQ6IENyb3NzLWJyb3dzZXIgRUNNQVNjcmlwdCA1IGFjY2Vzc29yc1xuICogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL1hjY2Vzc29yc1xuICogXG4gKiAyMDEwLTA2LTIxXG4gKiBcbiAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cbiAqIFxuICogQSBzaGltIHRoYXQgcGFydGlhbGx5IGltcGxlbWVudHMgT2JqZWN0LmRlZmluZVByb3BlcnR5LFxuICogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciwgYW5kIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIGluIGJyb3dzZXJzIHRoYXQgaGF2ZVxuICogbGVnYWN5IF9fKGRlZmluZXxsb29rdXApW0dTXWV0dGVyX18gc3VwcG9ydC5cbiAqIFxuICogTGljZW5zZWQgdW5kZXIgdGhlIFgxMS9NSVQgTGljZW5zZVxuICogICBTZWUgTElDRU5TRS5tZFxuKi9cblxuLy8gUmVtb3ZlZCBhIGZldyBKU0xpbnQgb3B0aW9ucyBhcyBOb3RlcGFkKysgSlNMaW50IHZhbGlkYXRvciBjb21wbGFpbmluZyBhbmQgXG4vLyAgIG1hZGUgY29tcGx5IHdpdGggSlNMaW50OyBhbHNvIG1vdmVkICd1c2Ugc3RyaWN0JyBpbnNpZGUgZnVuY3Rpb25cbi8qanNsaW50IHdoaXRlOiB0cnVlLCB1bmRlZjogdHJ1ZSwgcGx1c3BsdXM6IHRydWUsXG4gIGJpdHdpc2U6IHRydWUsIHJlZ2V4cDogdHJ1ZSwgbmV3Y2FwOiB0cnVlLCBtYXhsZW46IDkwICovXG5cbi8qISBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9YY2Nlc3NvcnMvYmxvYi9tYXN0ZXIveGNjZXNzb3JzLXN0YW5kYXJkLmpzKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICBkZWZpbmVHZXR0ZXIgPSBPYmplY3RQcm90by5fX2RlZmluZUdldHRlcl9fLFxuICAgIGRlZmluZVNldHRlciA9IE9iamVjdFByb3RvLl9fZGVmaW5lU2V0dGVyX18sXG4gICAgbG9va3VwR2V0dGVyID0gT2JqZWN0UHJvdG8uX19sb29rdXBHZXR0ZXJfXyxcbiAgICBsb29rdXBTZXR0ZXIgPSBPYmplY3RQcm90by5fX2xvb2t1cFNldHRlcl9fLFxuICAgIGhhc093blByb3AgPSBPYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcbiAgICBcbiAgICBpZiAoZGVmaW5lR2V0dGVyICYmIGRlZmluZVNldHRlciAmJiBsb29rdXBHZXR0ZXIgJiYgbG9va3VwU2V0dGVyKSB7XG5cbiAgICAgICAgaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsgLy8gYWxsIGFyZ3VtZW50cyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnRzIG5vdCBvcHRpb25hbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcHJvcCArPSBcIlwiOyAvLyBjb252ZXJ0IHByb3AgdG8gc3RyaW5nXG5cbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcC5jYWxsKGRlc2NyaXB0b3IsIFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29rdXBHZXR0ZXIuY2FsbChvYmosIHByb3ApICYmICFsb29rdXBTZXR0ZXIuY2FsbChvYmosIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHByb3BlcnR5IGRlZmluZWQgYW5kIG5vIHByZS1leGlzdGluZyBhY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoKGhhc093blByb3AuY2FsbChkZXNjcmlwdG9yLCBcImdldFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGhhc093blByb3AuY2FsbChkZXNjcmlwdG9yLCBcInNldFwiKSkpIFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yIGhhcyBhIHZhbHVlIHByb3AgYnV0IGFjY2Vzc29yIGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgYW4gYWNjZXNzb3IgYW5kIGEgdmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjYW4ndCBzd2l0Y2ggb2ZmIHRoZXNlIGZlYXR1cmVzIGluIEVDTUFTY3JpcHQgM1xuICAgICAgICAgICAgICAgIC8vIHNvIHRocm93IGEgVHlwZUVycm9yIGlmIGFueSBhcmUgZmFsc2VcbiAgICAgICAgICAgICAgICBpZiAoIShkZXNjcmlwdG9yLndyaXRhYmxlICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZSAmJiBcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3Qgc3VwcG9ydFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGZhbHNlIGZvciBjb25maWd1cmFibGUsIGVudW1lcmFibGUsIG9yIHdyaXRhYmxlLlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmdldCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVHZXR0ZXIuY2FsbChvYmosIHByb3AsIGRlc2NyaXB0b3IuZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZVNldHRlci5jYWxsKG9iaiwgcHJvcCwgZGVzY3JpcHRvci5zZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgeyAvLyBhbGwgYXJndW1lbnRzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudHMgbm90IG9wdGlvbmFsLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcHJvcCArPSBcIlwiOyAvLyBjb252ZXJ0IHByb3AgdG8gc3RyaW5nXG5cbiAgICAgICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlICA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlICAgIDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0dGVyID0gbG9va3VwR2V0dGVyLmNhbGwob2JqLCBwcm9wKSxcbiAgICAgICAgICAgICAgICBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIuY2FsbChvYmosIHByb3ApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wLmNhbGwob2JqLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0IG9yIGlzIGluaGVyaXRlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFnZXR0ZXIgJiYgIXNldHRlcikgeyAvLyBub3QgYW4gYWNjZXNzb3Igc28gcmV0dXJuIHByb3BcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IG9ialtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gYWNjZXNzb3IsIHJlbW92ZSBkZXNjcmlwdG9yLndyaXRhYmxlO1xuICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGRlc2NyaXB0b3IuZ2V0IGFuZCBkZXNjcmlwdG9yLnNldCAoSUUncyBiZWhhdmlvcilcbiAgICAgICAgICAgICAgICBkZWxldGUgZGVzY3JpcHRvci53cml0YWJsZTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldCA9IGRlc2NyaXB0b3Iuc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChnZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXQgPSBnZXR0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5zZXQgPSBzZXR0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKG9iaiwgcHJvcHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcDtcbiAgICAgICAgICAgICAgICBmb3IgKHByb3AgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093blByb3AuY2FsbChwcm9wcywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHByb3BzW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG59KCkpO1xuXG4vLyBCZWdpbiBkYXRhc2V0IGNvZGVcblxuaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGF0YXNldCAmJiBcbiAgICAgICAgIC8vIEZGIGlzIGVtcHR5IHdoaWxlIElFIGdpdmVzIGVtcHR5IG9iamVjdFxuICAgICAgICAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsICdkYXRhc2V0JykgIHx8XG4gICAgICAgICFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQucHJvdG90eXBlLCAnZGF0YXNldCcpLmdldClcbiAgICApIHtcbiAgICB2YXIgcHJvcERlc2NyaXB0b3IgPSB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgdmFyIGksIFxuICAgICAgICAgICAgICAgIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIEhUTUw1X0RPTVN0cmluZ01hcCwgXG4gICAgICAgICAgICAgICAgYXR0clZhbCwgYXR0ck5hbWUsIHByb3BOYW1lLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIGF0dHNMZW5ndGggPSBhdHRyaWJ1dGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB0b1VwcGVyQ2FzZSA9IGZ1bmN0aW9uIChuMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjAuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24gKGF0dHJOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpID8gXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWUpIDogXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7IC8vIFNpbXVsYXRlIERPTVN0cmluZ01hcCB3L2FjY2Vzc29yIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAvLyBUZXN0IHNldHRpbmcgYWNjZXNzb3Igb24gbm9ybWFsIG9iamVjdFxuICAgICAgICAgICAgICAgICh7fSkuX19kZWZpbmVHZXR0ZXJfXygndGVzdCcsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXAgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlMSkgeyAvLyBVc2UgYSBET00gb2JqZWN0IGZvciBJRThcbiAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdHRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZpeDogVGhpcyB0ZXN0IHJlYWxseSBzaG91bGQgYWxsb3cgYW55IFhNTCBOYW1lIHdpdGhvdXQgXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBjb2xvbnMgKGFuZCBub24tdXBwZXJjYXNlIGZvciBYSFRNTClcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5uYW1lICYmIFxuICAgICAgICAgICAgICAgICAgICAoL15kYXRhLVxcd1tcXHdcXC1dKiQvKS50ZXN0KGF0dHJpYnV0ZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyVmFsID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHJpYnV0ZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgdG8gQ2FtZWxDYXNlXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lID0gYXR0ck5hbWUuc3Vic3RyKDUpLnJlcGxhY2UoLy0uL2csIHRvVXBwZXJDYXNlKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MNV9ET01TdHJpbmdNYXAsIHByb3BOYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdGhpcy5lbnVtZXJhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZ2V0dGVyLmJpbmQoYXR0clZhbCB8fCAnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBzZXR0ZXIuYmluZCh0aGF0LCBhdHRyTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlMikgeyAvLyBpZiBhY2Nlc3NvcnMgYXJlIG5vdCB3b3JraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXBbcHJvcE5hbWVdID0gYXR0clZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIVE1MNV9ET01TdHJpbmdNYXA7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZGIGVudW1lcmF0ZXMgb3ZlciBlbGVtZW50J3MgZGF0YXNldCwgYnV0IG5vdCBcbiAgICAgICAgLy8gICBFbGVtZW50LnByb3RvdHlwZS5kYXRhc2V0OyBJRTkgaXRlcmF0ZXMgb3ZlciBib3RoXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgJ2RhdGFzZXQnLCBwcm9wRGVzY3JpcHRvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwcm9wRGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7IC8vIElFOCBkb2VzIG5vdCBhbGxvdyBzZXR0aW5nIHRvIHRydWVcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCAnZGF0YXNldCcsIHByb3BEZXNjcmlwdG9yKTtcbiAgICB9XG59XG4iLCIvLyBSZXF1aXJlIG1vZHVsZXMsIGFkZCBjb2RlLCBldGNcbnJlcXVpcmUoICcuL3NoaW1zL19kYXRhc2V0JyApXG52YXIgZXN2ZyAgICAgPSByZXF1aXJlKCAnLi9fZXN2ZycgKVxudmFyIGljb25zICAgID0gcmVxdWlyZSggJy4vX2ljb25zJyApXG52YXIgdG9nZ2xlciAgPSByZXF1aXJlKCAnY29tcG9zZS10b2dnbGVyJyApXG52YXIgdG9vbGJveCAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApXG52YXIgbW9kYWwgICAgPSByZXF1aXJlKCAnLi9fbW9kYWwnIClcbnZhciBzdGFjayAgICA9IHJlcXVpcmUoICcuL19zdGFjaycgKVxudmFyIHNlYXJjaCAgID0gcmVxdWlyZSggJy4vX3NlYXJjaCcgKVxudmFyIHRyZWUgICAgID0gcmVxdWlyZSggJy4vX3RyZWUnIClcbnZhciBjb29raWUgICA9IHJlcXVpcmUoICcuL19jb29raWUnIClcblxucmVxdWlyZSggJy4vX3NpZGViYXInIClcblxubW9kYWwuc2V0dXAoKVxuc3RhY2suc2V0dXAoKVxudHJlZS5zZXR1cCgpXG5cbndpbmRvdy5zcGFyayA9IG1vZHVsZS5leHBvcnRzID0gdG9vbGJveC5tZXJnZSh7XG4gIGVzdmc6IGVzdmcsXG4gIHRvZ2dsZXI6IHRvZ2dsZXIsXG4gIG1vZGFsOiBtb2RhbCxcbiAgc3RhY2s6IHN0YWNrLFxuICBjb29raWU6IGNvb2tpZSxcbiAgYmVhbjogcmVxdWlyZSggJ2JlYW4nIClcbn0sIHRvb2xib3ggKVxuXG4vLyBTaW1wbGUgaWdub3JlIGNsaWNrIG9uIGFuY2hvciB0cmlnZ2Vyc1xudG9vbGJveC5ldmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbaHJlZj1cIiNcIl0nLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG59KVxuIiwiLyohXG4gICogQmVhbiAtIGNvcHlyaWdodCAoYykgSmFjb2IgVGhvcm50b24gMjAxMS0yMDEyXG4gICogaHR0cHM6Ly9naXRodWIuY29tL2ZhdC9iZWFuXG4gICogTUlUIGxpY2Vuc2VcbiAgKi9cbihmdW5jdGlvbiAobmFtZSwgY29udGV4dCwgZGVmaW5pdGlvbikge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKClcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIGRlZmluZShkZWZpbml0aW9uKVxuICBlbHNlIGNvbnRleHRbbmFtZV0gPSBkZWZpbml0aW9uKClcbn0pKCdiZWFuJywgdGhpcywgZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQpIHtcbiAgbmFtZSAgICA9IG5hbWUgICAgfHwgJ2JlYW4nXG4gIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXNcblxuICB2YXIgd2luICAgICAgICAgICAgPSB3aW5kb3dcbiAgICAsIG9sZCAgICAgICAgICAgID0gY29udGV4dFtuYW1lXVxuICAgICwgbmFtZXNwYWNlUmVnZXggPSAvW15cXC5dKig/PVxcLi4qKVxcLnwuKi9cbiAgICAsIG5hbWVSZWdleCAgICAgID0gL1xcLi4qL1xuICAgICwgYWRkRXZlbnQgICAgICAgPSAnYWRkRXZlbnRMaXN0ZW5lcidcbiAgICAsIHJlbW92ZUV2ZW50ICAgID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInXG4gICAgLCBkb2MgICAgICAgICAgICA9IGRvY3VtZW50IHx8IHt9XG4gICAgLCByb290ICAgICAgICAgICA9IGRvYy5kb2N1bWVudEVsZW1lbnQgfHwge31cbiAgICAsIFczQ19NT0RFTCAgICAgID0gcm9vdFthZGRFdmVudF1cbiAgICAsIGV2ZW50U3VwcG9ydCAgID0gVzNDX01PREVMID8gYWRkRXZlbnQgOiAnYXR0YWNoRXZlbnQnXG4gICAgLCBPTkUgICAgICAgICAgICA9IHt9IC8vIHNpbmdsZXRvbiBmb3IgcXVpY2sgbWF0Y2hpbmcgbWFraW5nIGFkZCgpIGRvIG9uZSgpXG5cbiAgICAsIHNsaWNlICAgICAgICAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gICAgLCBzdHIyYXJyICAgICAgICA9IGZ1bmN0aW9uIChzLCBkKSB7IHJldHVybiBzLnNwbGl0KGQgfHwgJyAnKSB9XG4gICAgLCBpc1N0cmluZyAgICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnc3RyaW5nJyB9XG4gICAgLCBpc0Z1bmN0aW9uICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnZnVuY3Rpb24nIH1cbiAgICAsIGlzT2JqZWN0ICAgICAgID0gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvID09ICdvYmplY3QnIH1cblxuICAgIC8vIFRyeSB0byBidWlsZCBhbiBvcHRpb25zIG9iamVjdC4gSWYgYW55IGtleSBpbiBgbWF5YmVPcHRpb25zYFxuICAgIC8vIG1hdGNoZXMgYSBrZXkgaW4gYGRlZmF1bHRzYCwgaXQgd2lsbCBiZSBjb3BpZWQgaW50byBhIGNsb25lXG4gICAgLy8gb2YgYGRlZmF1bHRzYCwgdGh1cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0LlxuICAgICwgYnVpbGRPcHRpb25zID0gZnVuY3Rpb24gKG9yaWdpbmFsRGVmYXVsdHMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICB2YXIgZGVmYXVsdHMgPSB7fVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvcmlnaW5hbERlZmF1bHRzKSB7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsRGVmYXVsdHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG9yaWdpbmFsRGVmYXVsdHNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzT2JqZWN0KG1heWJlT3B0aW9ucykpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGtleSBpbiBkZWZhdWx0cykge1xuICAgICAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG1heWJlT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gbWF5YmVPcHRpb25zW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdHNcbiAgICAgIH1cblxuICAgICAgLy8gZXZlbnRzIHRoYXQgd2UgY29uc2lkZXIgdG8gYmUgJ25hdGl2ZScsIGFueXRoaW5nIG5vdCBpbiB0aGlzIGxpc3Qgd2lsbFxuICAgICAgLy8gYmUgdHJlYXRlZCBhcyBhIGN1c3RvbSBldmVudFxuICAgICwgc3RhbmRhcmROYXRpdmVFdmVudHMgPVxuICAgICAgICAnY2xpY2sgZGJsY2xpY2sgbW91c2V1cCBtb3VzZWRvd24gY29udGV4dG1lbnUgJyAgICAgICAgICAgICAgICAgICsgLy8gbW91c2UgYnV0dG9uc1xuICAgICAgICAnbW91c2V3aGVlbCBtb3VzZW11bHRpd2hlZWwgRE9NTW91c2VTY3JvbGwgJyAgICAgICAgICAgICAgICAgICAgICsgLy8gbW91c2Ugd2hlZWxcbiAgICAgICAgJ21vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgc2VsZWN0c3RhcnQgc2VsZWN0ZW5kICcgICAgICAgICAgICArIC8vIG1vdXNlIG1vdmVtZW50XG4gICAgICAgICdrZXlkb3duIGtleXByZXNzIGtleXVwICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBrZXlib2FyZFxuICAgICAgICAnb3JpZW50YXRpb25jaGFuZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gbW9iaWxlXG4gICAgICAgICdmb2N1cyBibHVyIGNoYW5nZSByZXNldCBzZWxlY3Qgc3VibWl0ICcgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBmb3JtIGVsZW1lbnRzXG4gICAgICAgICdsb2FkIHVubG9hZCBiZWZvcmV1bmxvYWQgcmVzaXplIG1vdmUgRE9NQ29udGVudExvYWRlZCAnICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ3JlYWR5c3RhdGVjaGFuZ2UgbWVzc2FnZSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIHdpbmRvd1xuICAgICAgICAnZXJyb3IgYWJvcnQgc2Nyb2xsICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzY1xuICAgICAgLy8gZWxlbWVudC5maXJlRXZlbnQoJ29uWFlaJy4uLiBpcyBub3QgZm9yZ2l2aW5nIGlmIHdlIHRyeSB0byBmaXJlIGFuIGV2ZW50XG4gICAgICAvLyB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QsIHNvIG1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoZXNlIG9uIG5ld2VyIGJyb3dzZXJzXG4gICAgLCB3M2NOYXRpdmVFdmVudHMgPVxuICAgICAgICAnc2hvdyAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gbW91c2UgYnV0dG9uc1xuICAgICAgICAnaW5wdXQgaW52YWxpZCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gZm9ybSBlbGVtZW50c1xuICAgICAgICAndG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwgJyAgICAgICAgICAgICAgICAgICAgICsgLy8gdG91Y2hcbiAgICAgICAgJ2dlc3R1cmVzdGFydCBnZXN0dXJlY2hhbmdlIGdlc3R1cmVlbmQgJyAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIGdlc3R1cmVcbiAgICAgICAgJ3RleHRpbnB1dCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIFRleHRFdmVudFxuICAgICAgICAncmVhZHlzdGF0ZWNoYW5nZSBwYWdlc2hvdyBwYWdlaGlkZSBwb3BzdGF0ZSAnICAgICAgICAgICAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdoYXNoY2hhbmdlIG9mZmxpbmUgb25saW5lICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ2FmdGVycHJpbnQgYmVmb3JlcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIHByaW50aW5nXG4gICAgICAgICdkcmFnc3RhcnQgZHJhZ2VudGVyIGRyYWdvdmVyIGRyYWdsZWF2ZSBkcmFnIGRyb3AgZHJhZ2VuZCAnICAgICAgKyAvLyBkbmRcbiAgICAgICAgJ2xvYWRzdGFydCBwcm9ncmVzcyBzdXNwZW5kIGVtcHRpZWQgc3RhbGxlZCBsb2FkbWV0YWRhdGEgJyAgICAgICArIC8vIG1lZGlhXG4gICAgICAgICdsb2FkZWRkYXRhIGNhbnBsYXkgY2FucGxheXRocm91Z2ggcGxheWluZyB3YWl0aW5nIHNlZWtpbmcgJyAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnc2Vla2VkIGVuZGVkIGR1cmF0aW9uY2hhbmdlIHRpbWV1cGRhdGUgcGxheSBwYXVzZSByYXRlY2hhbmdlICcgICsgLy8gbWVkaWFcbiAgICAgICAgJ3ZvbHVtZWNoYW5nZSBjdWVjaGFuZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1lZGlhXG4gICAgICAgICdjaGVja2luZyBub3VwZGF0ZSBkb3dubG9hZGluZyBjYWNoZWQgdXBkYXRlcmVhZHkgb2Jzb2xldGUgJyAgICAgICAvLyBhcHBjYWNoZVxuXG4gICAgICAvLyBjb252ZXJ0IHRvIGEgaGFzaCBmb3IgcXVpY2sgbG9va3Vwc1xuICAgICwgbmF0aXZlRXZlbnRzID0gKGZ1bmN0aW9uIChoYXNoLCBldmVudHMsIGkpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgZXZlbnRzW2ldICYmIChoYXNoW2V2ZW50c1tpXV0gPSAxKVxuICAgICAgICByZXR1cm4gaGFzaFxuICAgICAgfSh7fSwgc3RyMmFycihzdGFuZGFyZE5hdGl2ZUV2ZW50cyArIChXM0NfTU9ERUwgPyB3M2NOYXRpdmVFdmVudHMgOiAnJykpKSlcblxuICAgICAgLy8gY3VzdG9tIGV2ZW50cyBhcmUgZXZlbnRzIHRoYXQgd2UgKmZha2UqLCB0aGV5IGFyZSBub3QgcHJvdmlkZWQgbmF0aXZlbHkgYnV0XG4gICAgICAvLyB3ZSBjYW4gdXNlIG5hdGl2ZSBldmVudHMgdG8gZ2VuZXJhdGUgdGhlbVxuICAgICwgY3VzdG9tRXZlbnRzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlzQW5jZXN0b3IgPSAnY29tcGFyZURvY3VtZW50UG9zaXRpb24nIGluIHJvb3RcbiAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIChjb250YWluZXIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudCkgJiAxNikgPT09IDE2XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6ICdjb250YWlucycgaW4gcm9vdFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIubm9kZVR5cGUgPT09IDkgfHwgY29udGFpbmVyID09PSB3aW5kb3cgPyByb290IDogY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIgIT09IGVsZW1lbnQgJiYgY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKSBpZiAoZWxlbWVudCA9PT0gY29udGFpbmVyKSByZXR1cm4gMVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICwgY2hlY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAgIHJldHVybiAhcmVsYXRlZFxuICAgICAgICAgICAgICAgID8gcmVsYXRlZCA9PSBudWxsXG4gICAgICAgICAgICAgICAgOiAocmVsYXRlZCAhPT0gdGhpcyAmJiByZWxhdGVkLnByZWZpeCAhPT0gJ3h1bCcgJiYgIS9kb2N1bWVudC8udGVzdCh0aGlzLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICYmICFpc0FuY2VzdG9yKHJlbGF0ZWQsIHRoaXMpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb3VzZWVudGVyOiB7IGJhc2U6ICdtb3VzZW92ZXInLCBjb25kaXRpb246IGNoZWNrIH1cbiAgICAgICAgICAsIG1vdXNlbGVhdmU6IHsgYmFzZTogJ21vdXNlb3V0JywgY29uZGl0aW9uOiBjaGVjayB9XG4gICAgICAgICAgLCBtb3VzZXdoZWVsOiB7IGJhc2U6IC9GaXJlZm94Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpID8gJ0RPTU1vdXNlU2Nyb2xsJyA6ICdtb3VzZXdoZWVsJyB9XG4gICAgICAgIH1cbiAgICAgIH0oKSlcblxuICAgICAgLy8gd2UgcHJvdmlkZSBhIGNvbnNpc3RlbnQgRXZlbnQgb2JqZWN0IGFjcm9zcyBicm93c2VycyBieSB0YWtpbmcgdGhlIGFjdHVhbCBET01cbiAgICAgIC8vIGV2ZW50IG9iamVjdCBhbmQgZ2VuZXJhdGluZyBhIG5ldyBvbmUgZnJvbSBpdHMgcHJvcGVydGllcy5cbiAgICAsIEV2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGEgd2hpdGVsaXN0IG9mIHByb3BlcnRpZXMgKGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMpIHRlbGxzIHVzIHdoYXQgdG8gY2hlY2sgZm9yIGFuZCBjb3B5XG4gICAgICAgIHZhciBjb21tb25Qcm9wcyAgPSBzdHIyYXJyKCdhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0ICcgK1xuICAgICAgICAgICAgICAnZGV0YWlsIGV2ZW50UGhhc2UgZ2V0TW9kaWZpZXJTdGF0ZSBpc1RydXN0ZWQgbWV0YUtleSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5ICcgICtcbiAgICAgICAgICAgICAgJ3NyY0VsZW1lbnQgdGFyZ2V0IHRpbWVTdGFtcCB0eXBlIHZpZXcgd2hpY2ggcHJvcGVydHlOYW1lIHBhdGgnKVxuICAgICAgICAgICwgbW91c2VQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2J1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBkYXRhVHJhbnNmZXIgJyAgICAgICtcbiAgICAgICAgICAgICAgJ2Zyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50IG1vdmVtZW50WCBtb3ZlbWVudFkgcmVnaW9uJykpXG4gICAgICAgICAgLCBtb3VzZVdoZWVsUHJvcHMgPSBtb3VzZVByb3BzLmNvbmNhdChzdHIyYXJyKCd3aGVlbERlbHRhIHdoZWVsRGVsdGFYIHdoZWVsRGVsdGFZIHdoZWVsRGVsdGFaICcgK1xuICAgICAgICAgICAgICAnYXhpcycpKSAvLyAnYXhpcycgaXMgRkYgc3BlY2lmaWNcbiAgICAgICAgICAsIGtleVByb3BzICAgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIGtleUlkZW50aWZpZXIgJyAgICAgICAgICArXG4gICAgICAgICAgICAgICdrZXlMb2NhdGlvbiBsb2NhdGlvbiBpc0NvbXBvc2luZyBjb2RlJykpXG4gICAgICAgICAgLCB0ZXh0UHJvcHMgICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignZGF0YScpKVxuICAgICAgICAgICwgdG91Y2hQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ3RvdWNoZXMgdGFyZ2V0VG91Y2hlcyBjaGFuZ2VkVG91Y2hlcyBzY2FsZSByb3RhdGlvbicpKVxuICAgICAgICAgICwgbWVzc2FnZVByb3BzID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2RhdGEgb3JpZ2luIHNvdXJjZScpKVxuICAgICAgICAgICwgc3RhdGVQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ3N0YXRlJykpXG4gICAgICAgICAgLCBvdmVyT3V0UmVnZXggPSAvb3ZlcnxvdXQvXG4gICAgICAgICAgICAvLyBzb21lIGV2ZW50IHR5cGVzIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBhbmQgc29tZSBuZWVkIHNwZWNpYWwgcHJvcGVydGllcywgZG8gdGhhdCBhbGwgaGVyZVxuICAgICAgICAgICwgdHlwZUZpeGVycyAgID0gW1xuICAgICAgICAgICAgICAgIHsgLy8ga2V5IGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9rZXkvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uIChldmVudCwgbmV3RXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5rZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlQcm9wc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbW91c2UgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL2NsaWNrfG1vdXNlKD8hKC4qd2hlZWx8c2Nyb2xsKSl8bWVudXxkcmFnfGRyb3AvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uIChldmVudCwgbmV3RXZlbnQsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5yaWdodENsaWNrID0gZXZlbnQud2hpY2ggPT09IDMgfHwgZXZlbnQuYnV0dG9uID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQucG9zID0geyB4OiAwLCB5OiAwIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQucGFnZVggfHwgZXZlbnQucGFnZVkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFggPSBldmVudC5wYWdlWFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WSA9IGV2ZW50LnBhZ2VZXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5jbGllbnRYIHx8IGV2ZW50LmNsaWVudFkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFggPSBldmVudC5jbGllbnRYICsgZG9jLmJvZHkuc2Nyb2xsTGVmdCArIHJvb3Quc2Nyb2xsTGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WSA9IGV2ZW50LmNsaWVudFkgKyBkb2MuYm9keS5zY3JvbGxUb3AgKyByb290LnNjcm9sbFRvcFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAob3Zlck91dFJlZ2V4LnRlc3QodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LnJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50Wyh0eXBlID09ICdtb3VzZW92ZXInID8gJ2Zyb20nIDogJ3RvJykgKyAnRWxlbWVudCddXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3VzZVByb3BzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBtb3VzZSB3aGVlbCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvbW91c2UuKih3aGVlbHxzY3JvbGwpL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtb3VzZVdoZWVsUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIFRleHRFdmVudFxuICAgICAgICAgICAgICAgICAgICByZWc6IC9edGV4dC9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGV4dFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyB0b3VjaCBhbmQgZ2VzdHVyZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXnRvdWNofF5nZXN0dXJlL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0b3VjaFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBtZXNzYWdlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9ebWVzc2FnZSQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gcG9wc3RhdGUgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL15wb3BzdGF0ZSQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0YXRlUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZWc6IC8uKi9cbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb21tb25Qcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgICwgdHlwZUZpeGVyTWFwID0ge30gLy8gdXNlZCB0byBtYXAgZXZlbnQgdHlwZXMgdG8gZml4ZXIgZnVuY3Rpb25zIChhYm92ZSksIGEgYmFzaWMgY2FjaGUgbWVjaGFuaXNtXG5cbiAgICAgICAgICAsIEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBlbGVtZW50LCBpc05hdGl2ZSkge1xuICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVyblxuICAgICAgICAgICAgICBldmVudCA9IGV2ZW50IHx8ICgoZWxlbWVudC5vd25lckRvY3VtZW50IHx8IGVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCkucGFyZW50V2luZG93IHx8IHdpbikuZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy5pc05hdGl2ZSAgICAgICA9IGlzTmF0aXZlXG4gICAgICAgICAgICAgIHRoaXMuaXNCZWFuICAgICAgICAgPSB0cnVlXG5cbiAgICAgICAgICAgICAgaWYgKCFldmVudCkgcmV0dXJuXG5cbiAgICAgICAgICAgICAgdmFyIHR5cGUgICA9IGV2ZW50LnR5cGVcbiAgICAgICAgICAgICAgICAsIHRhcmdldCA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50XG4gICAgICAgICAgICAgICAgLCBpLCBsLCBwLCBwcm9wcywgZml4ZXJcblxuICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT09IDMgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldFxuXG4gICAgICAgICAgICAgIGlmIChpc05hdGl2ZSkgeyAvLyB3ZSBvbmx5IG5lZWQgYmFzaWMgYXVnbWVudGF0aW9uIG9uIGN1c3RvbSBldmVudHMsIHRoZSByZXN0IGV4cGVuc2l2ZSAmIHBvaW50bGVzc1xuICAgICAgICAgICAgICAgIGZpeGVyID0gdHlwZUZpeGVyTWFwW3R5cGVdXG4gICAgICAgICAgICAgICAgaWYgKCFmaXhlcikgeyAvLyBoYXZlbid0IGVuY291bnRlcmVkIHRoaXMgZXZlbnQgdHlwZSBiZWZvcmUsIG1hcCBhIGZpeGVyIGZ1bmN0aW9uIGZvciBpdFxuICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IHR5cGVGaXhlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlRml4ZXJzW2ldLnJlZy50ZXN0KHR5cGUpKSB7IC8vIGd1YXJhbnRlZWQgdG8gbWF0Y2ggYXQgbGVhc3Qgb25lLCBsYXN0IGlzIC4qXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZUZpeGVyTWFwW3R5cGVdID0gZml4ZXIgPSB0eXBlRml4ZXJzW2ldLmZpeFxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcm9wcyA9IGZpeGVyKGV2ZW50LCB0aGlzLCB0eXBlKVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IHByb3BzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgICAgaWYgKCEoKHAgPSBwcm9wc1tpXSkgaW4gdGhpcykgJiYgcCBpbiBldmVudCkgdGhpc1twXSA9IGV2ZW50W3BdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJldmVudERlZmF1bHQoKSBhbmQgc3RvcFByb3BhZ2F0aW9uKCkgYXJlIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgdG8gdGhvc2UgZnVuY3Rpb25zXG4gICAgICAgIC8vIG9uIHRoZSBET00sIHN0b3AoKSBpcyBhbiBhbGlhcyBmb3IgYm90aCBvZiB0aGVtIHRvZ2V0aGVyXG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KSB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIGVsc2UgdGhpcy5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBFdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICBlbHNlIHRoaXMub3JpZ2luYWxFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICAvLyBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBoYXMgdG8gYmUgaGFuZGxlZCBpbnRlcm5hbGx5IGJlY2F1c2Ugd2UgbWFuYWdlIHRoZSBldmVudCBsaXN0IGZvclxuICAgICAgICAvLyBlYWNoIGVsZW1lbnRcbiAgICAgICAgLy8gbm90ZSB0aGF0IG9yaWdpbmFsRWxlbWVudCBtYXkgYmUgYSBCZWFuI0V2ZW50IG9iamVjdCBpbiBzb21lIHNpdHVhdGlvbnNcbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICAgICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWUgfVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkICYmIHRoaXMub3JpZ2luYWxFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICAvL1RPRE86IHRoaXMgaXMgcmlwZSBmb3Igb3B0aW1pc2F0aW9uLCBuZXcgZXZlbnRzIGFyZSAqZXhwZW5zaXZlKlxuICAgICAgICAgIC8vIGltcHJvdmluZyB0aGlzIHdpbGwgc3BlZWQgdXAgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgICAgIHZhciBuZSA9IG5ldyBFdmVudCh0aGlzLCB0aGlzLmVsZW1lbnQsIHRoaXMuaXNOYXRpdmUpXG4gICAgICAgICAgbmUuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXRcbiAgICAgICAgICByZXR1cm4gbmVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBFdmVudFxuICAgICAgfSgpKVxuXG4gICAgICAvLyBpZiB3ZSdyZSBpbiBvbGQgSUUgd2UgY2FuJ3QgZG8gb25wcm9wZXJ0eWNoYW5nZSBvbiBkb2Mgb3Igd2luIHNvIHdlIHVzZSBkb2MuZG9jdW1lbnRFbGVtZW50IGZvciBib3RoXG4gICAgLCB0YXJnZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGlzTmF0aXZlKSB7XG4gICAgICAgIHJldHVybiAhVzNDX01PREVMICYmICFpc05hdGl2ZSAmJiAoZWxlbWVudCA9PT0gZG9jIHx8IGVsZW1lbnQgPT09IHdpbikgPyByb290IDogZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBCZWFuIG1haW50YWlucyBhbiBpbnRlcm5hbCByZWdpc3RyeSBmb3IgZXZlbnQgbGlzdGVuZXJzLiBXZSBkb24ndCB0b3VjaCBlbGVtZW50cywgb2JqZWN0c1xuICAgICAgICAqIG9yIGZ1bmN0aW9ucyB0byBpZGVudGlmeSB0aGVtLCBpbnN0ZWFkIHdlIHN0b3JlIGV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2lzdHJ5LlxuICAgICAgICAqIEVhY2ggZXZlbnQgbGlzdGVuZXIgaGFzIGEgUmVnRW50cnkgb2JqZWN0LCB3ZSBoYXZlIG9uZSAncmVnaXN0cnknIGZvciB0aGUgd2hvbGUgaW5zdGFuY2UuXG4gICAgICAgICovXG4gICAgLCBSZWdFbnRyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVhY2ggaGFuZGxlciBpcyB3cmFwcGVkIHNvIHdlIGNhbiBoYW5kbGUgZGVsZWdhdGlvbiBhbmQgY3VzdG9tIGV2ZW50c1xuICAgICAgICB2YXIgd3JhcHBlZEhhbmRsZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgZm4sIGNvbmRpdGlvbiwgYXJncykge1xuICAgICAgICAgICAgdmFyIGNhbGwgPSBmdW5jdGlvbiAoZXZlbnQsIGVhcmdzKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgYXJncyA/IHNsaWNlLmNhbGwoZWFyZ3MsIGV2ZW50ID8gMCA6IDEpLmNvbmNhdChhcmdzKSA6IGVhcmdzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCBmaW5kVGFyZ2V0ID0gZnVuY3Rpb24gKGV2ZW50LCBldmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmbi5fX2JlYW5EZWwgPyBmbi5fX2JlYW5EZWwuZnQoZXZlbnQudGFyZ2V0LCBlbGVtZW50KSA6IGV2ZW50RWxlbWVudFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCBoYW5kbGVyID0gY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBmaW5kVGFyZ2V0KGV2ZW50LCB0aGlzKSAvLyBkZWxlYXRlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQpIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsKGV2ZW50LCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChmbi5fX2JlYW5EZWwpIGV2ZW50ID0gZXZlbnQuY2xvbmUoZmluZFRhcmdldChldmVudCkpIC8vIGRlbGVnYXRlZCBldmVudCwgZml4IHRoZSBmaXhcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbChldmVudCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVyLl9fYmVhbkRlbCA9IGZuLl9fYmVhbkRlbFxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICAgICAgICB9XG5cbiAgICAgICAgLCBSZWdFbnRyeSA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcmlnaW5hbCwgbmFtZXNwYWNlcywgYXJncywgcm9vdCkge1xuICAgICAgICAgICAgdmFyIGN1c3RvbVR5cGUgICAgID0gY3VzdG9tRXZlbnRzW3R5cGVdXG4gICAgICAgICAgICAgICwgaXNOYXRpdmVcblxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ3VubG9hZCcpIHtcbiAgICAgICAgICAgICAgLy8gc2VsZiBjbGVhbi11cFxuICAgICAgICAgICAgICBoYW5kbGVyID0gb25jZShyZW1vdmVMaXN0ZW5lciwgZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3JpZ2luYWwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21UeXBlKSB7XG4gICAgICAgICAgICAgIGlmIChjdXN0b21UeXBlLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIgPSB3cmFwcGVkSGFuZGxlcihlbGVtZW50LCBoYW5kbGVyLCBjdXN0b21UeXBlLmNvbmRpdGlvbiwgYXJncylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0eXBlID0gY3VzdG9tVHlwZS5iYXNlIHx8IHR5cGVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pc05hdGl2ZSAgICAgID0gaXNOYXRpdmUgPSBuYXRpdmVFdmVudHNbdHlwZV0gJiYgISFlbGVtZW50W2V2ZW50U3VwcG9ydF1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9tVHlwZSAgICA9ICFXM0NfTU9ERUwgJiYgIWlzTmF0aXZlICYmIHR5cGVcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCAgICAgICA9IGVsZW1lbnRcbiAgICAgICAgICAgIHRoaXMudHlwZSAgICAgICAgICA9IHR5cGVcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWwgICAgICA9IG9yaWdpbmFsXG4gICAgICAgICAgICB0aGlzLm5hbWVzcGFjZXMgICAgPSBuYW1lc3BhY2VzXG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSAgICAgPSBXM0NfTU9ERUwgfHwgaXNOYXRpdmUgPyB0eXBlIDogJ3Byb3BlcnR5Y2hhbmdlJ1xuICAgICAgICAgICAgdGhpcy50YXJnZXQgICAgICAgID0gdGFyZ2V0RWxlbWVudChlbGVtZW50LCBpc05hdGl2ZSlcbiAgICAgICAgICAgIHRoaXNbZXZlbnRTdXBwb3J0XSA9ICEhdGhpcy50YXJnZXRbZXZlbnRTdXBwb3J0XVxuICAgICAgICAgICAgdGhpcy5yb290ICAgICAgICAgID0gcm9vdFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyICAgICAgID0gd3JhcHBlZEhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgbnVsbCwgYXJncylcbiAgICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzcGFjZXMsIGlzIG91ciBlbnRyeSBpbiBhbnkgb2YgdGhlbT9cbiAgICAgICAgUmVnRW50cnkucHJvdG90eXBlLmluTmFtZXNwYWNlcyA9IGZ1bmN0aW9uIChjaGVja05hbWVzcGFjZXMpIHtcbiAgICAgICAgICB2YXIgaSwgaiwgYyA9IDBcbiAgICAgICAgICBpZiAoIWNoZWNrTmFtZXNwYWNlcykgcmV0dXJuIHRydWVcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZXNwYWNlcykgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgZm9yIChpID0gY2hlY2tOYW1lc3BhY2VzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgZm9yIChqID0gdGhpcy5uYW1lc3BhY2VzLmxlbmd0aDsgai0tOykge1xuICAgICAgICAgICAgICBpZiAoY2hlY2tOYW1lc3BhY2VzW2ldID09IHRoaXMubmFtZXNwYWNlc1tqXSkgYysrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGVja05hbWVzcGFjZXMubGVuZ3RoID09PSBjXG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXRjaCBieSBlbGVtZW50LCBvcmlnaW5hbCBmbiAob3B0KSwgaGFuZGxlciBmbiAob3B0KVxuICAgICAgICBSZWdFbnRyeS5wcm90b3R5cGUubWF0Y2hlcyA9IGZ1bmN0aW9uIChjaGVja0VsZW1lbnQsIGNoZWNrT3JpZ2luYWwsIGNoZWNrSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQgPT09IGNoZWNrRWxlbWVudCAmJlxuICAgICAgICAgICAgKCFjaGVja09yaWdpbmFsIHx8IHRoaXMub3JpZ2luYWwgPT09IGNoZWNrT3JpZ2luYWwpICYmXG4gICAgICAgICAgICAoIWNoZWNrSGFuZGxlciB8fCB0aGlzLmhhbmRsZXIgPT09IGNoZWNrSGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWdFbnRyeVxuICAgICAgfSgpKVxuXG4gICAgLCByZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIG91ciBtYXAgc3RvcmVzIGFycmF5cyBieSBldmVudCB0eXBlLCBqdXN0IGJlY2F1c2UgaXQncyBiZXR0ZXIgdGhhbiBzdG9yaW5nXG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgaW4gYSBzaW5nbGUgYXJyYXkuXG4gICAgICAgIC8vIHVzZXMgJyQnIGFzIGEgcHJlZml4IGZvciB0aGUga2V5cyBmb3Igc2FmZXR5IGFuZCAncicgYXMgYSBzcGVjaWFsIHByZWZpeCBmb3JcbiAgICAgICAgLy8gcm9vdExpc3RlbmVycyBzbyB3ZSBjYW4gbG9vayB0aGVtIHVwIGZhc3RcbiAgICAgICAgdmFyIG1hcCA9IHt9XG5cbiAgICAgICAgICAvLyBnZW5lcmljIGZ1bmN0aW9uYWwgc2VhcmNoIG9mIG91ciByZWdpc3RyeSBmb3IgbWF0Y2hpbmcgbGlzdGVuZXJzLFxuICAgICAgICAgIC8vIGBmbmAgcmV0dXJucyBmYWxzZSB0byBicmVhayBvdXQgb2YgdGhlIGxvb3BcbiAgICAgICAgICAsIGZvckFsbCA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBvcmlnaW5hbCwgaGFuZGxlciwgcm9vdCwgZm4pIHtcbiAgICAgICAgICAgICAgdmFyIHBmeCA9IHJvb3QgPyAncicgOiAnJCdcbiAgICAgICAgICAgICAgaWYgKCF0eXBlIHx8IHR5cGUgPT0gJyonKSB7XG4gICAgICAgICAgICAgICAgLy8gc2VhcmNoIHRoZSB3aG9sZSByZWdpc3RyeVxuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodC5jaGFyQXQoMCkgPT0gcGZ4KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvckFsbChlbGVtZW50LCB0LnN1YnN0cigxKSwgb3JpZ2luYWwsIGhhbmRsZXIsIHJvb3QsIGZuKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IDAsIGwsIGxpc3QgPSBtYXBbcGZ4ICsgdHlwZV0sIGFsbCA9IGVsZW1lbnQgPT0gJyonXG4gICAgICAgICAgICAgICAgaWYgKCFsaXN0KSByZXR1cm5cbiAgICAgICAgICAgICAgICBmb3IgKGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgaWYgKChhbGwgfHwgbGlzdFtpXS5tYXRjaGVzKGVsZW1lbnQsIG9yaWdpbmFsLCBoYW5kbGVyKSkgJiYgIWZuKGxpc3RbaV0sIGxpc3QsIGksIHR5cGUpKSByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgaGFzID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCByb290KSB7XG4gICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCB1c2luZyBmb3JBbGwgaGVyZSBzaW1wbHkgYmVjYXVzZSBpdCdzIGEgYml0IHNsb3dlciBhbmQgdGhpc1xuICAgICAgICAgICAgICAvLyBuZWVkcyB0byBiZSBmYXN0XG4gICAgICAgICAgICAgIHZhciBpLCBsaXN0ID0gbWFwWyhyb290ID8gJ3InIDogJyQnKSArIHR5cGVdXG4gICAgICAgICAgICAgIGlmIChsaXN0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmICghbGlzdFtpXS5yb290ICYmIGxpc3RbaV0ubWF0Y2hlcyhlbGVtZW50LCBvcmlnaW5hbCwgbnVsbCkpIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBnZXQgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIHJvb3QpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBbXVxuICAgICAgICAgICAgICBmb3JBbGwoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIG51bGwsIHJvb3QsIGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAsIHB1dCA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICB2YXIgaGFzID0gIWVudHJ5LnJvb3QgJiYgIXRoaXMuaGFzKGVudHJ5LmVsZW1lbnQsIGVudHJ5LnR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICAgICAgICwga2V5ID0gKGVudHJ5LnJvb3QgPyAncicgOiAnJCcpICsgZW50cnkudHlwZVxuICAgICAgICAgICAgICA7KG1hcFtrZXldIHx8IChtYXBba2V5XSA9IFtdKSkucHVzaChlbnRyeSlcbiAgICAgICAgICAgICAgcmV0dXJuIGhhc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBkZWwgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgZm9yQWxsKGVudHJ5LmVsZW1lbnQsIGVudHJ5LnR5cGUsIG51bGwsIGVudHJ5LmhhbmRsZXIsIGVudHJ5LnJvb3QsIGZ1bmN0aW9uIChlbnRyeSwgbGlzdCwgaSkge1xuICAgICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGksIDEpXG4gICAgICAgICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIGRlbGV0ZSBtYXBbKGVudHJ5LnJvb3QgPyAncicgOiAnJCcpICsgZW50cnkudHlwZV1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZHVtcCBhbGwgZW50cmllcywgdXNlZCBmb3Igb251bmxvYWRcbiAgICAgICAgICAsIGVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciB0LCBlbnRyaWVzID0gW11cbiAgICAgICAgICAgICAgZm9yICh0IGluIG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0LmNoYXJBdCgwKSA9PSAnJCcpIGVudHJpZXMgPSBlbnRyaWVzLmNvbmNhdChtYXBbdF0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBoYXM6IGhhcywgZ2V0OiBnZXQsIHB1dDogcHV0LCBkZWw6IGRlbCwgZW50cmllczogZW50cmllcyB9XG4gICAgICB9KCkpXG5cbiAgICAgIC8vIHdlIG5lZWQgYSBzZWxlY3RvciBlbmdpbmUgZm9yIGRlbGVnYXRlZCBldmVudHMsIHVzZSBxdWVyeVNlbGVjdG9yQWxsIGlmIGl0IGV4aXN0c1xuICAgICAgLy8gYnV0IGZvciBvbGRlciBicm93c2VycyB3ZSBuZWVkIFF3ZXJ5LCBTaXp6bGUgb3Igc2ltaWxhclxuICAgICwgc2VsZWN0b3JFbmdpbmVcbiAgICAsIHNldFNlbGVjdG9yRW5naW5lID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgc2VsZWN0b3JFbmdpbmUgPSBkb2MucXVlcnlTZWxlY3RvckFsbFxuICAgICAgICAgICAgPyBmdW5jdGlvbiAocywgcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByLnF1ZXJ5U2VsZWN0b3JBbGwocylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCZWFuOiBObyBzZWxlY3RvciBlbmdpbmUgaW5zdGFsbGVkJykgLy8gZWVla1xuICAgICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0b3JFbmdpbmUgPSBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gd2UgYXR0YWNoIHRoaXMgbGlzdGVuZXIgdG8gZWFjaCBET00gZXZlbnQgdGhhdCB3ZSBuZWVkIHRvIGxpc3RlbiB0bywgb25seSBvbmNlXG4gICAgICAvLyBwZXIgZXZlbnQgdHlwZSBwZXIgRE9NIGVsZW1lbnRcbiAgICAsIHJvb3RMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgdHlwZSkge1xuICAgICAgICBpZiAoIVczQ19NT0RFTCAmJiB0eXBlICYmIGV2ZW50ICYmIGV2ZW50LnByb3BlcnR5TmFtZSAhPSAnX29uJyArIHR5cGUpIHJldHVyblxuXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSByZWdpc3RyeS5nZXQodGhpcywgdHlwZSB8fCBldmVudC50eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAgICAgLCBpID0gMFxuXG4gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50LCB0aGlzLCB0cnVlKVxuICAgICAgICBpZiAodHlwZSkgZXZlbnQudHlwZSA9IHR5cGVcblxuICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIGhhbmRsZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgY2FsbGluZyB0aGVtIHVubGVzcyB0aGV5IGhhdmVcbiAgICAgICAgLy8gYmVlbiByZW1vdmVkIGJ5IGEgcHJldmlvdXMgaGFuZGxlciBvciBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBoYXMgYmVlbiBjYWxsZWRcbiAgICAgICAgZm9yICg7IGkgPCBsICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpc3RlbmVyc1tpXS5yZW1vdmVkKSBsaXN0ZW5lcnNbaV0uaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCBhbmQgcmVtb3ZlIGxpc3RlbmVycyB0byBET00gZWxlbWVudHNcbiAgICAsIGxpc3RlbmVyID0gVzNDX01PREVMXG4gICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFkZCwgY3VzdG9tLCB1c2VDYXB0dXJlKSB7XG4gICAgICAgICAgICAvLyBuZXcgYnJvd3NlcnNcbiAgICAgICAgICAgIGVsZW1lbnRbYWRkID8gYWRkRXZlbnQgOiByZW1vdmVFdmVudF0odHlwZSwgcm9vdExpc3RlbmVyLCB1c2VDYXB0dXJlKVxuICAgICAgICAgIH1cbiAgICAgICAgOiBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgYWRkLCBjdXN0b20gLyosIHVzZUNhcHR1cmUgKi8pIHtcbiAgICAgICAgICAgIC8vIElFOCBhbmQgYmVsb3csIHVzZSBhdHRhY2hFdmVudC9kZXRhY2hFdmVudCBhbmQgd2UgaGF2ZSB0byBwaWdneS1iYWNrIHByb3BlcnR5Y2hhbmdlIGV2ZW50c1xuICAgICAgICAgICAgLy8gdG8gc2ltdWxhdGUgZXZlbnQgYnViYmxpbmcgZXRjLlxuICAgICAgICAgICAgdmFyIGVudHJ5XG4gICAgICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICAgIHJlZ2lzdHJ5LnB1dChlbnRyeSA9IG5ldyBSZWdFbnRyeShcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAsIGN1c3RvbSB8fCB0eXBlXG4gICAgICAgICAgICAgICAgLCBmdW5jdGlvbiAoZXZlbnQpIHsgLy8gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICByb290TGlzdGVuZXIuY2FsbChlbGVtZW50LCBldmVudCwgY3VzdG9tKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICwgcm9vdExpc3RlbmVyXG4gICAgICAgICAgICAgICAgLCBudWxsXG4gICAgICAgICAgICAgICAgLCBudWxsXG4gICAgICAgICAgICAgICAgLCB0cnVlIC8vIGlzIHJvb3RcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgaWYgKGN1c3RvbSAmJiBlbGVtZW50Wydfb24nICsgY3VzdG9tXSA9PSBudWxsKSBlbGVtZW50Wydfb24nICsgY3VzdG9tXSA9IDBcbiAgICAgICAgICAgICAgZW50cnkudGFyZ2V0LmF0dGFjaEV2ZW50KCdvbicgKyBlbnRyeS5ldmVudFR5cGUsIGVudHJ5LmhhbmRsZXIpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbnRyeSA9IHJlZ2lzdHJ5LmdldChlbGVtZW50LCBjdXN0b20gfHwgdHlwZSwgcm9vdExpc3RlbmVyLCB0cnVlKVswXVxuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS50YXJnZXQuZGV0YWNoRXZlbnQoJ29uJyArIGVudHJ5LmV2ZW50VHlwZSwgZW50cnkuaGFuZGxlcilcbiAgICAgICAgICAgICAgICByZWdpc3RyeS5kZWwoZW50cnkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAsIG9uY2UgPSBmdW5jdGlvbiAocm0sIGVsZW1lbnQsIHR5cGUsIGZuLCBvcmlnaW5hbEZuKSB7XG4gICAgICAgIC8vIHdyYXAgdGhlIGhhbmRsZXIgaW4gYSBoYW5kbGVyIHRoYXQgZG9lcyBhIHJlbW92ZSBhcyB3ZWxsXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIHJtKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsRm4pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICwgcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3JnVHlwZSwgaGFuZGxlciwgbmFtZXNwYWNlcywgdXNlQ2FwdHVyZSkge1xuICAgICAgICB2YXIgdHlwZSAgICAgPSBvcmdUeXBlICYmIG9yZ1R5cGUucmVwbGFjZShuYW1lUmVnZXgsICcnKVxuICAgICAgICAgICwgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCByZW1vdmVkICA9IHt9XG4gICAgICAgICAgLCBpLCBsXG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmICgoIWhhbmRsZXIgfHwgaGFuZGxlcnNbaV0ub3JpZ2luYWwgPT09IGhhbmRsZXIpICYmIGhhbmRsZXJzW2ldLmluTmFtZXNwYWNlcyhuYW1lc3BhY2VzKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBwcm9ibGVtYXRpYywgd2UgaGF2ZSBhIHJlZ2lzdHJ5LmdldCgpIGFuZCByZWdpc3RyeS5kZWwoKSB0aGF0XG4gICAgICAgICAgICAvLyBib3RoIGRvIHJlZ2lzdHJ5IHNlYXJjaGVzIHNvIHdlIHdhc3RlIGN5Y2xlcyBkb2luZyB0aGlzLiBOZWVkcyB0byBiZSByb2xsZWQgaW50b1xuICAgICAgICAgICAgLy8gYSBzaW5nbGUgcmVnaXN0cnkuZm9yQWxsKGZuKSB0aGF0IHJlbW92ZXMgd2hpbGUgZmluZGluZywgYnV0IHRoZSBjYXRjaCBpcyB0aGF0XG4gICAgICAgICAgICAvLyB3ZSdsbCBiZSBzcGxpY2luZyB0aGUgYXJyYXlzIHRoYXQgd2UncmUgaXRlcmF0aW5nIG92ZXIuIE5lZWRzIGV4dHJhIHRlc3RzIHRvXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2NyZXcgaXQgdXAuIEBydmFnZ1xuICAgICAgICAgICAgcmVnaXN0cnkuZGVsKGhhbmRsZXJzW2ldKVxuICAgICAgICAgICAgaWYgKCFyZW1vdmVkW2hhbmRsZXJzW2ldLmV2ZW50VHlwZV0gJiYgaGFuZGxlcnNbaV1bZXZlbnRTdXBwb3J0XSlcbiAgICAgICAgICAgICAgcmVtb3ZlZFtoYW5kbGVyc1tpXS5ldmVudFR5cGVdID0geyB0OiBoYW5kbGVyc1tpXS5ldmVudFR5cGUsIGM6IGhhbmRsZXJzW2ldLnR5cGUgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBlYWNoIHR5cGUvZWxlbWVudCBmb3IgcmVtb3ZlZCBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGUgcm9vdExpc3RlbmVyIHdoZXJlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZFxuICAgICAgICBmb3IgKGkgaW4gcmVtb3ZlZCkge1xuICAgICAgICAgIGlmICghcmVnaXN0cnkuaGFzKGVsZW1lbnQsIHJlbW92ZWRbaV0udCwgbnVsbCwgZmFsc2UpKSB7XG4gICAgICAgICAgICAvLyBsYXN0IGxpc3RlbmVyIG9mIHRoaXMgdHlwZSwgcmVtb3ZlIHRoZSByb290TGlzdGVuZXJcbiAgICAgICAgICAgIGxpc3RlbmVyKGVsZW1lbnQsIHJlbW92ZWRbaV0udCwgZmFsc2UsIHJlbW92ZWRbaV0uYywgdXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHVwIGEgZGVsZWdhdGUgaGVscGVyIHVzaW5nIHRoZSBnaXZlbiBzZWxlY3Rvciwgd3JhcCB0aGUgaGFuZGxlciBmdW5jdGlvblxuICAgICwgZGVsZWdhdGUgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGZuKSB7XG4gICAgICAgIC8vVE9ETzogZmluZFRhcmdldCAodGhlcmVmb3JlICQpIGlzIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgbWF0Y2ggYW5kIG9uY2UgZm9yXG4gICAgICAgIC8vIHNldHRpbmcgZS5jdXJyZW50VGFyZ2V0LCBmaXggdGhpcyBzbyBpdCdzIG9ubHkgbmVlZGVkIG9uY2VcbiAgICAgICAgdmFyIGZpbmRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCByb290KSB7XG4gICAgICAgICAgICAgIHZhciBpLCBhcnJheSA9IGlzU3RyaW5nKHNlbGVjdG9yKSA/IHNlbGVjdG9yRW5naW5lKHNlbGVjdG9yLCByb290KSA6IHNlbGVjdG9yXG4gICAgICAgICAgICAgIGZvciAoOyB0YXJnZXQgJiYgdGFyZ2V0ICE9PSByb290OyB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGFycmF5Lmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSB0YXJnZXQpIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAsIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kVGFyZ2V0KGUudGFyZ2V0LCB0aGlzKVxuICAgICAgICAgICAgICBpZiAobWF0Y2gpIGZuLmFwcGx5KG1hdGNoLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gX19iZWFuRGVsIGlzbid0IHBsZWFzYW50IGJ1dCBpdCdzIGEgcHJpdmF0ZSBmdW5jdGlvbiwgbm90IGV4cG9zZWQgb3V0c2lkZSBvZiBCZWFuXG4gICAgICAgIGhhbmRsZXIuX19iZWFuRGVsID0ge1xuICAgICAgICAgICAgZnQgICAgICAgOiBmaW5kVGFyZ2V0IC8vIGF0dGFjaCBpdCBoZXJlIGZvciBjdXN0b21FdmVudHMgdG8gdXNlIHRvb1xuICAgICAgICAgICwgc2VsZWN0b3IgOiBzZWxlY3RvclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgICB9XG5cbiAgICAsIGZpcmVMaXN0ZW5lciA9IFczQ19NT0RFTCA/IGZ1bmN0aW9uIChpc05hdGl2ZSwgdHlwZSwgZWxlbWVudCkge1xuICAgICAgICAvLyBtb2Rlcm4gYnJvd3NlcnMsIGRvIGEgcHJvcGVyIGRpc3BhdGNoRXZlbnQoKVxuICAgICAgICB2YXIgZXZ0ID0gZG9jLmNyZWF0ZUV2ZW50KGlzTmF0aXZlID8gJ0hUTUxFdmVudHMnIDogJ1VJRXZlbnRzJylcbiAgICAgICAgZXZ0W2lzTmF0aXZlID8gJ2luaXRFdmVudCcgOiAnaW5pdFVJRXZlbnQnXSh0eXBlLCB0cnVlLCB0cnVlLCB3aW4sIDEpXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpXG4gICAgICB9IDogZnVuY3Rpb24gKGlzTmF0aXZlLCB0eXBlLCBlbGVtZW50KSB7XG4gICAgICAgIC8vIG9sZCBicm93c2VyIHVzZSBvbnByb3BlcnR5Y2hhbmdlLCBqdXN0IGluY3JlbWVudCBhIGN1c3RvbSBwcm9wZXJ0eSB0byB0cmlnZ2VyIHRoZSBldmVudFxuICAgICAgICBlbGVtZW50ID0gdGFyZ2V0RWxlbWVudChlbGVtZW50LCBpc05hdGl2ZSlcbiAgICAgICAgaXNOYXRpdmUgPyBlbGVtZW50LmZpcmVFdmVudCgnb24nICsgdHlwZSwgZG9jLmNyZWF0ZUV2ZW50T2JqZWN0KCkpIDogZWxlbWVudFsnX29uJyArIHR5cGVdKytcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogUHVibGljIEFQSTogb2ZmKCksIG9uKCksIGFkZCgpLCAocmVtb3ZlKCkpLCBvbmUoKSwgZmlyZSgpLCBjbG9uZSgpXG4gICAgICAgICovXG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9mZihlbGVtZW50WywgZXZlbnRUeXBlKHMpWywgaGFuZGxlciBdLCBvcHRpb25zXSlcbiAgICAgICAgKi9cbiAgICAsIG9mZiA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlU3BlYywgZm4pIHtcbiAgICAgICAgdmFyIGlzVHlwZVN0ciA9IGlzU3RyaW5nKHR5cGVTcGVjKSxcbiAgICAgICAgICBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgICAgIHVzZUNhcHR1cmU6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgICwgb3B0cyA9IGJ1aWxkT3B0aW9ucyhkZWZhdWx0T3B0cywgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSlcbiAgICAgICAgICAsIGssIHR5cGUsIG5hbWVzcGFjZXMsIGlcblxuICAgICAgICBpZiAoaXNUeXBlU3RyICYmIHR5cGVTcGVjLmluZGV4T2YoJyAnKSA+IDApIHtcbiAgICAgICAgICAvLyBvZmYoZWwsICd0MSB0MiB0MycsIGZuKSBvciBvZmYoZWwsICd0MSB0MiB0MycpXG4gICAgICAgICAgdHlwZVNwZWMgPSBzdHIyYXJyKHR5cGVTcGVjKVxuICAgICAgICAgIGZvciAoaSA9IHR5cGVTcGVjLmxlbmd0aDsgaS0tOylcbiAgICAgICAgICAgIG9mZihlbGVtZW50LCB0eXBlU3BlY1tpXSwgZm4pXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgPSBpc1R5cGVTdHIgJiYgdHlwZVNwZWMucmVwbGFjZShuYW1lUmVnZXgsICcnKVxuICAgICAgICBpZiAodHlwZSAmJiBjdXN0b21FdmVudHNbdHlwZV0pIHR5cGUgPSBjdXN0b21FdmVudHNbdHlwZV0uYmFzZVxuXG4gICAgICAgIGlmICghdHlwZVNwZWMgfHwgaXNUeXBlU3RyKSB7XG4gICAgICAgICAgLy8gb2ZmKGVsKSBvciBvZmYoZWwsIHQxLm5zKSBvciBvZmYoZWwsIC5ucykgb3Igb2ZmKGVsLCAubnMxLm5zMi5uczMpXG4gICAgICAgICAgaWYgKG5hbWVzcGFjZXMgPSBpc1R5cGVTdHIgJiYgdHlwZVNwZWMucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKSBuYW1lc3BhY2VzID0gc3RyMmFycihuYW1lc3BhY2VzLCAnLicpXG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgdHlwZSwgZm4sIG5hbWVzcGFjZXMsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHR5cGVTcGVjKSkge1xuICAgICAgICAgIC8vIG9mZihlbCwgZm4pXG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgbnVsbCwgdHlwZVNwZWMsIG51bGwsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvZmYoZWwsIHsgdDE6IGZuMSwgdDIsIGZuMiB9KVxuICAgICAgICAgIGZvciAoayBpbiB0eXBlU3BlYykge1xuICAgICAgICAgICAgaWYgKHR5cGVTcGVjLmhhc093blByb3BlcnR5KGspKSBvZmYoZWxlbWVudCwgaywgdHlwZVNwZWNba10pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogb24oZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgc2VsZWN0b3JdLCBoYW5kbGVyWywgYXJncyBdLCBbb3B0aW9uc10pXG4gICAgICAgICovXG4gICAgLCBvbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50cywgc2VsZWN0b3IsIGZuKSB7XG4gICAgICAgIHZhciBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgICAgIHVzZUNhcHR1cmU6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbEZuLCB0eXBlLCB0eXBlcywgaSwgYXJncywgZW50cnksIGZpcnN0LCBvcHRzXG5cbiAgICAgICAgLy9UT0RPOiB0aGUgdW5kZWZpbmVkIGNoZWNrIG1lYW5zIHlvdSBjYW4ndCBwYXNzIGFuICdhcmdzJyBhcmd1bWVudCwgZml4IHRoaXMgcGVyaGFwcz9cbiAgICAgICAgaWYgKHNlbGVjdG9yID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGV2ZW50cyA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIC8vVE9ETzogdGhpcyBjYW4ndCBoYW5kbGUgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgICAgIGZvciAodHlwZSBpbiBldmVudHMpIHtcbiAgICAgICAgICAgIGlmIChldmVudHMuaGFzT3duUHJvcGVydHkodHlwZSkpIHtcbiAgICAgICAgICAgICAgb24uY2FsbCh0aGlzLCBlbGVtZW50LCB0eXBlLCBldmVudHNbdHlwZV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuICAgICAgICAgIC8vIGRlbGVnYXRlZCBldmVudFxuICAgICAgICAgIG9yaWdpbmFsRm4gPSBmblxuICAgICAgICAgIGFyZ3MgICAgICAgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgNClcbiAgICAgICAgICBmbiAgICAgICAgID0gZGVsZWdhdGUoc2VsZWN0b3IsIG9yaWdpbmFsRm4sIHNlbGVjdG9yRW5naW5lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFyZ3MgICAgICAgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMylcbiAgICAgICAgICBmbiAgICAgICAgID0gb3JpZ2luYWxGbiA9IHNlbGVjdG9yXG4gICAgICAgIH1cblxuICAgICAgICBvcHRzID0gYnVpbGRPcHRpb25zKGRlZmF1bHRPcHRzLCBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pXG4gICAgICAgIHR5cGVzID0gc3RyMmFycihldmVudHMpXG5cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBvbmUoKSwgd3JhcCBpbiBhIHNlbGYtcmVtb3ZpbmcgaGFuZGxlclxuICAgICAgICBpZiAodGhpcyA9PT0gT05FKSB7XG4gICAgICAgICAgZm4gPSBvbmNlKG9mZiwgZWxlbWVudCwgZXZlbnRzLCBmbiwgb3JpZ2luYWxGbilcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IHR5cGVzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgIC8vIGFkZCBuZXcgaGFuZGxlciB0byB0aGUgcmVnaXN0cnkgYW5kIGNoZWNrIGlmIGl0J3MgdGhlIGZpcnN0IGZvciB0aGlzIGVsZW1lbnQvdHlwZVxuICAgICAgICAgIGZpcnN0ID0gcmVnaXN0cnkucHV0KGVudHJ5ID0gbmV3IFJlZ0VudHJ5KFxuICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAsIHR5cGVzW2ldLnJlcGxhY2UobmFtZVJlZ2V4LCAnJykgLy8gZXZlbnQgdHlwZVxuICAgICAgICAgICAgLCBmblxuICAgICAgICAgICAgLCBvcmlnaW5hbEZuXG4gICAgICAgICAgICAsIHN0cjJhcnIodHlwZXNbaV0ucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpLCAnLicpIC8vIG5hbWVzcGFjZXNcbiAgICAgICAgICAgICwgYXJnc1xuICAgICAgICAgICAgLCBmYWxzZSAvLyBub3Qgcm9vdFxuICAgICAgICAgICkpXG4gICAgICAgICAgaWYgKGVudHJ5W2V2ZW50U3VwcG9ydF0gJiYgZmlyc3QpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IGV2ZW50IG9mIHRoaXMgdHlwZSBvbiB0aGlzIGVsZW1lbnQsIGFkZCByb290IGxpc3RlbmVyXG4gICAgICAgICAgICBsaXN0ZW5lcihlbGVtZW50LCBlbnRyeS5ldmVudFR5cGUsIHRydWUsIGVudHJ5LmN1c3RvbVR5cGUsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBhZGQoZWxlbWVudFssIHNlbGVjdG9yXSwgZXZlbnRUeXBlKHMpLCBoYW5kbGVyWywgYXJncyBdKVxuICAgICAgICAqXG4gICAgICAgICogRGVwcmVjYXRlZDoga2VwdCAoZm9yIG5vdykgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHlcbiAgICAgICAgKi9cbiAgICAsIGFkZCA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudHMsIGZuLCBkZWxmbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gb24uYXBwbHkoXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICAgLCAhaXNTdHJpbmcoZm4pXG4gICAgICAgICAgICAgID8gc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAgICAgICAgIDogWyBlbGVtZW50LCBmbiwgZXZlbnRzLCBkZWxmbiBdLmNvbmNhdChhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCA0KSA6IFtdKVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9uZShlbGVtZW50LCBldmVudFR5cGUocylbLCBzZWxlY3Rvcl0sIGhhbmRsZXJbLCBhcmdzIF0pXG4gICAgICAgICovXG4gICAgLCBvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvbi5hcHBseShPTkUsIGFyZ3VtZW50cylcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogZmlyZShlbGVtZW50LCBldmVudFR5cGUocylbLCBhcmdzIF0pXG4gICAgICAgICpcbiAgICAgICAgKiBUaGUgb3B0aW9uYWwgJ2FyZ3MnIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXksIGlmIG5vICdhcmdzJyBhcmd1bWVudCBpcyBwcm92aWRlZFxuICAgICAgICAqIHRoZW4gd2UgY2FuIHVzZSB0aGUgYnJvd3NlcidzIERPTSBldmVudCBzeXN0ZW0sIG90aGVyd2lzZSB3ZSB0cmlnZ2VyIGhhbmRsZXJzIG1hbnVhbGx5XG4gICAgICAgICovXG4gICAgLCBmaXJlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIHR5cGVzID0gc3RyMmFycih0eXBlKVxuICAgICAgICAgICwgaSwgaiwgbCwgbmFtZXMsIGhhbmRsZXJzXG5cbiAgICAgICAgZm9yIChpID0gdHlwZXMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgdHlwZSA9IHR5cGVzW2ldLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgICBpZiAobmFtZXMgPSB0eXBlc1tpXS5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpIG5hbWVzID0gc3RyMmFycihuYW1lcywgJy4nKVxuICAgICAgICAgIGlmICghbmFtZXMgJiYgIWFyZ3MgJiYgZWxlbWVudFtldmVudFN1cHBvcnRdKSB7XG4gICAgICAgICAgICBmaXJlTGlzdGVuZXIobmF0aXZlRXZlbnRzW3R5cGVdLCB0eXBlLCBlbGVtZW50KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBub24tbmF0aXZlIGV2ZW50LCBlaXRoZXIgYmVjYXVzZSBvZiBhIG5hbWVzcGFjZSwgYXJndW1lbnRzIG9yIGEgbm9uIERPTSBlbGVtZW50XG4gICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIGxpc3RlbmVycyBhbmQgbWFudWFsbHkgJ2ZpcmUnXG4gICAgICAgICAgICBoYW5kbGVycyA9IHJlZ2lzdHJ5LmdldChlbGVtZW50LCB0eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAgIGFyZ3MgPSBbZmFsc2VdLmNvbmNhdChhcmdzKVxuICAgICAgICAgICAgZm9yIChqID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaiA8IGw7IGorKykge1xuICAgICAgICAgICAgICBpZiAoaGFuZGxlcnNbal0uaW5OYW1lc3BhY2VzKG5hbWVzKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW2pdLmhhbmRsZXIuYXBwbHkoZWxlbWVudCwgYXJncylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBjbG9uZShkc3RFbGVtZW50LCBzcmNFbGVtZW50WywgZXZlbnRUeXBlIF0pXG4gICAgICAgICpcbiAgICAgICAgKiBUT0RPOiBwZXJoYXBzIGZvciBjb25zaXN0ZW5jeSB3ZSBzaG91bGQgYWxsb3cgdGhlIHNhbWUgZmxleGliaWxpdHkgaW4gdHlwZSBzcGVjaWZpZXJzP1xuICAgICAgICAqL1xuICAgICwgY2xvbmUgPSBmdW5jdGlvbiAoZWxlbWVudCwgZnJvbSwgdHlwZSkge1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZnJvbSwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCBsID0gaGFuZGxlcnMubGVuZ3RoXG4gICAgICAgICAgLCBpID0gMFxuICAgICAgICAgICwgYXJncywgYmVhbkRlbFxuXG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXJzW2ldLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICBhcmdzID0gWyBlbGVtZW50LCBoYW5kbGVyc1tpXS50eXBlIF1cbiAgICAgICAgICAgIGlmIChiZWFuRGVsID0gaGFuZGxlcnNbaV0uaGFuZGxlci5fX2JlYW5EZWwpIGFyZ3MucHVzaChiZWFuRGVsLnNlbGVjdG9yKVxuICAgICAgICAgICAgYXJncy5wdXNoKGhhbmRsZXJzW2ldLm9yaWdpbmFsKVxuICAgICAgICAgICAgb24uYXBwbHkobnVsbCwgYXJncylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICwgYmVhbiA9IHtcbiAgICAgICAgICAnb24nICAgICAgICAgICAgICAgIDogb25cbiAgICAgICAgLCAnYWRkJyAgICAgICAgICAgICAgIDogYWRkXG4gICAgICAgICwgJ29uZScgICAgICAgICAgICAgICA6IG9uZVxuICAgICAgICAsICdvZmYnICAgICAgICAgICAgICAgOiBvZmZcbiAgICAgICAgLCAncmVtb3ZlJyAgICAgICAgICAgIDogb2ZmXG4gICAgICAgICwgJ2Nsb25lJyAgICAgICAgICAgICA6IGNsb25lXG4gICAgICAgICwgJ2ZpcmUnICAgICAgICAgICAgICA6IGZpcmVcbiAgICAgICAgLCAnRXZlbnQnICAgICAgICAgICAgIDogRXZlbnRcbiAgICAgICAgLCAnc2V0U2VsZWN0b3JFbmdpbmUnIDogc2V0U2VsZWN0b3JFbmdpbmVcbiAgICAgICAgLCAnbm9Db25mbGljdCcgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29udGV4dFtuYW1lXSA9IG9sZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgLy8gZm9yIElFLCBjbGVhbiB1cCBvbiB1bmxvYWQgdG8gYXZvaWQgbGVha3NcbiAgaWYgKHdpbi5hdHRhY2hFdmVudCkge1xuICAgIHZhciBjbGVhbnVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGksIGVudHJpZXMgPSByZWdpc3RyeS5lbnRyaWVzKClcbiAgICAgIGZvciAoaSBpbiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyaWVzW2ldLnR5cGUgJiYgZW50cmllc1tpXS50eXBlICE9PSAndW5sb2FkJykgb2ZmKGVudHJpZXNbaV0uZWxlbWVudCwgZW50cmllc1tpXS50eXBlKVxuICAgICAgfVxuICAgICAgd2luLmRldGFjaEV2ZW50KCdvbnVubG9hZCcsIGNsZWFudXApXG4gICAgICB3aW4uQ29sbGVjdEdhcmJhZ2UgJiYgd2luLkNvbGxlY3RHYXJiYWdlKClcbiAgICB9XG4gICAgd2luLmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIGNsZWFudXApXG4gIH1cblxuICAvLyBpbml0aWFsaXplIHNlbGVjdG9yIGVuZ2luZSB0byBpbnRlcm5hbCBkZWZhdWx0IChxU0Egb3IgdGhyb3cgRXJyb3IpXG4gIHNldFNlbGVjdG9yRW5naW5lKClcblxuICByZXR1cm4gYmVhblxufSk7XG4iLCJyZXF1aXJlKCAnLi9saWIvc2hpbXMvY3VzdG9tLWV2ZW50JyApXG5cbnZhciBiZWFuID0gcmVxdWlyZSggJ2JlYW4nICksXG4gICAga2V5ICA9IHJlcXVpcmUoICdrZXltYXN0ZXInICksXG4gICAgYW5pbWF0aW9uRXZlbnQgICAgPSByZXF1aXJlKCAnLi9saWIvYW5pbWF0aW9uLWV2ZW50cycgKSxcbiAgICBhZnRlckFuaW1hdGlvbiAgICA9IHJlcXVpcmUoICcuL2xpYi9hZnRlci1hbmltYXRpb24nICksXG4gICAgcGFnZSAgICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvcGFnZScgKSxcbiAgICB0YXAgICAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi90YXAtZXZlbnRzJyApLFxuICAgIGRlYm91bmNlICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RlYm91bmNlJyApLFxuICAgIHRocm90dGxlICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3Rocm90dGxlJyApLFxuICAgIGRlbGF5ICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RlbGF5JyApLFxuICAgIHJlcGVhdCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3JlcGVhdCcgKSxcbiAgICBidWJibGVGb3JtRXZlbnRzICA9IHJlcXVpcmUoICcuL2xpYi9idWJibGUtZm9ybS1ldmVudHMnICksXG4gICAgc3VibWl0ICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvc3VibWl0JyApLFxuICAgIHNjcm9sbCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3Njcm9sbCcgKSxcbiAgICByZXNpemUgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9yZXNpemUnICksXG4gICAgY2FsbGJhY2tNYW5hZ2VyICAgPSByZXF1aXJlKCAnLi9saWIvY2FsbGJhY2stbWFuYWdlcicgKSxcbiAgICBtZWRpYSAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9tZWRpYScgKSxcblxuICAgIHNsaWNlICAgICAgICAgICAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLFxuICAgIGZvcm1CdWJibGluZyAgICAgID0gZmFsc2UsXG4gICAgd2F0Y2hBbmltYXRpb24gICAgPSB0cnVlXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8vIERPTSBldmVudHNcbiAgb246IG9uLFxuICBvZmY6IG9mZixcbiAgb25lOiBvbmUsXG4gIGZpcmU6IGZpcmUsXG4gIGNsb25lOiBiZWFuLmNsb25lLFxuICByZWFkeTogcGFnZS5yZWFkeSxcbiAgY2hhbmdlOiBwYWdlLmNoYW5nZSxcbiAgYWZ0ZXJBbmltYXRpb246IGFmdGVyQW5pbWF0aW9uLFxuICB3YXRjaEFuaW1hdGlvbjogd2F0Y2hBbmltYXRpb24sXG5cbiAgLy8gTWVkaWEgcXVlcnkgZXZlbnRzXG4gIG1lZGlhOiBtZWRpYSxcblxuICAvLyBLZXlib2FyZCBldmVudHNcbiAga2V5OiBrZXksXG4gIGtleU9uOiBrZXksXG4gIGtleU9mZjoga2V5LnVuYmluZCxcbiAga2V5T25lOiBrZXlPbmUsXG5cbiAgLy8gVGltaW5nIHV0aWxpdGllc1xuICBkZWJvdW5jZTogZGVib3VuY2UsXG4gIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgZGVsYXk6ICAgIGRlbGF5LFxuICByZXBlYXQ6ICAgcmVwZWF0LFxuXG4gIC8vIE9wdGltaXplZCBFdmVudCBNYW5hZ2Vyc1xuICBzY3JvbGw6ICAgICAgc2Nyb2xsLFxuICByZXNpemU6ICAgICAgcmVzaXplLFxuXG4gIGNhbGxiYWNrTWFuYWdlcjogY2FsbGJhY2tNYW5hZ2VyLFxuICBjYWxsYmFjazogY2FsbGJhY2tNYW5hZ2VyLmNhbGxiYWNrLFxuXG4gIC8vIEJ1YmJsaW5nIGZpeFxuICBidWJibGVGb3JtRXZlbnRzOiBidWJibGVGb3JtRXZlbnRzLFxuXG4gIHN1Ym1pdDogc3VibWl0XG59XG5cbnBhZ2UucmVhZHkoIGZ1bmN0aW9uKCkge1xuICBpZiAoIHdhdGNoQW5pbWF0aW9uICkgYWZ0ZXJBbmltYXRpb24ud2F0Y2goKVxufSlcblxuLy8gQmVhbiBkb2Vzbid0IGFjY291bnQgZm9yIGNyb3NzLWJyb3dzZXIgc3VwcG9ydCBvbiBhbmltYXRpb24gZXZlbnRzXG4vLyBTbyByYXRoZXIgdGhhbiBwYXNzIHRocm91Z2ggZXZlbnRzIHRvIGJlYW4sIHdlIHByb2Nlc3MgdGhlbSB0byBhZGRcbi8vIHZlbmRvciBwcmVmaXhlcyBvciByZW1vdmUgZXZlbnRzIGlmIGJyb3dzZXJzIGRvIG5vdCBzdXBwb3IgdGhlbVxuLy9cbmZ1bmN0aW9uIG9uICgpIHtcbiAgc2V0RXZlbnQoICdvbicsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIClcbn1cblxuZnVuY3Rpb24gb2ZmICgpIHtcbiAgc2V0RXZlbnQoICdvZmYnLCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG59XG5cbmZ1bmN0aW9uIG9uZSAoKSB7XG4gIHNldEV2ZW50KCAnb25lJywgc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxufVxuXG5mdW5jdGlvbiBmaXJlICgpIHtcblxuICBhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzIClcbiAgdmFyIGVsID0gYXJnc1swXVxuICB2YXIgZXZlbnRzID0gW11cblxuICBhcmdzWzFdLnNwbGl0KCcgJykuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50ICkge1xuXG4gICAgdmFyIGV2ZW50ID0gYW5pbWF0aW9uRXZlbnQudHJhbnNmb3JtKCBldmVudCApXG4gICAgaWYgKCAhaXNFbXB0eSggZXZlbnQgKSApIGV2ZW50cy5wdXNoKCBldmVudCApXG5cbiAgfSlcblxuICBpZiAoICFpc0VtcHR5KCBldmVudHMgKSApIHtcblxuICAgIGFyZ3NbMV0gPSBldmVudHMuam9pbiggJyAnIClcbiAgICBiZWFuLmZpcmUuYXBwbHkoIHRoaXMsIGFyZ3MgKVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RXZlbnQoIHJlZ2lzdGVyVHlwZSwgYXJncyApIHtcbiAgdHJhbnNmb3JtQXJncyggYXJncyApLmZvckVhY2goIGZ1bmN0aW9uKCBhcmcgKSB7XG4gICAgYmVhblsgcmVnaXN0ZXJUeXBlIF0uYXBwbHkoIG51bGwsIGFyZyApXG4gIH0pXG5cbn1cblxuLy8gQWRkIHN1cHBvcnQgZm9yIHVuYmluZGluZyBhIGtleSBldmVudCBhZnRlciBpdCBpcyBjYWxsZWRcbi8vXG5mdW5jdGlvbiBrZXlPbmUgKCBrZXlzLCBzY29wZSwgZm4gKSB7XG5cbiAgaWYgKCB0eXBlb2Ygc2NvcGUgPT0gJ2Z1bmN0aW9uJyApIHtcbiAgICBmbiA9IHNjb3BlXG4gICAgc2NvcGUgPSAnYWxsJ1xuICB9XG5cbiAga2V5KCBrZXlzLCBzY29wZSwgZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIGtleS51bmJpbmQoIGtleXMsIHNjb3BlIClcbiAgICBmbiggZXZlbnQgKVxuICB9KVxufVxuXG4vLyBUcmFuc2Zvcm0gZXZlbnQgYXJndW1lbnRzIHRvIGhhbmRsZSB0YXAgZXZlbnQgYW5kIGNyb3NzLWJyb3dzZXIgYW5pbWF0aW9uIGV2ZW50c1xuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBldmVudHMgdG8gYmUgcmVnaXN0ZXJlZCBpbmRpdmlkdWFsbHlcbi8vXG5mdW5jdGlvbiB0cmFuc2Zvcm1BcmdzKCBhcmdzICkge1xuXG4gIHZhciB0cmFuc2Zvcm1lZEFyZ3MgPSBbXVxuICB2YXIgbmV3RXZlbnRzID0ge31cbiAgdmFyIGVsZW1lbnQgPSBhcmdzLnNoaWZ0KCkgLy8gcmV0cmlldmUgZWxlbWVudFxuICB2YXIgZXZlbnRzID0gYXJncy5zaGlmdCgpXG5cbiAgLy8gZGV0ZWN0IGV2ZW50IGRlbGVnYXRlIHNlbGVjdG9yXG4gIGlmICggdHlwZW9mIGFyZ3NbMF0gIT0gJ2Z1bmN0aW9uJyApIHtcbiAgICB2YXIgZGVsZWdhdGUgPSBhcmdzLnNoaWZ0KClcbiAgfVxuXG4gIC8vIGNvbnZlcnQgZXZlbnQgc3RyaW5ncyB0byBvYmplY3QgYmFzZWQgZXZlbnRzIGZvciBjb2RlIHNpbXBsaWZpY2F0aW9uXG4gIC8vIGV4YW1wbGU6IGFyZ3VtZW50cyAoJ2hvdmVyIGZvY3VzJywgZnVuY3Rpb24pIHdvdWxkIGJlY29tZSAoeyAnaG92ZXIgZm9jdXMnOiBmdW5jdGlvbiB9KVxuICBpZiAoIHR5cGVvZiBldmVudHMgPT0gJ3N0cmluZycgKSB7XG4gICAgdmFyIG9iakV2ZW50cyA9IHt9XG4gICAgb2JqRXZlbnRzW2V2ZW50c10gPSBhcmdzLnNoaWZ0KClcbiAgICBldmVudHMgPSBvYmpFdmVudHNcbiAgfVxuXG4gIC8vIFdhbGsgdGhyb3VnaCBlYWNoIGtleSBpbiB0aGUgZXZlbnRzIG9iamVjdCBhbmQgYWRkIHZlbmRvciBwcmVmaXhlcyB0byAnYW5pbWF0aW9uJyBldmVudHNcbiAgLy8gYW5kIHdyYXAgY2FsbGJhY2sgaW4gdGhlIHRhcCBmdW5jdGlvbiBmb3IgYWxsICd0YXAnIGV2ZW50cy5cbiAgLy9cblxuICBPYmplY3Qua2V5cyggZXZlbnRzICkuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIHZhciBjYWxsYmFjayA9IGV2ZW50c1tldmVudF1cblxuICAgIC8vIEV2ZW50cyBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBzcGFjZSBzZXBhcmF0ZWQgZ3JvdXBzIGxpa2UgXCJob3ZlciBmb2N1c1wiXG4gICAgLy8gVGhpcyBoYW5kbGVzIGVhY2ggZXZlbnQgaW5kZXBlbmRhbnRseVxuICAgIC8vXG4gICAgZXZlbnQuc3BsaXQoJyAnKS5mb3JFYWNoKCBmdW5jdGlvbiggZSApe1xuXG4gICAgICAvLyBJZiBpdCBpcyBhbiBhbmltYXRpb24gZXZlbnQsIHZlbmRvciBwcmVmaXggaXQsIG9yIGZpcmUgdGhlIGNhbGxiYWNrIGFjY29yZGluZyB0byBicm93c2VyIHN1cHBvcnRcbiAgICAgIGUgPSBhbmltYXRpb25FdmVudC50cmFuc2Zvcm0oIGUgKVxuXG4gICAgICBpZiAoIGlzRW1wdHkoIGUgKSApIHtcbiAgICAgICAgLy8gSWYgaXQncyBlbXB0eSwgaXQgaGFzIGJlZW4gcmVtb3ZlZCBzaW5jZSBhbmltYXRpb24gZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHRyaWdnZXIgdGhlIGV2ZW50IGltbWVkaWF0ZWx5XG4gICAgICAgIGNhbGxiYWNrKClcblxuICAgICAgfSBlbHNlIGlmICggZS5tYXRjaCggL3RhcC8gKSApIHtcblxuICAgICAgICAvLyBJZiBpdCdzIGEgdGFwIGV2ZW50LCB3cmFwIHRoZSBjYWxsYmFjayBhbmQgc2V0IHRoZSBldmVudCB0byAndG91Y2hzdGFydCdcbiAgICAgICAgLy8gVGFwIGlzbid0IGEgcmVhbCBuYXRpdmUgZXZlbnQsIGJ1dCB0aGlzIHdyYXBwZXIgbGV0cyB1cyBzaW11bGF0ZSB3aGF0IGFcbiAgICAgICAgLy8gbmF0aXZlIHRhcCBldmVudCB3b3VsZCBiZS5cbiAgICAgICAgLy9cbiAgICAgICAgbmV3RXZlbnRzLnRvdWNoc3RhcnQgPSB0YXAoIGNhbGxiYWNrIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0V2ZW50c1sgZSBdID0gY2FsbGJhY2tcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIE9iamVjdC5rZXlzKCBuZXdFdmVudHMgKS5mb3JFYWNoKCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgdmFyIGEgPSBbXVxuICAgIGEucHVzaCggZWxlbWVudCwgZXZlbnQgKVxuXG4gICAgaWYgKCBkZWxlZ2F0ZSApIGEucHVzaCggZGVsZWdhdGUgKVxuXG4gICAgYS5wdXNoKCBuZXdFdmVudHNbIGV2ZW50IF0gKVxuICAgIHRyYW5zZm9ybWVkQXJncy5wdXNoKCBhLmNvbmNhdCggYXJncyApIClcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRBcmdzXG59XG5cblxuZnVuY3Rpb24gaXNFbXB0eSggb2JqICkge1xuXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuICBpZiAoIG9iaiA9PSBudWxsIHx8IG9iai5sZW5ndGggPT09IDAgKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICggMCA8IG9iai5sZW5ndGggKSByZXR1cm4gZmFsc2VcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCBoYXNPd25Qcm9wZXJ0eS5jYWxsKCBvYmosIGtleSApICkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsInZhciBFdmVudCAgICAgPSByZXF1aXJlKCAnYmVhbicgKSxcbiAgICBkZWxheSAgICAgPSByZXF1aXJlKCAnLi9kZWxheScgKSxcbiAgICBzdXBwb3J0ZWQgPSByZXF1aXJlKCAnLi9hbmltYXRpb24tZXZlbnRzJyApLnN1cHBvcnRlZFxuXG5mdW5jdGlvbiBhbmltYXRpb25EdXJhdGlvbiggZWwgKSB7XG4gIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZWwgKS5nZXRQcm9wZXJ0eVZhbHVlKCAnYW5pbWF0aW9uLWR1cmF0aW9uJyApXG59XG5cbi8vIFdhdGNoZXMgYWxsIGRvY3VtZW50IGFuaW1hdGlvbiBhZGQgYWRkIGRhdGEgYXR0cmlidXRlcyB0byBlbGVtZW50cyB3aGVuIHRoZXkgYmVnaW5cbi8vIFRoaXMgZW5hYmxlcyBhbmltYXRpb25FbmQgdG8gd2F0Y2ggYW5pbWF0aW9ucyB3aGljaCBoYXZlbid0IGJlZ3VuXG5mdW5jdGlvbiB3YXRjaEFuaW1hdGlvbigpIHtcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnYW5pbWF0aW9uc3RhcnQnLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgZXZlbnQudGFyZ2V0LmRhdGFzZXQuaXNBbmltYXRpbmcgPSB0cnVlXG4gIH0pXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2FuaW1hdGlvbmVuZCcsIGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICBldmVudC50YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWlzLWFuaW1hdGluZycpXG4gIH0pXG59XG5cbi8vIFRoaXMgcmVxdWlyZXMgdHJhY2tFbGVtZW50QW5pbWF0aW9uIHRvIGJlIGVuYWJsZWRcbmZ1bmN0aW9uIGFmdGVyQW5pbWF0aW9uKCBlbCwgY2FsbGJhY2ssIHN0YXJ0VGltZW91dCApIHtcbiAgLy8gQW5pbWF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIGp1c3QgdHJpZ2dlciB0aGUgY2FsbGJhY2tcbiAgaWYgKCAhc3VwcG9ydGVkICkgcmV0dXJuIGNhbGxiYWNrKClcblxuICAvLyBBbmltYXRpb24gaGFzIGFscmVhZHkgYmVndW5cbiAgaWYgKCBlbC5kYXRhc2V0LmlzQW5pbWF0aW5nIHx8IGVsLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1pcy1hbmltYXRpbmddJyApICkge1xuXG4gICAgLy8gV2F0Y2ggZm9yIGVuZFxuICAgIEV2ZW50Lm9uZSggZWwsICdhbmltYXRpb25lbmQnLCBjYWxsYmFjayApXG5cbiAgLy8gQW5pbWF0aW9uIGhhcyBub3QgeWV0IGJlZ3VuIHNv4oCmXG4gIH0gZWxzZSB7XG5cbiAgICAvLyBzdGFydFRpbWVvdXQgaXMgbWVhbnQgdG8gZW5zdXJlIHRoYXQgYSBjYWxsYmFjayBpcyBmaXJlZCBldmVuIGlmIFxuICAgIC8vIGFuIGFuaW1hdGlvbiBldmVudCwgb3IgaW4gdGhlIGNhc2UgdGhhdCBhbiBhbmltYXRpb24gZXZlbnQgaXMgbmV2ZXIgdHJpZ2dlcmVkXG4gICAgLy8gdGhpcyBtaWdodCBoYXBwZW4gaWYgYSB1c2VyIHdhbnRzIHRvIGZpcmUgYSBjYWxsYWNrIGFmdGVyIGFuIGVsZW1lbnQgYW5pbWF0ZXNcbiAgICAvLyBvciBmaXJlIHRoZSBjYWxsYmFjayBhbnl3YXkgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGFuaW1hdGlvbi5cbiAgICBpZiAoIHN0YXJ0VGltZW91dCApIHtcblxuICAgICAgLy8gU2V0IGEgZGVmYXVsdCB0aW1lb3V0IChhbGxvd2luZyBzdGFydFRpbWVvdXQgPT0gdHJ1ZSBvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsaXNlY29ucylcbiAgICAgIHZhciB0aW1lID0gKCh0eXBlb2Ygc3RhcnRUaW1lb3V0ID09IFwibnVtYmVyXCIpID8gc3RhcnRUaW1lb3V0IDogMzIpIC8vIDMybXM6IH4gdHdvIGZyYW1lcyBvZiBhbmltYXRpb24gZ3JhY2UgcGVyaW9kXG5cbiAgICAgIHZhciBkZWxheWVkRXZlbnQgPSBkZWxheSggZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFN0b3Agd2F0Y2hpbmcgZm9yIGFuaW1hdGlvbiB0byBzdGFydFxuICAgICAgICAvLyBXaHk/IC0gSWYgdGhlIGFuaW1hdGlvbiBzdGFydHMgbGF0ZXIsIHRoZSBjYWxsYmFjayB3aWxsIGZpcmUgdHdpY2VcbiAgICAgICAgRXZlbnQub2ZmKCBlbCwgJ2FuaW1hdGlvbnN0YXJ0Jywgd2F0Y2hFbmRFdmVudCApIFxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9LCB0aW1lIClcbiAgICB9XG5cbiAgICAvLyBOZXh0OlxuICAgIC8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYXR0YWNoIGNhbGxiYWNrIHRvIGFuaW1hdGlvbkVuZCBldmVudFxuICAgIGZ1bmN0aW9uIHdhdGNoRW5kRXZlbnQgKCkge1xuICAgICAgaWYgKCBzdGFydFRpbWVvdXQgKSBkZWxheWVkRXZlbnQuc3RvcCgpICAgIC8vIGNhbmNlbCBkZWxheWVkIGZpcmVcbiAgICAgIEV2ZW50Lm9uZSggZWwsICdhbmltYXRpb25lbmQnLCBjYWxsYmFjayApIC8vIHdhdGNoIGZvciBhbmltYXRpb24gdG8gZmluaXNoXG4gICAgfVxuICAgIFxuICAgIC8vIEZpbmFsbHksIHdoZW4gdGhlIGFuaW1hdGlvbiBkb2VzIHN0YXJ0LCB3YXRjaCBmb3IgaXRzIGVuZFxuICAgIEV2ZW50Lm9uZSggZWwsICdhbmltYXRpb25zdGFydCcsIHdhdGNoRW5kRXZlbnQgKVxuICB9XG59XG5cbmFmdGVyQW5pbWF0aW9uLndhdGNoID0gd2F0Y2hBbmltYXRpb25cblxubW9kdWxlLmV4cG9ydHMgPSBhZnRlckFuaW1hdGlvblxuIiwidmFyIGNzc0FuaW1FdmVudFR5cGVzID0gZ2V0QW5pbWF0aW9uRXZlbnRUeXBlcygpXG52YXIgc3VwcG9ydGVkICAgICAgICAgPSBjc3NBbmltRXZlbnRUeXBlcy5hbmltYXRpb25zdGFydCAhPT0gdW5kZWZpbmVkXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB0cmFuc2Zvcm06IHRyYW5zZm9ybUFuaW1hdGlvbkV2ZW50cyxcbiAgc3VwcG9ydGVkOiBzdXBwb3J0ZWRcbn1cblxuZnVuY3Rpb24gY2FtZWxDYXNlRXZlbnRUeXBlcyhwcmVmaXgpIHtcbiAgcHJlZml4ID0gcHJlZml4IHx8ICcnO1xuXG4gIHJldHVybiB7XG4gICAgYW5pbWF0aW9uc3RhcnQ6IHByZWZpeCArICdBbmltYXRpb25TdGFydCcsXG4gICAgYW5pbWF0aW9uZW5kOiBwcmVmaXggKyAnQW5pbWF0aW9uRW5kJyxcbiAgICBhbmltYXRpb25pdGVyYXRpb246IHByZWZpeCArICdBbmltYXRpb25JdGVyYXRpb24nXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZUV2ZW50VHlwZXMocHJlZml4KSB7XG4gIHByZWZpeCA9IHByZWZpeCB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGFuaW1hdGlvbnN0YXJ0OiBwcmVmaXggKyAnYW5pbWF0aW9uc3RhcnQnLFxuICAgIGFuaW1hdGlvbmVuZDogcHJlZml4ICsgJ2FuaW1hdGlvbmVuZCcsXG4gICAgYW5pbWF0aW9uaXRlcmF0aW9uOiBwcmVmaXggKyAnYW5pbWF0aW9uaXRlcmF0aW9uJ1xuICB9O1xufVxuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gQW5pbWF0aW9uIGV2ZW50IHR5cGVzIHthbmltYXRpb25zdGFydCwgYW5pbWF0aW9uZW5kLCBhbmltYXRpb25pdGVyYXRpb259XG4gKi9cblxuZnVuY3Rpb24gZ2V0QW5pbWF0aW9uRXZlbnRUeXBlcygpIHtcbiAgaWYgKCAhZG9jdW1lbnQgKSByZXR1cm4ge31cblxuICB2YXIgcHJlZml4ZXMgPSBbJ3dlYmtpdCcsICdNb3onLCAnTycsICcnXTtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG4gIC8vIGJyb3dzZXIgY29tcGxpYW50XG4gIGlmICh1bmRlZmluZWQgIT09IHN0eWxlLmFuaW1hdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcygpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHByZWZpeGVzLmxlbmd0aCwgcHJlZml4OyBpIDwgbGVuOyBpKyspIHtcbiAgICBwcmVmaXggPSBwcmVmaXhlc1tpXTtcblxuICAgIGlmICh1bmRlZmluZWQgIT09IHN0eWxlW3ByZWZpeCArICdBbmltYXRpb25OYW1lJ10pIHtcbiAgICAgIC8vIFdlYmtpdFxuICAgICAgaWYgKDAgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZUV2ZW50VHlwZXMocHJlZml4LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZWxzZSBpZiAoMSA9PT0gaSkge1xuICAgICAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcygpO1xuICAgICAgfVxuICAgICAgLy8gT3BlcmFcbiAgICAgIGVsc2UgaWYgKDIgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyQ2FzZUV2ZW50VHlwZXMocHJlZml4LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuXG4vLyBBZGRzIG5lY2Vzc2FyeSBhZGQgdmVuZG9yIHByZWZpeGVzIG9yIGNhbWVsQ2FzZWQgZXZlbnQgbmFtZXNcbi8vXG5mdW5jdGlvbiB0cmFuc2Zvcm1BbmltYXRpb25FdmVudHMgKGV2ZW50KSB7XG4gIGlmICghZXZlbnQubWF0Y2goL2FuaW1hdGlvbi9pKSkge1xuICAgIHJldHVybiBldmVudFxuICB9IGVsc2Uge1xuICAgIGlmIChjc3NBbmltRXZlbnRUeXBlc1tldmVudF0pIHtcbiAgICAgIHJldHVybiBjc3NBbmltRXZlbnRUeXBlc1tldmVudF1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYod2luZG93LmVudiAhPSAndGVzdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignXCInICsgZXZlbnQgKyAnXCIgaXMgbm90IGEgc3VwcG9ydGVkIGFuaW1hdGlvbiBldmVudCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cbn1cbiIsInZhciBFdmVudCA9IHJlcXVpcmUoICdiZWFuJyApLFxuICAgIHBhZ2UgID0gcmVxdWlyZSggJy4vcGFnZScgKSxcbiAgICBmb3JtRWxzO1xuXG52YXIgZm9ybUJ1YmJsaW5nID0gZmFsc2VcblxudmFyIGZpcmVCdWJibGUgPSBmdW5jdGlvbiAoIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50LmRldGFpbCAmJiBldmVudC5kZXRhaWwudHJpZ2dlcmVkICkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIHZhciBldiA9IG5ldyBDdXN0b21FdmVudCggZXZlbnQudHlwZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IHsgdHJpZ2dlcmVkOiB0cnVlIH0gfSApXG5cbiAgLy8gU3RvcCBvbmx5ICdzdWJtaXQnIGV2ZW50cy4gU3RvcHBpbmcgYmx1ciBvciBmb3VjcyBldmVudHMgc2VlbXMgdG8gYnJlYWsgRmlyZUZveCBpbnB1dCBpbnRlcmFjdGlvbnMuXG4gIGlmICggZXZlbnQudHlwZSA9PSAnc3VibWl0JyApIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgZXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQoIGV2IClcblxuICAvLyBQcmV2ZW50IGRlZmF1bHQgb24gb3JpZ2luYWwgZXZlbnQgaWYgY3VzdG9tIGV2ZW50IGlzIHByZXZlbnRlZFxuICBpZiAoIGV2LmRlZmF1bHRQcmV2ZW50ZWQgKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpIFxufVxuXG4vLyBTaW1wbGlmeSBzZXR0aW5nIHRoZSBldmVudCB0eXBlIGJhc2VkIG9uIHRoZSBlbGVtZW50XG52YXIgZXZlbnRUeXBlID0gZnVuY3Rpb24gKCBlbCApIHtcbiAgcmV0dXJuICggZWwudGFnTmFtZSA9PSAnRk9STScgKSA/ICdzdWJtaXQnIDogJ2ZvY3VzIGJsdXInXG59XG5cbi8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbnZhciBidWJibGVPbiA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIEV2ZW50Lm9uKCBlbCwgZXZlbnRUeXBlKCBlbCApLCBmaXJlQnViYmxlIClcbn1cblxuLy8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xudmFyIGJ1YmJsZU9mZiA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIEV2ZW50Lm9mZiggZWwsIGV2ZW50VHlwZSggZWwgKSwgZmlyZUJ1YmJsZSApXG59XG5cbi8vIEFkZC9SZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG52YXIgYnViYmxlRm9ybUV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCBmb3JtQnViYmxpbmcgKSB7IHJldHVybiB9IFxuICBwYWdlLmNoYW5nZSggZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIGZyb20gcHJldmlvdXMgcGFnZVxuICAgIGlmICggZm9ybUVscyApIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGZvcm1FbHMsIGJ1YmJsZU9mZiApXG5cbiAgICAvLyBBZGQgbmV3IGxpc3RlbmVycyB0byB0aGlzIHBhZ2VcbiAgICBmb3JtRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2Zvcm0sIGlucHV0JyApXG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBmb3JtRWxzLCBidWJibGVPbiApXG4gIH0pXG5cbiAgdmFyIGZvcm1CdWJibGluZyA9IHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBidWJibGVGb3JtRXZlbnRzXG4iLCJ2YXIgTWFuYWdlciA9IHtcbiAgbmV3OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbWFuYWdlciA9IHtcblxuICAgICAgY2FsbGJhY2tzOiBbXSxcblxuICAgICAgYWRkOiBmdW5jdGlvbiggZm4gKSB7XG5cbiAgICAgICAgdmFyIGNiID0gTWFuYWdlci5jYWxsYmFjay5uZXcoIGZuIClcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MucHVzaCggY2IgKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGNiXG5cbiAgICAgIH0sXG5cbiAgICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggY2IgKSB7IGNiLnN0b3AoKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi5zdGFydCgpIH0gKVxuICAgICAgfSxcblxuICAgICAgdG9nZ2xlOiBmdW5jdGlvbiggYm9vbCApIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi50b2dnbGUoIGJvb2wgKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzID0gW11cbiAgICAgIH0sXG5cbiAgICAgIGZpcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKVxuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggZm4gKSB7IGZuLmFwcGx5KCB0aGlzLCBhcmdzICkgfSApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hbmFnZXJcbiAgfSxcblxuICBjYWxsYmFjazoge1xuICAgIG5ldzogZnVuY3Rpb24oIGZuICkge1xuICAgICAgdmFyIGNiID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICggY2IuZW5hYmxlZCApIHsgZm4uYXBwbHkoIGZuLCBhcmd1bWVudHMgKSB9XG4gICAgICB9XG5cbiAgICAgIGNiLnN0b3AgICA9IGZ1bmN0aW9uKCkgeyBjYi5lbmFibGVkID0gZmFsc2UgfVxuICAgICAgY2Iuc3RhcnQgID0gZnVuY3Rpb24oKSB7IGNiLmVuYWJsZWQgPSB0cnVlIH1cbiAgICAgIGNiLnRvZ2dsZSA9IGZ1bmN0aW9uKCBib29sICkge1xuICAgICAgICBjYi5lbmFibGVkID0gKCAwIGluIGFyZ3VtZW50cyApID8gYm9vbCA6ICFjYi5lbmFibGVkXG4gICAgICB9XG4gICAgICBjYi5lbmFibGVkID0gdHJ1ZVxuXG4gICAgICByZXR1cm4gY2JcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNYW5hZ2VyXG4iLCJ2YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBEYXRlLm5vdygpXG59XG5cbnZhciBwaWNrRnVuY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGZvdW5kXG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGNhbmRpZGF0ZSApIHtcbiAgICBpZiAoIHR5cGVvZiggY2FuZGlkYXRlICkgPT0gJ2Z1bmN0aW9uJyAmJiAhZm91bmQgKSB7IGZvdW5kID0gY2FuZGlkYXRlIH1cbiAgfSlcblxuICByZXR1cm4gZm91bmRcbn1cblxudmFyIGRlYm91bmNlID0gZnVuY3Rpb24oIGZuLCB3YWl0LCBvcHRpb25zICkge1xuXG4gIC8vIEFsbG93IG9wdGlvbnMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudFxuICBpZiAoIHR5cGVvZiggZm4gKSA9PSAnb2JqZWN0JyApIHsgb3B0aW9ucyA9IGZuIH0gXG5cbiAgLy8gT3B0aW9ucyB3b24ndCBiZSBudWxsXG4gIGVsc2UgeyBvcHRpb25zID0gb3B0aW9ucyB8fCB7fSB9XG5cbiAgd2FpdCA9IG9wdGlvbnMud2FpdCB8fCB3YWl0IHx8IDBcblxuICB2YXIgbWF4ICAgICAgICAgICAgPSBvcHRpb25zLm1heCB8fCBmYWxzZSxcbiAgICAgIGxlYWRpbmcgICAgICAgID0gKCAoICdsZWFkaW5nJyAgaW4gb3B0aW9ucyApID8gb3B0aW9ucy5sZWFkaW5nICA6IGZhbHNlICksXG4gICAgICB0cmFpbGluZyAgICAgICA9ICggKCAndHJhaWxpbmcnIGluIG9wdGlvbnMgKSA/IG9wdGlvbnMudHJhaWxpbmcgOiB0cnVlICksXG4gICAgICBcbiAgICAgIC8vIEdyYWIgZnVuY3Rpb25zIGZyb20gb3B0aW9ucyBvciBkZWZhdWx0IHRvIGZpcnN0IGFyZ3VtZW50XG4gICAgICBsZWFkaW5nRm4gICAgICA9IHBpY2tGdW5jdGlvbiggb3B0aW9ucy5sZWFkaW5nLCBvcHRpb25zLnRyYWlsaW5nLCBvcHRpb25zLmNhbGxiYWNrLCBmbiApLFxuICAgICAgdHJhaWxpbmdGbiAgICAgPSBwaWNrRnVuY3Rpb24oIG9wdGlvbnMudHJhaWxpbmcsIG9wdGlvbnMubGVhZGluZywgb3B0aW9ucy5jYWxsYmFjaywgZm4gKSxcblxuICAgICAgLy8gU3RhdGUgdHJhY2tpbmcgdmFyc1xuICAgICAgYXJncywgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGVib3VuY2VkIGNhbGxiYWNrXG4gICAgICBxdWV1ZWQgICAgICAgICA9IGZhbHNlLCAgLy8gSGFzIGEgY2FsbGJhY2sgYmVlbiBhZGRlZCB0byB0aGUgYW5pbWF0aW9uIGxvb3A/XG4gICAgICBoYW5kbGUgICAgICAgICA9IHt9LCAgICAgLy8gT2JqZWN0IGZvciB0cmFja2luZyBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrc1xuICAgICAgbGFzdENhbGxlZCAgICAgPSAwLCAgICAgIC8vIEtlZXAgYSB0aW1lciBmb3IgZGVib3VuY2luZ1xuICAgICAgbGFzdEludm9rZWQgICAgPSAwLCAgICAgIC8vIEtlZXAgYSB0aW1lciBmb3IgbWF4XG4gICAgICBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlOyAgLy8gVHJhY2sgbGVhZGluZywgdGhyb3R0bGluZyBzdWJzZXF1ZW50IGxlYWRpbmcgY2FsbHNcblxuICAvLyBRdWV1ZSB0aGUgZnVuY3Rpb24gd2l0aCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgdmFyIGludm9rZSA9IGZ1bmN0aW9uKCBjYWxsVHlwZSApIHtcblxuICAgIGxhc3RDYWxsZWQgPSBub3coKVxuICAgIGxhc3RJbnZva2VkID0gbm93KClcbiAgICBxdWV1ZWQgPSBmYWxzZVxuICAgIGxlYWRpbmdCbG9ja2VkID0gdHJ1ZVxuXG4gICAgaWYgKCBjYWxsVHlwZSA9PT0gJ2xlYWRpbmcnICkge1xuICAgICAgbGVhZGluZ0ZuLmFwcGx5KCBsZWFkaW5nRm4sIGFyZ3MgKSB9XG4gICAgZWxzZSB7XG4gICAgICB0cmFpbGluZ0ZuLmFwcGx5KCB0cmFpbGluZ0ZuLCBhcmdzICkgfVxuXG4gIH1cblxuICAvLyBMb2FkIHRoZSBsb29wIGludG8gdGhlIGFuaW1hdGlvbiBxdWV1ZVxuICB2YXIgYWRkVG9RdWV1ZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICggIXF1ZXVlZCApIHtcbiAgICAgIHF1ZXVlZCA9IHRydWVcbiAgICAgIGhhbmRsZS52YWx1ZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSggbG9vcCApICAvLyBBZGQgdG8gYnJvd3NlcidzIGFuaW1hdGlvbiBxdWV1ZVxuICAgIH1cblxuICB9XG5cbiAgLy8gUmVtb3ZlIGZyb20gYW5pbWF0aW9uIHF1ZXVlIGFuZCByZXNldCBkZWJvdW5jZSBcbiAgdmFyIHJlbW92ZUZyb21RdWV1ZSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgaWYgKCBcInZhbHVlXCIgaW4gaGFuZGxlICkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoIGhhbmRsZS52YWx1ZSApXG4gICAgICBxdWV1ZWQgICAgICAgICA9IGZhbHNlXG4gICAgICBsYXN0Q2FsbGVkICAgICA9IDBcbiAgICAgIGxhc3RJbnZva2VkICAgID0gMFxuICAgICAgbGVhZGluZ0Jsb2NrZWQgPSBmYWxzZVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIC8vIHByZXZlbnQgaW5maW5pdGUgZGVib3VuY2luZyAoIGlmIG9wdGlvbnMubWF4IGlzIHNldCApXG4gIHZhciBtYXhQYXNzZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKCBtYXggJiYgbm93KCkgLSBsYXN0SW52b2tlZCA+PSBtYXggKVxuICB9XG5cbiAgdmFyIHdhaXRSZWFjaGVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICggbm93KCkgLSBsYXN0Q2FsbGVkICkgPj0gd2FpdFxuICB9XG5cbiAgLy8gVGhpcyBnZXRzIGxvYWRlZCBpbnRvIHRoZSBhbmltYXRpb24gcXVldWUgYW5kIGRldGVybWluZXMgd2hldGhlciB0byBpdm9rZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCkge1xuICBcbiAgICAvLyBMb29wIHdhcyBleGVjdXRlZCBzbyBpdCdzIG5vIGxvbmdlciBpbiB0aGUgYW5pbWF0aW9uIHF1ZXVlXG4gICAgcXVldWVkID0gZmFsc2VcbiAgICBcbiAgICBpZiAoIGxlYWRpbmcgJiYgIWxlYWRpbmdCbG9ja2VkICkge1xuICAgICAgaW52b2tlKCAnbGVhZGluZycgKVxuICAgIH1cblxuICAgIC8vIElmIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCB0byBmcmVxdWVudGx5IHRvIGV4ZWN1dGVcbiAgICBlbHNlIGlmICggbWF4UGFzc2VkKCkgKSB7XG5cbiAgICAgIGlmICggbGVhZGluZyApIHsgaW52b2tlKCAnbGVhZGluZycgKSAgfVxuICAgICAgZWxzZSAgICAgICAgICAgeyBpbnZva2UoICd0cmFpbGluZycgKSB9XG5cbiAgICB9IFxuICAgIFxuICAgIC8vIElmIGZ1bmN0aW9uIGhhc24ndCBiZWVuIGNhbGxlZCBzaW5jZSBsYXN0IHdhaXRcbiAgICBlbHNlIGlmICggd2FpdFJlYWNoZWQoKSApIHtcblxuICAgICAgLy8gSWYgdHJhaWxpbmcgaXQncyBzYWZlIHRvIGludm9rZVxuICAgICAgaWYgKCB0cmFpbGluZyApIHsgaW52b2tlKCAndHJhaWxpbmcnICkgfVxuXG4gICAgICAvLyBJZiBsZWFkaW5nLCBpdCdzIHNhZmUgdG8gcmVtb3ZlIGJsb2NrXG4gICAgICBpZiAoIGxlYWRpbmcgKSAgeyBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlIH1cbiAgICAgXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFRvUXVldWUoKVxuICAgIH1cblxuICB9XG5cbiAgLy8gQSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBxdWV1ZWluZyB1cCBmdW5jdGlvbiBjYWxsc1xuICAvL1xuICB2YXIgZGVib3VuY2VkID0gZnVuY3Rpb24oKSB7XG4gICAgbGFzdENhbGxlZCA9IG5vdygpXG4gICAgYXJncyA9IGFyZ3VtZW50c1xuICAgIGFkZFRvUXVldWUoKVxuICB9XG5cbiAgZGVib3VuY2VkLnN0b3AgPSByZW1vdmVGcm9tUXVldWVcblxuICByZXR1cm4gZGVib3VuY2VkXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2VcbiIsInZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIERhdGUubm93KClcbn1cblxudmFyIGRlbGF5ID0gZnVuY3Rpb24gKCBmbiwgd2FpdCApIHtcblxuICB2YXIgYXJnc1N0YXJ0ID0gKCB3YWl0ICE9IG51bGwgKSA/IDIgOiAxO1xuICB2YXIgaGFuZGxlID0ge31cblxuICBoYW5kbGUuYXJncyAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzLCBhcmdzU3RhcnQgKVxuICBoYW5kbGUud2FpdCAgPSB3YWl0IHx8IDBcbiAgaGFuZGxlLnN0YXJ0ID0gbm93KClcblxuICBoYW5kbGUuc3RvcCAgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCBcInZhbHVlXCIgaW4gaGFuZGxlICkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoIGhhbmRsZS52YWx1ZSApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZS5sb29wICA9IGZ1bmN0aW9uICgpIHtcblxuICAgIC8vIElmIHdhaXQgbGltaXQgaGFzIGJlZW4gcmVhY2hlZFxuICAgIGlmICggbm93KCkgLSBoYW5kbGUuc3RhcnQgPj0gaGFuZGxlLndhaXQgKSB7XG4gICAgICBmbi5hcHBseSggZm4sIGhhbmRsZS5hcmdzIClcblxuICAgICAgLy8gSWYgcmVwZWF0IGlzIHNldCBhbmQgaXMgbm90IDBcbiAgICAgIGlmICggISFoYW5kbGUucmVwZWF0ICkge1xuICAgICAgICBoYW5kbGUucmVwZWF0ID0gaGFuZGxlLnJlcGVhdCAtIDFcbiAgICAgICAgaGFuZGxlLnN0YXJ0ID0gbm93KClcbiAgICAgICAgcXVldWVEZWxheSggaGFuZGxlIClcbiAgICAgIH0gZWxzZSBpZiAoIGhhbmRsZS5yZXBlYXQgPT09IDAgJiYgaGFuZGxlLmNvbXBsZXRlICkge1xuICAgICAgICBoYW5kbGUuY29tcGxldGUoKVxuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlRGVsYXkoIGhhbmRsZSApXG4gICAgfVxuXG4gIH1cblxuXG4gIHJldHVybiBxdWV1ZURlbGF5KCBoYW5kbGUgKVxufVxuXG52YXIgcXVldWVEZWxheSA9IGZ1bmN0aW9uICggaGFuZGxlICkge1xuICBoYW5kbGUudmFsdWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGhhbmRsZS5sb29wIClcbiAgcmV0dXJuIGhhbmRsZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlbGF5XG4iLCIvLyBUaGlzIHNpbXBsaWZpZXMgY29tbW9uIHVzZXMgZm9yIHdpbmRvdy5tYXRjaE1lZGlhIFxuLy8gbmFtZWx5LCBhZGRpbmcgbGlzdGVuZXJzIGZvciB3aWR0aCBhbmQgaGVpZ2h0IHF1ZXJpZXNcblxuZnVuY3Rpb24gcGFyc2VRdWVyeSggcXVlcnksIGRpbWVuc2lvbiApIHtcbiAgdmFyIHJlc3VsdCA9IHt9XG5cbiAgaWYgKCB0eXBlb2YoIHF1ZXJ5ICkgPT09ICdzdHJpbmcnICkgeyByZXR1cm4gcXVlcnkgfVxuXG4gIHJlc3VsdC5taW4gPSBzaXplKCBxdWVyeS5taW4sICdtaW4tJyArIGRpbWVuc2lvbiApXG4gIHJlc3VsdC5tYXggPSBzaXplKCBxdWVyeS5tYXgsICdtYXgtJyArIGRpbWVuc2lvbiApXG5cbiAgaWYgKCByZXN1bHQubWluICYmIHJlc3VsdC5tYXggKVxuICAgIHJlc3VsdC5xdWVyeSA9IHJlc3VsdC5taW4gKyAnIGFuZCAnICsgcmVzdWx0Lm1heFxuXG4gIHJldHVybiByZXN1bHQucXVlcnkgfHwgcmVzdWx0Lm1pbiB8fCByZXN1bHQubWF4XG59XG5cbmZ1bmN0aW9uIHNpemUoIG51bSwgbGltaXQgKSB7XG4gIHJldHVybiAoIG51bSApID8gJygnK2xpbWl0Kyc6ICcgKyB0b1B4KCBudW0gKSArICcpJyA6IG51bGxcbn1cblxuZnVuY3Rpb24gdG9QeCggd2lkdGggKSB7XG4gIGlmICggdHlwZW9mKCB3aWR0aCApID09PSAnbnVtYmVyJyApIHsgcmV0dXJuIHdpZHRoICsgJ3B4J31cbiAgcmV0dXJuIHdpZHRoXG59XG5cbnZhciBtZWRpYSA9IHtcblxuICB3aWR0aDogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICByZXR1cm4gbWVkaWEubGlzdGVuKCBwYXJzZVF1ZXJ5KCBxdWVyeSwgJ3dpZHRoJyApLCBmbiApXG4gIH0sXG5cbiAgbWluV2lkdGg6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLndpZHRoKCB7IG1pbjogc2l6ZSB9LCBmbiApIH0sXG4gIG1heFdpZHRoOiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS53aWR0aCggeyBtYXg6IHNpemUgfSwgZm4gKSB9LFxuXG4gIGhlaWdodDogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICByZXR1cm4gbWVkaWEubGlzdGVuKCBwYXJzZVF1ZXJ5KCBxdWVyeSwgJ2hlaWdodCcgKSwgZm4gKVxuICB9LFxuXG4gIG1pbkhlaWdodDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEuaGVpZ2h0KCB7IG1pbjogc2l6ZSB9LCBmbiApIH0sXG4gIG1heEhlaWdodDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEuaGVpZ2h0KCB7IG1heDogc2l6ZSB9LCBmbiApIH0sXG5cbiAgbGlzdGVuOiBmdW5jdGlvbiggcXVlcnksIGZuICkge1xuICAgIHZhciBtYXRjaCA9IHdpbmRvdy5tYXRjaE1lZGlhKCBxdWVyeSApXG5cbiAgICBpZiAoIGZuICkge1xuICAgICAgZm4oIG1hdGNoIClcbiAgICAgIG1hdGNoLmFkZExpc3RlbmVyKCBmbiApXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoXG4gIH1cblxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gbWVkaWFcbiIsInZhciBFdmVudCAgICAgICAgICAgPSByZXF1aXJlKCAnYmVhbicgKVxudmFyIGNhbGxiYWNrTWFuYWdlciA9IHJlcXVpcmUoICcuL2NhbGxiYWNrLW1hbmFnZXInIClcbnZhciB0aHJvdHRsZSAgICAgICAgPSByZXF1aXJlKCAnLi90aHJvdHRsZScgKVxudmFyIGRlYm91bmNlICAgICAgICA9IHJlcXVpcmUoICcuL2RlYm91bmNlJyApXG5cbnZhciBvcHRpbWl6ZWRFdmVudE1hbmFnZXIgPSB7XG4gIG5ldzogZnVuY3Rpb24oIG5hbWUgKSB7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY2FsbGJhY2sgbWFuYWdlclxuICAgIHZhciBtYW5hZ2VyID0ge1xuICAgICAgcnVuOiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gICAgICBzdGFydDogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICAgICAgc3RvcDogY2FsbGJhY2tNYW5hZ2VyLm5ldygpXG4gICAgfVxuXG4gICAgLy8gcnVuIGNhbGxiYWNrcyB3aGVuIGV2ZW50IGhhcHBlbnMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgcnVubmluZyA9IHRocm90dGxlKCBtYW5hZ2VyLnJ1bi5maXJlIClcblxuICAgIC8vIGZpcmUgY2FsbGJhY2tzIHdoZW4gZXZlbnQgc3RhcnRzIChhdCBwYWludC1yZWFkeSBmcmFtZXMpXG4gICAgdmFyIHN0YXJ0ZWQgPSBkZWJvdW5jZSh7XG4gICAgICBsZWFkaW5nOiBtYW5hZ2VyLnN0YXJ0LmZpcmUsXG4gICAgICB0cmFpbGluZzogZmFsc2UsXG4gICAgICB3YWl0OiAxNTBcbiAgICB9KVxuXG4gICAgLy8gZmlyZSBjYWxsYmFja3Mgd2hlbiBldmVudCBzdGFydHMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgc3RvcHBlZCA9IGRlYm91bmNlKCBtYW5hZ2VyLnN0b3AuZmlyZSwgMTUwIClcblxuICAgIEV2ZW50Lm9uKCB3aW5kb3csIG5hbWUsIGZ1bmN0aW9uKCkge1xuICAgICAgcnVubmluZygpXG4gICAgICBzdGFydGVkKClcbiAgICAgIHN0b3BwZWQoKVxuICAgIH0pXG5cbiAgICAvLyBQdWJsaWMgQVBJXG4gICAgdmFyIHJ1biAgID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIucnVuLmFkZCggZm4gKSB9XG4gICAgcnVuLnN0YXJ0ID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIuc3RhcnQuYWRkKCBmbiApIH1cbiAgICBydW4uc3RvcCAgPSBmdW5jdGlvbiAoIGZuICkgeyByZXR1cm4gbWFuYWdlci5zdG9wLmFkZCggZm4gKSB9XG5cbiAgICAvLyBBZGQgY3VzdG9tIGV2ZW50cyBmb3IgdG8gcnVuIG9wdGltaXplZCBsaXN0ZW5lcnMuICggbmFtZSAtPiBOYW1lIClcbiAgICBydW4oIGZ1bmN0aW9uKCkgeyBFdmVudC5maXJlKCB3aW5kb3csICdvcHRpbWl6ZWQnICsgIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpICkgfSApXG4gICAgcnVuLnN0YXJ0KCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCBuYW1lICsgJ1N0YXJ0JyApIH0gKVxuICAgIHJ1bi5zdG9wKCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCBuYW1lICsgJ1N0b3AnICkgfSApXG5cbiAgICByZXR1cm4gcnVuXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvcHRpbWl6ZWRFdmVudE1hbmFnZXJcbiIsInZhciBFdmVudCAgICAgICAgICAgPSByZXF1aXJlKCAnYmVhbicgKVxudmFyIGNhbGxiYWNrTWFuYWdlciA9IHJlcXVpcmUoICcuL2NhbGxiYWNrLW1hbmFnZXInIClcblxuLy8gQ3JlYXRlIGEgbmV3IHBhZ2UgZXZlbnQgbWFuYWdlclxudmFyIG1hbmFnZXIgPSB7XG4gIHJlYWR5OiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gIGNoYW5nZTogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICByZWFkeUFscmVhZHk6IGZhbHNlLFxuICBjaGFuZ2VkOiBmYWxzZSxcbn1cblxubWFuYWdlci5yZWFkeS5hZGQoIGZ1bmN0aW9uKCl7XG4gIG1hbmFnZXIucmVhZHlBbHJlYWR5ID0gdHJ1ZSBcbn0pXG5cbm1hbmFnZXIucmVhZHkuYWRkKCBmdW5jdGlvbigpeyBcbiAgaWYgKCAhd2luZG93LlR1cmJvbGlua3MgJiYgIW1hbmFnZXIuY2hhbmdlZCApIHsgXG4gICAgbWFuYWdlci5jaGFuZ2VkID0gdHJ1ZSBcbiAgICBtYW5hZ2VyLmNoYW5nZS5maXJlKClcbiAgfVxufSlcblxudmFyIHJlYWR5ID0gZnVuY3Rpb24gKCBmbiApIHtcbiAgaWYgKCBtYW5hZ2VyLnJlYWR5QWxyZWFkeSApIHsgZm4oKSB9XG4gIHJldHVybiBtYW5hZ2VyLnJlYWR5LmFkZCggZm4gKSB9XG5cbnZhciBjaGFuZ2UgPSBmdW5jdGlvbiggZm4gKSB7XG4gIGlmICggbWFuYWdlci5jaGFuZ2VkICkgeyBmbigpIH1cbiAgcmV0dXJuIG1hbmFnZXIuY2hhbmdlLmFkZCggZm4gKSB9XG5cbi8vIE1ha2UgaXQgZWFzeSB0byB0cmlnZ2VyIHJlYWR5IGNhbGxiYWNrc1xucmVhZHkuZmlyZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWFuYWdlci5yZWFkeS5maXJlKClcbiAgLy8gQmUgc3VyZSByZWFkeSBjYW4gb25seSBiZSBmaXJlZCBvbmNlXG4gIG1hbmFnZXIucmVhZHkuc3RvcCgpIH1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIHRyaWdnZXIgY2hhbmdlIGNhbGxiYWNrc1xuY2hhbmdlLmZpcmUgPSBmdW5jdGlvbiAoKSB7XG4gIG1hbmFnZXIuY2hhbmdlLmZpcmUoKSB9XG5cbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ0RPTUNvbnRlbnRMb2FkZWQnLCByZWFkeS5maXJlIClcbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ3BhZ2U6Y2hhbmdlIHR1cmJvbGlua3M6bG9hZCcsIGNoYW5nZS5maXJlICkgLy8gU3VwcG9ydCBjdXN0b20gYW5kIHJhaWxzIHR1cmJvbGlua3MgcGFnZSBsb2FkIGV2ZW50c1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmVhZHk6IHJlYWR5LFxuICBjaGFuZ2U6IGNoYW5nZVxufVxuIiwidmFyIGRlbGF5ID0gcmVxdWlyZSggJy4vZGVsYXknIClcblxudmFyIHJlcGVhdCA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgbGltaXQgKSB7XG5cbiAgdmFyIGFyZ3NTdGFydCA9IDEsXG4gICAgICBoYW5kbGUgPSBkZWxheSAoIGZuLCB3YWl0ICk7XG5cbiAgaWYgICAgICAoIGxpbWl0ICE9IG51bGwgKSB7IGFyZ3NTdGFydCA9IDMgfVxuICBlbHNlIGlmICggd2FpdCAgIT0gbnVsbCApIHsgYXJnc1N0YXJ0ID0gMiB9XG5cbiAgLy8gRW5hYmxlIHJlcGVhdCAoIC0xIHdpbGwgcmVwZWF0IGZvcmV2ZXIgKVxuICBoYW5kbGUucmVwZWF0ID0gbGltaXQgfHwgLTFcbiAgaGFuZGxlLmFyZ3MgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIGFyZ3NTdGFydCApXG4gIGhhbmRsZS5zdG9wICAgPSBoYW5kbGUuY2FuY2VsXG5cbiAgcmV0dXJuIGhhbmRsZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcGVhdFxuIiwidmFyIG1hbmFnZXIgPSByZXF1aXJlKCAnLi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlcicgKVxudmFyIHJlc2l6ZSAgPSBtYW5hZ2VyLm5ldyggJ3Jlc2l6ZScgKVxuXG4vLyBQYXVzZSBhbmltYXRpb25zIGR1cmluZyByZXNpemluZyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG5yZXNpemUuZGlzYWJsZUFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGUgPSAnPHN0eWxlIGlkPVwiZnVsbHN0b3BcIj4ubm8tYW5pbWF0aW9uICosIC5uby1hbmltYXRpb24gKjphZnRlciwgLm5vLWFuaW1hdGlvbiAqOmJlZm9yZSB7XFxcbiAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7IGFuaW1hdGlvbjogbm9uZSAhaW1wb3J0YW50XFxcbiAgfTwvc3R5bGU+J1xuXG4gIC8vIEluamVjdCBzdHlsZSBmb3IgZWFzeSBjbGFzc25hbWUgbWFuaXB1bGF0aW9uXG4gIGlmICggIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlI2Z1bGxzdG9wJykgKSB7IFxuICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBzdHlsZSlcbiAgfVxuXG4gIHJlc2l6ZS5zdGFydCggZnVuY3Rpb24oKSB7IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCggJ25vLWFuaW1hdGlvbicgKSB9IClcbiAgcmVzaXplLnN0b3AoIGZ1bmN0aW9uKCkgeyAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCAnbm8tYW5pbWF0aW9uJyApIH0gKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc2l6ZVxuIiwidmFyIG1hbmFnZXIgPSByZXF1aXJlKCAnLi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlcicgKVxudmFyIHNjcm9sbCAgPSBtYW5hZ2VyLm5ldyggJ3Njcm9sbCcgKVxuXG5zY3JvbGwuZGlzYWJsZVBvaW50ZXIgPSBmdW5jdGlvbigpIHtcblxuICAvLyBEaXNhYmxlIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgc2Nyb2xsLnN0YXJ0KCBmdW5jdGlvbigpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICB9KVxuXG4gIC8vIEVuYWJsZSBwb2ludGVyIGludGVyYWN0aW9uXG4gIHNjcm9sbC5zdG9wKCBmdW5jdGlvbigpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsXG4iLCIvLyBDdXN0b20gRXZlbnQgUG9seWZpbGxcbihmdW5jdGlvbiAoKSB7XG5cbiAgaWYgKCB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIgKSByZXR1cm4gZmFsc2U7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKCBldmVudCwgcGFyYW1zICkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoICdDdXN0b21FdmVudCcgKTtcbiAgICBldnQuaW5pdEN1c3RvbUV2ZW50KCBldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsICk7XG4gICAgcmV0dXJuIGV2dDtcbiAgIH1cblxuICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuXG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKVxuIiwiLy8gTWFudWFsbHkgdHJpZ2dlciBhIGNhbmNlbGFibGUgZm9ybSBzdWJtaXQgZXZlbnQuXG5mdW5jdGlvbiBzdWJtaXQoIGZvcm0gKSB7XG4gIGlmICggIWZvcm0udGFnTmFtZSB8fCBmb3JtLnRhZ05hbWUgIT0gJ0ZPUk0nICkge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKCAnVHJpZ2dlciB0aGlzIGV2ZW50IG9uIGEgZm9ybSBlbGVtZW50JyApXG4gIH1cblxuICB2YXIgZXYgPSBuZXcgQ3VzdG9tRXZlbnQoICdzdWJtaXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGRldGFpbDogeyB0cmlnZ2VyZWQ6IHRydWUgfSB9IClcbiAgZm9ybS5kaXNwYXRjaEV2ZW50KCBldiApXG5cbiAgLy8gU3VibWl0IGZvcm0gdW5sZXNzIGV2ZW50IGRlZmF1bHQgaXMgcHJldmVudGVkXG4gIGlmICggIWV2LmRlZmF1bHRQcmV2ZW50ZWQgKSBmb3JtLnN1Ym1pdCgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3VibWl0XG4iLCJ2YXIgZW5kRXZlbnRzID0gW1xuICAndG91Y2hlbmQnXG5dXG5cbm1vZHVsZS5leHBvcnRzID0gVGFwXG5cbi8vIGRlZmF1bHQgdGFwIHRpbWVvdXQgaW4gbXNcblRhcC50aW1lb3V0ID0gMjAwXG5cbmZ1bmN0aW9uIFRhcChjYWxsYmFjaywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAvLyBpZiB0aGUgdXNlciBob2xkcyBoaXMvaGVyIGZpbmdlciBkb3duIGZvciBtb3JlIHRoYW4gMjAwbXMsXG4gIC8vIHRoZW4gaXQncyBub3QgcmVhbGx5IGNvbnNpZGVyZWQgYSB0YXAuXG4gIC8vIGhvd2V2ZXIsIHlvdSBjYW4gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgdmFyIHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgfHwgVGFwLnRpbWVvdXRcblxuICAvLyB0byBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lclxuICBsaXN0ZW5lci5oYW5kbGVyID0gY2FsbGJhY2tcblxuICByZXR1cm4gbGlzdGVuZXJcblxuICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgbGlzdGVuZXIpXG4gIGZ1bmN0aW9uIGxpc3RlbmVyKGUxKSB7XG4gICAgLy8gdGFwIHNob3VsZCBvbmx5IGhhcHBlbiB3aXRoIGEgc2luZ2xlIGZpbmdlclxuICAgIGlmICghZTEudG91Y2hlcyB8fCBlMS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVyblxuXG4gICAgdmFyIGVsID0gZTEudGFyZ2V0XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgdGltZW91dF9pZCA9IHNldFRpbWVvdXQoY2xlYW51cCwgdGltZW91dClcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGNsZWFudXApXG5cbiAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGRvbmUpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIGRvbmUoZTIpIHtcbiAgICAgIC8vIHNpbmNlIHRvdWNoc3RhcnQgaXMgYWRkZWQgb24gdGhlIHNhbWUgdGlja1xuICAgICAgLy8gYW5kIGJlY2F1c2Ugb2YgYnViYmxpbmcsXG4gICAgICAvLyBpdCdsbCBleGVjdXRlIHRoaXMgb24gdGhlIHNhbWUgdG91Y2hzdGFydC5cbiAgICAgIC8vIHRoaXMgZmlsdGVycyBvdXQgdGhlIHNhbWUgdG91Y2hzdGFydCBldmVudC5cbiAgICAgIGlmIChlMSA9PT0gZTIpIHJldHVyblxuXG4gICAgICBjbGVhbnVwKClcblxuICAgICAgLy8gYWxyZWFkeSBoYW5kbGVkXG4gICAgICBpZiAoZTIuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuXG5cbiAgICAgIC8vIG92ZXJ3cml0ZSB0aGVzZSBmdW5jdGlvbnMgc28gdGhhdCB0aGV5IGFsbCB0byBib3RoIHN0YXJ0IGFuZCBldmVudHMuXG4gICAgICB2YXIgcHJldmVudERlZmF1bHQgPSBlMS5wcmV2ZW50RGVmYXVsdFxuICAgICAgdmFyIHN0b3BQcm9wYWdhdGlvbiA9IGUxLnN0b3BQcm9wYWdhdGlvblxuXG4gICAgICBlMS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbi5jYWxsKGUxKVxuICAgICAgICBzdG9wUHJvcGFnYXRpb24uY2FsbChlMilcbiAgICAgIH1cblxuICAgICAgZTEucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0LmNhbGwoZTEpXG4gICAgICAgIHByZXZlbnREZWZhdWx0LmNhbGwoZTIpXG4gICAgICB9XG5cbiAgICAgIC8vIGNhbGxzIHRoZSBoYW5kbGVyIHdpdGggdGhlIGBlbmRgIGV2ZW50LFxuICAgICAgLy8gYnV0IGkgZG9uJ3QgdGhpbmsgaXQgbWF0dGVycy5cbiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgfVxuXG4gICAgLy8gY2xlYW51cCBlbmQgZXZlbnRzXG4gICAgLy8gdG8gY2FuY2VsIHRoZSB0YXAsIGp1c3QgcnVuIHRoaXMgZWFybHlcbiAgICBmdW5jdGlvbiBjbGVhbnVwKGUyKSB7XG4gICAgICAvLyBpZiBpdCdzIHRoZSBzYW1lIGV2ZW50IGFzIHRoZSBvcmlnaW4sXG4gICAgICAvLyB0aGVuIGRvbid0IGFjdHVhbGx5IGNsZWFudXAuXG4gICAgICAvLyBoaXQgaXNzdWVzIHdpdGggdGhpcyAtIGRvbid0IHJlbWVtYmVyXG4gICAgICBpZiAoZTEgPT09IGUyKSByZXR1cm5cblxuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRfaWQpXG5cbiAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGNsZWFudXApXG5cbiAgICAgIGVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBkb25lKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsInZhciBkZWJvdW5jZSA9IHJlcXVpcmUoICcuL2RlYm91bmNlJyApXG5cbnZhciB0aHJvdHRsZSA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgb3B0aW9ucyApIHtcblxuICBpZiAoIHR5cGVvZiggZm4gKSA9PSAnb2JqZWN0JyApIHsgb3B0aW9ucyA9IGZuOyBmbiA9IHVuZGVmaW5lZCB9IFxuICBlbHNlIHsgb3B0aW9ucyA9IG9wdGlvbnMgfHwge30gfVxuXG4gIG9wdGlvbnMud2FpdCA9IG9wdGlvbnMud2FpdCB8fCB3YWl0IHx8IDBcbiAgb3B0aW9ucy5tYXggID0gb3B0aW9ucy5tYXggfHwgb3B0aW9ucy53YWl0XG4gIG9wdGlvbnMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZuXG4gIG9wdGlvbnMubGVhZGluZyAgPSB0cnVlXG4gIG9wdGlvbnMudHJhaWxpbmcgPSB0cnVlXG5cbiAgcmV0dXJuIGRlYm91bmNlKG9wdGlvbnMpXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0aHJvdHRsZVxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS1ldmVudCcpXG5cbnZhciBUb2dnbGVyID0ge1xuICBjaGVja2JveFNlbGVjdG9yOiBcIlt0eXBlPWNoZWNrYm94XVtkYXRhLXRvZ2dsZV0sIFt0eXBlPWNoZWNrYm94XVtkYXRhLXNob3ddLCBbdHlwZT1jaGVja2JveF1bZGF0YS1oaWRlXVwiLFxuICByYWRpb1NlbGVjdG9yOiBcImlucHV0W3R5cGU9cmFkaW9dW2RhdGEtc2hvd10sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtaGlkZV0sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtYWRkLWNsYXNzXSwgaW5wdXRbdHlwZT1yYWRpb11bZGF0YS1yZW1vdmUtY2xhc3NdXCIsXG4gIHNlbGVjdFNlbGVjdG9yOiBcIm9wdGlvbltkYXRhLWhpZGVdLCBvcHRpb25bZGF0YS1zaG93XVwiLFxuXG4gIGxpc3RlbjogZnVuY3Rpb24oKXtcbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjbGljayBjaGFuZ2VcIiwgXCJbZGF0YS10b2dnbGVdLCBbZGF0YS1zaG93XSwgW2RhdGEtaGlkZV0sIFtkYXRhLXRvZ2dsZS1jbGFzc10sIFtkYXRhLWFkZC1jbGFzc10sIFtkYXRhLXJlbW92ZS1jbGFzc11cIiwgVG9nZ2xlci50cmlnZ2VyKVxuICAgIEV2ZW50Lm9uKGRvY3VtZW50LCBcImNoYW5nZVwiLCBcIi5zZWxlY3QtdG9nZ2xlclwiLCBUb2dnbGVyLnRyaWdnZXIpXG4gICAgRXZlbnQub24od2luZG93LCAnaGFzaGNoYW5nZScsIFRvZ2dsZXIuaGFzaENoYW5nZSlcbiAgfSxcblxuICBoYXNoQ2hhbmdlOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIHdpbmRvdy5sb2NhdGlvbi5oYXNoICkge1xuXG4gICAgICB2YXIgYW5jaG9yID0gJ1tkYXRhLWFuY2hvcj1cIicrd2luZG93LmxvY2F0aW9uLmhhc2grJ1wiXSdcbiAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQnK2FuY2hvcisgJywgb3B0aW9uJythbmNob3IgKVxuXG4gICAgICBpZiAoIHRhcmdldCApIHtcbiAgICAgICAgaWYgKCB0YXJnZXQudHlwZSA9PSAncmFkaW8nICkge1xuICAgICAgICAgIHRhcmdldC5jaGVja2VkID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzZWxlY3QgPSBUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24odGFyZ2V0KVxuICAgICAgICAgIHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gdGFyZ2V0LmluZGV4XG4gICAgICAgICAgdGFyZ2V0ID0gc2VsZWN0XG4gICAgICAgIH1cbiAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoIHRhcmdldCApXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlZnJlc2g6IGZ1bmN0aW9uKCl7XG4gICAgVG9nZ2xlci50b2dnbGVDaGVja2JveGVzKClcbiAgICBUb2dnbGVyLnNldHVwU2VsZWN0cygpXG4gICAgVG9nZ2xlci5zZXR1cFJhZGlvcygpXG4gIH0sXG5cbiAgdHJpZ2dlcjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBTdG9wIGV2ZW50IGFuZCBidWJibGluZyBpZiBsaW5rIGlzIG9ubHkgYmVpbmcgdXNlZCBhcyBhIHRvZ2dsZXJcbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PSBcIiNcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgZXZlbnQuc3RvcCgpXG4gICAgfSBcblxuICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsaW5nKGV2ZW50LmN1cnJlbnRUYXJnZXQsIGV2ZW50KVxuICB9LFxuXG4gIHRyaWdnZXJUb2dnbGluZzogZnVuY3Rpb24odGFyZ2V0LCBldmVudCkge1xuICAgIHZhciBhY3Rpb25zID0gWydoaWRlJywgJ3RvZ2dsZScsICdzaG93JywgJ3JlbW92ZUNsYXNzJywgJ3RvZ2dsZUNsYXNzJywgJ2FkZENsYXNzJ11cbiAgICB2YXIgc2VsZWN0XG5cbiAgICAvLyBTdG9yZSB0aGUgc2VsZWN0LCBhbmQgc2V0IHRoZSB0YXJnZXQgdG8gdGhlIGN1cnJlbnQgb3B0aW9uXG4gICAgLy8gRXZlbnRzIGZpcmUgb24gdGhlIHNlbGVjdCwgYnV0IHRoZSBvcHRpb25zIGhhdmUgdG9nZ2xpbmcgYXR0cmlidXRlc1xuICAgIGlmICh0YXJnZXQudGFnTmFtZS5tYXRjaCgvc2VsZWN0L2kpKSB7XG4gICAgICBzZWxlY3QgPSB0YXJnZXRcbiAgICAgIHRhcmdldCA9IHNlbGVjdC5zZWxlY3RlZE9wdGlvbnNbMF1cbiAgICB9XG5cbiAgICAvLyBSYWRpbyBpbnB1dHMgYW5kIHNlbGVjdHMgZG8gbm90IHN1cHBvcnQgdG9nZ2xpbmcsIHNvIHJlbW92ZSB0aGVtXG4gICAgYWN0aW9ucyA9IGFjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgaWYgKHNlbGVjdCB8fCB0YXJnZXQudHlwZSA9PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiAhYWN0aW9uLm1hdGNoKC90b2dnbGUvKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldC5kYXRhc2V0W2FjdGlvbl0gIT0gbnVsbFxuICAgIH0pXG4gICAgXG4gICAgLy8gRGlzcGF0Y2ggYWxsIGFjdGlvbnNcbiAgICBhY3Rpb25zLmZvckVhY2goIGZ1bmN0aW9uKCBhY3Rpb24gKSB7XG4gICAgICBUb2dnbGVyLmRpc3BhdGNoKCB0YXJnZXQsIGFjdGlvbiApXG4gICAgfSlcbiAgfSxcblxuICBkaXNwYXRjaDogZnVuY3Rpb24oZWwsIHR5cGUpIHtcbiAgICB2YXIgYWN0aW9uID0gdHlwZVxuICAgIHZhciBkYXRhID0gZWwuZGF0YXNldFt0eXBlXVxuXG4gICAgLy8gQWJvcnQgaWYgZWxlbWVudCBkb2Vzbid0IGhhdmUgZGF0YSBmb3IgdGhlIGFjdGlvblxuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSA9PSAndW5kZWZpbmVkJyB8fCBkYXRhID09ICcnKSByZXR1cm5cblxuICAgIC8vIFRvZ2dsZSBhbmQgc2hvdyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBmb3IgY2hlY2tib3hlc1xuICAgIGlmIChlbC50eXBlID09ICdjaGVja2JveCcpXG4gICAgICBhY3Rpb24gPSAodHlwZS5tYXRjaCgvaGlkZXxyZW1vdmUvaSkgPyAhZWwuY2hlY2tlZCA6IGVsLmNoZWNrZWQpXG5cbiAgICBpZiAoZGF0YSl7XG4gICAgICBpZiAodHlwZS5tYXRjaCgvY2xhc3MvaSkpe1xuICAgICAgICBUb2dnbGVyLnNldENsYXNzKGRhdGEsIGFjdGlvbiwgZWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBUb2dnbGVyLnNldFN0YXRlKGRhdGEsIGFjdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gQWRkLCByZW1vdmUsIG9yIHRvZ2dsZSBjbGFzc25hbWVzLCB0cmlnZ2VyZWQgYnkgZWxlbWVudHMgd2l0aDpcbiAgLy8gIGRhdGEtaGlkZS1jbGFzcywgZGF0YS1zaG93LWNsYXNzLCBhbmQgZGF0YS10b2dnbGUtY2xhc3MgdmFsdWVzXG4gIC8vXG4gIC8vICBEYXRhIHZhbHVlIGV4YW1wbGVzOlxuICAvLyAgIC0gXCJjbGFzc25hbWVcIiAtIGFkZC9yZW1vdmUvdG9nZ2xlIGNsYXNzbmFtZSBvbiBjdXJyZW50IGVsZW1lbnRcbiAgLy8gICAtIFwiZm9vIGJhclwiICAgLSBtdWx0aXBsZSBjbGFzc25hbWVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzIChsaWtlIGh0bWwgY2xhc3MgcHJvcGVydHkpXG4gIC8vICAgLSBcImZvbyBiYXI7IHNlbGVjdG9yXCIgLSBjaGFuZ2UgY2xhc3NuYW1lcyBvbiBlbGVtZW50cyBtYXRjaGVkIGJ5IHNlbGVjdG9yXG4gIC8vICAgLSBcImZvbyBiYXI7IHNlbGVjdG9yLCBzZWxlY3RvclwiIC0gbWF0Y2ggbXVsdGlwbGUgc2VsZWN0b3JzXG4gIC8vXG4gIC8vICBZb3UgY2FuIHBlcmZvcm0gbXVsdGlwbGUgYWRkL3JlbW92ZSBjbGFzc2VzIGJ5IGpvaW5pbmcgdmFsdWVzIHdpdGggYW4gYCZgXG4gIC8vICBGb3IgZXhhbXBsZTogXCJjbGFzc25hbWUgJiBmb28gYmFyOyBzZWxlY3RvclwiXG4gIC8vICBUaGlzIHdvdWxkIHRvZ2dsZSBjbGFzc25hbWUgb24gY3VycmVudCBlbGVtZW50IGFuZCB0b2dnbGUgYGZvbyBiYXJgIGNsYXNzbmFtZXNcbiAgLy8gIG9uIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gIC8vXG5cbiAgc2V0Q2xhc3M6IGZ1bmN0aW9uIChzZWxlY3RvcnMsIGFjdGlvbiwgZWwpe1xuICAgIGlmKHR5cGVvZiBzZWxlY3RvcnMgPT0gJ3VuZGVmaW5lZCcgfHwgc2VsZWN0b3JzID09ICcnKSByZXR1cm5cblxuICAgIGlmICh0eXBlb2YoYWN0aW9uKSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIGFjdGlvbiA9IChhY3Rpb24gPyAnYWRkJyA6ICdyZW1vdmUnKVxuICAgIH1cblxuICAgIGlmIChzZWxlY3RvcnMubWF0Y2goLyYvKSkge1xuICAgICAgc2VsZWN0b3JzLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbihzZWwpe1xuICAgICAgICBUb2dnbGVyLnNldENsYXNzKHNlbC50cmltKCksIGFjdGlvbiwgZWwpIFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEdldCBzZWxlY3RvciBhbmQgY2xhc3NuYW1lcywgZm9ybWF0OiBcImNsYXNzbmFtZSBjbGFzc25hbWU7IHNlbGVjdG9yLHNlbGVjdG9yXCJcbiAgICB2YXIgc2V0dGluZ3MgPSBzZWxlY3RvcnMuc3BsaXQoJzsnKVxuICAgIHZhciBjbGFzc25hbWVzID0gc2V0dGluZ3NbMF0udHJpbSgpXG4gICAgdmFyIG1hdGNoZXMgPSBbXVxuICAgIHNlbGVjdG9ycyA9IHNldHRpbmdzWzFdXG5cbiAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcnMpXG5cbiAgICAvLyBJZiBubyBzbGVjdG9ycyBhcmUgcHJlc2VudCwgYW5kIGVsIGlzIGFuIE9QVElPTiwgdXNlIGl0cyBTRUxFQ1QgYXMgdGhlIG1hdGNoZWQgZWxlbWVudFxuICAgIH0gZWxzZSBpZiAoZWwgJiYgZWwudGFnTmFtZS5tYXRjaCgvb3B0aW9uL2kpKSB7XG4gICAgICBtYXRjaGVzID0gW1RvZ2dsZXIuZ2V0U2VsZWN0RnJvbU9wdGlvbihlbCldXG4gICAgICBcbiAgICAvLyBJZiBubyBzbGVjdG9ycyBhcmUgcHJlc2VudCwgdXNlIHRoZSBjdXJyZW50IGVsIGZvciBjbGFzc25hbWVzXG4gICAgfSBlbHNlIGlmIChlbCkge1xuICAgICAgbWF0Y2hlcyA9IFtlbF1cbiAgICB9XG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG1hdGNoZXMsIGZ1bmN0aW9uKG1hdGNoKXtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2xhc3NuYW1lcy5zcGxpdCgnICcpLCBmdW5jdGlvbihjbGFzc25hbWUpIHtcbiAgICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvbi5yZXBsYWNlKC9DbGFzcy8sJycpXG4gICAgICAgIG1hdGNoLmNsYXNzTGlzdFttZXRob2RdKGNsYXNzbmFtZSlcbiAgICAgIH0pXG5cbiAgICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsZXJFdmVudHNPbkNoaWxkcmVuKG1hdGNoLCAnY2xhc3MnKVxuICAgIH0pXG4gIH0sXG5cbiAgc2V0U3RhdGU6IGZ1bmN0aW9uKHNlbGVjdG9ycywgc3RhdGUpIHtcbiAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtYXRjaGVzLCBmdW5jdGlvbihtYXRjaCl7XG4gICAgICB2YXIgYWN0aW9uID0gVG9nZ2xlci50b2dnbGVBY3Rpb24obWF0Y2gsIHN0YXRlKVxuXG4gICAgICBUb2dnbGVyW2FjdGlvbl0obWF0Y2gpXG4gICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbihtYXRjaCwgYWN0aW9uKVxuICAgIH0pXG4gIH0sXG5cbiAgdG9nZ2xlQWN0aW9uOiBmdW5jdGlvbiggZWwsIGFjdGlvbiApIHtcblxuICAgIGlmICggdHlwZW9mIGFjdGlvbiA9PSAnYm9vbGVhbicgKSB7XG4gICAgICBhY3Rpb24gPSAoIGFjdGlvbiA/ICdzaG93JyA6ICdoaWRlJyApXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PSAndG9nZ2xlJykge1xuICAgICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygnaGlkaW5nJykgKSB7XG4gICAgICAgIGFjdGlvbiA9ICdzaG93J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uID0gJ2hpZGUnXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvblxuICB9LFxuXG4gIHNob3c6IGZ1bmN0aW9uKGVsKSB7XG4gICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd2aXNpYmxlJyApIHx8IFxuICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnc2hvd2luZycgKSB8fFxuICAgICAgICAgZWwub2Zmc2V0UGFyZW50ICE9IG51bGwgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGRlbicsICdoaWRpbmcnIClcblxuICAgIHZhciBmdWxseVNob3cgPSBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFJlbW92ZSBoaWRkZW4gYmVjYXVzZSBpdCBtaWdodCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBmaXJlc1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Nob3dpbmcnLCAnaGlkZGVuJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAndmlzaWJsZScgKVxuXG4gICAgICAvLyBFbmFibGUgaW5wdXRzLCBmaWVsZHNldHMgb3IgZm9ybXMgd2hlbiBzaG93blxuICAgICAgaWYgKCB0eXBlb2YgZWwuZGlzYWJsZWQgIT0gJ3VuZGVmaW5lZCcgKXtcbiAgICAgICAgZWwuZGlzYWJsZWQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBGb2N1cyBvbiBrZXkgZWxlbWVudCBpZiBhbiBlbGVtZW50IGV4cGVjdHMgZm9jdXNcbiAgICAgIHZhciBmb2N1c0VsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtZm9jdXNdJylcbiAgICAgIGlmIChmb2N1c0VsKSB7IGZvY3VzRWwuZm9jdXMoKSB9XG5cbiAgICAgIC8vIFRyaWdnZXIgaW5wdXQgZXZlbnQgb24gcmFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGhpZGRlblxuICAgICAgdmFyIHJhbmdlcyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhbmdlXScpXG4gICAgfVxuXG4gICAgaWYgKCBlbC5kYXRhc2V0LmFuaW1hdGUgKSB7XG4gICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIGZ1bGx5U2hvdywgdHJ1ZSlcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdzaG93aW5nJyApXG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGx5U2hvdygpXG4gICAgfVxuICB9LFxuXG4gIGhpZGU6IGZ1bmN0aW9uKGVsKSB7XG4gICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICdoaWRkZW4nICkgfHwgXG4gICAgICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoICdoaWRpbmcnICkgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgc2hvd2luZyBiZWNhdXNlIGl0IG1pZ2h0IGJlIGFkZGVkIGJlZm9yZSB0aGlzIGZpcmVzXG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Zpc2libGUnLCAnc2hvd2luZycgKVxuXG4gICAgdmFyIGZ1bGx5SGlkZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGluZycsICd2aXNpYmxlJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnaGlkZGVuJyApXG5cbiAgICAgIC8vIERpc2FibGUgaW5wdXRzLCBmaWVsZHNldHMgb3IgZm9ybXMgd2hlbiBoaWRkZW5cbiAgICAgIGlmICggdHlwZW9mIGVsLmRpc2FibGVkICE9ICd1bmRlZmluZWQnICl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICggZWwuZGF0YXNldC5hbmltYXRlICkge1xuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdWxseUhpZGUsIHRydWUpXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnaGlkaW5nJyApXG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGx5SGlkZSgpXG4gICAgfVxuICB9LFxuXG4gIGdldExlYWZOb2RlczogZnVuY3Rpb24gKHBhcmVudCkge1xuICAgIC8vIGlzIHRoZSBwYXJlbnQgaXRzZWxmIGEgbGVhZiBub2RlP1xuICAgIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkgcmV0dXJuIFtwYXJlbnRdXG5cbiAgICB2YXIgbm9kZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLCAwKVxuXG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcihmdW5jdGlvbihlbGVtKSB7XG4gICAgICByZXR1cm4gZWxlbS5jaGlsZHJlbiAmJiBlbGVtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMFxuICAgIH0pXG4gIH0sXG5cbiAgdHJpZ2dlclRvZ2dsZXJFdmVudHNPbkNoaWxkcmVuOiBmdW5jdGlvbihlbCwgZXZlbnROYW1lKXtcbiAgICAvLyB3ZSBjYXJlIGFib3V0IGxlYWYgbm9kZXMgc2luY2UgdGhlIGV2ZW50IHdpbGwgYnViYmxlIHRvXG4gICAgLy8gbm9uLWxlYWYgbm9kZXMgZnJvbSB0aGUgbGVhZiBub2Rlc1xuICAgIHZhciBsZWFmQ2hpbGROb2RlcyA9IFRvZ2dsZXIuZ2V0TGVhZk5vZGVzKGVsKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsZWFmQ2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgLy8gJ3RvZ2dsZXI6c2hvdycsICd0b2dnbGVyOmhpZGUnLCBldGNcbiAgICAgIEV2ZW50LmZpcmUobm9kZSwgXCJ0b2dnbGVyOlwiICsgZXZlbnROYW1lKVxuICAgIH0pXG4gIH0sXG5cbiAgdG9nZ2xlQ2hlY2tib3hlczogZnVuY3Rpb24oY2hlY2tib3hlcykge1xuICAgIGNoZWNrYm94ZXMgPSBjaGVja2JveGVzIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoVG9nZ2xlci5jaGVja2JveFNlbGVjdG9yKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjaGVja2JveGVzLCBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZylcbiAgfSxcblxuICBzZXR1cFJhZGlvczogZnVuY3Rpb24oKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFRvZ2dsZXIucmFkaW9TZWxlY3RvciksIGZ1bmN0aW9uKHJhZGlvLCBpbmRleCl7XG4gICAgICBpZiAoIXJhZGlvLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSkge1xuXG4gICAgICAgIHZhciByYWRpb05hbWUgICAgICAgICA9IHJhZGlvLmdldEF0dHJpYnV0ZSgnbmFtZScpLFxuICAgICAgICAgICAgc2libGluZ3MgICAgICAgICAgPSBUb2dnbGVyLnBhcmVudEZvcm0ocmFkaW8pLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhZGlvXVtuYW1lPVwiJytyYWRpb05hbWUrJ1wiXScpLFxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyAgICAgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKHNpYmxpbmdzLCAnc2hvdycpLFxuICAgICAgICAgICAgYWRkQ2xhc3NTZWxlY3RvcnMgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKHNpYmxpbmdzLCAnYWRkQ2xhc3MnKSxcbiAgICAgICAgICAgIGNoZWNrZWRcblxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNpYmxpbmdzLCBmdW5jdGlvbihyKXtcblxuICAgICAgICAgIGlmIChyLmRhdGFzZXQuYW5jaG9yICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICgnIycrci5kYXRhc2V0LmFuY2hvci5yZXBsYWNlKCcjJywnJykpKSB7XG4gICAgICAgICAgICByLmNoZWNrZWQgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCBoYXZlIGEgZGVmYXVsdCBkYXRhLXNob3cgdmFsdWUgb2YgJydcbiAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdW5zZXQgZGF0YS1zaG93IHZhbHVlcyB3aWxsIHRvZ2dsZSBvZmYgZXZlcnl0aGluZ1xuICAgICAgICAgIC8vXG4gICAgICAgICAgci5kYXRhc2V0LnNob3cgPSByLmRhdGFzZXQuc2hvdyB8fCAnJ1xuICAgICAgICAgIHIuZGF0YXNldC5hZGRDbGFzcyA9IHIuZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gQXBwZW5kIGVsZW1lbnQncyBkYXRhLWhpZGUgdG8gc2hvd1NlbGVjdG9yc1xuICAgICAgICAgIGlmICggci5kYXRhc2V0LmhpZGUgJiYgci5kYXRhc2V0LmhpZGUubGVuZ3RoID4gMCApXG4gICAgICAgICAgICBzaG93U2VsZWN0b3JzID0gc2hvd1NlbGVjdG9ycy5jb25jYXQoIHIuZGF0YXNldC5oaWRlLnNwbGl0KCAnLCcgKSApXG5cbiAgICAgICAgICByLmRhdGFzZXQuaGlkZSA9IHNob3dTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiByLmRhdGFzZXQuc2hvdy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignLCcpXG5cbiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBhbGwgcmFkaW8gYnV0dG9ucyBpbiBhIGdyb3VwIGhhdmUgYSBkZWZhdWx0IGRhdGEtYWRkLWNsYXNzIHZhbHVlIG9mICcnXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHVuc2V0IGRhdGEtYWRkLWNsYXNzIHZhbHVlcyBhcmUgdG9nZ2xlIG9mZiBhbGwgY2xhc3Nlc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgci5kYXRhc2V0LmFkZENsYXNzID0gci5kYXRhc2V0LmFkZENsYXNzIHx8ICcnXG5cbiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBzZWxlY3RlZCByYWRpbyBidXR0b25zIHJlbW92ZSBjbGFzc2VzIGFjY29yZGluZ1xuICAgICAgICAgIC8vIHRvIHRoZSBkZXNlbGVjdGVkIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgICByLmRhdGFzZXQucmVtb3ZlQ2xhc3MgPSBhZGRDbGFzc1NlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3Ipe1xuICAgICAgICAgICAgcmV0dXJuIHIuZGF0YXNldC5hZGRDbGFzcy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignJicpXG5cblxuICAgICAgICAgIHIuZGF0YXNldC50b2dnbGVyQWN0aXZlID0gdHJ1ZVxuXG5cbiAgICAgICAgICBpZiggci5jaGVja2VkICkgY2hlY2tlZCA9IHJcblxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICggY2hlY2tlZCApIHtcbiAgICAgICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyggY2hlY2tlZCApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgVG9nZ2xlci5zZXRTdGF0ZSggc2hvd1NlbGVjdG9ycy5qb2luKCcsJyksICdoaWRlJyApXG4gICAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyggYWRkQ2xhc3NTZWxlY3RvcnMuam9pbignICYgJyksICdyZW1vdmVDbGFzcycgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KVxuICB9LFxuXG4gIC8vIEFkZCBkYXRhLWhpZGUgdG8gZWFjaCA8b3B0aW9uPiBjb250YWluaW5nIHRoZSBzZWxlY3RvcnMgZnJvbSBvdGhlclxuICAvLyBvcHRpb24ncyBkYXRhLXNob3cuIFRoaXMgbWFrZXMgdGhlIHRvZ2dsaW5nIG9mIGVsZW1lbnRzIGV4Y2x1c2l2ZS5cbiAgLy9cbiAgc2V0dXBTZWxlY3RzOiBmdW5jdGlvbigpe1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChUb2dnbGVyLnNlbGVjdFNlbGVjdG9yKSwgZnVuY3Rpb24ob3B0aW9uKXtcbiAgICAgIC8vIFByZXZlbnQgYW4gb3B0aW9uIGZyb20gYmVpbmcgY29uc2lkZXJlZCB0d2ljZVxuICAgICAgaWYgKCFvcHRpb24uZGF0YXNldC50b2dnbGVyQWN0aXZlKSB7XG5cbiAgICAgICAgb3B0aW9uLmRhdGFzZXQuc2hvdyA9IG9wdGlvbi5kYXRhc2V0LnNob3cgfHwgJydcblxuICAgICAgICB2YXIgc2VsZWN0ID0gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKG9wdGlvbilcbiAgICAgICAgc2VsZWN0LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdC10b2dnbGVyJylcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJylcblxuICAgICAgICB2YXIgc2hvd1NlbGVjdG9ycyAgICAgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKG9wdGlvbnMsICdzaG93JylcbiAgICAgICAgdmFyIGFkZENsYXNzU2VsZWN0b3JzID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhvcHRpb25zLCAnYWRkQ2xhc3MnKVxuXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwob3B0aW9ucywgZnVuY3Rpb24obywgaW5kZXgpIHtcblxuICAgICAgICAgIGlmIChvLmRhdGFzZXQuYW5jaG9yICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICgnIycrby5kYXRhc2V0LmFuY2hvci5yZXBsYWNlKCcjJywnJykpKSB7XG4gICAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGluZGV4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgby5kYXRhc2V0LnNob3cgPSBvLmRhdGFzZXQuc2hvdyB8fCAnJ1xuICAgICAgICAgIG8uZGF0YXNldC5hZGRDbGFzcyA9IG8uZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gQXBwZW5kIGVsZW1lbnQncyBkYXRhLWhpZGUgdG8gc2hvd1NlbGVjdG9yc1xuICAgICAgICAgIGlmICggby5kYXRhc2V0LmhpZGUgJiYgby5kYXRhc2V0LmhpZGUubGVuZ3RoID4gMCApXG4gICAgICAgICAgICBzaG93U2VsZWN0b3JzID0gc2hvd1NlbGVjdG9ycy5jb25jYXQoIG8uZGF0YXNldC5oaWRlLnNwbGl0KCAnLCcgKSApXG5cbiAgICAgICAgICAvLyBJZiBzaG93IHNlbGVjdG9ycyBhcmUgbm90IHByZXNlbnQgaW4gZWxlbWVudCdzIGRhdGEtc2hvd1xuICAgICAgICAgIC8vIEFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIHNlbGVjdG9ycyB0byBiZSBoaWRkZW5cbiAgICAgICAgICBvLmRhdGFzZXQuaGlkZSA9IHNob3dTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiBvLmRhdGFzZXQuc2hvdy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignLCcpXG5cbiAgICAgICAgICBvLmRhdGFzZXQucmVtb3ZlQ2xhc3MgPSBhZGRDbGFzc1NlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3Ipe1xuICAgICAgICAgICAgcmV0dXJuIG8uZGF0YXNldC5hZGRDbGFzcy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignICYgJylcblxuICAgICAgICAgIG8uZGF0YXNldC50b2dnbGVyQWN0aXZlID0gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgdG9nZ2xlZCBwcm9wZXJseVxuICAgICAgICAvL1xuICAgICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyhzZWxlY3QpXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICAvLyBGaW5kIHBhcmVudCA8c2VsZWN0PiBmb3IgYW4gb3B0aW9uIChhY2NvdW50cyBmb3Igb3B0aW9uIGdyb3VwcylcbiAgLy9cbiAgZ2V0U2VsZWN0RnJvbU9wdGlvbjogZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgcCA9IGVsLnBhcmVudEVsZW1lbnRcblxuICAgIGlmIChwLnRhZ05hbWUgPT0gJ1NFTEVDVCcpIHtcbiAgICAgIHJldHVybiBwXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24ocClcbiAgICB9XG4gIH0sXG5cblxuICAvLyBGaW5kIHBhcmVudCA8Zm9ybT4gb3IgZG9jdW1lbnQgaWYgdGhlcmUgaXMgbm8gZm9ybVxuICAvL1xuICBwYXJlbnRGb3JtOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgdmFyIGVsID0gZWxlbWVudFxuXG4gICAgd2hpbGUgKGVsICYmIGVsLnRhZ05hbWUgIT0gXCJGT1JNXCIpIHtcbiAgICAgIGVsID0gZWwucGFyZW50Tm9kZVxuICAgIH1cblxuICAgIHJldHVybiBlbCB8fCBkb2N1bWVudFxuICB9LFxuXG4gIC8vIFJldHVybiBhIHVuaXF1ZSBhcnJheSBvZiBhbGwgZGF0YSBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZWxlbWVudHNcbiAgLy9cbiAgZGF0YUF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBhdHRyKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlbGVtZW50cywgZnVuY3Rpb24oZWwpIHsgXG4gICAgICByZXR1cm4gZWwuZGF0YXNldFthdHRyXVxuICAgIH0pLmZpbHRlcihmdW5jdGlvbihzZWxlY3RvcnMsIGluZGV4LCBzZWxmKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JzICE9IFwiXCIgJiYgdHlwZW9mIHNlbGVjdG9ycyAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLmluZGV4T2Yoc2VsZWN0b3JzKSA9PT0gaW5kZXhcbiAgICB9KVxuICB9XG59XG5cbkV2ZW50LnJlYWR5KFRvZ2dsZXIubGlzdGVuKVxuRXZlbnQuY2hhbmdlKFRvZ2dsZXIucmVmcmVzaClcblxubW9kdWxlLmV4cG9ydHMgPSBUb2dnbGVyXG4iLCIvLyBTaGltc1xucmVxdWlyZSggJy4vbGliL3NoaW1zL19jbGFzc2xpc3QnIClcbnZhciBtZXJnZSAgICA9IHJlcXVpcmUoICcuL2xpYi9zaGltcy9fb2JqZWN0LmFzc2lnbicgKSxcbiAgICBldmVudCAgICA9IHJlcXVpcmUoICdjb21wb3NlLWV2ZW50JyApLFxuICAgIGx1eG9uICAgID0gcmVxdWlyZSggJ2x1eG9uJyApLFxuICAgIHRpbWUgICAgID0gbWVyZ2UocmVxdWlyZSggJy4vbGliL3RpbWUnICksIGx1eG9uKSxcbiAgICBzY3JvbGxUbyA9IHJlcXVpcmUoICcuL2xpYi9zY3JvbGx0bycgKSxcbiAgICBmcm9tVG9wICA9IHJlcXVpcmUoICcuL2xpYi9mcm9tdG9wJyApLFxuICAgIGVhc2UgICAgID0gcmVxdWlyZSggJy4vbGliL2Vhc2UnIClcblxudmFyIHRvb2xib3ggPSB7XG5cbiAgZXZlbnQ6IGV2ZW50LFxuICBzY3JvbGxUbzogc2Nyb2xsVG8sXG4gIGZyb21Ub3A6IGZyb21Ub3AsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZWFzZTogZWFzZSxcbiAgdGltZTogdGltZSxcblxuICAvLyBHZXQgY2xvc2VzdCBET00gZWxlbWVudCB1cCB0aGUgdHJlZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3RvclxuICBnZXRDbG9zZXN0OiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCB0b29sYm94Lm1hdGNoZXMoIGVsLCBzZWxlY3RvciApICkgcmV0dXJuIGVsXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIGNoaWxkT2Y6IGZ1bmN0aW9uICggZWwsIHBhcmVudCApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbCA9PSBwYXJlbnQgKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0sXG5cbiAgLy8gR2V0IG5leHQgRE9NIGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3JcbiAgZ2V0TmV4dDogZnVuY3Rpb24oIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApICkgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvLyBNYXRjaGVzIHNlbGVjdG9yIGZ1bmN0aW9uXG4gIC8vIEByZWZlcmVuY2UgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvbWF0Y2hlc1xuICBtYXRjaGVzOiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICByZXR1cm4gKCBlbC5tYXRjaGVzIHx8IGVsLm1hdGNoZXNTZWxlY3RvciB8fCBlbC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLm9NYXRjaGVzU2VsZWN0b3IgKS5jYWxsKCBlbCwgc2VsZWN0b3IgKTtcbiAgfSxcblxuICB3b3JkQ291bnQ6IGZ1bmN0aW9uKCBzdHIgKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBzdHIubWF0Y2goIC9cXFMrL2cgKTtcbiAgICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXMubGVuZ3RoIDogMDtcbiAgfSxcblxuICAvLyBFYXN5IGFjY2VzcyB0byBzbGljZSBmb3IgY29udmVydGluZyBvYmplY3RzIGludG8gYXJyYXlzIG9mIHZhbHVlcy5cbiAgc2xpY2U6IGZ1bmN0aW9uKCBvYmosIGNvdW50ICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggb2JqLCBjb3VudCApXG4gIH0sXG5cbiAgZWFjaDogZnVuY3Rpb24oIGNvbGxlY3Rpb24sIGNhbGxiYWNrICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBjb2xsZWN0aW9uLCBjYWxsYmFjayApXG4gIH0sXG5cbiAgaXNFbGVtZW50OiBmdW5jdGlvbiAoIGl0ZW0gKSB7XG4gICAgcmV0dXJuIGl0ZW0uY29uc3RydWN0b3IudG9TdHJpbmcoKS5zZWFyY2goL0hUTUwuK0VsZW1lbnQvKSA+IC0xXG4gIH0sXG5cbiAgZm9ybURhdGE6IGZ1bmN0aW9uKCByb290RWwgKSB7XG4gICAgdmFyIGZvcm1EYXRhICA9IG5ldyBGb3JtRGF0YSgpLFxuICAgICAgICBmaWVsZHMgPSB0b29sYm94LnNsaWNlKHJvb3RFbC5xdWVyeVNlbGVjdG9yQWxsKCAnaW5wdXRbbmFtZV06bm90KFtkaXNhYmxlZF0pLCBzZWxlY3RbbmFtZV06bm90KFtkaXNhYmxlZF0pLCB0ZXh0YXJlYVtuYW1lXTpub3QoW2Rpc2FibGVkXSknICkpXG4gICAgdmFyIGZpZWxkRGF0YSA9IHt9XG5cbiAgICAvLyBSZW1vdmUgYW55IGZpZWxkIHdoaWNoIGhhcyBhIHBhcmVudCB3aGljaCBpcyBkaXNhYmxlZFxuICAgIGZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoIGZ1bmN0aW9uKCBmICkgeyByZXR1cm4gIXRvb2xib3guZ2V0Q2xvc2VzdChmLCAnW2Rpc2FibGVkXScpIH0pXG5cbiAgICAvLyBMb29wIG92ZXIgZmllbGRzXG4gICAgLy8gcmV2ZXJzZSB0aGVtIGJlY2F1c2UgaWYgdGhlcmUgYXJlIHR3byBpbnB1dHMgd2l0aCB0aGUgc2FtZSBuYW1lXG4gICAgLy8gdGhlIGxhc3QgaW5wdXQgb3ZlcnJpZGVzIHRoZSBmaXJzdC5cbiAgICBmaWVsZHMucmV2ZXJzZSgpLmZvckVhY2goIGZ1bmN0aW9uKCBmaWVsZCApIHtcbiAgICAgIGlmICggdG9vbGJveC5tYXRjaGVzKCBmaWVsZCwgJ1t0eXBlPXJhZGlvXSwgW3R5cGU9Y2hlY2tib3hdJykgKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBjaGVja2JveCBvciByYWRpbyBpbnB1dCwgb3ZlcndyaXRlIHdpdGggY2hlY2tlZCB2YWx1ZXNcbiAgICAgICAgaWYgKCBmaWVsZC5jaGVja2VkICkgZmllbGREYXRhW2ZpZWxkLm5hbWVdID0gZmllbGRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9ubHkgYWRkIG9uZSB2YWx1ZSBwZXIgZmllbGQgbmFtZVxuICAgICAgICBmaWVsZERhdGFbZmllbGQubmFtZV0gPSBmaWVsZERhdGFbZmllbGQubmFtZV0gfHwgZmllbGRcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZm9yICggdmFyIG5hbWUgaW4gZmllbGREYXRhICkge1xuICAgICAgLy8gQXBwZW5kIGN1cnJlbnQgZmllbGTigJlzIG5hbWUvdmFsdWUgdG8gbmV3IGZvcm1EYXRhIG9iamVjdFxuICAgICAgZm9ybURhdGEuYXBwZW5kKCBuYW1lLCBmaWVsZERhdGFbbmFtZV0udmFsdWUgKTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIHJldHVybiBzYWlkIGZvcm1EYXRhIG9iamVjdFxuICAgIHJldHVybiBmb3JtRGF0YTtcbiAgfVxuXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0b29sYm94XG4iLCIvLyBlYXNpbmcgZnVuY3Rpb25zIGh0dHA6Ly9naXptYS5jb20vZWFzaW5nL1xudmFyIGVhc2UgPSB7XG5cbiAgaW5PdXRRdWFkOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuICAgIHQgLz0gZC8yXG4gICAgaWYgKHQgPCAxKSB7IHJldHVybiBjLzIqdCp0ICsgYiB9XG4gICAgdC0tXG4gICAgcmV0dXJuIC1jLzIgKiAodCoodC0yKSAtIDEpICsgYlxuICB9LFxuXG4gIGluT3V0Q3ViaWM6IGZ1bmN0aW9uICh0LCBiLCBjLCBkKSB7XG5cdHQgLz0gZC8yO1xuXHRpZiAodCA8IDEpIHJldHVybiBjLzIqdCp0KnQgKyBiO1xuXHR0IC09IDI7XG5cdHJldHVybiBjLzIqKHQqdCp0ICsgMikgKyBiO1xuICB9LFxuXG4gIGluT3V0UXVpbnQ6IGZ1bmN0aW9uKHQsIGIsIGMsIGQpIHtcbiAgICB2YXIgdHMgPSAodC89ZCkqdCxcbiAgICB0YyA9IHRzKnQ7XG4gICAgcmV0dXJuIGIrYyooNip0Yyp0cyArIC0xNSp0cyp0cyArIDEwKnRjKTtcbiAgfSxcblxuICBpbk91dENpcmM6IGZ1bmN0aW9uICh0LCBiLCBjLCBkKSB7XG4gICAgdCAvPSBkLzI7XG4gICAgaWYgKHQgPCAxKSByZXR1cm4gLWMvMiAqIChNYXRoLnNxcnQoMSAtIHQqdCkgLSAxKSArIGI7XG4gICAgdCAtPSAyO1xuICAgIHJldHVybiBjLzIgKiAoTWF0aC5zcXJ0KDEgLSB0KnQpICsgMSkgKyBiO1xuICB9XG5cbn1cblxuZWFzZS5kZWZhdWx0ID0gZWFzZS5pbk91dFF1YWRcblxubW9kdWxlLmV4cG9ydHMgPSBlYXNlXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCBlbCApIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldCApO1xufVxuIiwidmFyIGVhc2UgICAgPSByZXF1aXJlKCAnLi9lYXNlJyApXG52YXIgZnJvbVRvcCA9IHJlcXVpcmUoICcuL2Zyb210b3AnIClcblxuZnVuY3Rpb24gbW92ZShhbW91bnQpIHtcblxuICAvLyBTY3JvbGwgYWxsIGJlY2F1c2UgZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCBpcyBzdGlsbCBleHBpcmVtZW50YWxcbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IGFtb3VudDtcbiAgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbFRvcCA9IGFtb3VudDtcbiAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBhbW91bnQ7XG5cbn1cblxuZnVuY3Rpb24gcG9zaXRpb24oKSB7XG4gIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG59XG5cbmZ1bmN0aW9uIHNjcm9sbFRvKHRvLCBjYWxsYmFjaywgZHVyYXRpb24pIHtcblxuICAvLyBNYWtpbmcgYXJncyBmbGV4aWJsZVxuICAvL1xuICAvLyBBbGxvdyBmb3IgZWxlbWVudCBvciB5LWNvb3JkaW5hdGVzXG4gIGlmKCB0eXBlb2YoIHRvICkgPT09ICdvYmplY3QnICkgeyB0byA9IGZyb21Ub3AoIHRvICkgfVxuXG4gIC8vIEFjY2VwdCBkdXJhdGlvbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG4gIGlmKCB0eXBlb2YoIGNhbGxiYWNrICkgPT09ICdudW1iZXInICkgeyBkdXJhdGlvbiA9IGNhbGxiYWNrOyBjYWxsYmFjayA9IG51bGwgfVxuXG4gIC8vIERlZmF1bHQgZHVyYXRpb24gPSA1MDBcbiAgZHVyYXRpb24gPSAoIHR5cGVvZiggZHVyYXRpb24gKSA9PT0gJ3VuZGVmaW5lZCcgKSA/IDUwMCA6IGR1cmF0aW9uXG5cbiAgdmFyIHN0YXJ0ID0gcG9zaXRpb24oKSxcbiAgICBjaGFuZ2UgPSB0byAtIHN0YXJ0LFxuICAgIGN1cnJlbnRUaW1lID0gMCxcbiAgICBpbmNyZW1lbnQgPSAyMDtcblxuXG4gIHZhciBhbmltYXRlU2Nyb2xsID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBpbmNyZW1lbnQgdGhlIHRpbWVcbiAgICBjdXJyZW50VGltZSArPSBpbmNyZW1lbnRcblxuICAgIC8vIGZpbmQgdGhlIHZhbHVlIHdpdGggdGhlIHF1YWRyYXRpYyBpbi1vdXQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgdmFyIHZhbCA9IGVhc2UuZGVmYXVsdChjdXJyZW50VGltZSwgc3RhcnQsIGNoYW5nZSwgZHVyYXRpb24pXG5cbiAgICAvLyBtb3ZlIHRoZSBkb2N1bWVudC5ib2R5XG4gICAgbW92ZSh2YWwpO1xuXG4gICAgLy8gZG8gdGhlIGFuaW1hdGlvbiB1bmxlc3MgaXRzIG92ZXJcbiAgICBpZiAoIGN1cnJlbnRUaW1lIDwgZHVyYXRpb24gKSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGVTY3JvbGwgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIGNhbGxiYWNrICYmIHR5cGVvZiggY2FsbGJhY2sgKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYW5pbWF0ZVNjcm9sbCgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsVG9cbiIsIi8qKlxuICogQ2xhc3NMaXN0IHBvbHlmaWxsXG4gKiBDcm9zcy1icm93c2VyIGZ1bGwgZWxlbWVudC5jbGFzc0xpc3QgaW1wbGVtZW50YXRpb25cbiAqIEBzb3VyY2UgaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL2NsYXNzTGlzdC5qcy9ibG9iL21hc3Rlci9jbGFzc0xpc3QuanNcbiAqIEBhdXRob3IgRWxpIEdyZXkgLSBodHRwOi8vZWxpZ3JleS5jb21cbiAqIEBsaWNlbnNlIE1JVFxuICoqL1xuXG5pZiAoICdkb2N1bWVudCcgaW4gc2VsZiApIHtcblxuICAvLyBGdWxsIHBvbHlmaWxsIGZvciBicm93c2VycyB3aXRoIG5vIGNsYXNzTGlzdCBzdXBwb3J0XG4gIGlmICggISggJ2NsYXNzTGlzdCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ18nICkgKSApIHtcblxuICAgICggZnVuY3Rpb24oIHZpZXcgKSB7XG5cbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBpZiAoICEoICdFbGVtZW50JyBpbiB2aWV3ICkgKSByZXR1cm47XG5cbiAgICB2YXJcbiAgICAgIGNsYXNzTGlzdFByb3AgPSAnY2xhc3NMaXN0JyxcbiAgICAgIHByb3RvUHJvcCAgICAgPSAncHJvdG90eXBlJyxcbiAgICAgIGVsZW1DdHJQcm90byAgPSB2aWV3LkVsZW1lbnRbIHByb3RvUHJvcCBdLFxuICAgICAgb2JqQ3RyICAgICAgICA9IE9iamVjdCxcblxuICAgICAgc3RyVHJpbSA9IFN0cmluZ1sgcHJvdG9Qcm9wIF0udHJpbSB8fCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSggL15cXHMrfFxccyskL2csICcnICk7XG4gICAgICB9LFxuXG4gICAgICBhcnJJbmRleE9mID0gQXJyYXlbIHByb3RvUHJvcCBdLmluZGV4T2YgfHwgZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgaWYgKCBpIGluIHRoaXMgJiYgdGhpc1sgaSBdID09PSBpdGVtICkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0sXG5cbiAgICAgIERPTUV4ID0gZnVuY3Rpb24oIHR5cGUsIG1lc3NhZ2UgKSB7XG4gICAgICAgIHRoaXMubmFtZSAgICA9IHR5cGU7XG4gICAgICAgIHRoaXMuY29kZSAgICA9IERPTUV4Y2VwdGlvblsgdHlwZSBdO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfSxcblxuICAgICAgY2hlY2tUb2tlbkFuZEdldEluZGV4ID0gZnVuY3Rpb24oIGNsYXNzTGlzdCwgdG9rZW4gKSB7XG4gICAgICAgIGlmICggdG9rZW4gPT09ICcnICkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeChcbiAgICAgICAgICAgICdTWU5UQVhfRVJSJyxcbiAgICAgICAgICAgICdBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIC9cXHMvLnRlc3QoIHRva2VuICkgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4KFxuICAgICAgICAgICAgJ0lOVkFMSURfQ0hBUkFDVEVSX0VSUicsXG4gICAgICAgICAgICAnU3RyaW5nIGNvbnRhaW5zIGFuIGludmFsaWQgY2hhcmFjdGVyJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyckluZGV4T2YuY2FsbCggY2xhc3NMaXN0LCB0b2tlbiApO1xuICAgICAgfSxcblxuICAgICAgQ2xhc3NMaXN0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgICAgIHZhciB0cmltbWVkQ2xhc3NlcyA9IHN0clRyaW0uY2FsbCggZWxlbS5nZXRBdHRyaWJ1dGUoICdjbGFzcycgKSB8fCAnJyApLFxuICAgICAgICAgICAgY2xhc3NlcyA9IHRyaW1tZWRDbGFzc2VzID8gdHJpbW1lZENsYXNzZXMuc3BsaXQoIC9cXHMrLyApIDogW107XG5cbiAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICB0aGlzLnB1c2goIGNsYXNzZXNbIGkgXSApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoICdjbGFzcycsIHRoaXMudG9TdHJpbmcoKSApO1xuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgY2xhc3NMaXN0UHJvdG8gPSBDbGFzc0xpc3RbIHByb3RvUHJvcCBdID0gW10sXG5cbiAgICAgIGNsYXNzTGlzdEdldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdCggdGhpcyApO1xuICAgICAgfTtcblxuICAgIERPTUV4WyBwcm90b1Byb3AgXSA9IEVycm9yWyBwcm90b1Byb3AgXTtcblxuICAgIGNsYXNzTGlzdFByb3RvLml0ZW0gPSBmdW5jdGlvbiggaSApIHtcbiAgICAgIHJldHVybiB0aGlzWyBpIF0gfHwgbnVsbDtcbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiggdG9rZW4gKSB7XG4gICAgICB0b2tlbiArPSAnJztcbiAgICAgIHJldHVybiBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICkgIT09IC0xO1xuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by5hZGQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhclxuICAgICAgICB0b2tlbnMgID0gYXJndW1lbnRzLFxuICAgICAgICBpdGVyICAgID0gMCxcbiAgICAgICAgbGVuICAgICA9IHRva2Vucy5sZW5ndGgsXG4gICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcbiAgICAgICAgdG9rZW47XG5cbiAgICAgIGRvIHtcbiAgICAgICAgdG9rZW4gPSB0b2tlbnNbIGl0ZXIgXSArICcnO1xuICAgICAgICBpZiAoIGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKSA9PT0gLTEgKSB7XG4gICAgICAgICAgdGhpcy5wdXNoKCB0b2tlbiApO1xuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICggKytpdGVyIDwgbGVuICk7XG5cbiAgICAgIGlmICggdXBkYXRlZCApIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyXG4gICAgICAgIHRva2VucyAgPSBhcmd1bWVudHMsXG4gICAgICAgIGl0ZXIgICAgPSAwLFxuICAgICAgICBsZW4gICAgID0gdG9rZW5zLmxlbmd0aCxcbiAgICAgICAgdXBkYXRlZCA9IGZhbHNlLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgaW5kZXg7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgdG9rZW4gPSB0b2tlbnNbIGl0ZXIgXSArICcnO1xuICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKTtcblxuICAgICAgICB3aGlsZSAoIGluZGV4ICE9PSAtMSApIHtcbiAgICAgICAgICB0aGlzLnNwbGljZSggaW5kZXgsIDEgKTtcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoICsraXRlciA8IGxlbiApO1xuXG4gICAgICBpZiAoIHVwZGF0ZWQgKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by50b2dnbGUgPSBmdW5jdGlvbiggdG9rZW4sIGZvcmNlICkge1xuICAgICAgdG9rZW4gKz0gJyc7XG5cbiAgICAgIHZhclxuICAgICAgICByZXN1bHQgPSB0aGlzLmNvbnRhaW5zKCB0b2tlbiApLFxuICAgICAgICBtZXRob2QgPSByZXN1bHQgPyBmb3JjZSAhPT0gdHJ1ZSAmJiAncmVtb3ZlJyA6IGZvcmNlICE9PSBmYWxzZSAmJiAnYWRkJztcblxuICAgICAgaWYgKCBtZXRob2QgKSB7XG4gICAgICAgIHRoaXNbIG1ldGhvZCBdKCB0b2tlbiApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIGZvcmNlID09PSB0cnVlIHx8IGZvcmNlID09PSBmYWxzZSApIHtcbiAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5qb2luKCAnICcgKTtcbiAgICB9O1xuXG4gICAgaWYgKCBvYmpDdHIuZGVmaW5lUHJvcGVydHkgKSB7XG4gICAgICB2YXIgY2xhc3NMaXN0UHJvcERlc2MgPSB7XG4gICAgICAgICAgZ2V0ICAgICAgICAgIDogY2xhc3NMaXN0R2V0dGVyLFxuICAgICAgICAgIGVudW1lcmFibGUgICA6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlIDogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KCBlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjICk7XG4gICAgICB9XG5cbiAgICAgIGNhdGNoICggZXggKSB7XG4gICAgICAgIGlmICggZXgubnVtYmVyID09PSAtMHg3RkY1RUM1NCApIHtcbiAgICAgICAgICBjbGFzc0xpc3RQcm9wRGVzYy5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KCBlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoIG9iakN0clsgcHJvdG9Qcm9wIF0uX19kZWZpbmVHZXR0ZXJfXyApIHtcbiAgICAgIGVsZW1DdHJQcm90by5fX2RlZmluZUdldHRlcl9fKCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RHZXR0ZXIgKTtcbiAgICB9XG5cbiAgICB9KCBzZWxmICkpO1xuXG4gIH0gZWxzZSB7XG5cbiAgICAoIGZ1bmN0aW9uKCkge1xuXG4gICAgICAndXNlIHN0cmljdCc7XG5cbiAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdfJyApO1xuXG4gICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnYzEnLCAnYzInICk7XG5cbiAgICAgIGlmICggIXRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyggJ2MyJyApICkge1xuICAgICAgICB2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24oIG1ldGhvZCApIHtcbiAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlWyBtZXRob2QgXTtcblxuICAgICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGVbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHRva2VuICkge1xuICAgICAgICAgICAgdmFyIGksIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG4gICAgICAgICAgICAgIHRva2VuID0gYXJndW1lbnRzWyBpIF07XG4gICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwoIHRoaXMsIHRva2VuICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgY3JlYXRlTWV0aG9kKCAnYWRkJyApO1xuICAgICAgICBjcmVhdGVNZXRob2QoICdyZW1vdmUnICk7XG4gICAgICB9XG5cbiAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoICdjMycsIGZhbHNlICk7XG5cbiAgICAgIGlmICggdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnYzMnICkgKSB7XG4gICAgICAgIHZhciBfdG9nZ2xlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU7XG5cbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiggdG9rZW4sIGZvcmNlICkge1xuICAgICAgICAgIGlmICggMSBpbiBhcmd1bWVudHMgJiYgIXRoaXMuY29udGFpbnMoIHRva2VuICkgPT09ICFmb3JjZSApIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIF90b2dnbGUuY2FsbCggdGhpcywgdG9rZW4gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgIH1cblxuICAgICAgdGVzdEVsZW1lbnQgPSBudWxsO1xuXG4gICAgfSgpKTtcblxuICB9XG59XG4iLCIvKipcbiAqIE9iamVjdC5hc3NpZ24gcG9seWZpbGxcbiAqIENyb3NzLWJyb3dzZXIgZnVsbCBPYmplY3QuYXNzaWduIGltcGxlbWVudGF0aW9uXG4gKiBAc291cmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ24jUG9seWZpbGxcbiAqIEBsaWNlbnNlIE1JVFxuICoqL1xuXG5pZiAoIHR5cGVvZiBPYmplY3QuYXNzaWduICE9ICdmdW5jdGlvbicgKSB7XG4gICggZnVuY3Rpb24oKSB7XG4gICAgT2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG4gICAgICAndXNlIHN0cmljdCc7XG4gICAgICBpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG91dHB1dCA9IE9iamVjdCggdGFyZ2V0ICk7XG4gICAgICBmb3IgKCB2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KysgKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbIGluZGV4IF07XG4gICAgICAgIGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuICAgICAgICAgIGZvciAoIHZhciBuZXh0S2V5IGluIHNvdXJjZSApIHtcbiAgICAgICAgICAgIGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBzb3VyY2UsIG5leHRLZXkgKSApIHtcbiAgICAgICAgICAgICAgb3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbiAgfSkoKTtcbn1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIG1lcmdlIG9iamVjdHMgd2l0aG91dCBvdmVyd3JpdGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0c1xudmFyIG1lcmdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhcmdzID0gW3t9XS5jb25jYXQoIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG4gIHJldHVybiBPYmplY3QuYXNzaWduLmFwcGx5KCB0aGlzLCBhcmdzIClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZVxuIiwidmFyIERhdGVUaW1lID0gcmVxdWlyZSggJ2x1eG9uJyApLkRhdGVUaW1lXG5cbmZ1bmN0aW9uIGlzQmVmb3JlKCBkYXRlLCBlbmQgKSB7XG4gIGVuZCA9IHBhcnNlKCBlbmQgKVxuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICByZXR1cm4gZGF0ZSA9PSBEYXRlVGltZS5taW4oIGVuZCwgZGF0ZSApXG59XG5cbmZ1bmN0aW9uIGlzQWZ0ZXIoIGRhdGUsIHN0YXJ0ICkge1xuICBzdGFydCA9IHBhcnNlKCBzdGFydCApXG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIHJldHVybiBkYXRlID09IERhdGVUaW1lLm1heCggc3RhcnQsIGRhdGUgKVxufVxuXG5mdW5jdGlvbiBpc0JldHdlZW4oIGRhdGUsIGRhdGUxLCBkYXRlMiApIHtcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlIClcbiAgZGF0ZTEgPSBwYXJzZSggZGF0ZTEgKVxuICBkYXRlMiA9IHBhcnNlKCBkYXRlMiApXG5cbiAgaWYgKCBkYXRlLmlzVmFsaWQgJiYgZGF0ZTEuaXNWYWxpZCAmJiBkYXRlMi5pc1ZhbGlkICkge1xuICAgIC8vIERldGVybWluZSBzdGFydCBhbmQgZW5kIGRhdGVzICh0byBhbGxvdyBhbnkgb3JkZXIgaW4gYXJncylcbiAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5taW4oIGRhdGUxLCBkYXRlMiApXG4gICAgdmFyIGVuZCA9IERhdGVUaW1lLm1heCggZGF0ZTEsIGRhdGUyIClcblxuICAgIHJldHVybiBEYXRlVGltZS5tYXgoIHN0YXJ0LCBkYXRlICkgPT0gRGF0ZVRpbWUubWluKCBkYXRlLCBlbmQgKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlKCBkYXRlLCBvcHRpb25zICkge1xuICB2YXIgZm9ybWF0cyA9IFsgXCJJU09cIiwgXCJTUUxcIiwgXCJIVFRQXCIsIFwiUkZDMjgyMlwiIF0sXG4gICAgICBwYXJzZWREYXRlXG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBpZiAoIG9wdGlvbnMubWlsbGlzICYmICFpc05hTiggZGF0ZSApICkge1xuICAgIGRhdGUgPSBOdW1iZXIoIGRhdGUgKVxuICAgIGZvcm1hdHMudW5zaGlmdCgnTWlsbGlzJylcbiAgfVxuXG4gIGlmICggdHlwZW9mIGRhdGUgPT0gJ29iamVjdCcgKSB7XG4gICAgXG4gICAgLy8gSXMgYWxyZWFkeSBhIERhdGVUaW1lIG9iamVjdFxuICAgIGlmICggZGF0ZS50b0lTTyApIHJldHVybiBkYXRlXG4gICAgZWxzZSBmb3JtYXRzLnVuc2hpZnQoICdPYmplY3QnIClcblxuICAvLyBQYXJzZSBzdHJpbmcgZm9ybWF0c1xuICB9XG5cbiAgZm9ybWF0cy5mb3JFYWNoKCBmdW5jdGlvbiggZm9ybWF0ICkge1xuICAgIGlmICgoICFwYXJzZWREYXRlIHx8ICFwYXJzZWREYXRlLmlzVmFsaWQgKSAmJiBEYXRlVGltZVsnZnJvbScrZm9ybWF0XSApIHtcbiAgICAgIHBhcnNlZERhdGUgPSBEYXRlVGltZVsnZnJvbScrZm9ybWF0XSggZGF0ZSwgb3B0aW9ucyApXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBwYXJzZWREYXRlLmlzVmFsaWQgPyBwYXJzZWREYXRlIDogZmFsc2Vcbn1cblxuLy8gUmVtb3ZlIGluc2lnbmlmaWNhbnQgZGlnaXRzXG5mdW5jdGlvbiBwcmV0dHlQcmludCggZGF0ZSwgb3B0aW9ucyApIHtcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlLCBvcHRpb25zIClcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnpvbmUpIGRhdGUgPSBkYXRlLnNldFpvbmUob3B0aW9ucy56b25lKVxuXG4gIGlmICggZGF0ZSApIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTTygpLnJlcGxhY2UoJ1QnLCAnICcpLnJlcGxhY2UoJy4wMDAnLCcgJykucmVwbGFjZSgnOjAwICcsJyAnKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIlVucGFyc2VhYmxlIGRhdGUgc3RyaW5nXCIgXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQmVmb3JlOiBpc0JlZm9yZSxcbiAgaXNBZnRlcjogaXNBZnRlcixcbiAgaXNCZXR3ZWVuOiBpc0JldHdlZW4sXG4gIHBhcnNlOiBwYXJzZSxcbiAgcHJldHR5UHJpbnQ6IHByZXR0eVByaW50XG59XG4iLCIvLyBDb3B5cmlnaHQgKGMpIDIwMTUgRmxvcmlhbiBIYXJ0bWFubiwgaHR0cHM6Ly9naXRodWIuY29tL2Zsb3JpYW4gaHR0cHM6Ly9naXRodWIuY29tL2Zsb3JpYW4vY29va2llLmpzXG5cbiFmdW5jdGlvbiAoZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdHZhciBjb29raWUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGNvb2tpZS5nZXQuYXBwbHkoY29va2llLCBhcmd1bWVudHMpO1xuXHR9O1xuXG5cdHZhciB1dGlscyA9IGNvb2tpZS51dGlscyA9ICB7XG5cblx0XHQvLyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYW4gYXJyYXk/IFVzZSBFUzUgQXJyYXkuaXNBcnJheSBpZiBpdCdzIGF2YWlsYWJsZS5cblx0XHRpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG5cdFx0fSxcblxuXHRcdC8vIElzIHRoZSBnaXZlbiB2YWx1ZSBhIHBsYWluIG9iamVjdCAvIGFuIG9iamVjdCB3aG9zZSBjb25zdHJ1Y3RvciBpcyBgT2JqZWN0YD9cblx0XHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiAhIXZhbHVlICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuXHRcdH0sXG5cblx0XHQvLyBDb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0IHRvIGFuIGFycmF5IOKAkyBmb3IgZXhhbXBsZSBgYXJndW1lbnRzYC5cblx0XHR0b0FycmF5OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2YWx1ZSk7XG5cdFx0fSxcblxuXHRcdC8vIEdldCB0aGUga2V5cyBvZiBhbiBvYmplY3QuIFVzZSBFUzUgT2JqZWN0LmtleXMgaWYgaXQncyBhdmFpbGFibGUuXG5cdFx0Z2V0S2V5czogT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0dmFyIGtleXMgPSBbXSxcblx0XHRcdFx0IGtleSA9ICcnO1xuXHRcdFx0Zm9yIChrZXkgaW4gb2JqKSB7XG5cdFx0XHRcdGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkga2V5cy5wdXNoKGtleSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ga2V5cztcblx0XHR9LFxuXG5cdFx0Ly8gVW5saWtlIEphdmFTY3JpcHQncyBidWlsdC1pbiBlc2NhcGUgZnVuY3Rpb25zLCB0aGlzIG1ldGhvZFxuXHRcdC8vIG9ubHkgZXNjYXBlcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIGNvb2tpZXMuXG5cdFx0ZW5jb2RlOiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1ssO1wiXFxcXD1cXHMlXS9nLCBmdW5jdGlvbiAoY2hhcmFjdGVyKSB7XG5cdFx0XHRcdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoY2hhcmFjdGVyKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRkZWNvZGU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cdFx0fSxcblxuXHRcdC8vIFJldHVybiBmYWxsYmFjayBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZmluZWQsIG90aGVyd2lzZSByZXR1cm4gdmFsdWUuXG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uICh2YWx1ZSwgZmFsbGJhY2spIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gZmFsbGJhY2sgOiB2YWx1ZTtcblx0XHR9XG5cblx0fTtcblxuXHRjb29raWUuZGVmYXVsdHMgPSB7fTtcblxuXHRjb29raWUuZXhwaXJlc011bHRpcGxpZXIgPSA2MCAqIDYwICogMjQ7XG5cblx0Y29va2llLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBvcHRpb25zKSB7XG5cdFx0aWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoa2V5KSkge1xuXHRcdFx0Ly8gYGtleWAgY29udGFpbnMgYW4gb2JqZWN0IHdpdGgga2V5cyBhbmQgdmFsdWVzIGZvciBjb29raWVzLCBgdmFsdWVgIGNvbnRhaW5zIHRoZSBvcHRpb25zIG9iamVjdC5cblxuXHRcdFx0Zm9yICh2YXIgayBpbiBrZXkpIHtcblx0XHRcdFx0aWYgKGtleS5oYXNPd25Qcm9wZXJ0eShrKSkgdGhpcy5zZXQoaywga2V5W2tdLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMgPSB1dGlscy5pc1BsYWluT2JqZWN0KG9wdGlvbnMpID8gb3B0aW9ucyA6IHsgZXhwaXJlczogb3B0aW9ucyB9O1xuXG5cdFx0XHQvLyBFbXB0eSBzdHJpbmcgZm9yIHNlc3Npb24gY29va2llcy5cblx0XHRcdHZhciBleHBpcmVzID0gb3B0aW9ucy5leHBpcmVzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmV4cGlyZXMgOiAodGhpcy5kZWZhdWx0cy5leHBpcmVzIHx8ICcnKSxcblx0XHRcdCAgICBleHBpcmVzVHlwZSA9IHR5cGVvZihleHBpcmVzKTtcblxuXHRcdFx0aWYgKGV4cGlyZXNUeXBlID09PSAnc3RyaW5nJyAmJiBleHBpcmVzICE9PSAnJykgZXhwaXJlcyA9IG5ldyBEYXRlKGV4cGlyZXMpO1xuXHRcdFx0ZWxzZSBpZiAoZXhwaXJlc1R5cGUgPT09ICdudW1iZXInKSBleHBpcmVzID0gbmV3IERhdGUoK25ldyBEYXRlICsgMTAwMCAqIHRoaXMuZXhwaXJlc011bHRpcGxpZXIgKiBleHBpcmVzKTsgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBJRSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgbWF4LWFnZWAgY29va2llIGF0dHJpYnV0ZS5cblxuXHRcdFx0aWYgKGV4cGlyZXMgIT09ICcnICYmICd0b0dNVFN0cmluZycgaW4gZXhwaXJlcykgZXhwaXJlcyA9ICc7ZXhwaXJlcz0nICsgZXhwaXJlcy50b0dNVFN0cmluZygpO1xuXG5cdFx0XHR2YXIgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCB0aGlzLmRlZmF1bHRzLnBhdGg7XG5cdFx0XHRwYXRoID0gcGF0aCA/ICc7cGF0aD0nICsgcGF0aCA6ICcnO1xuXG5cdFx0XHR2YXIgZG9tYWluID0gb3B0aW9ucy5kb21haW4gfHwgdGhpcy5kZWZhdWx0cy5kb21haW47XG5cdFx0XHRkb21haW4gPSBkb21haW4gPyAnO2RvbWFpbj0nICsgZG9tYWluIDogJyc7XG5cblx0XHRcdHZhciBzZWN1cmUgPSBvcHRpb25zLnNlY3VyZSB8fCB0aGlzLmRlZmF1bHRzLnNlY3VyZSA/ICc7c2VjdXJlJyA6ICcnO1xuXHRcdFx0aWYgKG9wdGlvbnMuc2VjdXJlID09PSBmYWxzZSkgc2VjdXJlID0gJyc7XG5cblx0XHRcdGRvY3VtZW50LmNvb2tpZSA9IHV0aWxzLmVuY29kZShrZXkpICsgJz0nICsgdXRpbHMuZW5jb2RlKHZhbHVlKSArIGV4cGlyZXMgKyBwYXRoICsgZG9tYWluICsgc2VjdXJlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIGBjb29raWVgIG9iamVjdCB0byBtYWtlIGNoYWluaW5nIHBvc3NpYmxlLlxuXHR9O1xuXG5cdGNvb2tpZS5zZXREZWZhdWx0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcblx0XHRpZiAodXRpbHMuaXNQbGFpbk9iamVjdChrZXkpKSB7XG5cdFx0XHRmb3IgKHZhciBrIGluIGtleSkge1xuXHRcdFx0XHRpZiAodGhpcy5nZXQoaykgPT09IHVuZGVmaW5lZCkgdGhpcy5zZXQoaywga2V5W2tdLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY29va2llO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGhpcy5nZXQoa2V5KSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHR9XG5cdH0sXG5cblx0Y29va2llLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXlzKSB7XG5cdFx0a2V5cyA9IHV0aWxzLmlzQXJyYXkoa2V5cykgPyBrZXlzIDogdXRpbHMudG9BcnJheShhcmd1bWVudHMpO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dGhpcy5zZXQoa2V5c1tpXSwgJycsIC0xKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpczsgLy8gUmV0dXJuIHRoZSBgY29va2llYCBvYmplY3QgdG8gbWFrZSBjaGFpbmluZyBwb3NzaWJsZS5cblx0fTtcblxuXHRjb29raWUucmVtb3ZlU3BlY2lmaWMgPSBmdW5jdGlvbiAoa2V5cywgb3B0aW9ucykge1xuXHRcdGlmICghb3B0aW9ucykgcmV0dXJuIHRoaXMucmVtb3ZlKGtleXMpO1xuXG5cdFx0a2V5cyA9IHV0aWxzLmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdO1xuXHRcdG9wdGlvbnMuZXhwaXJlcyA9IC0xO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dGhpcy5zZXQoa2V5c1tpXSwgJycsIG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIGBjb29raWVgIG9iamVjdCB0byBtYWtlIGNoYWluaW5nIHBvc3NpYmxlLlxuXHR9O1xuXG5cdGNvb2tpZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmUodXRpbHMuZ2V0S2V5cyh0aGlzLmFsbCgpKSk7XG5cdH07XG5cblx0Y29va2llLmdldCA9IGZ1bmN0aW9uIChrZXlzLCBmYWxsYmFjaykge1xuXHRcdHZhciBjb29raWVzID0gdGhpcy5hbGwoKTtcblxuXHRcdGlmICh1dGlscy5pc0FycmF5KGtleXMpKSB7XG5cdFx0XHR2YXIgcmVzdWx0ID0ge307XG5cblx0XHRcdGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0dmFyIHZhbHVlID0ga2V5c1tpXTtcblx0XHRcdFx0cmVzdWx0W3ZhbHVlXSA9IHV0aWxzLnJldHJpZXZlKGNvb2tpZXNbdmFsdWVdLCBmYWxsYmFjayk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHR9IGVsc2UgcmV0dXJuIHV0aWxzLnJldHJpZXZlKGNvb2tpZXNba2V5c10sIGZhbGxiYWNrKTtcblx0fTtcblxuXHRjb29raWUuYWxsID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmIChkb2N1bWVudC5jb29raWUgPT09ICcnKSByZXR1cm4ge307XG5cblx0XHR2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSxcblx0XHQgICAgcmVzdWx0ID0ge307XG5cblx0XHRmb3IgKHZhciBpID0gMCwgbCA9IGNvb2tpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IGNvb2tpZXNbaV0uc3BsaXQoJz0nKTtcblx0XHRcdHZhciBrZXkgPSB1dGlscy5kZWNvZGUoaXRlbS5zaGlmdCgpKTtcblx0XHRcdHZhciB2YWx1ZSA9IHV0aWxzLmRlY29kZShpdGVtLmpvaW4oJz0nKSk7XG5cdFx0XHRyZXN1bHRba2V5XSA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Y29va2llLmVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKG5hdmlnYXRvci5jb29raWVFbmFibGVkKSByZXR1cm4gdHJ1ZTtcblxuXHRcdHZhciByZXQgPSBjb29raWUuc2V0KCdfJywgJ18nKS5nZXQoJ18nKSA9PT0gJ18nO1xuXHRcdGNvb2tpZS5yZW1vdmUoJ18nKTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXG5cdC8vIElmIGFuIEFNRCBsb2FkZXIgaXMgcHJlc2VudCB1c2UgQU1ELlxuXHQvLyBJZiBhIENvbW1vbkpTIGxvYWRlciBpcyBwcmVzZW50IHVzZSBDb21tb25KUy5cblx0Ly8gT3RoZXJ3aXNlIGFzc2lnbiB0aGUgYGNvb2tpZWAgb2JqZWN0IHRvIHRoZSBnbG9iYWwgc2NvcGUuXG5cblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4ge2Nvb2tpZTogY29va2llfTtcblx0XHR9KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRleHBvcnRzLmNvb2tpZSA9IGNvb2tpZTtcblx0fSBlbHNlIHdpbmRvdy5jb29raWUgPSBjb29raWU7XG5cbi8vIElmIHVzZWQgZS5nLiB3aXRoIEJyb3dzZXJpZnkgYW5kIENvbW1vbkpTLCBkb2N1bWVudCBpcyBub3QgZGVjbGFyZWQuXG59KHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogZG9jdW1lbnQpO1xuIiwiLy8gICAgIGtleW1hc3Rlci5qc1xuLy8gICAgIChjKSAyMDExLTIwMTMgVGhvbWFzIEZ1Y2hzXG4vLyAgICAga2V5bWFzdGVyLmpzIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuXG47KGZ1bmN0aW9uKGdsb2JhbCl7XG4gIHZhciBrLFxuICAgIF9oYW5kbGVycyA9IHt9LFxuICAgIF9tb2RzID0geyAxNjogZmFsc2UsIDE4OiBmYWxzZSwgMTc6IGZhbHNlLCA5MTogZmFsc2UgfSxcbiAgICBfc2NvcGUgPSAnYWxsJyxcbiAgICAvLyBtb2RpZmllciBrZXlzXG4gICAgX01PRElGSUVSUyA9IHtcbiAgICAgICfih6cnOiAxNiwgc2hpZnQ6IDE2LFxuICAgICAgJ+KMpSc6IDE4LCBhbHQ6IDE4LCBvcHRpb246IDE4LFxuICAgICAgJ+KMgyc6IDE3LCBjdHJsOiAxNywgY29udHJvbDogMTcsXG4gICAgICAn4oyYJzogOTEsIGNvbW1hbmQ6IDkxXG4gICAgfSxcbiAgICAvLyBzcGVjaWFsIGtleXNcbiAgICBfTUFQID0ge1xuICAgICAgYmFja3NwYWNlOiA4LCB0YWI6IDksIGNsZWFyOiAxMixcbiAgICAgIGVudGVyOiAxMywgJ3JldHVybic6IDEzLFxuICAgICAgZXNjOiAyNywgZXNjYXBlOiAyNywgc3BhY2U6IDMyLFxuICAgICAgbGVmdDogMzcsIHVwOiAzOCxcbiAgICAgIHJpZ2h0OiAzOSwgZG93bjogNDAsXG4gICAgICBkZWw6IDQ2LCAnZGVsZXRlJzogNDYsXG4gICAgICBob21lOiAzNiwgZW5kOiAzNSxcbiAgICAgIHBhZ2V1cDogMzMsIHBhZ2Vkb3duOiAzNCxcbiAgICAgICcsJzogMTg4LCAnLic6IDE5MCwgJy8nOiAxOTEsXG4gICAgICAnYCc6IDE5MiwgJy0nOiAxODksICc9JzogMTg3LFxuICAgICAgJzsnOiAxODYsICdcXCcnOiAyMjIsXG4gICAgICAnWyc6IDIxOSwgJ10nOiAyMjEsICdcXFxcJzogMjIwXG4gICAgfSxcbiAgICBjb2RlID0gZnVuY3Rpb24oeCl7XG4gICAgICByZXR1cm4gX01BUFt4XSB8fCB4LnRvVXBwZXJDYXNlKCkuY2hhckNvZGVBdCgwKTtcbiAgICB9LFxuICAgIF9kb3duS2V5cyA9IFtdO1xuXG4gIGZvcihrPTE7azwyMDtrKyspIF9NQVBbJ2YnK2tdID0gMTExK2s7XG5cbiAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IEFycmF5I2luZGV4T2YsIHNvIGhhdmUgYSBzaW1wbGUgcmVwbGFjZW1lbnRcbiAgZnVuY3Rpb24gaW5kZXgoYXJyYXksIGl0ZW0pe1xuICAgIHZhciBpID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlKGktLSkgaWYoYXJyYXlbaV09PT1pdGVtKSByZXR1cm4gaTtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBmb3IgY29tcGFyaW5nIG1vZHMgYmVmb3JlIHVuYXNzaWdubWVudFxuICBmdW5jdGlvbiBjb21wYXJlQXJyYXkoYTEsIGEyKSB7XG4gICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhMVtpXSAhPT0gYTJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbW9kaWZpZXJNYXAgPSB7XG4gICAgICAxNjonc2hpZnRLZXknLFxuICAgICAgMTg6J2FsdEtleScsXG4gICAgICAxNzonY3RybEtleScsXG4gICAgICA5MTonbWV0YUtleSdcbiAgfTtcbiAgZnVuY3Rpb24gdXBkYXRlTW9kaWZpZXJLZXkoZXZlbnQpIHtcbiAgICAgIGZvcihrIGluIF9tb2RzKSBfbW9kc1trXSA9IGV2ZW50W21vZGlmaWVyTWFwW2tdXTtcbiAgfTtcblxuICAvLyBoYW5kbGUga2V5ZG93biBldmVudFxuICBmdW5jdGlvbiBkaXNwYXRjaChldmVudCkge1xuICAgIHZhciBrZXksIGhhbmRsZXIsIGssIGksIG1vZGlmaWVyc01hdGNoLCBzY29wZTtcbiAgICBrZXkgPSBldmVudC5rZXlDb2RlO1xuXG4gICAgaWYgKGluZGV4KF9kb3duS2V5cywga2V5KSA9PSAtMSkge1xuICAgICAgICBfZG93bktleXMucHVzaChrZXkpO1xuICAgIH1cblxuICAgIC8vIGlmIGEgbW9kaWZpZXIga2V5LCBzZXQgdGhlIGtleS48bW9kaWZpZXJrZXluYW1lPiBwcm9wZXJ0eSB0byB0cnVlIGFuZCByZXR1cm5cbiAgICBpZihrZXkgPT0gOTMgfHwga2V5ID09IDIyNCkga2V5ID0gOTE7IC8vIHJpZ2h0IGNvbW1hbmQgb24gd2Via2l0LCBjb21tYW5kIG9uIEdlY2tvXG4gICAgaWYoa2V5IGluIF9tb2RzKSB7XG4gICAgICBfbW9kc1trZXldID0gdHJ1ZTtcbiAgICAgIC8vICdhc3NpZ25LZXknIGZyb20gaW5zaWRlIHRoaXMgY2xvc3VyZSBpcyBleHBvcnRlZCB0byB3aW5kb3cua2V5XG4gICAgICBmb3IoayBpbiBfTU9ESUZJRVJTKSBpZihfTU9ESUZJRVJTW2tdID09IGtleSkgYXNzaWduS2V5W2tdID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXBkYXRlTW9kaWZpZXJLZXkoZXZlbnQpO1xuXG4gICAgLy8gc2VlIGlmIHdlIG5lZWQgdG8gaWdub3JlIHRoZSBrZXlwcmVzcyAoZmlsdGVyKCkgY2FuIGNhbiBiZSBvdmVycmlkZGVuKVxuICAgIC8vIGJ5IGRlZmF1bHQgaWdub3JlIGtleSBwcmVzc2VzIGlmIGEgc2VsZWN0LCB0ZXh0YXJlYSwgb3IgaW5wdXQgaXMgZm9jdXNlZFxuICAgIGlmKCFhc3NpZ25LZXkuZmlsdGVyLmNhbGwodGhpcywgZXZlbnQpKSByZXR1cm47XG5cbiAgICAvLyBhYm9ydCBpZiBubyBwb3RlbnRpYWxseSBtYXRjaGluZyBzaG9ydGN1dHMgZm91bmRcbiAgICBpZiAoIShrZXkgaW4gX2hhbmRsZXJzKSkgcmV0dXJuO1xuXG4gICAgc2NvcGUgPSBnZXRTY29wZSgpO1xuXG4gICAgLy8gZm9yIGVhY2ggcG90ZW50aWFsIHNob3J0Y3V0XG4gICAgZm9yIChpID0gMDsgaSA8IF9oYW5kbGVyc1trZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoYW5kbGVyID0gX2hhbmRsZXJzW2tleV1baV07XG5cbiAgICAgIC8vIHNlZSBpZiBpdCdzIGluIHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICBpZihoYW5kbGVyLnNjb3BlID09IHNjb3BlIHx8IGhhbmRsZXIuc2NvcGUgPT0gJ2FsbCcpe1xuICAgICAgICAvLyBjaGVjayBpZiBtb2RpZmllcnMgbWF0Y2ggaWYgYW55XG4gICAgICAgIG1vZGlmaWVyc01hdGNoID0gaGFuZGxlci5tb2RzLmxlbmd0aCA+IDA7XG4gICAgICAgIGZvcihrIGluIF9tb2RzKVxuICAgICAgICAgIGlmKCghX21vZHNba10gJiYgaW5kZXgoaGFuZGxlci5tb2RzLCAraykgPiAtMSkgfHxcbiAgICAgICAgICAgIChfbW9kc1trXSAmJiBpbmRleChoYW5kbGVyLm1vZHMsICtrKSA9PSAtMSkpIG1vZGlmaWVyc01hdGNoID0gZmFsc2U7XG4gICAgICAgIC8vIGNhbGwgdGhlIGhhbmRsZXIgYW5kIHN0b3AgdGhlIGV2ZW50IGlmIG5lY2Nlc3NhcnlcbiAgICAgICAgaWYoKGhhbmRsZXIubW9kcy5sZW5ndGggPT0gMCAmJiAhX21vZHNbMTZdICYmICFfbW9kc1sxOF0gJiYgIV9tb2RzWzE3XSAmJiAhX21vZHNbOTFdKSB8fCBtb2RpZmllcnNNYXRjaCl7XG4gICAgICAgICAgaWYoaGFuZGxlci5tZXRob2QoZXZlbnQsIGhhbmRsZXIpPT09ZmFsc2Upe1xuICAgICAgICAgICAgaWYoZXZlbnQucHJldmVudERlZmF1bHQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGVsc2UgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZihldmVudC5jYW5jZWxCdWJibGUpIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHVuc2V0IG1vZGlmaWVyIGtleXMgb24ga2V5dXBcbiAgZnVuY3Rpb24gY2xlYXJNb2RpZmllcihldmVudCl7XG4gICAgdmFyIGtleSA9IGV2ZW50LmtleUNvZGUsIGssXG4gICAgICAgIGkgPSBpbmRleChfZG93bktleXMsIGtleSk7XG5cbiAgICAvLyByZW1vdmUga2V5IGZyb20gX2Rvd25LZXlzXG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgICBfZG93bktleXMuc3BsaWNlKGksIDEpO1xuICAgIH1cblxuICAgIGlmKGtleSA9PSA5MyB8fCBrZXkgPT0gMjI0KSBrZXkgPSA5MTtcbiAgICBpZihrZXkgaW4gX21vZHMpIHtcbiAgICAgIF9tb2RzW2tleV0gPSBmYWxzZTtcbiAgICAgIGZvcihrIGluIF9NT0RJRklFUlMpIGlmKF9NT0RJRklFUlNba10gPT0ga2V5KSBhc3NpZ25LZXlba10gPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVzZXRNb2RpZmllcnMoKSB7XG4gICAgZm9yKGsgaW4gX21vZHMpIF9tb2RzW2tdID0gZmFsc2U7XG4gICAgZm9yKGsgaW4gX01PRElGSUVSUykgYXNzaWduS2V5W2tdID0gZmFsc2U7XG4gIH07XG5cbiAgLy8gcGFyc2UgYW5kIGFzc2lnbiBzaG9ydGN1dFxuICBmdW5jdGlvbiBhc3NpZ25LZXkoa2V5LCBzY29wZSwgbWV0aG9kKXtcbiAgICB2YXIga2V5cywgbW9kcztcbiAgICBrZXlzID0gZ2V0S2V5cyhrZXkpO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0aG9kID0gc2NvcGU7XG4gICAgICBzY29wZSA9ICdhbGwnO1xuICAgIH1cblxuICAgIC8vIGZvciBlYWNoIHNob3J0Y3V0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBzZXQgbW9kaWZpZXIga2V5cyBpZiBhbnlcbiAgICAgIG1vZHMgPSBbXTtcbiAgICAgIGtleSA9IGtleXNbaV0uc3BsaXQoJysnKTtcbiAgICAgIGlmIChrZXkubGVuZ3RoID4gMSl7XG4gICAgICAgIG1vZHMgPSBnZXRNb2RzKGtleSk7XG4gICAgICAgIGtleSA9IFtrZXlba2V5Lmxlbmd0aC0xXV07XG4gICAgICB9XG4gICAgICAvLyBjb252ZXJ0IHRvIGtleWNvZGUgYW5kLi4uXG4gICAgICBrZXkgPSBrZXlbMF1cbiAgICAgIGtleSA9IGNvZGUoa2V5KTtcbiAgICAgIC8vIC4uLnN0b3JlIGhhbmRsZXJcbiAgICAgIGlmICghKGtleSBpbiBfaGFuZGxlcnMpKSBfaGFuZGxlcnNba2V5XSA9IFtdO1xuICAgICAgX2hhbmRsZXJzW2tleV0ucHVzaCh7IHNob3J0Y3V0OiBrZXlzW2ldLCBzY29wZTogc2NvcGUsIG1ldGhvZDogbWV0aG9kLCBrZXk6IGtleXNbaV0sIG1vZHM6IG1vZHMgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIHVuYmluZCBhbGwgaGFuZGxlcnMgZm9yIGdpdmVuIGtleSBpbiBjdXJyZW50IHNjb3BlXG4gIGZ1bmN0aW9uIHVuYmluZEtleShrZXksIHNjb3BlKSB7XG4gICAgdmFyIG11bHRpcGxlS2V5cywga2V5cyxcbiAgICAgIG1vZHMgPSBbXSxcbiAgICAgIGksIGosIG9iajtcblxuICAgIG11bHRpcGxlS2V5cyA9IGdldEtleXMoa2V5KTtcblxuICAgIGZvciAoaiA9IDA7IGogPCBtdWx0aXBsZUtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGtleXMgPSBtdWx0aXBsZUtleXNbal0uc3BsaXQoJysnKTtcblxuICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xuICAgICAgICBtb2RzID0gZ2V0TW9kcyhrZXlzKTtcbiAgICAgICAga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSBjb2RlKGtleSk7XG5cbiAgICAgIGlmIChzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjb3BlID0gZ2V0U2NvcGUoKTtcbiAgICAgIH1cbiAgICAgIGlmICghX2hhbmRsZXJzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IF9oYW5kbGVyc1trZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9iaiA9IF9oYW5kbGVyc1trZXldW2ldO1xuICAgICAgICAvLyBvbmx5IGNsZWFyIGhhbmRsZXJzIGlmIGNvcnJlY3Qgc2NvcGUgYW5kIG1vZHMgbWF0Y2hcbiAgICAgICAgaWYgKG9iai5zY29wZSA9PT0gc2NvcGUgJiYgY29tcGFyZUFycmF5KG9iai5tb2RzLCBtb2RzKSkge1xuICAgICAgICAgIF9oYW5kbGVyc1trZXldW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgd2l0aCBjb2RlICdrZXlDb2RlJyBpcyBjdXJyZW50bHkgZG93blxuICAvLyBDb252ZXJ0cyBzdHJpbmdzIGludG8ga2V5IGNvZGVzLlxuICBmdW5jdGlvbiBpc1ByZXNzZWQoa2V5Q29kZSkge1xuICAgICAgaWYgKHR5cGVvZihrZXlDb2RlKT09J3N0cmluZycpIHtcbiAgICAgICAga2V5Q29kZSA9IGNvZGUoa2V5Q29kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXgoX2Rvd25LZXlzLCBrZXlDb2RlKSAhPSAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByZXNzZWRLZXlDb2RlcygpIHtcbiAgICAgIHJldHVybiBfZG93bktleXMuc2xpY2UoMCk7XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXIoZXZlbnQpe1xuICAgIHZhciB0YWdOYW1lID0gKGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50KS50YWdOYW1lO1xuICAgIC8vIGlnbm9yZSBrZXlwcmVzc2VkIGluIGFueSBlbGVtZW50cyB0aGF0IHN1cHBvcnQga2V5Ym9hcmQgZGF0YSBpbnB1dFxuICAgIHJldHVybiAhKHRhZ05hbWUgPT0gJ0lOUFVUJyB8fCB0YWdOYW1lID09ICdTRUxFQ1QnIHx8IHRhZ05hbWUgPT0gJ1RFWFRBUkVBJyk7XG4gIH1cblxuICAvLyBpbml0aWFsaXplIGtleS48bW9kaWZpZXI+IHRvIGZhbHNlXG4gIGZvcihrIGluIF9NT0RJRklFUlMpIGFzc2lnbktleVtrXSA9IGZhbHNlO1xuXG4gIC8vIHNldCBjdXJyZW50IHNjb3BlIChkZWZhdWx0ICdhbGwnKVxuICBmdW5jdGlvbiBzZXRTY29wZShzY29wZSl7IF9zY29wZSA9IHNjb3BlIHx8ICdhbGwnIH07XG4gIGZ1bmN0aW9uIGdldFNjb3BlKCl7IHJldHVybiBfc2NvcGUgfHwgJ2FsbCcgfTtcblxuICAvLyBkZWxldGUgYWxsIGhhbmRsZXJzIGZvciBhIGdpdmVuIHNjb3BlXG4gIGZ1bmN0aW9uIGRlbGV0ZVNjb3BlKHNjb3BlKXtcbiAgICB2YXIga2V5LCBoYW5kbGVycywgaTtcblxuICAgIGZvciAoa2V5IGluIF9oYW5kbGVycykge1xuICAgICAgaGFuZGxlcnMgPSBfaGFuZGxlcnNba2V5XTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7ICkge1xuICAgICAgICBpZiAoaGFuZGxlcnNbaV0uc2NvcGUgPT09IHNjb3BlKSBoYW5kbGVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGVsc2UgaSsrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBhYnN0cmFjdCBrZXkgbG9naWMgZm9yIGFzc2lnbiBhbmQgdW5hc3NpZ25cbiAgZnVuY3Rpb24gZ2V0S2V5cyhrZXkpIHtcbiAgICB2YXIga2V5cztcbiAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBrZXlzID0ga2V5LnNwbGl0KCcsJyk7XG4gICAgaWYgKChrZXlzW2tleXMubGVuZ3RoIC0gMV0pID09ICcnKSB7XG4gICAgICBrZXlzW2tleXMubGVuZ3RoIC0gMl0gKz0gJywnO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIC8vIGFic3RyYWN0IG1vZHMgbG9naWMgZm9yIGFzc2lnbiBhbmQgdW5hc3NpZ25cbiAgZnVuY3Rpb24gZ2V0TW9kcyhrZXkpIHtcbiAgICB2YXIgbW9kcyA9IGtleS5zbGljZSgwLCBrZXkubGVuZ3RoIC0gMSk7XG4gICAgZm9yICh2YXIgbWkgPSAwOyBtaSA8IG1vZHMubGVuZ3RoOyBtaSsrKVxuICAgIG1vZHNbbWldID0gX01PRElGSUVSU1ttb2RzW21pXV07XG4gICAgcmV0dXJuIG1vZHM7XG4gIH1cblxuICAvLyBjcm9zcy1icm93c2VyIGV2ZW50c1xuICBmdW5jdGlvbiBhZGRFdmVudChvYmplY3QsIGV2ZW50LCBtZXRob2QpIHtcbiAgICBpZiAob2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIpXG4gICAgICBvYmplY3QuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbWV0aG9kLCBmYWxzZSk7XG4gICAgZWxzZSBpZihvYmplY3QuYXR0YWNoRXZlbnQpXG4gICAgICBvYmplY3QuYXR0YWNoRXZlbnQoJ29uJytldmVudCwgZnVuY3Rpb24oKXsgbWV0aG9kKHdpbmRvdy5ldmVudCkgfSk7XG4gIH07XG5cbiAgLy8gc2V0IHRoZSBoYW5kbGVycyBnbG9iYWxseSBvbiBkb2N1bWVudFxuICBhZGRFdmVudChkb2N1bWVudCwgJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkgeyBkaXNwYXRjaChldmVudCkgfSk7IC8vIFBhc3NpbmcgX3Njb3BlIHRvIGEgY2FsbGJhY2sgdG8gZW5zdXJlIGl0IHJlbWFpbnMgdGhlIHNhbWUgYnkgZXhlY3V0aW9uLiBGaXhlcyAjNDhcbiAgYWRkRXZlbnQoZG9jdW1lbnQsICdrZXl1cCcsIGNsZWFyTW9kaWZpZXIpO1xuXG4gIC8vIHJlc2V0IG1vZGlmaWVycyB0byBmYWxzZSB3aGVuZXZlciB0aGUgd2luZG93IGlzIChyZSlmb2N1c2VkLlxuICBhZGRFdmVudCh3aW5kb3csICdmb2N1cycsIHJlc2V0TW9kaWZpZXJzKTtcblxuICAvLyBzdG9yZSBwcmV2aW91c2x5IGRlZmluZWQga2V5XG4gIHZhciBwcmV2aW91c0tleSA9IGdsb2JhbC5rZXk7XG5cbiAgLy8gcmVzdG9yZSBwcmV2aW91c2x5IGRlZmluZWQga2V5IGFuZCByZXR1cm4gcmVmZXJlbmNlIHRvIG91ciBrZXkgb2JqZWN0XG4gIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7XG4gICAgdmFyIGsgPSBnbG9iYWwua2V5O1xuICAgIGdsb2JhbC5rZXkgPSBwcmV2aW91c0tleTtcbiAgICByZXR1cm4gaztcbiAgfVxuXG4gIC8vIHNldCB3aW5kb3cua2V5IGFuZCB3aW5kb3cua2V5LnNldC9nZXQvZGVsZXRlU2NvcGUsIGFuZCB0aGUgZGVmYXVsdCBmaWx0ZXJcbiAgZ2xvYmFsLmtleSA9IGFzc2lnbktleTtcbiAgZ2xvYmFsLmtleS5zZXRTY29wZSA9IHNldFNjb3BlO1xuICBnbG9iYWwua2V5LmdldFNjb3BlID0gZ2V0U2NvcGU7XG4gIGdsb2JhbC5rZXkuZGVsZXRlU2NvcGUgPSBkZWxldGVTY29wZTtcbiAgZ2xvYmFsLmtleS5maWx0ZXIgPSBmaWx0ZXI7XG4gIGdsb2JhbC5rZXkuaXNQcmVzc2VkID0gaXNQcmVzc2VkO1xuICBnbG9iYWwua2V5LmdldFByZXNzZWRLZXlDb2RlcyA9IGdldFByZXNzZWRLZXlDb2RlcztcbiAgZ2xvYmFsLmtleS5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgZ2xvYmFsLmtleS51bmJpbmQgPSB1bmJpbmRLZXk7XG5cbiAgaWYodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIG1vZHVsZS5leHBvcnRzID0gYXNzaWduS2V5O1xuXG59KSh0aGlzKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24oZm4pIHtcbiAgcmV0dXJuIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsIHx8ICFfaXNOYXRpdmVGdW5jdGlvbihDbGFzcykpIHJldHVybiBDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG4vKlxyXG4gIFRoaXMgaXMganVzdCBhIGp1bmsgZHJhd2VyLCBjb250YWluaW5nIGFueXRoaW5nIHVzZWQgYWNyb3NzIG11bHRpcGxlIGNsYXNzZXMuXHJcbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcclxuICBpdCB1cCBpbnRvLCBzYXksIHBhcnNpbmdVdGlsLmpzIGFuZCBiYXNpY1V0aWwuanMgYW5kIHNvIG9uLiBCdXQgdGhleSBhcmUgZGl2aWRlZCB1cCBieSBmZWF0dXJlIGFyZWEuXHJcbiovXG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cbi8vIFRZUEVTXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJ1bmRlZmluZWRcIjtcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcIm51bWJlclwiO1xufVxuZnVuY3Rpb24gaXNTdHJpbmcobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwic3RyaW5nXCI7XG59XG5mdW5jdGlvbiBpc0RhdGUobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbn0gLy8gQ0FQQUJJTElUSUVTXG5cbmZ1bmN0aW9uIGhhc0ludGwoKSB7XG4gIHJldHVybiB0eXBlb2YgSW50bCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0O1xufVxuZnVuY3Rpb24gaGFzRm9ybWF0VG9QYXJ0cygpIHtcbiAgcmV0dXJuICFpc1VuZGVmaW5lZChJbnRsLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXRUb1BhcnRzKTtcbn0gLy8gT0JKRUNUUyBBTkQgQVJSQVlTXG5cbmZ1bmN0aW9uIG1heWJlQXJyYXkodGhpbmcpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpbmcpID8gdGhpbmcgOiBbdGhpbmddO1xufVxuZnVuY3Rpb24gYmVzdEJ5KGFyciwgYnksIGNvbXBhcmUpIHtcbiAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGFyci5yZWR1Y2UoZnVuY3Rpb24gKGJlc3QsIG5leHQpIHtcbiAgICB2YXIgcGFpciA9IFtieShuZXh0KSwgbmV4dF07XG5cbiAgICBpZiAoIWJlc3QpIHtcbiAgICAgIHJldHVybiBwYWlyO1xuICAgIH0gZWxzZSBpZiAoY29tcGFyZShiZXN0WzBdLCBwYWlyWzBdKSA9PT0gYmVzdFswXSkge1xuICAgICAgcmV0dXJuIGJlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYWlyO1xuICAgIH1cbiAgfSwgbnVsbClbMV07XG59XG5mdW5jdGlvbiBwaWNrKG9iaiwga2V5cykge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGspIHtcbiAgICBhW2tdID0gb2JqW2tdO1xuICAgIHJldHVybiBhO1xuICB9LCB7fSk7XG59IC8vIE5VTUJFUlMgQU5EIFNUUklOR1NcblxuZnVuY3Rpb24gbnVtYmVyQmV0d2Vlbih0aGluZywgYm90dG9tLCB0b3ApIHtcbiAgcmV0dXJuIGlzTnVtYmVyKHRoaW5nKSAmJiB0aGluZyA+PSBib3R0b20gJiYgdGhpbmcgPD0gdG9wO1xufSAvLyB4ICUgbiBidXQgdGFrZXMgdGhlIHNpZ24gb2YgbiBpbnN0ZWFkIG9mIHhcblxuZnVuY3Rpb24gZmxvb3JNb2QoeCwgbikge1xuICByZXR1cm4geCAtIG4gKiBNYXRoLmZsb29yKHggLyBuKTtcbn1cbmZ1bmN0aW9uIHBhZFN0YXJ0KGlucHV0LCBuKSB7XG4gIGlmIChuID09PSB2b2lkIDApIHtcbiAgICBuID0gMjtcbiAgfVxuXG4gIGlmIChpbnB1dC50b1N0cmluZygpLmxlbmd0aCA8IG4pIHtcbiAgICByZXR1cm4gKFwiMFwiLnJlcGVhdChuKSArIGlucHV0KS5zbGljZSgtbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhcnNlTWlsbGlzKGZyYWN0aW9uKSB7XG4gIGlmIChpc1VuZGVmaW5lZChmcmFjdGlvbikpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9IGVsc2Uge1xuICAgIHZhciBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5mdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzKSB7XG4gIHZhciBmYWN0b3IgPSBNYXRoLnBvdygxMCwgZGlnaXRzKTtcbiAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyICogZmFjdG9yKSAvIGZhY3Rvcjtcbn0gLy8gREFURSBCQVNJQ1NcblxuZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcbn1cbmZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbn1cbmZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gIHZhciBtb2RNb250aCA9IGZsb29yTW9kKG1vbnRoIC0gMSwgMTIpICsgMSxcbiAgICAgIG1vZFllYXIgPSB5ZWFyICsgKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG5cbiAgaWYgKG1vZE1vbnRoID09PSAyKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIobW9kWWVhcikgPyAyOSA6IDI4O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVttb2RNb250aCAtIDFdO1xuICB9XG59XG5mdW5jdGlvbiB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpIHtcbiAgdmFyIHAxID0gKHdlZWtZZWFyICsgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQpIC0gTWF0aC5mbG9vcih3ZWVrWWVhciAvIDEwMCkgKyBNYXRoLmZsb29yKHdlZWtZZWFyIC8gNDAwKSkgJSA3LFxuICAgICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICAgIHAyID0gKGxhc3QgKyBNYXRoLmZsb29yKGxhc3QgLyA0KSAtIE1hdGguZmxvb3IobGFzdCAvIDEwMCkgKyBNYXRoLmZsb29yKGxhc3QgLyA0MDApKSAlIDc7XG4gIHJldHVybiBwMSA9PT0gNCB8fCBwMiA9PT0gMyA/IDUzIDogNTI7XG59XG5mdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyKSB7XG4gIGlmICh5ZWFyID4gOTkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHJldHVybiB5ZWFyID4gNjAgPyAxOTAwICsgeWVhciA6IDIwMDAgKyB5ZWFyO1xufSAvLyBQQVJTSU5HXG5cbmZ1bmN0aW9uIHBhcnNlWm9uZUluZm8odHMsIG9mZnNldEZvcm1hdCwgbG9jYWxlLCB0aW1lWm9uZSkge1xuICBpZiAodGltZVpvbmUgPT09IHZvaWQgMCkge1xuICAgIHRpbWVab25lID0gbnVsbDtcbiAgfVxuXG4gIHZhciBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgICAgaW50bE9wdHMgPSB7XG4gICAgaG91cjEyOiBmYWxzZSxcbiAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgZGF5OiBcIjItZGlnaXRcIixcbiAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICBtaW51dGU6IFwiMi1kaWdpdFwiXG4gIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIHZhciBtb2RpZmllZCA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHRpbWVab25lTmFtZTogb2Zmc2V0Rm9ybWF0XG4gIH0sIGludGxPcHRzKSxcbiAgICAgIGludGwgPSBoYXNJbnRsKCk7XG5cbiAgaWYgKGludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgdmFyIHBhcnNlZCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgbW9kaWZpZWQpLmZvcm1hdFRvUGFydHMoZGF0ZSkuZmluZChmdW5jdGlvbiAobSkge1xuICAgICAgcmV0dXJuIG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiO1xuICAgIH0pO1xuICAgIHJldHVybiBwYXJzZWQgPyBwYXJzZWQudmFsdWUgOiBudWxsO1xuICB9IGVsc2UgaWYgKGludGwpIHtcbiAgICAvLyB0aGlzIHByb2JhYmx5IGRvZXNuJ3Qgd29yayBmb3IgYWxsIGxvY2FsZXNcbiAgICB2YXIgd2l0aG91dCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgaW50bE9wdHMpLmZvcm1hdChkYXRlKSxcbiAgICAgICAgaW5jbHVkZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKS5mb3JtYXQoZGF0ZSksXG4gICAgICAgIGRpZmZlZCA9IGluY2x1ZGVkLnN1YnN0cmluZyh3aXRob3V0Lmxlbmd0aCksXG4gICAgICAgIHRyaW1tZWQgPSBkaWZmZWQucmVwbGFjZSgvXlssIFxcdTIwMGVdKy8sIFwiXCIpO1xuICAgIHJldHVybiB0cmltbWVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59IC8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5cbmZ1bmN0aW9uIHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpIHtcbiAgdmFyIG9mZkhvdXIgPSBwYXJzZUludChvZmZIb3VyU3RyLCAxMCkgfHwgMCxcbiAgICAgIG9mZk1pbiA9IHBhcnNlSW50KG9mZk1pbnV0ZVN0ciwgMTApIHx8IDAsXG4gICAgICBvZmZNaW5TaWduZWQgPSBvZmZIb3VyIDwgMCA/IC1vZmZNaW4gOiBvZmZNaW47XG4gIHJldHVybiBvZmZIb3VyICogNjAgKyBvZmZNaW5TaWduZWQ7XG59IC8vIENPRVJDSU9OXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIsIGlnbm9yZVVua25vd24pIHtcbiAgaWYgKGlnbm9yZVVua25vd24gPT09IHZvaWQgMCkge1xuICAgIGlnbm9yZVVua25vd24gPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBub3JtYWxpemVkID0ge307XG5cbiAgZm9yICh2YXIgdSBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHUpKSB7XG4gICAgICB2YXIgdiA9IG9ialt1XTtcblxuICAgICAgaWYgKHYgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHYpICYmICFOdW1iZXIuaXNOYU4odikpIHtcbiAgICAgICAgdmFyIG1hcHBlZCA9IG5vcm1hbGl6ZXIodSwgaWdub3JlVW5rbm93bik7XG5cbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgIG5vcm1hbGl6ZWRbbWFwcGVkXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbmZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgW1wiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgbiA9IFwibnVtZXJpY1wiLFxuICAgIHMgPSBcInNob3J0XCIsXG4gICAgbCA9IFwibG9uZ1wiLFxuICAgIGQyID0gXCIyLWRpZ2l0XCI7XG52YXIgREFURV9TSE9SVCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogblxufTtcbnZhciBEQVRFX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogblxufTtcbnZhciBEQVRFX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG5cbn07XG52YXIgREFURV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsXG59O1xudmFyIFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xudmFyIFRJTUVfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyXG59O1xudmFyIFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcbnZhciBUSU1FX1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcbnZhciBUSU1FXzI0X1NJTVBMRSA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgaG91cjEyOiBmYWxzZVxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cblxudmFyIFRJTUVfMjRfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICBob3VyMTI6IGZhbHNlXG59O1xuLyoqXG4gKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9OyBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRURUJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cblxudmFyIFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIGhvdXIxMjogZmFsc2UsXG4gIHRpbWVab25lTmFtZTogc1xufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxuICovXG5cbnZhciBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIGhvdXIxMjogZmFsc2UsXG4gIHRpbWVab25lTmFtZTogbFxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAqL1xuXG52YXIgREFURVRJTUVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDJcbn07XG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gKi9cblxudmFyIERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcbnZhciBEQVRFVElNRV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDJcbn07XG52YXIgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcbnZhciBEQVRFVElNRV9GVUxMID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG52YXIgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcbnZhciBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG52YXIgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGwsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBPYmplY3Qua2V5cyhvYmopLnNvcnQoKSk7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG52YXIgbW9udGhzTG9uZyA9IFtcIkphbnVhcnlcIiwgXCJGZWJydWFyeVwiLCBcIk1hcmNoXCIsIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLCBcIkF1Z3VzdFwiLCBcIlNlcHRlbWJlclwiLCBcIk9jdG9iZXJcIiwgXCJOb3ZlbWJlclwiLCBcIkRlY2VtYmVyXCJdO1xudmFyIG1vbnRoc1Nob3J0ID0gW1wiSmFuXCIsIFwiRmViXCIsIFwiTWFyXCIsIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuXCIsIFwiSnVsXCIsIFwiQXVnXCIsIFwiU2VwXCIsIFwiT2N0XCIsIFwiTm92XCIsIFwiRGVjXCJdO1xudmFyIG1vbnRoc05hcnJvdyA9IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXTtcbmZ1bmN0aW9uIG1vbnRocyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gbW9udGhzTmFycm93O1xuXG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gbW9udGhzU2hvcnQ7XG5cbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIG1vbnRoc0xvbmc7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcIjEwXCIsIFwiMTFcIiwgXCIxMlwiXTtcblxuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG52YXIgd2Vla2RheXNMb25nID0gW1wiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLCBcIlRodXJzZGF5XCIsIFwiRnJpZGF5XCIsIFwiU2F0dXJkYXlcIiwgXCJTdW5kYXlcIl07XG52YXIgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcbnZhciB3ZWVrZGF5c05hcnJvdyA9IFtcIk1cIiwgXCJUXCIsIFwiV1wiLCBcIlRcIiwgXCJGXCIsIFwiU1wiLCBcIlNcIl07XG5mdW5jdGlvbiB3ZWVrZGF5cyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gd2Vla2RheXNOYXJyb3c7XG5cbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiB3ZWVrZGF5c1Nob3J0O1xuXG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiB3ZWVrZGF5c0xvbmc7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIl07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbnZhciBtZXJpZGllbXMgPSBbXCJBTVwiLCBcIlBNXCJdO1xudmFyIGVyYXNMb25nID0gW1wiQmVmb3JlIENocmlzdFwiLCBcIkFubm8gRG9taW5pXCJdO1xudmFyIGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG52YXIgZXJhc05hcnJvdyA9IFtcIkJcIiwgXCJBXCJdO1xuZnVuY3Rpb24gZXJhcyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gZXJhc05hcnJvdztcblxuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIGVyYXNTaG9ydDtcblxuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gZXJhc0xvbmc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIG1lcmlkaWVtRm9yRGF0ZVRpbWUoZHQpIHtcbiAgcmV0dXJuIG1lcmlkaWVtc1tkdC5ob3VyIDwgMTIgPyAwIDogMV07XG59XG5mdW5jdGlvbiB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gd2Vla2RheXMobGVuZ3RoKVtkdC53ZWVrZGF5IC0gMV07XG59XG5mdW5jdGlvbiBtb250aEZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIG1vbnRocyhsZW5ndGgpW2R0Lm1vbnRoIC0gMV07XG59XG5mdW5jdGlvbiBlcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiBlcmFzKGxlbmd0aClbZHQueWVhciA8IDAgPyAwIDogMV07XG59XG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICB2YXIgZmlsdGVyZWQgPSBwaWNrKGtub3duRm9ybWF0LCBbXCJ3ZWVrZGF5XCIsIFwiZXJhXCIsIFwieWVhclwiLCBcIm1vbnRoXCIsIFwiZGF5XCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcInRpbWVab25lTmFtZVwiLCBcImhvdXIxMlwiXSksXG4gICAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgICAgZGF0ZVRpbWVIdWdlID0gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW0gYVwiO1xuXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9TSE9SVCk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9NRUQpOlxuICAgICAgcmV0dXJuIFwiTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfRlVMTCk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfSFVHRSk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfU0lNUExFKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiaDptbTpzcyBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX0xPTkdfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkhIOm1tOnNzXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcIkhIOm1tXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX1NIT1JUKTpcbiAgICAgIHJldHVybiBcIk0vZC95eXl5LCBoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX01FRCk6XG4gICAgICByZXR1cm4gXCJMTEwgZCwgeXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9IVUdFKTpcbiAgICAgIHJldHVybiBkYXRlVGltZUh1Z2U7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG5cbi8vIHRoZXNlIGFyZW4ndCByZWFsbHkgcHJpdmF0ZSwgYnV0IG5vciBhcmUgdGhleSByZWFsbHkgdXNlZnVsIHRvIGRvY3VtZW50XG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cbnZhciBMdXhvbkVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfRXJyb3IpIHtcbiAgX2luaGVyaXRzTG9vc2UoTHV4b25FcnJvciwgX0Vycm9yKTtcblxuICBmdW5jdGlvbiBMdXhvbkVycm9yKCkge1xuICAgIHJldHVybiBfRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEx1eG9uRXJyb3I7XG59KF93cmFwTmF0aXZlU3VwZXIoRXJyb3IpKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG52YXIgSW52YWxpZERhdGVUaW1lRXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWREYXRlVGltZUVycm9yLCBfTHV4b25FcnJvcik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZERhdGVUaW1lRXJyb3IocmVhc29uKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yLmNhbGwodGhpcywgXCJJbnZhbGlkIERhdGVUaW1lOiBcIiArIHJlYXNvbi50b01lc3NhZ2UoKSkgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkRGF0ZVRpbWVFcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBJbnZhbGlkSW50ZXJ2YWxFcnJvciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0x1eG9uRXJyb3IyKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWRJbnRlcnZhbEVycm9yLCBfTHV4b25FcnJvcjIpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWRJbnRlcnZhbEVycm9yKHJlYXNvbikge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjIuY2FsbCh0aGlzLCBcIkludmFsaWQgSW50ZXJ2YWw6IFwiICsgcmVhc29uLnRvTWVzc2FnZSgpKSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRJbnRlcnZhbEVycm9yO1xufShMdXhvbkVycm9yKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIEludmFsaWREdXJhdGlvbkVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjMpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZER1cmF0aW9uRXJyb3IsIF9MdXhvbkVycm9yMyk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZER1cmF0aW9uRXJyb3IocmVhc29uKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yMy5jYWxsKHRoaXMsIFwiSW52YWxpZCBEdXJhdGlvbjogXCIgKyByZWFzb24udG9NZXNzYWdlKCkpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZER1cmF0aW9uRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yNCkge1xuICBfaW5oZXJpdHNMb29zZShDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvciwgX0x1eG9uRXJyb3I0KTtcblxuICBmdW5jdGlvbiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcigpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBJbnZhbGlkVW5pdEVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjUpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZFVuaXRFcnJvciwgX0x1eG9uRXJyb3I1KTtcblxuICBmdW5jdGlvbiBJbnZhbGlkVW5pdEVycm9yKHVuaXQpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I1LmNhbGwodGhpcywgXCJJbnZhbGlkIHVuaXQgXCIgKyB1bml0KSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRVbml0RXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgSW52YWxpZEFyZ3VtZW50RXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yNikge1xuICBfaW5oZXJpdHNMb29zZShJbnZhbGlkQXJndW1lbnRFcnJvciwgX0x1eG9uRXJyb3I2KTtcblxuICBmdW5jdGlvbiBJbnZhbGlkQXJndW1lbnRFcnJvcigpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBab25lSXNBYnN0cmFjdEVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjcpIHtcbiAgX2luaGVyaXRzTG9vc2UoWm9uZUlzQWJzdHJhY3RFcnJvciwgX0x1eG9uRXJyb3I3KTtcblxuICBmdW5jdGlvbiBab25lSXNBYnN0cmFjdEVycm9yKCkge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjcuY2FsbCh0aGlzLCBcIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3NcIikgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBab25lSXNBYnN0cmFjdEVycm9yO1xufShMdXhvbkVycm9yKTtcblxuLyoqXHJcbiAqIEBpbnRlcmZhY2VcclxuICovXG5cbnZhciBab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWm9uZSgpIHt9XG5cbiAgdmFyIF9wcm90byA9IFpvbmUucHJvdG90eXBlO1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG9mZnNldCdzIGNvbW1vbiBuYW1lIChzdWNoIGFzIEVTVCkgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXBcclxuICAgKiBAYWJzdHJhY3RcclxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgbmFtZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gT3B0aW9ucyB0byBhZmZlY3QgdGhlIGZvcm1hdFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi4gQWNjZXB0cyAnbG9uZycgb3IgJ3Nob3J0Jy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5sb2NhbGUgLSBXaGF0IGxvY2FsZSB0byByZXR1cm4gdGhlIG9mZnNldCBuYW1lIGluLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBvcHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBvZmZzZXQgaW4gbWludXRlcyBmb3IgdGhpcyB6b25lIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wLlxyXG4gICAqIEBhYnN0cmFjdFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgb2Zmc2V0XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgWm9uZSBpcyBlcXVhbCB0byBhbm90aGVyIHpvbmVyXHJcbiAgICogQGFic3RyYWN0XHJcbiAgICogQHBhcmFtIHtab25lfSBvdGhlclpvbmUgLSB0aGUgem9uZSB0byBjb21wYXJlXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIHZhbGlkLlxyXG4gICAqIEBhYnN0cmFjdFxyXG4gICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcblxuICAgIC8qKlxyXG4gICAgICogVGhlIHR5cGUgb2Ygem9uZVxyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgem9uZS5cclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9mZnNldCBpcyBrbm93biB0byBiZSBmaXhlZCBmb3IgdGhlIHdob2xlIHllYXIuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bml2ZXJzYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFpvbmU7XG59KCk7XG5cbnZhciBzaW5nbGV0b24gPSBudWxsO1xuXG52YXIgTG9jYWxab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfWm9uZSkge1xuICBfaW5oZXJpdHNMb29zZShMb2NhbFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBMb2NhbFpvbmUoKSB7XG4gICAgcmV0dXJuIF9ab25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBMb2NhbFpvbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSh0cywgX3JlZikge1xuICAgIHZhciBmb3JtYXQgPSBfcmVmLmZvcm1hdCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlKTtcbiAgfTtcblxuICBfcHJvdG8ub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KHRzKSB7XG4gICAgcmV0dXJuIC1uZXcgRGF0ZSh0cykuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgfTtcblxuICBfcHJvdG8uZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gXCJsb2NhbFwiO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhMb2NhbFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImxvY2FsXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmIChoYXNJbnRsKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmU7XG4gICAgICB9IGVsc2UgcmV0dXJuIFwibG9jYWxcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImluc3RhbmNlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiA9IG5ldyBMb2NhbFpvbmUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTG9jYWxab25lO1xufShab25lKTtcblxudmFyIGR0ZkNhY2hlID0ge307XG5cbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHtcbiAgICAgIGhvdXIxMjogZmFsc2UsXG4gICAgICB0aW1lWm9uZTogem9uZSxcbiAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgICAgZGF5OiBcIjItZGlnaXRcIixcbiAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgIHNlY29uZDogXCIyLWRpZ2l0XCJcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBkdGZDYWNoZVt6b25lXTtcbn1cblxudmFyIHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDVcbn07XG5cbmZ1bmN0aW9uIGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICB2YXIgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgICAgcGFyc2VkID0gLyhcXGQrKVxcLyhcXGQrKVxcLyhcXGQrKSw/IChcXGQrKTooXFxkKyk6KFxcZCspLy5leGVjKGZvcm1hdHRlZCksXG4gICAgICBmTW9udGggPSBwYXJzZWRbMV0sXG4gICAgICBmRGF5ID0gcGFyc2VkWzJdLFxuICAgICAgZlllYXIgPSBwYXJzZWRbM10sXG4gICAgICBmSG91ciA9IHBhcnNlZFs0XSxcbiAgICAgIGZNaW51dGUgPSBwYXJzZWRbNV0sXG4gICAgICBmU2Vjb25kID0gcGFyc2VkWzZdO1xuICByZXR1cm4gW2ZZZWFyLCBmTW9udGgsIGZEYXksIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXTtcbn1cblxuZnVuY3Rpb24gcGFydHNPZmZzZXQoZHRmLCBkYXRlKSB7XG4gIHZhciBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICAgIGZpbGxlZCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0dGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9mb3JtYXR0ZWQkaSA9IGZvcm1hdHRlZFtpXSxcbiAgICAgICAgdHlwZSA9IF9mb3JtYXR0ZWQkaS50eXBlLFxuICAgICAgICB2YWx1ZSA9IF9mb3JtYXR0ZWQkaS52YWx1ZSxcbiAgICAgICAgcG9zID0gdHlwZVRvUG9zW3R5cGVdO1xuXG4gICAgaWYgKCFpc1VuZGVmaW5lZChwb3MpKSB7XG4gICAgICBmaWxsZWRbcG9zXSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxudmFyIElBTkFab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfWm9uZSkge1xuICBfaW5oZXJpdHNMb29zZShJQU5BWm9uZSwgX1pvbmUpO1xuXG4gIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIgPSBmdW5jdGlvbiBpc1ZhbGlkU3BlY2lmaWVyKHMpIHtcbiAgICByZXR1cm4gcyAmJiBzLm1hdGNoKC9eW2Etel8rLV17MSwyNTZ9KFxcL1thLXpfKy1dezEsMjU2fShcXC9bYS16XystXXsxLDI1Nn0pPyk/JC9pKTtcbiAgfTtcblxuICBJQU5BWm9uZS5pc1ZhbGlkWm9uZSA9IGZ1bmN0aW9uIGlzVmFsaWRab25lKHpvbmUpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1VU1wiLCB7XG4gICAgICAgIHRpbWVab25lOiB6b25lXG4gICAgICB9KS5mb3JtYXQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07IC8vIEV0Yy9HTVQrOCAtPiAtNDgwXG5cblxuICBJQU5BWm9uZS5wYXJzZUdNVE9mZnNldCA9IGZ1bmN0aW9uIHBhcnNlR01UT2Zmc2V0KHNwZWNpZmllcikge1xuICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNwZWNpZmllci5tYXRjaCgvXkV0Y1xcL0dNVChbKy1dXFxkezEsMn0pJC9pKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiAtNjAgKiBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgZnVuY3Rpb24gSUFOQVpvbmUobmFtZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1pvbmUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLnpvbmVOYW1lID0gbmFtZTtcbiAgICBfdGhpcy52YWxpZCA9IElBTkFab25lLmlzVmFsaWRab25lKG5hbWUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBJQU5BWm9uZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBfcmVmKSB7XG4gICAgdmFyIGZvcm1hdCA9IF9yZWYuZm9ybWF0LFxuICAgICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcbiAgICByZXR1cm4gcGFyc2Vab25lSW5mbyh0cywgZm9ybWF0LCBsb2NhbGUsIHRoaXMuem9uZU5hbWUpO1xuICB9O1xuXG4gIF9wcm90by5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQodHMpIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRzKSxcbiAgICAgICAgZHRmID0gbWFrZURURih0aGlzLnpvbmVOYW1lKSxcbiAgICAgICAgX3JlZjIgPSBkdGYuZm9ybWF0VG9QYXJ0cyA/IHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkgOiBoYWNreU9mZnNldChkdGYsIGRhdGUpLFxuICAgICAgICBmWWVhciA9IF9yZWYyWzBdLFxuICAgICAgICBmTW9udGggPSBfcmVmMlsxXSxcbiAgICAgICAgZkRheSA9IF9yZWYyWzJdLFxuICAgICAgICBmSG91ciA9IF9yZWYyWzNdLFxuICAgICAgICBmTWludXRlID0gX3JlZjJbNF0sXG4gICAgICAgIGZTZWNvbmQgPSBfcmVmMls1XSxcbiAgICAgICAgYXNVVEMgPSBEYXRlLlVUQyhmWWVhciwgZk1vbnRoIC0gMSwgZkRheSwgZkhvdXIsIGZNaW51dGUsIGZTZWNvbmQpO1xuXG4gICAgdmFyIGFzVFMgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICBhc1RTIC09IGFzVFMgJSAxMDAwO1xuICAgIHJldHVybiAoYXNVVEMgLSBhc1RTKSAvICg2MCAqIDEwMDApO1xuICB9O1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImlhbmFcIiAmJiBvdGhlclpvbmUuem9uZU5hbWUgPT09IHRoaXMuem9uZU5hbWU7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKElBTkFab25lLCBbe1xuICAgIGtleTogXCJ0eXBlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJpYW5hXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bml2ZXJzYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElBTkFab25lO1xufShab25lKTtcblxudmFyIHNpbmdsZXRvbiQxID0gbnVsbDtcblxuZnVuY3Rpb24gaG91cnNNaW51dGVzT2Zmc2V0KHopIHtcbiAgdmFyIGhvdXJzID0gTWF0aC50cnVuYyh6LmZpeGVkIC8gNjApLFxuICAgICAgbWludXRlcyA9IE1hdGguYWJzKHouZml4ZWQgJSA2MCksXG4gICAgICBzaWduID0gaG91cnMgPiAwID8gXCIrXCIgOiBcIi1cIixcbiAgICAgIGJhc2UgPSBzaWduICsgTWF0aC5hYnMoaG91cnMpO1xuICByZXR1cm4gbWludXRlcyA+IDAgPyBiYXNlICsgXCI6XCIgKyBwYWRTdGFydChtaW51dGVzLCAyKSA6IGJhc2U7XG59XG5cbnZhciBGaXhlZE9mZnNldFpvbmUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9ab25lKSB7XG4gIF9pbmhlcml0c0xvb3NlKEZpeGVkT2Zmc2V0Wm9uZSwgX1pvbmUpO1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZSA9IGZ1bmN0aW9uIGluc3RhbmNlKG9mZnNldCkge1xuICAgIHJldHVybiBvZmZzZXQgPT09IDAgPyBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2UgOiBuZXcgRml4ZWRPZmZzZXRab25lKG9mZnNldCk7XG4gIH07XG5cbiAgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyID0gZnVuY3Rpb24gcGFyc2VTcGVjaWZpZXIocykge1xuICAgIGlmIChzKSB7XG4gICAgICB2YXIgciA9IHMubWF0Y2goL151dGMoPzooWystXVxcZHsxLDJ9KSg/OjooXFxkezJ9KSk/KT8kL2kpO1xuXG4gICAgICBpZiAocikge1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkT2Zmc2V0Wm9uZShzaWduZWRPZmZzZXQoclsxXSwgclsyXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhGaXhlZE9mZnNldFpvbmUsIG51bGwsIFt7XG4gICAga2V5OiBcInV0Y0luc3RhbmNlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uJDEgPT09IG51bGwpIHtcbiAgICAgICAgc2luZ2xldG9uJDEgPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2luZ2xldG9uJDE7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gRml4ZWRPZmZzZXRab25lKG9mZnNldCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1pvbmUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLmZpeGVkID0gb2Zmc2V0O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9O1xuXG4gIF9wcm90by5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZml4ZWQ7XG4gIH07XG5cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiZml4ZWRcIiAmJiBvdGhlclpvbmUuZml4ZWQgPT09IHRoaXMuZml4ZWQ7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKEZpeGVkT2Zmc2V0Wm9uZSwgW3tcbiAgICBrZXk6IFwidHlwZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiZml4ZWRcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyBcIlVUQ1wiIDogXCJVVENcIiArIGhvdXJzTWludXRlc09mZnNldCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZTtcbn0oWm9uZSk7XG5cbnZhciBJbnZhbGlkWm9uZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1pvbmUpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBJbnZhbGlkWm9uZSh6b25lTmFtZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1pvbmUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLnpvbmVOYW1lID0gem9uZU5hbWU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEludmFsaWRab25lLnByb3RvdHlwZTtcblxuICBfcHJvdG8ub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9O1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhJbnZhbGlkWm9uZSwgW3tcbiAgICBrZXk6IFwidHlwZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiaW52YWxpZFwiO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lTmFtZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW52YWxpZFpvbmU7XG59KFpvbmUpO1xuXG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5mdW5jdGlvbiBub3JtYWxpemVab25lKGlucHV0LCBkZWZhdWx0Wm9uZSkge1xuICB2YXIgb2Zmc2V0O1xuXG4gIGlmIChpc1VuZGVmaW5lZChpbnB1dCkgfHwgaW5wdXQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZGVmYXVsdFpvbmU7XG4gIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBab25lKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgIHZhciBsb3dlcmVkID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJlZCA9PT0gXCJsb2NhbFwiKSByZXR1cm4gTG9jYWxab25lLmluc3RhbmNlO2Vsc2UgaWYgKGxvd2VyZWQgPT09IFwidXRjXCIgfHwgbG93ZXJlZCA9PT0gXCJnbXRcIikgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZTtlbHNlIGlmICgob2Zmc2V0ID0gSUFOQVpvbmUucGFyc2VHTVRPZmZzZXQoaW5wdXQpKSAhPSBudWxsKSB7XG4gICAgICAvLyBoYW5kbGUgRXRjL0dNVC00LCB3aGljaCBWOCBjaG9rZXMgb25cbiAgICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KTtcbiAgICB9IGVsc2UgaWYgKElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIobG93ZXJlZCkpIHJldHVybiBuZXcgSUFOQVpvbmUoaW5wdXQpO2Vsc2UgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihsb3dlcmVkKSB8fCBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoaW5wdXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiBpbnB1dC5vZmZzZXQgJiYgdHlwZW9mIGlucHV0Lm9mZnNldCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIFRoaXMgaXMgZHVtYiwgYnV0IHRoZSBpbnN0YW5jZW9mIGNoZWNrIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byByZWFsbHkgd29ya1xuICAgIC8vIHNvIHdlJ3JlIGR1Y2sgY2hlY2tpbmcgaXRcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBJbnZhbGlkWm9uZShpbnB1dCk7XG4gIH1cbn1cblxudmFyIG5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59LFxuICAgIGRlZmF1bHRab25lID0gbnVsbCxcbiAgICAvLyBub3Qgc2V0dGluZyB0aGlzIGRpcmVjdGx5IHRvIExvY2FsWm9uZS5pbnN0YW5jZSBiYyBsb2FkaW5nIG9yZGVyIGlzc3Vlc1xuZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bGwsXG4gICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gbnVsbCxcbiAgICB0aHJvd09uSW52YWxpZCA9IGZhbHNlO1xuLyoqXHJcbiAqIFNldHRpbmdzIGNvbnRhaW5zIHN0YXRpYyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHRoYXQgY29udHJvbCBMdXhvbidzIG92ZXJhbGwgYmVoYXZpb3IuIEx1eG9uIGlzIGEgc2ltcGxlIGxpYnJhcnkgd2l0aCBmZXcgb3B0aW9ucywgYnV0IHRoZSBvbmVzIGl0IGRvZXMgaGF2ZSBsaXZlIGhlcmUuXHJcbiAqL1xuXG5cbnZhciBTZXR0aW5ncyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNldHRpbmdzKCkge31cblxuICAvKipcclxuICAgKiBSZXNldCBMdXhvbidzIGdsb2JhbCBjYWNoZXMuIFNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBpbiB0ZXN0aW5nIHNjZW5hcmlvcy5cclxuICAgKiBAcmV0dXJuIHt2b2lkfVxyXG4gICAqL1xuICBTZXR0aW5ncy5yZXNldENhY2hlcyA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGVzKCkge1xuICAgIExvY2FsZS5yZXNldENhY2hlKCk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKFNldHRpbmdzLCBudWxsLCBbe1xuICAgIGtleTogXCJub3dcIixcblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cclxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG5vdztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxyXG4gICAgICogVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBudW1iZXIsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gRXBvY2ggbWlsbGlzZWNvbmQgY291bnRcclxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IERhdGUubm93KCkgKyAzMDAwIC8vIHByZXRlbmQgaXQgaXMgMyBzZWNvbmRzIGluIHRoZSBmdXR1cmVcclxuICAgICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IDAgLy8gYWx3YXlzIHByZXRlbmQgaXQncyBKYW4gMSwgMTk3MCBhdCBtaWRuaWdodCBpbiBVVEMgdGltZVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KG4pIHtcbiAgICAgIG5vdyA9IG47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSB0byBjcmVhdGUgRGF0ZVRpbWVzIGluLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdFpvbmVOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gKGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZSkubmFtZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHopIHtcbiAgICAgIGlmICgheikge1xuICAgICAgICBkZWZhdWx0Wm9uZSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0Wm9uZSA9IG5vcm1hbGl6ZVpvbmUoeik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSBvYmplY3QgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtab25lfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0Wm9uZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRMb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TG9jYWxlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBsb2NhbGUgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChsb2NhbGUpIHtcbiAgICAgIGRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdE51bWJlcmluZ1N5c3RlbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0T3V0cHV0Q2FsZW5kYXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KG91dHB1dENhbGVuZGFyKSB7XG4gICAgICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBvdXRwdXRDYWxlbmRhcjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ0aHJvd09uSW52YWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRocm93T25JbnZhbGlkO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodCkge1xuICAgICAgdGhyb3dPbkludmFsaWQgPSB0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTZXR0aW5ncztcbn0oKTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5VG9rZW5zKHNwbGl0cywgdG9rZW5Ub1N0cmluZykge1xuICB2YXIgcyA9IFwiXCI7XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gc3BsaXRzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgIHZhciBfcmVmO1xuXG4gICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICBfcmVmID0gX2l0ZXJhdG9yW19pKytdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICBfcmVmID0gX2kudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIHRva2VuID0gX3JlZjtcblxuICAgIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgICBzICs9IHRva2VuLnZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyArPSB0b2tlblRvU3RyaW5nKHRva2VuLnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHM7XG59XG5cbnZhciB0b2tlblRvT2JqZWN0ID0ge1xuICBEOiBEQVRFX1NIT1JULFxuICBERDogREFURV9NRUQsXG4gIERERDogREFURV9GVUxMLFxuICBEREREOiBEQVRFX0hVR0UsXG4gIHQ6IFRJTUVfU0lNUExFLFxuICB0dDogVElNRV9XSVRIX1NFQ09ORFMsXG4gIHR0dDogVElNRV9XSVRIX1NIT1JUX09GRlNFVCxcbiAgdHR0dDogVElNRV9XSVRIX0xPTkdfT0ZGU0VULFxuICBUOiBUSU1FXzI0X1NJTVBMRSxcbiAgVFQ6IFRJTUVfMjRfV0lUSF9TRUNPTkRTLFxuICBUVFQ6IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQsXG4gIFRUVFQ6IFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCxcbiAgZjogREFURVRJTUVfU0hPUlQsXG4gIGZmOiBEQVRFVElNRV9NRUQsXG4gIGZmZjogREFURVRJTUVfRlVMTCxcbiAgZmZmZjogREFURVRJTUVfSFVHRSxcbiAgRjogREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTLFxuICBGRjogREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyxcbiAgRkZGOiBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyxcbiAgRkZGRjogREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFNcbn07XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBGb3JtYXR0ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBGb3JtYXR0ZXIuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGxvY2FsZSwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZvcm1hdHRlcihsb2NhbGUsIG9wdHMpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wYXJzZUZvcm1hdCA9IGZ1bmN0aW9uIHBhcnNlRm9ybWF0KGZtdCkge1xuICAgIHZhciBjdXJyZW50ID0gbnVsbCxcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiLFxuICAgICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3BsaXRzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBmbXQuY2hhckF0KGkpO1xuXG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7XG4gICAgICAgICAgICBsaXRlcmFsOiBicmFja2V0ZWQsXG4gICAgICAgICAgICB2YWw6IGN1cnJlbnRGdWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7XG4gICAgICAgICAgICBsaXRlcmFsOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbDogY3VycmVudEZ1bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHtcbiAgICAgICAgbGl0ZXJhbDogYnJhY2tldGVkLFxuICAgICAgICB2YWw6IGN1cnJlbnRGdWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BsaXRzO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEZvcm1hdHRlcihsb2NhbGUsIGZvcm1hdE9wdHMpIHtcbiAgICB0aGlzLm9wdHMgPSBmb3JtYXRPcHRzO1xuICAgIHRoaXMubG9jID0gbG9jYWxlO1xuICAgIHRoaXMuc3lzdGVtTG9jID0gbnVsbDtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBGb3JtYXR0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdCA9IGZ1bmN0aW9uIGZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBvcHRzKSB7XG4gICAgaWYgKHRoaXMuc3lzdGVtTG9jID09PSBudWxsKSB7XG4gICAgICB0aGlzLnN5c3RlbUxvYyA9IHRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCk7XG4gICAgfVxuXG4gICAgdmFyIGRmID0gdGhpcy5zeXN0ZW1Mb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfTtcblxuICBfcHJvdG8uZm9ybWF0RGF0ZVRpbWUgPSBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShkdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9O1xuXG4gIF9wcm90by5mb3JtYXREYXRlVGltZVBhcnRzID0gZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWVQYXJ0cyhkdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdFRvUGFydHMoKTtcbiAgfTtcblxuICBfcHJvdG8ucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKGR0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gIH07XG5cbiAgX3Byb3RvLm51bSA9IGZ1bmN0aW9uIG51bShuLCBwKSB7XG4gICAgaWYgKHAgPT09IHZvaWQgMCkge1xuICAgICAgcCA9IDA7XG4gICAgfVxuXG4gICAgLy8gd2UgZ2V0IHNvbWUgcGVyZiBvdXQgb2YgZG9pbmcgdGhpcyBoZXJlLCBhbm5veWluZ2x5XG4gICAgaWYgKHRoaXMub3B0cy5mb3JjZVNpbXBsZSkge1xuICAgICAgcmV0dXJuIHBhZFN0YXJ0KG4sIHApO1xuICAgIH1cblxuICAgIHZhciBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzKTtcblxuICAgIGlmIChwID4gMCkge1xuICAgICAgb3B0cy5wYWRUbyA9IHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihvcHRzKS5mb3JtYXQobik7XG4gIH07XG5cbiAgX3Byb3RvLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm10KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBrbm93bkVuZ2xpc2ggPSB0aGlzLmxvYy5saXN0aW5nTW9kZSgpID09PSBcImVuXCI7XG5cbiAgICB2YXIgc3RyaW5nID0gZnVuY3Rpb24gc3RyaW5nKG9wdHMsIGV4dHJhY3QpIHtcbiAgICAgIHJldHVybiBfdGhpcy5sb2MuZXh0cmFjdChkdCwgb3B0cywgZXh0cmFjdCk7XG4gICAgfSxcbiAgICAgICAgZm9ybWF0T2Zmc2V0ID0gZnVuY3Rpb24gZm9ybWF0T2Zmc2V0KG9wdHMpIHtcbiAgICAgIGlmIChkdC5pc09mZnNldEZpeGVkICYmIGR0Lm9mZnNldCA9PT0gMCAmJiBvcHRzLmFsbG93Wikge1xuICAgICAgICByZXR1cm4gXCJaXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBob3VycyA9IE1hdGgudHJ1bmMoZHQub2Zmc2V0IC8gNjApLFxuICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmFicyhkdC5vZmZzZXQgJSA2MCksXG4gICAgICAgICAgc2lnbiA9IGhvdXJzID49IDAgPyBcIitcIiA6IFwiLVwiLFxuICAgICAgICAgIGJhc2UgPSBcIlwiICsgc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcblxuICAgICAgc3dpdGNoIChvcHRzLmZvcm1hdCkge1xuICAgICAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgICAgICByZXR1cm4gXCJcIiArIHNpZ24gKyBfdGhpcy5udW0oTWF0aC5hYnMoaG91cnMpLCAyKSArIFwiOlwiICsgX3RoaXMubnVtKG1pbnV0ZXMsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgICAgICByZXR1cm4gbWludXRlcyA+IDAgPyBiYXNlICsgXCI6XCIgKyBtaW51dGVzIDogYmFzZTtcblxuICAgICAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICAgICAgcmV0dXJuIFwiXCIgKyBzaWduICsgX3RoaXMubnVtKE1hdGguYWJzKGhvdXJzKSwgMikgKyBfdGhpcy5udW0obWludXRlcywgMik7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlZhbHVlIGZvcm1hdCBcIiArIG9wdHMuZm9ybWF0ICsgXCIgaXMgb3V0IG9mIHJhbmdlIGZvciBwcm9wZXJ0eSBmb3JtYXRcIik7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgbWVyaWRpZW0gPSBmdW5jdGlvbiBtZXJpZGllbSgpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSA6IHN0cmluZyh7XG4gICAgICAgIGhvdXI6IFwibnVtZXJpY1wiLFxuICAgICAgICBob3VyMTI6IHRydWVcbiAgICAgIH0sIFwiZGF5cGVyaW9kXCIpO1xuICAgIH0sXG4gICAgICAgIG1vbnRoID0gZnVuY3Rpb24gbW9udGgobGVuZ3RoLCBzdGFuZGFsb25lKSB7XG4gICAgICByZXR1cm4ga25vd25FbmdsaXNoID8gbW9udGhGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8ge1xuICAgICAgICBtb250aDogbGVuZ3RoXG4gICAgICB9IDoge1xuICAgICAgICBtb250aDogbGVuZ3RoLFxuICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICB9LCBcIm1vbnRoXCIpO1xuICAgIH0sXG4gICAgICAgIHdlZWtkYXkgPSBmdW5jdGlvbiB3ZWVrZGF5KGxlbmd0aCwgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8ge1xuICAgICAgICB3ZWVrZGF5OiBsZW5ndGhcbiAgICAgIH0gOiB7XG4gICAgICAgIHdlZWtkYXk6IGxlbmd0aCxcbiAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICB9LCBcIndlZWtkYXlcIik7XG4gICAgfSxcbiAgICAgICAgbWF5YmVNYWNybyA9IGZ1bmN0aW9uIG1heWJlTWFjcm8odG9rZW4pIHtcbiAgICAgIHZhciBtYWNybyA9IHRva2VuVG9PYmplY3RbdG9rZW5dO1xuXG4gICAgICBpZiAobWFjcm8pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBtYWNybyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgZXJhID0gZnVuY3Rpb24gZXJhKGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIDogc3RyaW5nKHtcbiAgICAgICAgZXJhOiBsZW5ndGhcbiAgICAgIH0sIFwiZXJhXCIpO1xuICAgIH0sXG4gICAgICAgIHRva2VuVG9TdHJpbmcgPSBmdW5jdGlvbiB0b2tlblRvU3RyaW5nKHRva2VuKSB7XG4gICAgICB2YXIgb3V0cHV0Q2FsID0gX3RoaXMubG9jLm91dHB1dENhbGVuZGFyOyAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lI1RPQy1TdGFuZC1BbG9uZS12cy4tRm9ybWF0LVN0eWxlc1xuXG4gICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIC8vIG1zXG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taWxsaXNlY29uZCk7XG5cbiAgICAgICAgY2FzZSBcInVcIjogLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kLCAzKTtcbiAgICAgICAgLy8gc2Vjb25kc1xuXG4gICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5zZWNvbmQpO1xuXG4gICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuc2Vjb25kLCAyKTtcbiAgICAgICAgLy8gbWludXRlc1xuXG4gICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUpO1xuXG4gICAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQubWludXRlLCAyKTtcbiAgICAgICAgLy8gaG91cnNcblxuICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIpO1xuXG4gICAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5ob3VyKTtcblxuICAgICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIsIDIpO1xuICAgICAgICAvLyBvZmZzZXRcblxuICAgICAgICBjYXNlIFwiWlwiOlxuICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGFsbG93WjogX3RoaXMub3B0cy5hbGxvd1pcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgICAvLyBsaWtlICswNjowMFxuICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoe1xuICAgICAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgICAgICBhbGxvd1o6IF90aGlzLm9wdHMuYWxsb3daXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIlpaWlwiOlxuICAgICAgICAgIC8vIGxpa2UgKzA2MDBcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJ0ZWNoaWVcIixcbiAgICAgICAgICAgIGFsbG93WjogZmFsc2VcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiWlpaWlwiOlxuICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgcmV0dXJuIGR0Lm9mZnNldE5hbWVTaG9ydDtcblxuICAgICAgICBjYXNlIFwiWlpaWlpcIjpcbiAgICAgICAgICAvLyBsaWtlIEVhc3Rlcm4gU3RhbmRhcmQgVGltZVxuICAgICAgICAgIHJldHVybiBkdC5vZmZzZXROYW1lTG9uZztcbiAgICAgICAgLy8gem9uZVxuXG4gICAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgcmV0dXJuIGR0LnpvbmVOYW1lO1xuICAgICAgICAvLyBtZXJpZGllbXNcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAvLyBkYXRlc1xuXG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJkYXlcIikgOiBfdGhpcy5udW0oZHQuZGF5KTtcblxuICAgICAgICBjYXNlIFwiZGRcIjpcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHtcbiAgICAgICAgICAgIGRheTogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcImRheVwiKSA6IF90aGlzLm51bShkdC5kYXksIDIpO1xuICAgICAgICAvLyB3ZWVrZGF5cyAtIHN0YW5kYWxvbmVcblxuICAgICAgICBjYXNlIFwiY1wiOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla2RheSk7XG5cbiAgICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJzaG9ydFwiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJsb25nXCIsIHRydWUpO1xuXG4gICAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgdHJ1ZSk7XG4gICAgICAgIC8vIHdlZWtkYXlzIC0gZm9ybWF0XG5cbiAgICAgICAgY2FzZSBcIkVcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwic2hvcnRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICByZXR1cm4gd2Vla2RheShcImxvbmdcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAvLyBtb250aHMgLSBzdGFuZGFsb25lXG5cbiAgICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHtcbiAgICAgICAgICAgIG1vbnRoOiBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcblxuICAgICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgICAvLyBsaWtlIDAxLCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgICAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwibW9udGhcIikgOiBfdGhpcy5udW0oZHQubW9udGgsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgICAvLyBsaWtlIEphblxuICAgICAgICAgIHJldHVybiBtb250aChcInNob3J0XCIsIHRydWUpO1xuXG4gICAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJuYXJyb3dcIiwgdHJ1ZSk7XG4gICAgICAgIC8vIG1vbnRocyAtIGZvcm1hdFxuXG4gICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBtb250aDogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcblxuICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIDAxXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBtb250aDogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoLCAyKTtcblxuICAgICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJzaG9ydFwiLCBmYWxzZSk7XG5cbiAgICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIGZhbHNlKTtcblxuICAgICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAvLyB5ZWFyc1xuXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgLy8gbGlrZSAyMDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IF90aGlzLm51bShkdC55ZWFyKTtcblxuICAgICAgICBjYXNlIFwieXlcIjpcbiAgICAgICAgICAvLyBsaWtlIDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIjItZGlnaXRcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IF90aGlzLm51bShkdC55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcblxuICAgICAgICBjYXNlIFwieXl5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDAxMlxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgeWVhcjogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcInllYXJcIikgOiBfdGhpcy5udW0oZHQueWVhciwgNCk7XG5cbiAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDAwMDEyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IF90aGlzLm51bShkdC55ZWFyLCA2KTtcbiAgICAgICAgLy8gZXJhc1xuXG4gICAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgICAgLy8gbGlrZSBBRFxuICAgICAgICAgIHJldHVybiBlcmEoXCJzaG9ydFwiKTtcblxuICAgICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgICAvLyBsaWtlIEFubm8gRG9taW5pXG4gICAgICAgICAgcmV0dXJuIGVyYShcImxvbmdcIik7XG5cbiAgICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgICAgcmV0dXJuIGVyYShcIm5hcnJvd1wiKTtcblxuICAgICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtZZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcblxuICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla1llYXIsIDQpO1xuXG4gICAgICAgIGNhc2UgXCJXXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrTnVtYmVyKTtcblxuICAgICAgICBjYXNlIFwiV1dcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtOdW1iZXIsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5vcmRpbmFsKTtcblxuICAgICAgICBjYXNlIFwib29vXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5vcmRpbmFsLCAzKTtcblxuICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlcik7XG5cbiAgICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlciwgMik7XG5cbiAgICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKE1hdGguZmxvb3IoZHQudHMgLyAxMDAwKSk7XG5cbiAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnRzKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBtYXliZU1hY3JvKHRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHN0cmluZ2lmeVRva2VucyhGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSwgdG9rZW5Ub1N0cmluZyk7XG4gIH07XG5cbiAgX3Byb3RvLmZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyhkdXIsIGZtdCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHRva2VuVG9GaWVsZCA9IGZ1bmN0aW9uIHRva2VuVG9GaWVsZCh0b2tlbikge1xuICAgICAgc3dpdGNoICh0b2tlblswXSkge1xuICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG5cbiAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICByZXR1cm4gXCJzZWNvbmRcIjtcblxuICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgIHJldHVybiBcIm1pbnV0ZVwiO1xuXG4gICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuXG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG5cbiAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgcmV0dXJuIFwieWVhclwiO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgdG9rZW5Ub1N0cmluZyA9IGZ1bmN0aW9uIHRva2VuVG9TdHJpbmcobGlsZHVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuXG4gICAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLm51bShsaWxkdXIuZ2V0KG1hcHBlZCksIHRva2VuLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIHRva2VucyA9IEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLFxuICAgICAgICByZWFsVG9rZW5zID0gdG9rZW5zLnJlZHVjZShmdW5jdGlvbiAoZm91bmQsIF9yZWYyKSB7XG4gICAgICB2YXIgbGl0ZXJhbCA9IF9yZWYyLmxpdGVyYWwsXG4gICAgICAgICAgdmFsID0gX3JlZjIudmFsO1xuICAgICAgcmV0dXJuIGxpdGVyYWwgPyBmb3VuZCA6IGZvdW5kLmNvbmNhdCh2YWwpO1xuICAgIH0sIFtdKSxcbiAgICAgICAgY29sbGFwc2VkID0gZHVyLnNoaWZ0VG8uYXBwbHkoZHVyLCByZWFsVG9rZW5zLm1hcCh0b2tlblRvRmllbGQpLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHN0cmluZ2lmeVRva2Vucyh0b2tlbnMsIHRva2VuVG9TdHJpbmcoY29sbGFwc2VkKSk7XG4gIH07XG5cbiAgcmV0dXJuIEZvcm1hdHRlcjtcbn0oKTtcblxudmFyIGludGxEVENhY2hlID0ge307XG5cbmZ1bmN0aW9uIGdldENhY2hlZERURihsb2NTdHJpbmcsIG9wdHMpIHtcbiAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIHZhciBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBvcHRzXSk7XG4gIHZhciBkdGYgPSBpbnRsRFRDYWNoZVtrZXldO1xuXG4gIGlmICghZHRmKSB7XG4gICAgZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jU3RyaW5nLCBvcHRzKTtcbiAgICBpbnRsRFRDYWNoZVtrZXldID0gZHRmO1xuICB9XG5cbiAgcmV0dXJuIGR0Zjtcbn1cblxudmFyIGludGxOdW1DYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDYWNoZW5kSU5GKGxvY1N0cmluZywgb3B0cykge1xuICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgdmFyIGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgdmFyIGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuXG4gIGlmICghaW5mKSB7XG4gICAgaW5mID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY1N0cmluZywgb3B0cyk7XG4gICAgaW50bE51bUNhY2hlW2tleV0gPSBpbmY7XG4gIH1cblxuICByZXR1cm4gaW5mO1xufVxuXG52YXIgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuXG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIGlmIChoYXNJbnRsKCkpIHtcbiAgICB2YXIgY29tcHV0ZWRTeXMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLmxvY2FsZTsgLy8gbm9kZSBzb21ldGltZXMgZGVmYXVsdHMgdG8gXCJ1bmRcIi4gT3ZlcnJpZGUgdGhhdCBiZWNhdXNlIHRoYXQgaXMgZHVtYlxuXG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBjb21wdXRlZFN5cyA9PT0gXCJ1bmRcIiA/IFwiZW4tVVNcIiA6IGNvbXB1dGVkU3lzO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IFwiZW4tVVNcIjtcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VMb2NhbGVTdHJpbmcobG9jYWxlU3RyKSB7XG4gIC8vIEkgcmVhbGx5IHdhbnQgdG8gYXZvaWQgd3JpdGluZyBhIEJDUCA0NyBwYXJzZXJcbiAgLy8gc2VlLCBlLmcuIGh0dHBzOi8vZ2l0aHViLmNvbS93b29vcm0vYmNwLTQ3XG4gIC8vIEludGVhZCwgd2UnbGwgZG8gdGhpczpcbiAgLy8gYSkgaWYgdGhlIHN0cmluZyBoYXMgbm8gLXUgZXh0ZW5zaW9ucywganVzdCBsZWF2ZSBpdCBhbG9uZVxuICAvLyBiKSBpZiBpdCBkb2VzLCB1c2UgSW50bCB0byByZXNvbHZlIGV2ZXJ5dGhpbmdcbiAgLy8gYykgaWYgSW50bCBmYWlscywgdHJ5IGFnYWluIHdpdGhvdXQgdGhlIC11XG4gIHZhciB1SW5kZXggPSBsb2NhbGVTdHIuaW5kZXhPZihcIi11LVwiKTtcblxuICBpZiAodUluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBbbG9jYWxlU3RyXTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgb3B0aW9ucztcbiAgICB2YXIgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcblxuICAgIHRyeSB7XG4gICAgICBvcHRpb25zID0gZ2V0Q2FjaGVkRFRGKGxvY2FsZVN0cikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihzbWFsbGVyKS5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGNhbGVuZGFyID0gX29wdGlvbnMuY2FsZW5kYXI7IC8vIHJldHVybiB0aGUgc21hbGxlciBvbmUgc28gdGhhdCB3ZSBjYW4gYXBwZW5kIHRoZSBjYWxlbmRhciBhbmQgbnVtYmVyaW5nIG92ZXJyaWRlcyB0byBpdFxuXG4gICAgcmV0dXJuIFtzbWFsbGVyLCBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnRsQ29uZmlnU3RyaW5nKGxvY2FsZVN0ciwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikge1xuICBpZiAoaGFzSW50bCgpKSB7XG4gICAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgICAgbG9jYWxlU3RyICs9IFwiLXVcIjtcblxuICAgICAgaWYgKG91dHB1dENhbGVuZGFyKSB7XG4gICAgICAgIGxvY2FsZVN0ciArPSBcIi1jYS1cIiArIG91dHB1dENhbGVuZGFyO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICAgIGxvY2FsZVN0ciArPSBcIi1udS1cIiArIG51bWJlcmluZ1N5c3RlbTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvY2FsZVN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvY2FsZVN0cjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcE1vbnRocyhmKSB7XG4gIHZhciBtcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICB2YXIgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgaSwgMSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cblxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIG1hcFdlZWtkYXlzKGYpIHtcbiAgdmFyIG1zID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gNzsgaSsrKSB7XG4gICAgdmFyIGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMyArIGkpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG5cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBsaXN0U3R1ZmYobG9jLCBsZW5ndGgsIGRlZmF1bHRPSywgZW5nbGlzaEZuLCBpbnRsRm4pIHtcbiAgdmFyIG1vZGUgPSBsb2MubGlzdGluZ01vZGUoZGVmYXVsdE9LKTtcblxuICBpZiAobW9kZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gXCJlblwiKSB7XG4gICAgcmV0dXJuIGVuZ2xpc2hGbihsZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbnRsRm4obGVuZ3RoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0Zhc3ROdW1iZXJzKGxvYykge1xuICBpZiAobG9jLm51bWJlcmluZ1N5c3RlbSAmJiBsb2MubnVtYmVyaW5nU3lzdGVtICE9PSBcImxhdG5cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbG9jLm51bWJlcmluZ1N5c3RlbSA9PT0gXCJsYXRuXCIgfHwgIWxvYy5sb2NhbGUgfHwgbG9jLmxvY2FsZS5zdGFydHNXaXRoKFwiZW5cIikgfHwgaGFzSW50bCgpICYmIEludGwuRGF0ZVRpbWVGb3JtYXQobG9jLmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbSA9PT0gXCJsYXRuXCI7XG4gIH1cbn1cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG52YXIgU2ltcGxlTnVtYmVyRm9ybWF0dGVyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2ltcGxlTnVtYmVyRm9ybWF0dGVyKG9wdHMpIHtcbiAgICB0aGlzLnBhZFRvID0gb3B0cy5wYWRUbyB8fCAwO1xuICAgIHRoaXMuZmxvb3IgPSBvcHRzLmZsb29yIHx8IGZhbHNlO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNpbXBsZU51bWJlckZvcm1hdHRlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgLy8gdG8gbWF0Y2ggdGhlIGJyb3dzZXIncyBudW1iZXJmb3JtYXR0ZXIgZGVmYXVsdHNcbiAgICB2YXIgZml4ZWQgPSB0aGlzLmZsb29yID8gTWF0aC5mbG9vcihpKSA6IHJvdW5kVG8oaSwgMyk7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KGZpeGVkLCB0aGlzLnBhZFRvKTtcbiAgfTtcblxuICByZXR1cm4gU2ltcGxlTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgSW50bE51bWJlckZvcm1hdHRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEludGxOdW1iZXJGb3JtYXR0ZXIoaW50bCwgb3B0cykge1xuICAgIHZhciBpbnRsT3B0cyA9IHtcbiAgICAgIHVzZUdyb3VwaW5nOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAob3B0cy5wYWRUbyA+IDApIHtcbiAgICAgIGludGxPcHRzLm1pbmltdW1JbnRlZ2VyRGlnaXRzID0gb3B0cy5wYWRUbztcbiAgICB9XG5cbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vcjtcbiAgICB0aGlzLmluZiA9IGdldENhY2hlbmRJTkYoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBJbnRsTnVtYmVyRm9ybWF0dGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8yLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgIHJldHVybiB0aGlzLmluZi5mb3JtYXQoZml4ZWQpO1xuICB9O1xuXG4gIHJldHVybiBJbnRsTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbnZhciBQb2x5RGF0ZUZvcm1hdHRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvbHlEYXRlRm9ybWF0dGVyKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmhhc0ludGwgPSBoYXNJbnRsKCk7XG4gICAgdmFyIHo7XG5cbiAgICBpZiAoZHQuem9uZS51bml2ZXJzYWwgJiYgdGhpcy5oYXNJbnRsKSB7XG4gICAgICAvLyBDaHJvbWl1bSBkb2Vzbid0IHN1cHBvcnQgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjL0dNVCs4IGluIGl0cyBmb3JtYXR0ZXIsXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzY0Mzc0LlxuICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAvLyAxLiBUaGUgZm9ybWF0IG9wdGlvbnMgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBXZSBjYW4ndCBkbyB0aGF0LCBzbyB0aGUgYmVzdFxuICAgICAgLy8gd2UgY2FuIGRvIGlzIGZvcm1hdCB0aGUgZGF0ZSBpbiBVVEMuXG4gICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgLy8gdGhlIHRpbWUgYW5kIHRlbGwgdGhlIGZvcm1hdHRlciB0byBzaG93IGl0IHRvIHVzIGluIFVUQywgc28gdGhhdCB0aGUgdGltZSBpcyByaWdodFxuICAgICAgLy8gYW5kIHRoZSBiYWQgem9uZSBkb2Vzbid0IHNob3cgdXAuXG4gICAgICAvLyBXZSBjYW4gY2xlYW4gYWxsIHRoaXMgdXAgd2hlbiBDaHJvbWUgZml4ZXMgdGhpcy5cbiAgICAgIHogPSBcIlVUQ1wiO1xuXG4gICAgICBpZiAob3B0cy50aW1lWm9uZU5hbWUpIHtcbiAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kdCA9IGR0Lm9mZnNldCA9PT0gMCA/IGR0IDogRGF0ZVRpbWUuZnJvbU1pbGxpcyhkdC50cyArIGR0Lm9mZnNldCAqIDYwICogMTAwMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwibG9jYWxcIikge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB6ID0gZHQuem9uZS5uYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHZhciBpbnRsT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cyk7XG5cbiAgICAgIGlmICh6KSB7XG4gICAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8zID0gUG9seURhdGVGb3JtYXR0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90bzMuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRva2VuRm9ybWF0ID0gZm9ybWF0U3RyaW5nKHRoaXMub3B0cyksXG4gICAgICAgICAgbG9jID0gTG9jYWxlLmNyZWF0ZShcImVuLVVTXCIpO1xuICAgICAgcmV0dXJuIEZvcm1hdHRlci5jcmVhdGUobG9jKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcy5kdCwgdG9rZW5Gb3JtYXQpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8zLmZvcm1hdFRvUGFydHMgPSBmdW5jdGlvbiBmb3JtYXRUb1BhcnRzKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYuZm9ybWF0VG9QYXJ0cyh0aGlzLmR0LnRvSlNEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGtpbmQgb2YgYSBjb3Agb3V0LiBXZSBhY3R1YWxseSBjb3VsZCBkbyB0aGlzIGZvciBFbmdsaXNoLiBIb3dldmVyLCB3ZSBjb3VsZG4ndCBkbyBpdCBmb3IgaW50bCBzdHJpbmdzXG4gICAgICAvLyBhbmQgSU1PIGl0J3MgdG9vIHdlaXJkIHRvIGhhdmUgYW4gdW5jYW5ueSB2YWxsZXkgbGlrZSB0aGF0XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzMucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiBcImVuLVVTXCIsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbTogXCJsYXRuXCIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyOiBcImdyZWdvcnlcIlxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFBvbHlEYXRlRm9ybWF0dGVyO1xufSgpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbnZhciBMb2NhbGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBMb2NhbGUuZnJvbU9wdHMgPSBmdW5jdGlvbiBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfTtcblxuICBMb2NhbGUuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhciwgZGVmYXVsdFRvRU4pIHtcbiAgICBpZiAoZGVmYXVsdFRvRU4gPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdFRvRU4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGUsXG4gICAgICAgIC8vIHRoZSBzeXN0ZW0gbG9jYWxlIGlzIHVzZWZ1bCBmb3IgaHVtYW4gcmVhZGFibGUgc3RyaW5ncyBidXQgYW5ub3lpbmcgZm9yIHBhcnNpbmcvZm9ybWF0dGluZyBrbm93biBmb3JtYXRzXG4gICAgbG9jYWxlUiA9IHNwZWNpZmllZExvY2FsZSB8fCAoZGVmYXVsdFRvRU4gPyBcImVuLVVTXCIgOiBzeXN0ZW1Mb2NhbGUoKSksXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbVIgPSBudW1iZXJpbmdTeXN0ZW0gfHwgU2V0dGluZ3MuZGVmYXVsdE51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfTtcblxuICBMb2NhbGUucmVzZXRDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGUoKSB7XG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuICAgIGludGxEVENhY2hlID0ge307XG4gICAgaW50bE51bUNhY2hlID0ge307XG4gIH07XG5cbiAgTG9jYWxlLmZyb21PYmplY3QgPSBmdW5jdGlvbiBmcm9tT2JqZWN0KF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXI7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIExvY2FsZShsb2NhbGUsIG51bWJlcmluZywgb3V0cHV0Q2FsZW5kYXIsIHNwZWNpZmllZExvY2FsZSkge1xuICAgIHZhciBfcGFyc2VMb2NhbGVTdHJpbmcgPSBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGUpLFxuICAgICAgICBwYXJzZWRMb2NhbGUgPSBfcGFyc2VMb2NhbGVTdHJpbmdbMF0sXG4gICAgICAgIHBhcnNlZE51bWJlcmluZ1N5c3RlbSA9IF9wYXJzZUxvY2FsZVN0cmluZ1sxXSxcbiAgICAgICAgcGFyc2VkT3V0cHV0Q2FsZW5kYXIgPSBfcGFyc2VMb2NhbGVTdHJpbmdbMl07XG5cbiAgICB0aGlzLmxvY2FsZSA9IHBhcnNlZExvY2FsZTtcbiAgICB0aGlzLm51bWJlcmluZ1N5c3RlbSA9IG51bWJlcmluZyB8fCBwYXJzZWROdW1iZXJpbmdTeXN0ZW0gfHwgbnVsbDtcbiAgICB0aGlzLm91dHB1dENhbGVuZGFyID0gb3V0cHV0Q2FsZW5kYXIgfHwgcGFyc2VkT3V0cHV0Q2FsZW5kYXIgfHwgbnVsbDtcbiAgICB0aGlzLmludGwgPSBpbnRsQ29uZmlnU3RyaW5nKHRoaXMubG9jYWxlLCB0aGlzLm51bWJlcmluZ1N5c3RlbSwgdGhpcy5vdXRwdXRDYWxlbmRhcik7XG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0ge1xuICAgICAgZm9ybWF0OiB7fSxcbiAgICAgIHN0YW5kYWxvbmU6IHt9XG4gICAgfTtcbiAgICB0aGlzLm1vbnRoc0NhY2hlID0ge1xuICAgICAgZm9ybWF0OiB7fSxcbiAgICAgIHN0YW5kYWxvbmU6IHt9XG4gICAgfTtcbiAgICB0aGlzLm1lcmlkaWVtQ2FjaGUgPSBudWxsO1xuICAgIHRoaXMuZXJhQ2FjaGUgPSB7fTtcbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIHZhciBfcHJvdG80ID0gTG9jYWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG80Lmxpc3RpbmdNb2RlID0gZnVuY3Rpb24gbGlzdGluZ01vZGUoZGVmYXVsdE9LKSB7XG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBpbnRsID0gaGFzSW50bCgpLFxuICAgICAgICBoYXNGVFAgPSBpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgaXNBY3R1YWxseUVuID0gdGhpcy5sb2NhbGUgPT09IFwiZW5cIiB8fCB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHwgaW50bCAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKSxcbiAgICAgICAgaGFzTm9XZWlyZG5lc3MgPSAodGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG51bGwgfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiKSAmJiAodGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gbnVsbCB8fCB0aGlzLm91dHB1dENhbGVuZGFyID09PSBcImdyZWdvcnlcIik7XG5cbiAgICBpZiAoIWhhc0ZUUCAmJiAhKGlzQWN0dWFsbHlFbiAmJiBoYXNOb1dlaXJkbmVzcykgJiYgIWRlZmF1bHRPSykge1xuICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICB9IGVsc2UgaWYgKCFoYXNGVFAgfHwgaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzKSB7XG4gICAgICByZXR1cm4gXCJlblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJpbnRsXCI7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzQuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZShhbHRzKSB7XG4gICAgaWYgKCFhbHRzIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFsdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGFsdHMubG9jYWxlIHx8IHRoaXMuc3BlY2lmaWVkTG9jYWxlLCBhbHRzLm51bWJlcmluZ1N5c3RlbSB8fCB0aGlzLm51bWJlcmluZ1N5c3RlbSwgYWx0cy5vdXRwdXRDYWxlbmRhciB8fCB0aGlzLm91dHB1dENhbGVuZGFyLCBhbHRzLmRlZmF1bHRUb0VOIHx8IGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvNC5yZWRlZmF1bHRUb0VOID0gZnVuY3Rpb24gcmVkZWZhdWx0VG9FTihhbHRzKSB7XG4gICAgaWYgKGFsdHMgPT09IHZvaWQgMCkge1xuICAgICAgYWx0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHtcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSkpO1xuICB9O1xuXG4gIF9wcm90bzQucmVkZWZhdWx0VG9TeXN0ZW0gPSBmdW5jdGlvbiByZWRlZmF1bHRUb1N5c3RlbShhbHRzKSB7XG4gICAgaWYgKGFsdHMgPT09IHZvaWQgMCkge1xuICAgICAgYWx0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHtcbiAgICAgIGRlZmF1bHRUb0VOOiBmYWxzZVxuICAgIH0pKTtcbiAgfTtcblxuICBfcHJvdG80Lm1vbnRocyA9IGZ1bmN0aW9uIG1vbnRocyQkMShsZW5ndGgsIGZvcm1hdCwgZGVmYXVsdE9LKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChmb3JtYXQgPT09IHZvaWQgMCkge1xuICAgICAgZm9ybWF0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIG1vbnRocywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSBmb3JtYXQgPyB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGgsXG4gICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgIH0gOiB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGhcbiAgICAgIH0sXG4gICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgICBpZiAoIV90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBNb250aHMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmV4dHJhY3QoZHQsIGludGwsIFwibW9udGhcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQud2Vla2RheXMgPSBmdW5jdGlvbiB3ZWVrZGF5cyQkMShsZW5ndGgsIGZvcm1hdCwgZGVmYXVsdE9LKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAoZm9ybWF0ID09PSB2b2lkIDApIHtcbiAgICAgIGZvcm1hdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCB3ZWVrZGF5cywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSBmb3JtYXQgPyB7XG4gICAgICAgIHdlZWtkYXk6IGxlbmd0aCxcbiAgICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgfSA6IHtcbiAgICAgICAgd2Vla2RheTogbGVuZ3RoXG4gICAgICB9LFxuICAgICAgICAgIGZvcm1hdFN0ciA9IGZvcm1hdCA/IFwiZm9ybWF0XCIgOiBcInN0YW5kYWxvbmVcIjtcblxuICAgICAgaWYgKCFfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwV2Vla2RheXMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5leHRyYWN0KGR0LCBpbnRsLCBcIndlZWtkYXlcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQubWVyaWRpZW1zID0gZnVuY3Rpb24gbWVyaWRpZW1zJCQxKGRlZmF1bHRPSykge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgdW5kZWZpbmVkLCBkZWZhdWx0T0ssIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZXJpZGllbXM7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gSW4gdGhlb3J5IHRoZXJlIGNvdWxkIGJlIGFyaWJpdHJhcnkgZGF5IHBlcmlvZHMuIFdlJ3JlIGdvbm5hIGFzc3VtZSB0aGVyZSBhcmUgZXhhY3RseSB0d29cbiAgICAgIC8vIGZvciBBTSBhbmQgUE0uIFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIG1ha2VzIHBhcnNpbmcgd2F5IGVhc2llci5cbiAgICAgIGlmICghX3RoaXMzLm1lcmlkaWVtQ2FjaGUpIHtcbiAgICAgICAgdmFyIGludGwgPSB7XG4gICAgICAgICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgICAgICAgaG91cjEyOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzMy5tZXJpZGllbUNhY2hlID0gW0RhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDkpLCBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCAxOSldLm1hcChmdW5jdGlvbiAoZHQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLmV4dHJhY3QoZHQsIGludGwsIFwiZGF5cGVyaW9kXCIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzMy5tZXJpZGllbUNhY2hlO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQuZXJhcyA9IGZ1bmN0aW9uIGVyYXMkJDEobGVuZ3RoLCBkZWZhdWx0T0spIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBlcmFzLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW50bCA9IHtcbiAgICAgICAgZXJhOiBsZW5ndGhcbiAgICAgIH07IC8vIFRoaXMgaXMgdXR0ZXIgYnVsbHNoaXQuIERpZmZlcmVudCBjYWxlbmRhcnMgYXJlIGdvaW5nIHRvIGRlZmluZSBlcmFzIHRvdGFsbHkgZGlmZmVyZW50bHkuIFdoYXQgSSBuZWVkIGlzIHRoZSBtaW5pbXVtIHNldCBvZiBkYXRlc1xuICAgICAgLy8gdG8gZGVmaW5pdGVseSBlbnVtZXJhdGUgdGhlbS5cblxuICAgICAgaWYgKCFfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSkge1xuICAgICAgICBfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSA9IFtEYXRlVGltZS51dGMoLTQwLCAxLCAxKSwgRGF0ZVRpbWUudXRjKDIwMTcsIDEsIDEpXS5tYXAoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNC5leHRyYWN0KGR0LCBpbnRsLCBcImVyYVwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG80LmV4dHJhY3QgPSBmdW5jdGlvbiBleHRyYWN0KGR0LCBpbnRsT3B0cywgZmllbGQpIHtcbiAgICB2YXIgZGYgPSB0aGlzLmR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyksXG4gICAgICAgIHJlc3VsdHMgPSBkZi5mb3JtYXRUb1BhcnRzKCksXG4gICAgICAgIG1hdGNoaW5nID0gcmVzdWx0cy5maW5kKGZ1bmN0aW9uIChtKSB7XG4gICAgICByZXR1cm4gbS50eXBlLnRvTG93ZXJDYXNlKCkgPT09IGZpZWxkO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXRjaGluZyA/IG1hdGNoaW5nLnZhbHVlIDogbnVsbDtcbiAgfTtcblxuICBfcHJvdG80Lm51bWJlckZvcm1hdHRlciA9IGZ1bmN0aW9uIG51bWJlckZvcm1hdHRlcihvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIC8vIHRoaXMgZm9yY2VzaW1wbGUgb3B0aW9uIGlzIG5ldmVyIHVzZWQgKHRoZSBvbmx5IGNhbGxlciBzaG9ydC1jaXJjdWl0cyBvbiBpdCwgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGxlYXZlKVxuICAgIC8vIChpbiBjb250cmFzdCwgdGhlIHJlc3Qgb2YgdGhlIGNvbmRpdGlvbiBpcyB1c2VkIGhlYXZpbHkpXG4gICAgaWYgKG9wdHMuZm9yY2VTaW1wbGUgfHwgdGhpcy5mYXN0TnVtYmVycyB8fCAhaGFzSW50bCgpKSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZU51bWJlckZvcm1hdHRlcihvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBJbnRsTnVtYmVyRm9ybWF0dGVyKHRoaXMuaW50bCwgb3B0cyk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzQuZHRGb3JtYXR0ZXIgPSBmdW5jdGlvbiBkdEZvcm1hdHRlcihkdCwgaW50bE9wdHMpIHtcbiAgICBpZiAoaW50bE9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgaW50bE9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBvbHlEYXRlRm9ybWF0dGVyKGR0LCB0aGlzLmludGwsIGludGxPcHRzKTtcbiAgfTtcblxuICBfcHJvdG80LmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZSA9PT0gb3RoZXIubG9jYWxlICYmIHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBvdGhlci5udW1iZXJpbmdTeXN0ZW0gJiYgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXI7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKExvY2FsZSwgW3tcbiAgICBrZXk6IFwiZmFzdE51bWJlcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IHN1cHBvcnRzRmFzdE51bWJlcnModGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMb2NhbGU7XG59KCk7XG5cbi8qXHJcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XHJcbiAqIFR3byB0aGluZ3MgZ28gaW50byBwYXJzaW5nOiBhIHJlZ2V4IHRvIG1hdGNoIHdpdGggYW5kIGFuIGV4dHJhY3RvciB0byB0YWtlIGFwYXJ0IHRoZSBncm91cHMgaW4gdGhlIG1hdGNoLlxyXG4gKiBBbiBleHRyYWN0b3IgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSByZWdleCBtYXRjaCBhcnJheSBhbmQgcmV0dXJucyBhIHsgeWVhcjogLi4uLCBtb250aDogLi4uIH0gb2JqZWN0XHJcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxyXG4gKiBFeHRyYWN0b3JzIGNhbiB0YWtlIGEgXCJjdXJzb3JcIiByZXByZXNlbnRpbmcgdGhlIG9mZnNldCBpbiB0aGUgbWF0Y2ggdG8gbG9vayBhdC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGNvbWJpbmUgZXh0cmFjdG9ycy5cclxuICogY29tYmluZUV4dHJhY3RvcnMoKSBkb2VzIHRoZSB3b3JrIG9mIGNvbWJpbmluZyB0aGVtLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjdXJzb3IgdGhyb3VnaCBtdWx0aXBsZSBleHRyYWN0aW9ucy5cclxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXHJcbiAqL1xuXG5mdW5jdGlvbiBjb21iaW5lUmVnZXhlcygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlZ2V4ZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcmVnZXhlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoZnVuY3Rpb24gKGYsIHIpIHtcbiAgICByZXR1cm4gZiArIHIuc291cmNlO1xuICB9LCBcIlwiKTtcbiAgcmV0dXJuIFJlZ0V4cChcIl5cIiArIGZ1bGwgKyBcIiRcIik7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVFeHRyYWN0b3JzKCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGV4dHJhY3RvcnMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBleHRyYWN0b3JzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gZXh0cmFjdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYsIGV4KSB7XG4gICAgICB2YXIgbWVyZ2VkVmFscyA9IF9yZWZbMF0sXG4gICAgICAgICAgbWVyZ2VkWm9uZSA9IF9yZWZbMV0sXG4gICAgICAgICAgY3Vyc29yID0gX3JlZlsyXTtcblxuICAgICAgdmFyIF9leCA9IGV4KG0sIGN1cnNvciksXG4gICAgICAgICAgdmFsID0gX2V4WzBdLFxuICAgICAgICAgIHpvbmUgPSBfZXhbMV0sXG4gICAgICAgICAgbmV4dCA9IF9leFsyXTtcblxuICAgICAgcmV0dXJuIFtPYmplY3QuYXNzaWduKG1lcmdlZFZhbHMsIHZhbCksIG1lcmdlZFpvbmUgfHwgem9uZSwgbmV4dF07XG4gICAgfSwgW3t9LCBudWxsLCAxXSkuc2xpY2UoMCwgMik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHMpIHtcbiAgaWYgKHMgPT0gbnVsbCkge1xuICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gIH1cblxuICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhdHRlcm5zID0gbmV3IEFycmF5KF9sZW4zID4gMSA/IF9sZW4zIC0gMSA6IDApLCBfa2V5MyA9IDE7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICBwYXR0ZXJuc1tfa2V5MyAtIDFdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgfVxuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBwYXR0ZXJucy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX3BhdHRlcm5zJF9pID0gcGF0dGVybnNbX2ldLFxuICAgICAgICByZWdleCA9IF9wYXR0ZXJucyRfaVswXSxcbiAgICAgICAgZXh0cmFjdG9yID0gX3BhdHRlcm5zJF9pWzFdO1xuICAgIHZhciBtID0gcmVnZXguZXhlYyhzKTtcblxuICAgIGlmIChtKSB7XG4gICAgICByZXR1cm4gZXh0cmFjdG9yKG0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKCkge1xuICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICBrZXlzW19rZXk0XSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG1hdGNoLCBjdXJzb3IpIHtcbiAgICB2YXIgcmV0ID0ge307XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBbcmV0LCBudWxsLCBjdXJzb3IgKyBpXTtcbiAgfTtcbn0gLy8gSVNPIGFuZCBTUUwgcGFyc2luZ1xuXG5cbnZhciBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gICAgaXNvVGltZUJhc2VSZWdleCA9IC8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Wy4sXShcXGR7MSw5fSkpPyk/KT8vLFxuICAgIGlzb1RpbWVSZWdleCA9IFJlZ0V4cChcIlwiICsgaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyBcIj9cIiksXG4gICAgaXNvVGltZUV4dGVuc2lvblJlZ2V4ID0gUmVnRXhwKFwiKD86VFwiICsgaXNvVGltZVJlZ2V4LnNvdXJjZSArIFwiKT9cIiksXG4gICAgaXNvWW1kUmVnZXggPSAvKFsrLV1cXGR7Nn18XFxkezR9KSg/Oi0/KFxcZFxcZCkoPzotPyhcXGRcXGQpKT8pPy8sXG4gICAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCkoPzotPyhcXGQpKT8vLFxuICAgIGlzb09yZGluYWxSZWdleCA9IC8oXFxkezR9KS0/KFxcZHszfSkvLFxuICAgIGV4dHJhY3RJU09XZWVrRGF0YSA9IHNpbXBsZVBhcnNlKFwid2Vla1llYXJcIiwgXCJ3ZWVrTnVtYmVyXCIsIFwid2Vla0RheVwiKSxcbiAgICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZShcInllYXJcIiwgXCJvcmRpbmFsXCIpLFxuICAgIHNxbFltZFJlZ2V4ID0gLyhcXGR7NH0pLShcXGRcXGQpLShcXGRcXGQpLyxcbiAgICAvLyBkdW1iZWQtZG93biB2ZXJzaW9uIG9mIHRoZSBJU08gb25lXG5zcWxUaW1lUmVnZXggPSBSZWdFeHAoaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyBcIiA/KD86XCIgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyBcInwoW2EtekEtWl9dezEsMjU2fS9bYS16QS1aX117MSwyNTZ9KSk/XCIpLFxuICAgIHNxbFRpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChcIig/OiBcIiArIHNxbFRpbWVSZWdleC5zb3VyY2UgKyBcIik/XCIpO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPWW1kKG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIGl0ZW0gPSB7XG4gICAgeWVhcjogcGFyc2VJbnQobWF0Y2hbY3Vyc29yXSksXG4gICAgbW9udGg6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDFdKSB8fCAxLFxuICAgIGRheTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMl0pIHx8IDFcbiAgfTtcbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1RpbWUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgaXRlbSA9IHtcbiAgICBob3VyOiBwYXJzZUludChtYXRjaFtjdXJzb3JdKSB8fCAwLFxuICAgIG1pbnV0ZTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMV0pIHx8IDAsXG4gICAgc2Vjb25kOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAyXSkgfHwgMCxcbiAgICBtaWxsaXNlY29uZDogcGFyc2VNaWxsaXMobWF0Y2hbY3Vyc29yICsgM10pXG4gIH07XG4gIHJldHVybiBbaXRlbSwgbnVsbCwgY3Vyc29yICsgNF07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJU09PZmZzZXQobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgbG9jYWwgPSAhbWF0Y2hbY3Vyc29yXSAmJiAhbWF0Y2hbY3Vyc29yICsgMV0sXG4gICAgICBmdWxsT2Zmc2V0ID0gc2lnbmVkT2Zmc2V0KG1hdGNoW2N1cnNvciArIDFdLCBtYXRjaFtjdXJzb3IgKyAyXSksXG4gICAgICB6b25lID0gbG9jYWwgPyBudWxsIDogRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGZ1bGxPZmZzZXQpO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElBTkFab25lKG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIHpvbmUgPSBtYXRjaFtjdXJzb3JdID8gbmV3IElBTkFab25lKG1hdGNoW2N1cnNvcl0pIDogbnVsbDtcbiAgcmV0dXJuIFt7fSwgem9uZSwgY3Vyc29yICsgMV07XG59IC8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cblxudmFyIGlzb0R1cmF0aW9uID0gL15QKD86KD86KC0/XFxkezEsOX0pWSk/KD86KC0/XFxkezEsOX0pTSk/KD86KC0/XFxkezEsOX0pRCk/KD86VCg/OigtP1xcZHsxLDl9KUgpPyg/OigtP1xcZHsxLDl9KU0pPyg/OigtP1xcZHsxLDl9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/fCgtP1xcZHsxLDl9KVcpJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RJU09EdXJhdGlvbihtYXRjaCkge1xuICB2YXIgeWVhclN0ciA9IG1hdGNoWzFdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFsyXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzNdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzRdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNV0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs2XSxcbiAgICAgIG1pbGxpc2Vjb25kc1N0ciA9IG1hdGNoWzddLFxuICAgICAgd2Vla1N0ciA9IG1hdGNoWzhdO1xuICByZXR1cm4gW3tcbiAgICB5ZWFyczogcGFyc2VJbnQoeWVhclN0ciksXG4gICAgbW9udGhzOiBwYXJzZUludChtb250aFN0ciksXG4gICAgd2Vla3M6IHBhcnNlSW50KHdlZWtTdHIpLFxuICAgIGRheXM6IHBhcnNlSW50KGRheVN0ciksXG4gICAgaG91cnM6IHBhcnNlSW50KGhvdXJTdHIpLFxuICAgIG1pbnV0ZXM6IHBhcnNlSW50KG1pbnV0ZVN0ciksXG4gICAgc2Vjb25kczogcGFyc2VJbnQoc2Vjb25kU3RyKSxcbiAgICBtaWxsaXNlY29uZHM6IHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0cilcbiAgfV07XG59IC8vIFRoZXNlIGFyZSBhIGxpdHRsZSBicmFpbmRlYWQuIEVEVCAqc2hvdWxkKiB0ZWxsIHVzIHRoYXQgd2UncmUgaW4sIHNheSwgQW1lcmljYS9OZXdfWW9ya1xuLy8gYW5kIG5vdCBqdXN0IHRoYXQgd2UncmUgaW4gLTI0MCAqcmlnaHQgbm93Ki4gQnV0IHNpbmNlIEkgZG9uJ3QgdGhpbmsgdGhlc2UgYXJlIHVzZWQgdGhhdCBvZnRlblxuLy8gSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXRcblxuXG52YXIgb2JzT2Zmc2V0cyA9IHtcbiAgR01UOiAwLFxuICBFRFQ6IC00ICogNjAsXG4gIEVTVDogLTUgKiA2MCxcbiAgQ0RUOiAtNSAqIDYwLFxuICBDU1Q6IC02ICogNjAsXG4gIE1EVDogLTYgKiA2MCxcbiAgTVNUOiAtNyAqIDYwLFxuICBQRFQ6IC03ICogNjAsXG4gIFBTVDogLTggKiA2MFxufTtcblxuZnVuY3Rpb24gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB5ZWFyOiB5ZWFyU3RyLmxlbmd0aCA9PT0gMiA/IHVudHJ1bmNhdGVZZWFyKHBhcnNlSW50KHllYXJTdHIpKSA6IHBhcnNlSW50KHllYXJTdHIpLFxuICAgIG1vbnRoOiBtb250aFN0ci5sZW5ndGggPT09IDIgPyBwYXJzZUludChtb250aFN0ciwgMTApIDogbW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0cikgKyAxLFxuICAgIGRheTogcGFyc2VJbnQoZGF5U3RyKSxcbiAgICBob3VyOiBwYXJzZUludChob3VyU3RyKSxcbiAgICBtaW51dGU6IHBhcnNlSW50KG1pbnV0ZVN0cilcbiAgfTtcbiAgaWYgKHNlY29uZFN0cikgcmVzdWx0LnNlY29uZCA9IHBhcnNlSW50KHNlY29uZFN0cik7XG5cbiAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICByZXN1bHQud2Vla2RheSA9IHdlZWtkYXlTdHIubGVuZ3RoID4gMyA/IHdlZWtkYXlzTG9uZy5pbmRleE9mKHdlZWtkYXlTdHIpICsgMSA6IHdlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSAvLyBSRkMgMjgyMi81MzIyXG5cblxudmFyIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLFxccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoPzooWystXVxcZFxcZCkoXFxkXFxkKSkpJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMyODIyKG1hdGNoKSB7XG4gIHZhciB3ZWVrZGF5U3RyID0gbWF0Y2hbMV0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFsyXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbM10sXG4gICAgICB5ZWFyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNV0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs2XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzddLFxuICAgICAgb2JzT2Zmc2V0ID0gbWF0Y2hbOF0sXG4gICAgICBtaWxPZmZzZXQgPSBtYXRjaFs5XSxcbiAgICAgIG9mZkhvdXJTdHIgPSBtYXRjaFsxMF0sXG4gICAgICBvZmZNaW51dGVTdHIgPSBtYXRjaFsxMV0sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHZhciBvZmZzZXQ7XG5cbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgXCIgXCIpLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCBcIiBcIikudHJpbSgpO1xufSAvLyBodHRwIGRhdGVcblxuXG52YXIgcmZjMTEyMyA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcXGRcXGQpIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgKFxcZHs0fSkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgR01UJC8sXG4gICAgcmZjODUwID0gL14oTW9uZGF5fFR1ZXNkYXl8V2Vkc2RheXxUaHVyc2RheXxGcmlkYXl8U2F0dXJkYXl8U3VuZGF5KSwgKFxcZFxcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgICBhc2NpaSA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1bikgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoIFxcZHxcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIChcXGR7NH0pJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMxMTIzT3I4NTAobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzJdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFszXSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs1XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzZdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbN10sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QVNDSUkobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbMl0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFszXSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzVdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbNl0sXG4gICAgICB5ZWFyU3RyID0gbWF0Y2hbN10sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09ZbWQsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KV0sIFtjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09XZWVrRGF0YSwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSwgW2NvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT09yZGluYWxEYXRhLCBleHRyYWN0SVNPVGltZSldLCBbY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSk7XG59XG5mdW5jdGlvbiBwYXJzZVJGQzI4MjJEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHByZXByb2Nlc3NSRkMyODIyKHMpLCBbcmZjMjgyMiwgZXh0cmFjdFJGQzI4MjJdKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSFRUUERhdGUocykge1xuICByZXR1cm4gcGFyc2UocywgW3JmYzExMjMsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLCBbcmZjODUwLCBleHRyYWN0UkZDMTEyM09yODUwXSwgW2FzY2lpLCBleHRyYWN0QVNDSUldKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cbmZ1bmN0aW9uIHBhcnNlU1FMKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtjb21iaW5lUmVnZXhlcyhzcWxZbWRSZWdleCwgc3FsVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1ltZCwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQsIGV4dHJhY3RJQU5BWm9uZSldLCBbY29tYmluZVJlZ2V4ZXMoc3FsVGltZVJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQsIGV4dHJhY3RJQU5BWm9uZSldKTtcbn1cblxudmFyIEludmFsaWQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pIHtcbiAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgICB0aGlzLmV4cGxhbmF0aW9uID0gZXhwbGFuYXRpb247XG4gIH1cblxuICB2YXIgX3Byb3RvID0gSW52YWxpZC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnRvTWVzc2FnZSA9IGZ1bmN0aW9uIHRvTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5leHBsYW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uICsgXCI6IFwiICsgdGhpcy5leHBsYW5hdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gSW52YWxpZDtcbn0oKTtcblxudmFyIElOVkFMSUQgPSBcIkludmFsaWQgRHVyYXRpb25cIjsgLy8gdW5pdCBjb252ZXJzaW9uIGNvbnN0YW50c1xuXG52YXIgbG93T3JkZXJNYXRyaXggPSB7XG4gIHdlZWtzOiB7XG4gICAgZGF5czogNyxcbiAgICBob3VyczogNyAqIDI0LFxuICAgIG1pbnV0ZXM6IDcgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBkYXlzOiB7XG4gICAgaG91cnM6IDI0LFxuICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgc2Vjb25kczogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBob3Vyczoge1xuICAgIG1pbnV0ZXM6IDYwLFxuICAgIHNlY29uZHM6IDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBtaW51dGVzOiB7XG4gICAgc2Vjb25kczogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA2MCAqIDEwMDBcbiAgfSxcbiAgc2Vjb25kczoge1xuICAgIG1pbGxpc2Vjb25kczogMTAwMFxuICB9XG59LFxuICAgIGNhc3VhbE1hdHJpeCA9IE9iamVjdC5hc3NpZ24oe1xuICB5ZWFyczoge1xuICAgIG1vbnRoczogMTIsXG4gICAgd2Vla3M6IDUyLFxuICAgIGRheXM6IDM2NSxcbiAgICBob3VyczogMzY1ICogMjQsXG4gICAgbWludXRlczogMzY1ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIHF1YXJ0ZXJzOiB7XG4gICAgbW9udGhzOiAzLFxuICAgIHdlZWtzOiAxMyxcbiAgICBkYXlzOiA5MSxcbiAgICBob3VyczogOTEgKiAyNCxcbiAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgd2Vla3M6IDQsXG4gICAgZGF5czogMzAsXG4gICAgaG91cnM6IDMwICogMjQsXG4gICAgbWludXRlczogMzAgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cbn0sIGxvd09yZGVyTWF0cml4KSxcbiAgICBkYXlzSW5ZZWFyQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQwMCxcbiAgICBkYXlzSW5Nb250aEFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0ODAwLFxuICAgIGFjY3VyYXRlTWF0cml4ID0gT2JqZWN0LmFzc2lnbih7XG4gIHllYXJzOiB7XG4gICAgbW9udGhzOiAxMixcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUsXG4gICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBxdWFydGVyczoge1xuICAgIG1vbnRoczogMyxcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICBob3VyczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgLyA0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgLyA0LFxuICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAvIDQsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwIC8gNFxuICB9LFxuICBtb250aHM6IHtcbiAgICB3ZWVrczogZGF5c0luTW9udGhBY2N1cmF0ZSAvIDcsXG4gICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG59LCBsb3dPcmRlck1hdHJpeCk7IC8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxuXG52YXIgb3JkZXJlZFVuaXRzID0gW1wieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIFwiZGF5c1wiLCBcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIl07XG52YXIgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTsgLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcblxuZnVuY3Rpb24gY2xvbmUoZHVyLCBhbHRzLCBjbGVhcikge1xuICBpZiAoY2xlYXIgPT09IHZvaWQgMCkge1xuICAgIGNsZWFyID0gZmFsc2U7XG4gIH1cblxuICAvLyBkZWVwIG1lcmdlIGZvciB2YWxzXG4gIHZhciBjb25mID0ge1xuICAgIHZhbHVlczogY2xlYXIgPyBhbHRzLnZhbHVlcyA6IE9iamVjdC5hc3NpZ24oe30sIGR1ci52YWx1ZXMsIGFsdHMudmFsdWVzIHx8IHt9KSxcbiAgICBsb2M6IGR1ci5sb2MuY2xvbmUoYWx0cy5sb2MpLFxuICAgIGNvbnZlcnNpb25BY2N1cmFjeTogYWx0cy5jb252ZXJzaW9uQWNjdXJhY3kgfHwgZHVyLmNvbnZlcnNpb25BY2N1cmFjeVxuICB9O1xuICByZXR1cm4gbmV3IER1cmF0aW9uKGNvbmYpO1xufVxuXG5mdW5jdGlvbiBhbnRpVHJ1bmMobikge1xuICByZXR1cm4gbiA8IDAgPyBNYXRoLmZsb29yKG4pIDogTWF0aC5jZWlsKG4pO1xufSAvLyBOQjogbXV0YXRlcyBwYXJhbWV0ZXJzXG5cblxuZnVuY3Rpb24gY29udmVydChtYXRyaXgsIGZyb21NYXAsIGZyb21Vbml0LCB0b01hcCwgdG9Vbml0KSB7XG4gIHZhciBjb252ID0gbWF0cml4W3RvVW5pdF1bZnJvbVVuaXRdLFxuICAgICAgcmF3ID0gZnJvbU1hcFtmcm9tVW5pdF0gLyBjb252LFxuICAgICAgc2FtZVNpZ24gPSBNYXRoLnNpZ24ocmF3KSA9PT0gTWF0aC5zaWduKHRvTWFwW3RvVW5pdF0pLFxuICAgICAgLy8gb2ssIHNvIHRoaXMgaXMgd2lsZCwgYnV0IHNlZSB0aGUgbWF0cml4IGluIHRoZSB0ZXN0c1xuICBhZGRlZCA9ICFzYW1lU2lnbiAmJiB0b01hcFt0b1VuaXRdICE9PSAwICYmIE1hdGguYWJzKHJhdykgPD0gMSA/IGFudGlUcnVuYyhyYXcpIDogTWF0aC50cnVuYyhyYXcpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59IC8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcblxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZXMobWF0cml4LCB2YWxzKSB7XG4gIHJldmVyc2VVbml0cy5yZWR1Y2UoZnVuY3Rpb24gKHByZXZpb3VzLCBjdXJyZW50KSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh2YWxzW2N1cnJlbnRdKSkge1xuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIGNvbnZlcnQobWF0cml4LCB2YWxzLCBwcmV2aW91cywgdmFscywgY3VycmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cbi8qKlxyXG4gKiBBIER1cmF0aW9uIG9iamVjdCByZXByZXNlbnRzIGEgcGVyaW9kIG9mIHRpbWUsIGxpa2UgXCIyIG1vbnRoc1wiIG9yIFwiMSBkYXksIDEgaG91clwiLiBDb25jZXB0dWFsbHksIGl0J3MganVzdCBhIG1hcCBvZiB1bml0cyB0byB0aGVpciBxdWFudGl0aWVzLCBhY2NvbXBhbmllZCBieSBzb21lIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBhbmQgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS4gVGhleSBjYW4gYmUgdXNlZCBvbiB0aGVpciBvd24gb3IgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBMdXhvbiB0eXBlczsgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHtAbGluayBEYXRlVGltZS5wbHVzfSB0byBhZGQgYSBEdXJhdGlvbiBvYmplY3QgdG8gYSBEYXRlVGltZSwgcHJvZHVjaW5nIGFub3RoZXIgRGF0ZVRpbWUuXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiBjb21tb25seSB1c2VkIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gRHVyYXRpb246XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhIER1cmF0aW9uLCB1c2Uge0BsaW5rIER1cmF0aW9uLmZyb21NaWxsaXN9LCB7QGxpbmsgRHVyYXRpb24uZnJvbU9iamVjdH0sIG9yIHtAbGluayBEdXJhdGlvbi5mcm9tSVNPfS5cclxuICogKiAqKlVuaXQgdmFsdWVzKiogU2VlIHRoZSB7QGxpbmsgRHVyYXRpb24ueWVhcnN9LCB7QGxpbmsgRHVyYXRpb24ubW9udGhzfSwge0BsaW5rIER1cmF0aW9uLndlZWtzfSwge0BsaW5rIER1cmF0aW9uLmRheXN9LCB7QGxpbmsgRHVyYXRpb24uaG91cnN9LCB7QGxpbmsgRHVyYXRpb24ubWludXRlc30sIHtAbGluayBEdXJhdGlvbi5zZWNvbmRzfSwge0BsaW5rIER1cmF0aW9uLm1pbGxpc2Vjb25kc30gYWNjZXNzb3JzLlxyXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSAge0BsaW5rIER1cmF0aW9uLmxvY2FsZX0gYW5kIHtAbGluayBEdXJhdGlvbi5udW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG5ldyBEdXJhdGlvbnMgb3V0IG9mIG9sZCBvbmVzIHVzZSB7QGxpbmsgRHVyYXRpb24ucGx1c30sIHtAbGluayBEdXJhdGlvbi5taW51c30sIHtAbGluayBEdXJhdGlvbi5ub3JtYWxpemV9LCB7QGxpbmsgRHVyYXRpb24uc2V0fSwge0BsaW5rIER1cmF0aW9uLnJlY29uZmlndXJlfSwge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99LCBhbmQge0BsaW5rIER1cmF0aW9uLm5lZ2F0ZX0uXHJcbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBEdXJhdGlvbiBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBEdXJhdGlvbi5hc30sIHtAbGluayBEdXJhdGlvbi50b0lTT30sIHtAbGluayBEdXJhdGlvbi50b0Zvcm1hdH0sIGFuZCB7QGxpbmsgRHVyYXRpb24udG9KU09OfVxyXG4gKlxyXG4gKiBUaGVyZSdzIGFyZSBtb3JlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIHZhbGlkaXR5LCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXHJcbiAqL1xuXG5cbnZhciBEdXJhdGlvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXG4gIGZ1bmN0aW9uIER1cmF0aW9uKGNvbmZpZykge1xuICAgIHZhciBhY2N1cmF0ZSA9IGNvbmZpZy5jb252ZXJzaW9uQWNjdXJhY3kgPT09IFwibG9uZ3Rlcm1cIiB8fCBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLnZhbHVlcyA9IGNvbmZpZy52YWx1ZXM7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5sb2MgPSBjb25maWcubG9jIHx8IExvY2FsZS5jcmVhdGUoKTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGFjY3VyYXRlID8gXCJsb25ndGVybVwiIDogXCJjYXN1YWxcIjtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZCB8fCBudWxsO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubWF0cml4ID0gYWNjdXJhdGUgPyBhY2N1cmF0ZU1hdHJpeCA6IGNhc3VhbE1hdHJpeDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmlzTHV4b25EdXJhdGlvbiA9IHRydWU7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIER1cmF0aW9uIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBvZiBtaWxsaXNlY29uZHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21NaWxsaXMgPSBmdW5jdGlvbiBmcm9tTWlsbGlzKGNvdW50LCBvcHRzKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbih7XG4gICAgICBtaWxsaXNlY29uZHM6IGNvdW50XG4gICAgfSwgb3B0cykpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXJzJyBhbmQgJ2hvdXJzLlxyXG4gICAqIElmIHRoaXMgb2JqZWN0IGlzIGVtcHR5IHRoZW4gemVybyAgbWlsbGlzZWNvbmRzIGR1cmF0aW9uIGlzIHJldHVybmVkLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoueWVhcnNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnF1YXJ0ZXJzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aHNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXlzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3Vyc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmRzXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmoubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiRHVyYXRpb24uZnJvbU9iamVjdDogYXJndW1lbnQgZXhwZWN0ZWQgdG8gYmUgYW4gb2JqZWN0LCBnb3QgXCIgKyB0eXBlb2Ygb2JqKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKHtcbiAgICAgIHZhbHVlczogbm9ybWFsaXplT2JqZWN0KG9iaiwgRHVyYXRpb24ubm9ybWFsaXplVW5pdCwgdHJ1ZSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9iaiksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9iai5jb252ZXJzaW9uQWNjdXJhY3lcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhbiBJU08gODYwMSBkdXJhdGlvbiBzdHJpbmcuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0ZXh0IHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQM1k2TTREVDEySDMwTTVTJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDMsIG1vbnRoczogNiwgZGF5OiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQVDIzSCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyMyB9XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUDVZM00nKS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogNSwgbW9udGhzOiAzIH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICB2YXIgX3BhcnNlSVNPRHVyYXRpb24gPSBwYXJzZUlTT0R1cmF0aW9uKHRleHQpLFxuICAgICAgICBwYXJzZWQgPSBfcGFyc2VJU09EdXJhdGlvblswXTtcblxuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIHZhciBvYmogPSBPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cyk7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgXCJ0aGUgaW5wdXQgXFxcIlwiICsgdGV4dCArIFwiXFxcIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFcIik7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBkYXRldGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIGlmIChleHBsYW5hdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICBleHBsYW5hdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREdXJhdGlvbkVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHtcbiAgICAgICAgaW52YWxpZDogaW52YWxpZFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ubm9ybWFsaXplVW5pdCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCwgaWdub3JlVW5rbm93bikge1xuICAgIGlmIChpZ25vcmVVbmtub3duID09PSB2b2lkIDApIHtcbiAgICAgIGlnbm9yZVVua25vd24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZCA9IHtcbiAgICAgIHllYXI6IFwieWVhcnNcIixcbiAgICAgIHllYXJzOiBcInllYXJzXCIsXG4gICAgICBxdWFydGVyOiBcInF1YXJ0ZXJzXCIsXG4gICAgICBxdWFydGVyczogXCJxdWFydGVyc1wiLFxuICAgICAgbW9udGg6IFwibW9udGhzXCIsXG4gICAgICBtb250aHM6IFwibW9udGhzXCIsXG4gICAgICB3ZWVrOiBcIndlZWtzXCIsXG4gICAgICB3ZWVrczogXCJ3ZWVrc1wiLFxuICAgICAgZGF5OiBcImRheXNcIixcbiAgICAgIGRheXM6IFwiZGF5c1wiLFxuICAgICAgaG91cjogXCJob3Vyc1wiLFxuICAgICAgaG91cnM6IFwiaG91cnNcIixcbiAgICAgIG1pbnV0ZTogXCJtaW51dGVzXCIsXG4gICAgICBtaW51dGVzOiBcIm1pbnV0ZXNcIixcbiAgICAgIHNlY29uZDogXCJzZWNvbmRzXCIsXG4gICAgICBzZWNvbmRzOiBcInNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kOiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgICAgbWlsbGlzZWNvbmRzOiBcIm1pbGxpc2Vjb25kc1wiXG4gICAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG4gICAgaWYgKCFpZ25vcmVVbmtub3duICYmICFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgRHVyYXRpb24uIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb1xyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5pc0R1cmF0aW9uID0gZnVuY3Rpb24gaXNEdXJhdGlvbihvKSB7XG4gICAgcmV0dXJuIG8uaXNMdXhvbkR1cmF0aW9uO1xuICB9O1xuICAvKipcclxuICAgKiBHZXQgIHRoZSBsb2NhbGUgb2YgYSBEdXJhdGlvbiwgc3VjaCAnZW4tR0InXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLiBZb3UgbWF5IHVzZSB0aGVzZSB0b2tlbnM6XHJcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xyXG4gICAqICogYHNgIGZvciBzZWNvbmRzXHJcbiAgICogKiBgbWAgZm9yIG1pbnV0ZXNcclxuICAgKiAqIGBoYCBmb3IgaG91cnNcclxuICAgKiAqIGBkYCBmb3IgZGF5c1xyXG4gICAqICogYE1gIGZvciBtb250aHNcclxuICAgKiAqIGB5YCBmb3IgeWVhcnNcclxuICAgKiBOb3RlczpcclxuICAgKiAqIEFkZCBwYWRkaW5nIGJ5IHJlcGVhdGluZyB0aGUgdG9rZW4sIGUuZy4gXCJ5eVwiIHBhZHMgdGhlIHllYXJzIHRvIHR3byBkaWdpdHMsIFwiaGhoaFwiIHBhZHMgdGhlIGhvdXJzIG91dCB0byBmb3VyIGRpZ2l0c1xyXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwieSBkIHNcIikgLy89PiBcIjEgNiAyXCJcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfSkudG9Gb3JtYXQoXCJ5eSBkZCBzc3NcIikgLy89PiBcIjAxIDA2IDAwMlwiXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cbiAgX3Byb3RvLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICB2YXIgZm10T3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdHMsIHtcbiAgICAgIGZsb29yOiBvcHRzLnJvdW5kICE9PSBmYWxzZSAmJiBvcHRzLmZsb29yICE9PSBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLCBmbXRPcHRzKS5mb3JtYXREdXJhdGlvbkZyb21TdHJpbmcodGhpcywgZm10KSA6IElOVkFMSUQ7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRHVyYXRpb24ncyB2YWx1ZXMuXHJcbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVDb25maWc9ZmFsc2VdIC0gaW5jbHVkZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgaW4gdGhlIG91dHB1dFxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9XHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvT2JqZWN0ID0gZnVuY3Rpb24gdG9PYmplY3Qob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuICAgIHZhciBiYXNlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy52YWx1ZXMpO1xuXG4gICAgaWYgKG9wdHMuaW5jbHVkZUNvbmZpZykge1xuICAgICAgYmFzZS5jb252ZXJzaW9uQWNjdXJhY3kgPSB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeTtcbiAgICAgIGJhc2UubnVtYmVyaW5nU3lzdGVtID0gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtO1xuICAgICAgYmFzZS5sb2NhbGUgPSB0aGlzLmxvYy5sb2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAzLCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1AzWVQ0NVMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNCwgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQNE1UNDVTJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtb250aHM6IDUgfSkudG9JU08oKSAvLz0+ICdQNU0nXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbnV0ZXM6IDUgfSkudG9JU08oKSAvLz0+ICdQVDVNJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaWxsaXNlY29uZHM6IDYgfSkudG9JU08oKSAvLz0+ICdQVDAuMDA2UydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9JU08gPSBmdW5jdGlvbiB0b0lTTygpIHtcbiAgICAvLyB3ZSBjb3VsZCB1c2UgdGhlIGZvcm1hdHRlciwgYnV0IHRoaXMgaXMgYW4gZWFzaWVyIHdheSB0byBnZXQgdGhlIG1pbmltdW0gc3RyaW5nXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuICAgIHZhciBzID0gXCJQXCI7XG4gICAgaWYgKHRoaXMueWVhcnMgIT09IDApIHMgKz0gdGhpcy55ZWFycyArIFwiWVwiO1xuICAgIGlmICh0aGlzLm1vbnRocyAhPT0gMCB8fCB0aGlzLnF1YXJ0ZXJzICE9PSAwKSBzICs9IHRoaXMubW9udGhzICsgdGhpcy5xdWFydGVycyAqIDMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy5kYXlzICE9PSAwIHx8IHRoaXMud2Vla3MgIT09IDApIHMgKz0gdGhpcy5kYXlzICsgdGhpcy53ZWVrcyAqIDcgKyBcIkRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCB8fCB0aGlzLm1pbnV0ZXMgIT09IDAgfHwgdGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKSBzICs9IFwiVFwiO1xuICAgIGlmICh0aGlzLmhvdXJzICE9PSAwKSBzICs9IHRoaXMuaG91cnMgKyBcIkhcIjtcbiAgICBpZiAodGhpcy5taW51dGVzICE9PSAwKSBzICs9IHRoaXMubWludXRlcyArIFwiTVwiO1xuICAgIGlmICh0aGlzLnNlY29uZHMgIT09IDAgfHwgdGhpcy5taWxsaXNlY29uZHMgIT09IDApIHMgKz0gdGhpcy5zZWNvbmRzICsgdGhpcy5taWxsaXNlY29uZHMgLyAxMDAwICsgXCJTXCI7XG4gICAgcmV0dXJuIHM7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBtaWxsaXNlY29uZHMgdmFsdWUgb2YgdGhpcyBEdXJhdGlvbi5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8udmFsdWVPZiA9IGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXMoXCJtaWxsaXNlY29uZHNcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIE1ha2UgdGhpcyBEdXJhdGlvbiBsb25nZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5wbHVzID0gZnVuY3Rpb24gcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9yZGVyZWRVbml0cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBrID0gb3JkZXJlZFVuaXRzW19pXTtcblxuICAgICAgaWYgKGR1ci52YWx1ZXMuaGFzT3duUHJvcGVydHkoaykgfHwgdGhpcy52YWx1ZXMuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgcmVzdWx0W2tdID0gZHVyLmdldChrKSArIHRoaXMuZ2V0KGspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IHJlc3VsdFxuICAgIH0sIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gc3VidHJhY3QuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8ubWludXMgPSBmdW5jdGlvbiBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXMucGx1cyhkdXIubmVnYXRlKCkpO1xuICB9O1xuICAvKipcclxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlJyBvciAnZGF5J1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkueWVhcnMgLy89PiAyXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5tb250aHMgLy89PiAwXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5kYXlzIC8vPT4gM1xyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQodW5pdCkge1xuICAgIHJldHVybiB0aGlzW0R1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCldO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KHZhbHVlcykge1xuICAgIHZhciBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy52YWx1ZXMsIG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpKTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywge1xuICAgICAgdmFsdWVzOiBtaXhlZFxuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUgYW5kL29yIG51bWJlcmluZ1N5c3RlbS4gIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAZXhhbXBsZSBkdXIucmVjb25maWd1cmUoeyBsb2NhbGU6ICdlbi1HQicgfSlcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5yZWNvbmZpZ3VyZSA9IGZ1bmN0aW9uIHJlY29uZmlndXJlKF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBjb252ZXJzaW9uQWNjdXJhY3kgPSBfcmVmLmNvbnZlcnNpb25BY2N1cmFjeTtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtXG4gICAgfSksXG4gICAgICAgIG9wdHMgPSB7XG4gICAgICBsb2M6IGxvY1xuICAgIH07XG5cbiAgICBpZiAoY29udmVyc2lvbkFjY3VyYWN5KSB7XG4gICAgICBvcHRzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGNvbnZlcnNpb25BY2N1cmFjeTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgb3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBkdXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlcycgb3IgJ2RheXMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnbW9udGhzJykgLy89PiAxMlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe2hvdXJzOiA2MH0pLmFzKCdkYXlzJykgLy89PiAyLjVcclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8uYXMgPSBmdW5jdGlvbiBhcyh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuc2hpZnRUbyh1bml0KS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG4gIC8qKlxyXG4gICAqIFJlZHVjZSB0aGlzIER1cmF0aW9uIHRvIGl0cyBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gaW4gaXRzIGN1cnJlbnQgdW5pdHMuXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8ubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KHZhbHMpO1xuICB9O1xuICAvKipcclxuICAgKiBDb252ZXJ0IHRoaXMgRHVyYXRpb24gaW50byBpdHMgcmVwcmVzZW50YXRpb24gaW4gYSBkaWZmZXJlbnQgc2V0IG9mIHVuaXRzLlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkuc2hpZnRUbygnbWludXRlcycsICdtaWxsaXNlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBtaW51dGVzOiA2MCwgbWlsbGlzZWNvbmRzOiAzMDAwMCB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2hpZnRUbyA9IGZ1bmN0aW9uIHNoaWZ0VG8oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHVuaXRzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdW5pdHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHVuaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdW5pdHMgPSB1bml0cy5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHUpO1xuICAgIH0pO1xuICAgIHZhciBidWlsdCA9IHt9LFxuICAgICAgICBhY2N1bXVsYXRlZCA9IHt9LFxuICAgICAgICB2YWxzID0gdGhpcy50b09iamVjdCgpO1xuICAgIHZhciBsYXN0VW5pdDtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3JkZXJlZFVuaXRzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIHZhciBrID0gb3JkZXJlZFVuaXRzW19pMl07XG5cbiAgICAgIGlmICh1bml0cy5pbmRleE9mKGspID49IDApIHtcbiAgICAgICAgbGFzdFVuaXQgPSBrO1xuICAgICAgICB2YXIgb3duID0gMDsgLy8gYW55dGhpbmcgd2UgaGF2ZW4ndCBib2lsZWQgZG93biB5ZXQgc2hvdWxkIGdldCBib2lsZWQgdG8gdGhpcyB1bml0XG5cbiAgICAgICAgZm9yICh2YXIgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoYWspKSB7XG4gICAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRbYWtdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gcGx1cyBhbnl0aGluZyB0aGF0J3MgYWxyZWFkeSBpbiB0aGlzIHVuaXRcblxuXG4gICAgICAgIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICAgIG93biArPSB2YWxzW2tdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBNYXRoLnRydW5jKG93bik7XG4gICAgICAgIGJ1aWx0W2tdID0gaTtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSBvd24gLSBpOyAvLyB3ZSdkIGxpa2UgdG8gYWJzb3JiIHRoZXNlIGZyYWN0aW9ucyBpbiBhbm90aGVyIHVuaXRcbiAgICAgICAgLy8gcGx1cyBhbnl0aGluZyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIHRoYXQgc2hvdWxkIGJlIHJvbGxlZCB1cCBpbiB0byB0aGlzXG5cbiAgICAgICAgZm9yICh2YXIgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG5cbiAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSB2YWxzW2tdO1xuICAgICAgfVxuICAgIH0gLy8gYW55dGhpbmcgbGVmdG92ZXIgYmVjb21lcyB0aGUgZGVjaW1hbCBmb3IgdGhlIGxhc3QgdW5pdFxuXG5cbiAgICBpZiAobGFzdFVuaXQpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmIChhY2N1bXVsYXRlZFtrZXldICE9PSAwKSB7XG4gICAgICAgICAgICBidWlsdFtsYXN0VW5pdF0gKz0ga2V5ID09PSBsYXN0VW5pdCA/IGFjY3VtdWxhdGVkW2tleV0gOiBhY2N1bXVsYXRlZFtrZXldIC8gdGhpcy5tYXRyaXhbbGFzdFVuaXRdW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogYnVpbHRcbiAgICB9LCB0cnVlKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBuZWdhdGl2ZSBvZiB0aGlzIER1cmF0aW9uLlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkubmVnYXRlKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IC0xLCBzZWNvbmRzOiAtMzAgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIG5lZ2F0ZWQgPSB7fTtcblxuICAgIHZhciBfYXJyID0gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpO1xuXG4gICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgX2Fyci5sZW5ndGg7IF9pMysrKSB7XG4gICAgICB2YXIgayA9IF9hcnJbX2kzXTtcbiAgICAgIG5lZ2F0ZWRba10gPSAtdGhpcy52YWx1ZXNba107XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogbmVnYXRlZFxuICAgIH0sIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBHZXQgdGhlIHllYXJzLlxyXG4gICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICAvKipcclxuICAgKiBFcXVhbGl0eSBjaGVja1xyXG4gICAqIFR3byBEdXJhdGlvbnMgYXJlIGVxdWFsIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgdW5pdHMgYW5kIHRoZSBzYW1lIHZhbHVlcyBmb3IgZWFjaCB1bml0LlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb259IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFvdGhlci5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxvYy5lcXVhbHMob3RoZXIubG9jKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG9yZGVyZWRVbml0cy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICB2YXIgdSA9IG9yZGVyZWRVbml0c1tfaTRdO1xuXG4gICAgICBpZiAodGhpcy52YWx1ZXNbdV0gIT09IG90aGVyLnZhbHVlc1t1XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKER1cmF0aW9uLCBbe1xuICAgIGtleTogXCJsb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIER1cmF0aW9uLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIER1cmF0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibnVtYmVyaW5nU3lzdGVtXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwieWVhcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy55ZWFycyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcXVhcnRlcnMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJxdWFydGVyc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnF1YXJ0ZXJzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtb250aHMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5tb250aHMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHdlZWtzXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLndlZWtzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkYXlzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGF5c1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmRheXMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGhvdXJzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaG91cnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5ob3VycyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWludXRlcy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbnV0ZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taW51dGVzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZWNvbmRzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuc2Vjb25kcyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtaWxsaXNlY29uZHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taWxsaXNlY29uZHMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIER1cmF0aW9uIGlzIGludmFsaWQuIEludmFsaWQgZHVyYXRpb25zIGFyZSByZXR1cm5lZCBieSBkaWZmIG9wZXJhdGlvbnNcclxuICAgICAqIG9uIGludmFsaWQgRGF0ZVRpbWVzIG9yIEludGVydmFscy5cclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgRHVyYXRpb24gYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIER1cmF0aW9uIGlzIHZhbGlkXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRSZWFzb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZEV4cGxhbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRHVyYXRpb247XG59KCk7XG5mdW5jdGlvbiBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uaXNoKSB7XG4gIGlmIChpc051bWJlcihkdXJhdGlvbmlzaCkpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU1pbGxpcyhkdXJhdGlvbmlzaCk7XG4gIH0gZWxzZSBpZiAoRHVyYXRpb24uaXNEdXJhdGlvbihkdXJhdGlvbmlzaCkpIHtcbiAgICByZXR1cm4gZHVyYXRpb25pc2g7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uaXNoID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoZHVyYXRpb25pc2gpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIlVua25vd24gZHVyYXRpb24gYXJndW1lbnQgXCIgKyBkdXJhdGlvbmlzaCArIFwiIG9mIHR5cGUgXCIgKyB0eXBlb2YgZHVyYXRpb25pc2gpO1xuICB9XG59XG5cbnZhciBJTlZBTElEJDEgPSBcIkludmFsaWQgSW50ZXJ2YWxcIjsgLy8gY2hlY2tzIGlmIHRoZSBzdGFydCBpcyBlcXVhbCB0byBvciBiZWZvcmUgdGhlIGVuZFxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBuZXcgSW52YWxpZChcIm1pc3Npbmcgb3IgaW52YWxpZCBzdGFydFwiKTtcbiAgfSBlbHNlIGlmICghZW5kIHx8ICFlbmQuaXNWYWxpZCkge1xuICAgIHJldHVybiBuZXcgSW52YWxpZChcIm1pc3Npbmcgb3IgaW52YWxpZCBlbmRcIik7XG4gIH0gZWxzZSBpZiAoZW5kIDwgc3RhcnQpIHtcbiAgICByZXR1cm4gbmV3IEludmFsaWQoXCJlbmQgYmVmb3JlIHN0YXJ0XCIsIFwiVGhlIGVuZCBvZiBhbiBpbnRlcnZhbCBtdXN0IGJlIGFmdGVyIGl0cyBzdGFydCwgYnV0IHlvdSBoYWQgc3RhcnQ9XCIgKyBzdGFydC50b0lTTygpICsgXCIgYW5kIGVuZD1cIiArIGVuZC50b0lTTygpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXHJcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBJbnRlcnZhbDpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKiogVG8gY3JlYXRlIGFuIEludGVydmFsLCB1c2Uge0BsaW5rIGZyb21EYXRlVGltZXN9LCB7QGxpbmsgYWZ0ZXJ9LCB7QGxpbmsgYmVmb3JlfSwgb3Ige0BsaW5rIGZyb21JU099LlxyXG4gKiAqICoqQWNjZXNzb3JzKiogVXNlIHtAbGluayBzdGFydH0gYW5kIHtAbGluayBlbmR9IHRvIGdldCB0aGUgc3RhcnQgYW5kIGVuZC5cclxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBjb3VudH0sIHtAbGluayBsZW5ndGh9LCB7QGxpbmsgaGFzU2FtZX0sIHtAbGluayBjb250YWluc30sIHtAbGluayBpc0FmdGVyfSwgb3Ige0BsaW5rIGlzQmVmb3JlfS5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG90aGVyIEludGVydmFscyBvdXQgb2YgdGhpcyBvbmUsIHVzZSB7QGxpbmsgc2V0fSwge0BsaW5rIHNwbGl0QXR9LCB7QGxpbmsgc3BsaXRCeX0sIHtAbGluayBkaXZpZGVFcXVhbGx5fSwge0BsaW5rIG1lcmdlfSwge0BsaW5rIHhvcn0sIHtAbGluayB1bmlvbn0sIHtAbGluayBpbnRlcnNlY3Rpb259LCBvciB7QGxpbmsgZGlmZmVyZW5jZX0uXHJcbiAqICogKipDb21wYXJpc29uKiogVG8gY29tcGFyZSB0aGlzIEludGVydmFsIHRvIGFub3RoZXIgb25lLCB1c2Uge0BsaW5rIGVxdWFsc30sIHtAbGluayBvdmVybGFwc30sIHtAbGluayBhYnV0c1N0YXJ0fSwge0BsaW5rIGFidXRzRW5kfSwge0BsaW5rIGVuZ3VsZnN9XHJcbiAqICogKipPdXRwdXQqKiogVG8gY29udmVydCB0aGUgSW50ZXJ2YWwgaW50byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHNlZSB7QGxpbmsgdG9TdHJpbmd9LCB7QGxpbmsgdG9JU099LCB7QGxpbmsgdG9Gb3JtYXR9LCBhbmQge0BsaW5rIHRvRHVyYXRpb259LlxyXG4gKi9cblxuXG52YXIgSW50ZXJ2YWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBJbnRlcnZhbChjb25maWcpIHtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5zID0gY29uZmlnLnN0YXJ0O1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMuZSA9IGNvbmZpZy5lbmQ7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmlzTHV4b25JbnRlcnZhbCA9IHRydWU7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgSW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHNpbXBsZSBzdHJpbmcgb2Ygd2h5IHRoaXMgSW50ZXJ2YWwgaXMgaW52YWxpZC4gU2hvdWxkIG5vdCBjb250YWluIHBhcmFtZXRlcnMgb3IgYW55dGhpbmcgZWxzZSBkYXRhLWRlcGVuZGVudFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pIHtcbiAgICBpZiAoZXhwbGFuYXRpb24gPT09IHZvaWQgMCkge1xuICAgICAgZXhwbGFuYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkSW50ZXJ2YWxFcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICAgIGludmFsaWQ6IGludmFsaWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBzdGFydFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyA9IGZ1bmN0aW9uIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIHZhciBidWlsdFN0YXJ0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCksXG4gICAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoe1xuICAgICAgc3RhcnQ6IGJ1aWx0U3RhcnQsXG4gICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgaW52YWxpZDogdmFsaWRhdGVTdGFydEVuZChidWlsdFN0YXJ0LCBidWlsdEVuZClcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYSBEdXJhdGlvbiB0byBleHRlbmQgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5hZnRlciA9IGZ1bmN0aW9uIGFmdGVyKHN0YXJ0LCBkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgICAgZHQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdCwgZHQucGx1cyhkdXIpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYmVmb3JlID0gZnVuY3Rpb24gYmVmb3JlKGVuZCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0Lm1pbnVzKGR1ciksIGR0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nLlxyXG4gICAqIEFjY2VwdHMgYDxzdGFydD4vPGVuZD5gLCBgPHN0YXJ0Pi88ZHVyYXRpb24+YCwgYW5kIGA8ZHVyYXRpb24+LzxlbmQ+YCBmb3JtYXRzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIElTTyBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gb3B0aW9ucyB0byBwYXNzIHtAbGluayBEYXRlVGltZS5mcm9tSVNPfSBhbmQgb3B0aW9uYWxseSB7QGxpbmsgRHVyYXRpb24uZnJvbUlTT31cclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVfaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5mcm9tSVNPID0gZnVuY3Rpb24gZnJvbUlTTyh0ZXh0LCBvcHRzKSB7XG4gICAgdmFyIF9zcGxpdCA9ICh0ZXh0IHx8IFwiXCIpLnNwbGl0KFwiL1wiLCAyKSxcbiAgICAgICAgcyA9IF9zcGxpdFswXSxcbiAgICAgICAgZSA9IF9zcGxpdFsxXTtcblxuICAgIGlmIChzICYmIGUpIHtcbiAgICAgIHZhciBzdGFydCA9IERhdGVUaW1lLmZyb21JU08ocywgb3B0cyksXG4gICAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcblxuICAgICAgaWYgKHN0YXJ0LmlzVmFsaWQgJiYgZW5kLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydC5pc1ZhbGlkKSB7XG4gICAgICAgIHZhciBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuXG4gICAgICAgIGlmIChkdXIuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBJbnRlcnZhbC5hZnRlcihzdGFydCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbmQuaXNWYWxpZCkge1xuICAgICAgICB2YXIgX2R1ciA9IER1cmF0aW9uLmZyb21JU08ocywgb3B0cyk7XG5cbiAgICAgICAgaWYgKF9kdXIuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBJbnRlcnZhbC5iZWZvcmUoZW5kLCBfZHVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwidW5wYXJzYWJsZVwiLCBcInRoZSBpbnB1dCBcXFwiXCIgKyB0ZXh0ICsgXCJcXFwiIGNhbid0IGJlIHBhcnNlZCBhc0lTTyA4NjAxXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gSW50ZXJ2YWwuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb1xyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5pc0ludGVydmFsID0gZnVuY3Rpb24gaXNJbnRlcnZhbChvKSB7XG4gICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBJbnRlcnZhbCB8fCBvLmlzTHV4b25JbnRlcnZhbDtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgc3RhcnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHR5cGUge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IEludGVydmFsLnByb3RvdHlwZTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsIGluIHRoZSBzcGVjaWZpZWQgdW5pdC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byByZXR1cm4gdGhlIGxlbmd0aCBpbi5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG4gIF9wcm90by5sZW5ndGggPSBmdW5jdGlvbiBsZW5ndGgodW5pdCkge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRvRHVyYXRpb24uYXBwbHkodGhpcywgW3VuaXRdKS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxyXG4gICAqIFVubGlrZSB7QGxpbmsgbGVuZ3RofSB0aGlzIGNvdW50cyBzZWN0aW9ucyBvZiB0aGUgY2FsZW5kYXIsIG5vdCBwZXJpb2RzIG9mIHRpbWUsIGUuZy4gc3BlY2lmeWluZyAnZGF5J1xyXG4gICAqIGFza3MgJ3doYXQgZGF0ZXMgYXJlIGluY2x1ZGVkIGluIHRoaXMgaW50ZXJ2YWw/Jywgbm90ICdob3cgbWFueSBkYXlzIGxvbmcgaXMgdGhpcyBpbnRlcnZhbD8nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmNvdW50ID0gZnVuY3Rpb24gY291bnQodW5pdCkge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gTmFOO1xuICAgIHZhciBzdGFydCA9IHRoaXMuc3RhcnQuc3RhcnRPZih1bml0KSxcbiAgICAgICAgZW5kID0gdGhpcy5lbmQuc3RhcnRPZih1bml0KTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihlbmQuZGlmZihzdGFydCwgdW5pdCkuZ2V0KHVuaXQpKSArIDE7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgYW5kIGVuZCBhcmUgYm90aCBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmhhc1NhbWUgPSBmdW5jdGlvbiBoYXNTYW1lKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5lLm1pbnVzKDEpLmhhc1NhbWUodGhpcy5zLCB1bml0KSA6IGZhbHNlO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnMudmFsdWVPZigpID09PSB0aGlzLmUudmFsdWVPZigpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uaXNBZnRlciA9IGZ1bmN0aW9uIGlzQWZ0ZXIoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPiBkYXRlVGltZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uaXNCZWZvcmUgPSBmdW5jdGlvbiBpc0JlZm9yZShkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZSA8PSBkYXRlVGltZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBjb250YWlucyB0aGUgc3BlY2lmaWVkIERhdGVUaW1lLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5jb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IGRhdGVUaW1lICYmIHRoaXMuZSA+IGRhdGVUaW1lO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldHNcIiB0aGUgc3RhcnQgYW5kL29yIGVuZCBkYXRlcy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5zdGFydCAtIHRoZSBzdGFydGluZyBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5lbmQgLSB0aGUgZW5kaW5nIERhdGVUaW1lXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgc3RhcnQgPSBfcmVmLnN0YXJ0LFxuICAgICAgICBlbmQgPSBfcmVmLmVuZDtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9O1xuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGF0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBEYXRlVGltZXNcclxuICAgKiBAcGFyYW0gey4uLltEYXRlVGltZV19IGRhdGVUaW1lcyAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zcGxpdEF0ID0gZnVuY3Rpb24gc3BsaXRBdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgc29ydGVkID0gZGF0ZVRpbWVzLm1hcChmcmllbmRseURhdGVUaW1lKS5zb3J0KCksXG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgICAgaSA9IDA7XG5cbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgdmFyIGFkZGVkID0gc29ydGVkW2ldIHx8IHRoaXMuZSxcbiAgICAgICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgaW50byBzbWFsbGVyIEludGVydmFscywgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cclxuICAgKiBMZWZ0IG92ZXIgdGltZSBpcyBncm91cGVkIGludG8gYSBzbWFsbGVyIGludGVydmFsXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zcGxpdEJ5ID0gZnVuY3Rpb24gc3BsaXRCeShkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFkdXIuaXNWYWxpZCB8fCBkdXIuYXMoXCJtaWxsaXNlY29uZHNcIikgPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgICAgYWRkZWQsXG4gICAgICAgIG5leHQ7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBhZGRlZCA9IHMucGx1cyhkdXIpO1xuICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlck9mUGFydHMgLSBUaGUgbnVtYmVyIG9mIEludGVydmFscyB0byBkaXZpZGUgdGhlIEludGVydmFsIGludG8uXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5kaXZpZGVFcXVhbGx5ID0gZnVuY3Rpb24gZGl2aWRlRXF1YWxseShudW1iZXJPZlBhcnRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5zcGxpdEJ5KHRoaXMubGVuZ3RoKCkgLyBudW1iZXJPZlBhcnRzKS5zbGljZSgwLCBudW1iZXJPZlBhcnRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8ub3ZlcmxhcHMgPSBmdW5jdGlvbiBvdmVybGFwcyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmUgPiBvdGhlci5zICYmIHRoaXMucyA8IG90aGVyLmU7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIHN0YXJ0LlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5hYnV0c1N0YXJ0ID0gZnVuY3Rpb24gYWJ1dHNTdGFydChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICt0aGlzLmUgPT09ICtvdGhlci5zO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uYWJ1dHNFbmQgPSBmdW5jdGlvbiBhYnV0c0VuZChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICtvdGhlci5lID09PSArdGhpcy5zO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGVuZ3VsZnMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uZW5ndWxmcyA9IGZ1bmN0aW9uIGVuZ3VsZnMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPD0gb3RoZXIucyAmJiB0aGlzLmUgPj0gb3RoZXIuZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnMuZXF1YWxzKG90aGVyLnMpICYmIHRoaXMuZS5lcXVhbHMob3RoZXIuZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxyXG4gICAqIFNwZWNpZmljYWxseSwgdGhlIHJlc3VsdGluZyBJbnRlcnZhbCBoYXMgdGhlIG1heGltdW0gc3RhcnQgdGltZSBhbmQgdGhlIG1pbmltdW0gZW5kIHRpbWUgb2YgdGhlIHR3byBJbnRlcnZhbHMuXHJcbiAgICogUmV0dXJucyBudWxsIGlmIHRoZSBpbnRlcnNlY3Rpb24gaXMgZW1wdHksIGkuZS4sIHRoZSBpbnRlcnZhbHMgZG9uJ3QgaW50ZXJzZWN0LlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8uaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBzID0gdGhpcy5zID4gb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICAgIGUgPSB0aGlzLmUgPCBvdGhlci5lID8gdGhpcy5lIDogb3RoZXIuZTtcblxuICAgIGlmIChzID4gZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtaW5pbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtYXhpbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8udW5pb24gPSBmdW5jdGlvbiB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgcyA9IHRoaXMucyA8IG90aGVyLnMgPyB0aGlzLnMgOiBvdGhlci5zLFxuICAgICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIE1lcmdlIGFuIGFycmF5IG9mIEludGVydmFscyBpbnRvIGEgZXF1aXZhbGVudCBtaW5pbWFsIHNldCBvZiBJbnRlcnZhbHMuXHJcbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5tZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKGludGVydmFscykge1xuICAgIHZhciBfaW50ZXJ2YWxzJHNvcnQkcmVkdWMgPSBpbnRlcnZhbHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEucyAtIGIucztcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYyLCBpdGVtKSB7XG4gICAgICB2YXIgc29mYXIgPSBfcmVmMlswXSxcbiAgICAgICAgICBjdXJyZW50ID0gX3JlZjJbMV07XG5cbiAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICByZXR1cm4gW3NvZmFyLCBpdGVtXTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIFtzb2ZhciwgY3VycmVudC51bmlvbihpdGVtKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgIH1cbiAgICB9LCBbW10sIG51bGxdKSxcbiAgICAgICAgZm91bmQgPSBfaW50ZXJ2YWxzJHNvcnQkcmVkdWNbMF0sXG4gICAgICAgIGZpbmFsID0gX2ludGVydmFscyRzb3J0JHJlZHVjWzFdO1xuXG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7W0ludGVydmFsXX0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnhvciA9IGZ1bmN0aW9uIHhvcihpbnRlcnZhbHMpIHtcbiAgICB2YXIgX0FycmF5JHByb3RvdHlwZTtcblxuICAgIHZhciBzdGFydCA9IG51bGwsXG4gICAgICAgIGN1cnJlbnRDb3VudCA9IDA7XG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdLFxuICAgICAgICBlbmRzID0gaW50ZXJ2YWxzLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIHRpbWU6IGkucyxcbiAgICAgICAgdHlwZTogXCJzXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdGltZTogaS5lLFxuICAgICAgICB0eXBlOiBcImVcIlxuICAgICAgfV07XG4gICAgfSksXG4gICAgICAgIGZsYXR0ZW5lZCA9IChfQXJyYXkkcHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlKS5jb25jYXQuYXBwbHkoX0FycmF5JHByb3RvdHlwZSwgZW5kcyksXG4gICAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS50aW1lIC0gYi50aW1lO1xuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gYXJyLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWYzO1xuXG4gICAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaSA9IF9yZWYzO1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB0aW1lIGluIHRoaXMgSW50ZXJ2YWwgdGhhdCBkb2Vzbid0IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5kaWZmZXJlbmNlID0gZnVuY3Rpb24gZGlmZmVyZW5jZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBpbnRlcnZhbHMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGludGVydmFsc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC54b3IoW3RoaXNdLmNvbmNhdChpbnRlcnZhbHMpKS5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBfdGhpcy5pbnRlcnNlY3Rpb24oaSk7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gaSAmJiAhaS5pc0VtcHR5KCk7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiBcIltcIiArIHRoaXMucy50b0lTTygpICsgXCIgXFx1MjAxMyBcIiArIHRoaXMuZS50b0lTTygpICsgXCIpXCI7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBzYW1lIG9wdGlvbnMgYXMge0BsaW5rIERhdGVUaW1lLnRvSVNPfVxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gdGhpcy5zLnRvSVNPKG9wdHMpICsgXCIvXCIgKyB0aGlzLmUudG9JU08ob3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0ZUZvcm1hdCAtIHRoZSBmb3JtYXQgc3RyaW5nLiBUaGlzIHN0cmluZyBmb3JtYXRzIHRoZSBzdGFydCBhbmQgZW5kIHRpbWUuIFNlZSB7QGxpbmsgRGF0ZVRpbWUudG9Gb3JtYXR9IGZvciBkZXRhaWxzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyDigJMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGRhdGVGb3JtYXQsIF90ZW1wMikge1xuICAgIHZhciBfcmVmNCA9IF90ZW1wMiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDIsXG4gICAgICAgIF9yZWY0JHNlcGFyYXRvciA9IF9yZWY0LnNlcGFyYXRvcixcbiAgICAgICAgc2VwYXJhdG9yID0gX3JlZjQkc2VwYXJhdG9yID09PSB2b2lkIDAgPyBcIiDigJMgXCIgOiBfcmVmNCRzZXBhcmF0b3I7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gXCJcIiArIHRoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KSArIHNlcGFyYXRvciArIHRoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGEgRHVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSB0aW1lIHNwYW5uZWQgYnkgdGhpcyBpbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3VuaXQ9WydtaWxsaXNlY29uZHMnXV0gLSB0aGUgdW5pdCBvciB1bml0cyAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gaW5jbHVkZSBpbiB0aGUgZHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCkudG9PYmplY3QoKSAvLz0+IHsgbWlsbGlzZWNvbmRzOiA4ODQ4OTI1NyB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignZGF5cycpLnRvT2JqZWN0KCkgLy89PiB7IGRheXM6IDEuMDI0MTgxMjE1Mjc3Nzc3OCB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbihbJ2hvdXJzJywgJ21pbnV0ZXMnXSkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDI0LCBtaW51dGVzOiAzNC44MjA5NSB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbihbJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjQsIG1pbnV0ZXM6IDM0LCBzZWNvbmRzOiA0OS4yNTcgfVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ3NlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBzZWNvbmRzOiA4ODQ4OS4yNTcgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvRHVyYXRpb24gPSBmdW5jdGlvbiB0b0R1cmF0aW9uKHVuaXQsIG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoSW50ZXJ2YWwsIFt7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBlbmQgb2YgdGhlIEludGVydmFsXHJcbiAgICAgKiBAdHlwZSB7RGF0ZVRpbWV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImVuZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuZSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYXQgbGVhc3QgaXRzIHN0YXJ0LCBpLmUuIHRoYXQgdGhlIEludGVydmFsIGlzbid0ICdiYWNrd2FyZHMnLlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgSW50ZXJ2YWwgaXMgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRSZWFzb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIEludGVydmFsIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBJbnRlcnZhbCBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZEV4cGxhbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW50ZXJ2YWw7XG59KCk7XG5cbi8qKlxyXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxyXG4gKi9cblxudmFyIEluZm8gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbmZvKCkge31cblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHpvbmUgY29udGFpbnMgYSBEU1QuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG4gIEluZm8uaGFzRFNUID0gZnVuY3Rpb24gaGFzRFNUKHpvbmUpIHtcbiAgICBpZiAoem9uZSA9PT0gdm9pZCAwKSB7XG4gICAgICB6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmU7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gRGF0ZVRpbWUubG9jYWwoKS5zZXRab25lKHpvbmUpLnNldCh7XG4gICAgICBtb250aDogMTJcbiAgICB9KTtcbiAgICByZXR1cm4gIXpvbmUudW5pdmVyc2FsICYmIHByb3RvLm9mZnNldCAhPT0gcHJvdG8uc2V0KHtcbiAgICAgIG1vbnRoOiA2XG4gICAgfSkub2Zmc2V0O1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHpvbmUgaXMgYSB2YWxpZCBJQU5BIHNwZWNpZmllci5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW5mby5pc1ZhbGlkSUFOQVpvbmUgPSBmdW5jdGlvbiBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiAhIUlBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoem9uZSkgJiYgSUFOQVpvbmUuaXNWYWxpZFpvbmUoem9uZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJudW1lcmljXCIsIFwiMi1kaWdpdFwiLCBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXI9J2dyZWdvcnknXSAtIHRoZSBjYWxlbmRhclxyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKClbMF0gLy89PiAnSmFudWFyeSdcclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXHJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ251bWVyaWMnKVswXSAvLz0+ICcxJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0gKVswXSAvLz0+ICdqYW52LidcclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ9mhJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdsb25nJywgeyBvdXRwdXRDYWxlbmRhcjogJ2lzbGFtaWMnIH0pWzBdIC8vPT4gJ1JhYmnKuyBJJ1xyXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxyXG4gICAqL1xuXG5cbiAgSW5mby5tb250aHMgPSBmdW5jdGlvbiBtb250aHMobGVuZ3RoLCBfdGVtcCkge1xuICAgIGlmIChsZW5ndGggPT09IHZvaWQgMCkge1xuICAgICAgbGVuZ3RoID0gXCJsb25nXCI7XG4gICAgfVxuXG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgX3JlZiRsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZiRsb2NhbGUgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJGxvY2FsZSxcbiAgICAgICAgX3JlZiRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZiRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgX3JlZiRvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZiRvdXRwdXRDYWxlbmRhciA9PT0gdm9pZCAwID8gXCJncmVnb3J5XCIgOiBfcmVmJG91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKS5tb250aHMobGVuZ3RoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIGZvcm1hdCBtb250aCBuYW1lcy5cclxuICAgKiBGb3JtYXQgbW9udGhzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgbW9udGhzIGluIHRoYXQgdGhleSdyZSBtZWFudCB0byBhcHBlYXIgbmV4dCB0byB0aGUgZGF5IG9mIHRoZSBtb250aC4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcclxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXHJcbiAgICogU2VlIHtAbGluayBtb250aHN9XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibnVtZXJpY1wiLCBcIjItZGlnaXRcIiwgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cclxuICAgKi9cblxuXG4gIEluZm8ubW9udGhzRm9ybWF0ID0gZnVuY3Rpb24gbW9udGhzRm9ybWF0KGxlbmd0aCwgX3RlbXAyKSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSBcImxvbmdcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjIgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBfcmVmMiRsb2NhbGUgPSBfcmVmMi5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYyJGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYyJGxvY2FsZSxcbiAgICAgICAgX3JlZjIkbnVtYmVyaW5nU3lzdGVtID0gX3JlZjIubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMiRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMiRudW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIF9yZWYyJG91dHB1dENhbGVuZGFyID0gX3JlZjIub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZjIkb3V0cHV0Q2FsZW5kYXIgPT09IHZvaWQgMCA/IFwiZ3JlZ29yeVwiIDogX3JlZjIkb3V0cHV0Q2FsZW5kYXI7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpLm1vbnRocyhsZW5ndGgsIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSB3ZWVrIG5hbWVzLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxyXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXHJcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnKVswXSAvLz0+ICdNb24nXHJcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogJ2ZyLUNBJyB9KVswXSAvLz0+ICdsdW4uJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAn2KfZhNin2KvZhtmK2YYnXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzID0gZnVuY3Rpb24gd2Vla2RheXMobGVuZ3RoLCBfdGVtcDMpIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwibG9uZ1wiO1xuICAgIH1cblxuICAgIHZhciBfcmVmMyA9IF90ZW1wMyA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDMsXG4gICAgICAgIF9yZWYzJGxvY2FsZSA9IF9yZWYzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjMkbG9jYWxlLFxuICAgICAgICBfcmVmMyRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYzJG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYzJG51bWJlcmluZ1N5c3RlbTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBudWxsKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZm9ybWF0IHdlZWsgbmFtZXMuXHJcbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcclxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXHJcbiAgICogU2VlIHtAbGluayB3ZWVrZGF5c31cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPW51bGxdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzRm9ybWF0ID0gZnVuY3Rpb24gd2Vla2RheXNGb3JtYXQobGVuZ3RoLCBfdGVtcDQpIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwibG9uZ1wiO1xuICAgIH1cblxuICAgIHZhciBfcmVmNCA9IF90ZW1wNCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDQsXG4gICAgICAgIF9yZWY0JGxvY2FsZSA9IF9yZWY0LmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjQkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjQkbG9jYWxlLFxuICAgICAgICBfcmVmNCRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmNC5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0JG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY0JG51bWJlcmluZ1N5c3RlbTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBudWxsKS53ZWVrZGF5cyhsZW5ndGgsIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgbWVyaWRpZW1zLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoKSAvLz0+IFsgJ0FNJywgJ1BNJyBdXHJcbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoeyBsb2NhbGU6ICdteScgfSkgLy89PiBbICfhgJThgLbhgJThgIDhgLonLCAn4YCK4YCU4YCxJyBdXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLm1lcmlkaWVtcyA9IGZ1bmN0aW9uIG1lcmlkaWVtcyhfdGVtcDUpIHtcbiAgICB2YXIgX3JlZjUgPSBfdGVtcDUgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA1LFxuICAgICAgICBfcmVmNSRsb2NhbGUgPSBfcmVmNS5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY1JGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY1JGxvY2FsZTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSkubWVyaWRpZW1zKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdzaG9ydCddIC0gdGhlIGxlbmd0aCBvZiB0aGUgZXJhIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwic2hvcnRcIiBvciBcImxvbmdcIi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxyXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygpIC8vPT4gWyAnQkMnLCAnQUQnIF1cclxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnKSAvLz0+IFsgJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknIF1cclxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IErDqXN1cy1DaHJpc3QnLCAnYXByw6hzIErDqXN1cy1DaHJpc3QnIF1cclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cclxuICAgKi9cblxuXG4gIEluZm8uZXJhcyA9IGZ1bmN0aW9uIGVyYXMobGVuZ3RoLCBfdGVtcDYpIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwic2hvcnRcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjYgPSBfdGVtcDYgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA2LFxuICAgICAgICBfcmVmNiRsb2NhbGUgPSBfcmVmNi5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY2JGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY2JGxvY2FsZTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVsbCwgXCJncmVnb3J5XCIpLmVyYXMobGVuZ3RoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXHJcbiAgICogU29tZSBmZWF0dXJlcyBvZiBMdXhvbiBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbGwgZW52aXJvbm1lbnRzLiBGb3IgZXhhbXBsZSwgb24gb2xkZXIgYnJvd3NlcnMsIHRpbWV6b25lIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBpZiB0aGF0J3MgdGhlIGNhc2UuXHJcbiAgICogS2V5czpcclxuICAgKiAqIGB6b25lc2A6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBJQU5BIHRpbWV6b25lc1xyXG4gICAqICogYGludGxUb2tlbnNgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgaW50ZXJuYXRpb25hbGl6ZWQgdG9rZW4tYmFzZWQgZm9ybWF0dGluZy9wYXJzaW5nXHJcbiAgICogKiBgaW50bGA6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBnZW5lcmFsIGludGVybmF0aW9uYWxpemF0aW9uXHJcbiAgICogQGV4YW1wbGUgSW5mby5mZWF0dXJlcygpIC8vPT4geyBpbnRsOiB0cnVlLCBpbnRsVG9rZW5zOiBmYWxzZSwgem9uZXM6IHRydWUgfVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIEluZm8uZmVhdHVyZXMgPSBmdW5jdGlvbiBmZWF0dXJlcygpIHtcbiAgICB2YXIgaW50bCA9IGZhbHNlLFxuICAgICAgICBpbnRsVG9rZW5zID0gZmFsc2UsXG4gICAgICAgIHpvbmVzID0gZmFsc2U7XG5cbiAgICBpZiAoaGFzSW50bCgpKSB7XG4gICAgICBpbnRsID0gdHJ1ZTtcbiAgICAgIGludGxUb2tlbnMgPSBoYXNGb3JtYXRUb1BhcnRzKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHpvbmVzID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlblwiLCB7XG4gICAgICAgICAgdGltZVpvbmU6IFwiQW1lcmljYS9OZXdfWW9ya1wiXG4gICAgICAgIH0pLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lID09PSBcIkFtZXJpY2EvTmV3X1lvcmtcIjtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgem9uZXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW50bDogaW50bCxcbiAgICAgIGludGxUb2tlbnM6IGludGxUb2tlbnMsXG4gICAgICB6b25lczogem9uZXNcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBJbmZvO1xufSgpO1xuXG5mdW5jdGlvbiBkYXlEaWZmKGVhcmxpZXIsIGxhdGVyKSB7XG4gIHZhciB1dGNEYXlTdGFydCA9IGZ1bmN0aW9uIHV0Y0RheVN0YXJ0KGR0KSB7XG4gICAgcmV0dXJuIGR0LnRvVVRDKDAsIHtcbiAgICAgIGtlZXBMb2NhbFRpbWU6IHRydWVcbiAgICB9KS5zdGFydE9mKFwiZGF5XCIpLnZhbHVlT2YoKTtcbiAgfSxcbiAgICAgIG1zID0gdXRjRGF5U3RhcnQobGF0ZXIpIC0gdXRjRGF5U3RhcnQoZWFybGllcik7XG5cbiAgcmV0dXJuIE1hdGguZmxvb3IoRHVyYXRpb24uZnJvbU1pbGxpcyhtcykuYXMoXCJkYXlzXCIpKTtcbn1cblxuZnVuY3Rpb24gaGlnaE9yZGVyRGlmZnMoY3Vyc29yLCBsYXRlciwgdW5pdHMpIHtcbiAgdmFyIGRpZmZlcnMgPSBbW1wieWVhcnNcIiwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi55ZWFyIC0gYS55ZWFyO1xuICB9XSwgW1wibW9udGhzXCIsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIubW9udGggLSBhLm1vbnRoICsgKGIueWVhciAtIGEueWVhcikgKiAxMjtcbiAgfV0sIFtcIndlZWtzXCIsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGRheXMgPSBkYXlEaWZmKGEsIGIpO1xuICAgIHJldHVybiAoZGF5cyAtIGRheXMgJSA3KSAvIDc7XG4gIH1dLCBbXCJkYXlzXCIsIGRheURpZmZdXTtcbiAgdmFyIHJlc3VsdHMgPSB7fTtcbiAgdmFyIGxvd2VzdE9yZGVyLCBoaWdoV2F0ZXI7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpZmZlcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9kaWZmZXJzJF9pID0gZGlmZmVyc1tfaV0sXG4gICAgICAgIHVuaXQgPSBfZGlmZmVycyRfaVswXSxcbiAgICAgICAgZGlmZmVyID0gX2RpZmZlcnMkX2lbMV07XG5cbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICB2YXIgX2N1cnNvciRwbHVzO1xuXG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG4gICAgICB2YXIgZGVsdGEgPSBkaWZmZXIoY3Vyc29yLCBsYXRlcik7XG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzID0ge30sIF9jdXJzb3IkcGx1c1t1bml0XSA9IGRlbHRhLCBfY3Vyc29yJHBsdXMpKTtcblxuICAgICAgaWYgKGhpZ2hXYXRlciA+IGxhdGVyKSB7XG4gICAgICAgIHZhciBfaGlnaFdhdGVyJG1pbnVzO1xuXG4gICAgICAgIGN1cnNvciA9IGhpZ2hXYXRlci5taW51cygoX2hpZ2hXYXRlciRtaW51cyA9IHt9LCBfaGlnaFdhdGVyJG1pbnVzW3VuaXRdID0gMSwgX2hpZ2hXYXRlciRtaW51cykpO1xuICAgICAgICBkZWx0YSAtPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3Vyc29yID0gaGlnaFdhdGVyO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzW3VuaXRdID0gZGVsdGE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdO1xufVxuXG5mdW5jdGlvbiBfZGlmZiAoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBvcHRzKSB7XG4gIHZhciBfaGlnaE9yZGVyRGlmZnMgPSBoaWdoT3JkZXJEaWZmcyhlYXJsaWVyLCBsYXRlciwgdW5pdHMpLFxuICAgICAgY3Vyc29yID0gX2hpZ2hPcmRlckRpZmZzWzBdLFxuICAgICAgcmVzdWx0cyA9IF9oaWdoT3JkZXJEaWZmc1sxXSxcbiAgICAgIGhpZ2hXYXRlciA9IF9oaWdoT3JkZXJEaWZmc1syXSxcbiAgICAgIGxvd2VzdE9yZGVyID0gX2hpZ2hPcmRlckRpZmZzWzNdO1xuXG4gIHZhciByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcbiAgdmFyIGxvd2VyT3JkZXJVbml0cyA9IHVuaXRzLmZpbHRlcihmdW5jdGlvbiAodSkge1xuICAgIHJldHVybiBbXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCIsIFwibWlsbGlzZWNvbmRzXCJdLmluZGV4T2YodSkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIHZhciBfY3Vyc29yJHBsdXMyO1xuXG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzMiA9IHt9LCBfY3Vyc29yJHBsdXMyW2xvd2VzdE9yZGVyXSA9IDEsIF9jdXJzb3IkcGx1czIpKTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgdmFyIGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHJlc3VsdHMsIG9wdHMpKTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgX0R1cmF0aW9uJGZyb21NaWxsaXM7XG5cbiAgICByZXR1cm4gKF9EdXJhdGlvbiRmcm9tTWlsbGlzID0gRHVyYXRpb24uZnJvbU1pbGxpcyhyZW1haW5pbmdNaWxsaXMsIG9wdHMpKS5zaGlmdFRvLmFwcGx5KF9EdXJhdGlvbiRmcm9tTWlsbGlzLCBsb3dlck9yZGVyVW5pdHMpLnBsdXMoZHVyYXRpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxufVxuXG52YXIgTUlTU0lOR19GVFAgPSBcIm1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnRcIjtcblxuZnVuY3Rpb24gaW50VW5pdChyZWdleCwgcG9zdCkge1xuICBpZiAocG9zdCA9PT0gdm9pZCAwKSB7XG4gICAgcG9zdCA9IGZ1bmN0aW9uIHBvc3QoaSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmKSB7XG4gICAgICB2YXIgcyA9IF9yZWZbMF07XG4gICAgICByZXR1cm4gcG9zdChwYXJzZUludChzKSk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBmaXhMaXN0UmVnZXgocykge1xuICAvLyBtYWtlIGRvdHMgb3B0aW9uYWwgYW5kIGFsc28gbWFrZSB0aGVtIGxpdGVyYWxcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuLywgXCJcXFxcLj9cIik7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5zZW5zaXRpdml0aWVzKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuLywgXCJcIikudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gb25lT2Yoc3RyaW5ncywgc3RhcnRJbmRleCkge1xuICBpZiAoc3RyaW5ncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHN0cmluZ3MubWFwKGZpeExpc3RSZWdleCkuam9pbihcInxcIikpLFxuICAgICAgZGVzZXI6IGZ1bmN0aW9uIGRlc2VyKF9yZWYyKSB7XG4gICAgICAgIHZhciBzID0gX3JlZjJbMF07XG4gICAgICAgIHJldHVybiBzdHJpbmdzLmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiBzdHJpcEluc2Vuc2l0aXZpdGllcyhzKSA9PT0gc3RyaXBJbnNlbnNpdGl2aXRpZXMoaSk7XG4gICAgICAgIH0pICsgc3RhcnRJbmRleDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldChyZWdleCwgZ3JvdXBzKSB7XG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMykge1xuICAgICAgdmFyIGggPSBfcmVmM1sxXSxcbiAgICAgICAgICBtID0gX3JlZjNbMl07XG4gICAgICByZXR1cm4gc2lnbmVkT2Zmc2V0KGgsIG0pO1xuICAgIH0sXG4gICAgZ3JvdXBzOiBncm91cHNcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlKHJlZ2V4KSB7XG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNCkge1xuICAgICAgdmFyIHMgPSBfcmVmNFswXTtcbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5pdEZvclRva2VuKHRva2VuLCBsb2MpIHtcbiAgdmFyIG9uZSA9IC9cXGQvLFxuICAgICAgdHdvID0gL1xcZHsyfS8sXG4gICAgICB0aHJlZSA9IC9cXGR7M30vLFxuICAgICAgZm91ciA9IC9cXGR7NH0vLFxuICAgICAgb25lT3JUd28gPSAvXFxkezEsMn0vLFxuICAgICAgb25lVG9UaHJlZSA9IC9cXGR7MSwzfS8sXG4gICAgICB0d29Ub0ZvdXIgPSAvXFxkezIsNH0vLFxuICAgICAgbGl0ZXJhbCA9IGZ1bmN0aW9uIGxpdGVyYWwodCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHQudmFsKSxcbiAgICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNSkge1xuICAgICAgICB2YXIgcyA9IF9yZWY1WzBdO1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH0sXG4gICAgICBsaXRlcmFsOiB0cnVlXG4gICAgfTtcbiAgfSxcbiAgICAgIHVuaXRhdGUgPSBmdW5jdGlvbiB1bml0YXRlKHQpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0LnZhbCkge1xuICAgICAgLy8gZXJhXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoXCJzaG9ydFwiLCBmYWxzZSksIDApO1xuXG4gICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5lcmFzKFwibG9uZ1wiLCBmYWxzZSksIDApO1xuICAgICAgLy8geWVhcnNcblxuICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoL1xcZHsxLDZ9Lyk7XG5cbiAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcblxuICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG5cbiAgICAgIGNhc2UgXCJ5eXl5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezQsNn0vKTtcblxuICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezZ9Lyk7XG4gICAgICAvLyBtb250aHNcblxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcblxuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcImxvbmdcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIC8vIGRhdGVzXG5cbiAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAvLyBvcmRpbmFsc1xuXG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcblxuICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAvLyB0aW1lXG5cbiAgICAgIGNhc2UgXCJISFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiSFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcInNzXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuXG4gICAgICBjYXNlIFwiU1NTXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcblxuICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgcmV0dXJuIHNpbXBsZSgvXFxkezEsOX0vKTtcbiAgICAgIC8vIG1lcmlkaWVtXG5cbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubWVyaWRpZW1zKCksIDApO1xuICAgICAgLy8gd2Vla1llYXIgKGspXG5cbiAgICAgIGNhc2UgXCJra2trXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuXG4gICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvVG9Gb3VyLCB1bnRydW5jYXRlWWVhcik7XG4gICAgICAvLyB3ZWVrTnVtYmVyIChXKVxuXG4gICAgICBjYXNlIFwiV1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgLy8gd2Vla2RheXNcblxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZSk7XG5cbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwic2hvcnRcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIC8vIG9mZnNldC96b25lXG5cbiAgICAgIGNhc2UgXCJaXCI6XG4gICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgcmV0dXJuIG9mZnNldCgvKFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPy8sIDIpO1xuXG4gICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgIHJldHVybiBvZmZzZXQoLyhbKy1dXFxkezEsMn0pKFxcZHsyfSk/LywgMik7XG4gICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IFpaWlogKFBTVCkgb3IgWlpaWlogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSkgaW4gcGFyc2luZ1xuICAgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFueSB3YXkgdG8gZmlndXJlIG91dCB3aGF0IHRoZXkgYXJlXG5cbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1thLXpfKy1dezEsMjU2fShcXC9bYS16XystXXsxLDI1Nn0oXFwvW2Etel8rLV17MSwyNTZ9KT8pPy9pKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB1bml0ID0gdW5pdGF0ZSh0b2tlbikgfHwge1xuICAgIGludmFsaWRSZWFzb246IE1JU1NJTkdfRlRQXG4gIH07XG4gIHVuaXQudG9rZW4gPSB0b2tlbjtcbiAgcmV0dXJuIHVuaXQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVnZXgodW5pdHMpIHtcbiAgdmFyIHJlID0gdW5pdHMubWFwKGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIHUucmVnZXg7XG4gIH0pLnJlZHVjZShmdW5jdGlvbiAoZiwgcikge1xuICAgIHJldHVybiBmICsgXCIoXCIgKyByLnNvdXJjZSArIFwiKVwiO1xuICB9LCBcIlwiKTtcbiAgcmV0dXJuIFtcIl5cIiArIHJlICsgXCIkXCIsIHVuaXRzXTtcbn1cblxuZnVuY3Rpb24gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycykge1xuICB2YXIgbWF0Y2hlcyA9IGlucHV0Lm1hdGNoKHJlZ2V4KTtcblxuICBpZiAobWF0Y2hlcykge1xuICAgIHZhciBhbGwgPSB7fTtcbiAgICB2YXIgbWF0Y2hJbmRleCA9IDE7XG5cbiAgICBmb3IgKHZhciBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgdmFyIGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICAgIGdyb3VwcyA9IGguZ3JvdXBzID8gaC5ncm91cHMgKyAxIDogMTtcblxuICAgICAgICBpZiAoIWgubGl0ZXJhbCAmJiBoLnRva2VuKSB7XG4gICAgICAgICAgYWxsW2gudG9rZW4udmFsWzBdXSA9IGguZGVzZXIobWF0Y2hlcy5zbGljZShtYXRjaEluZGV4LCBtYXRjaEluZGV4ICsgZ3JvdXBzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRjaEluZGV4ICs9IGdyb3VwcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21hdGNoZXMsIGFsbF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB7fV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHZhciB0b0ZpZWxkID0gZnVuY3Rpb24gdG9GaWVsZCh0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG5cbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuXG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcblxuICAgICAgY2FzZSBcImhcIjpcbiAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgIHJldHVybiBcImhvdXJcIjtcblxuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG5cbiAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgIHJldHVybiBcIm9yZGluYWxcIjtcblxuICAgICAgY2FzZSBcIkxcIjpcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgIHJldHVybiBcIm1vbnRoXCI7XG5cbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBcInllYXJcIjtcblxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtkYXlcIjtcblxuICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgcmV0dXJuIFwid2Vla051bWJlclwiO1xuXG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrWWVhclwiO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHpvbmU7XG5cbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLlopKSB7XG4gICAgem9uZSA9IG5ldyBGaXhlZE9mZnNldFpvbmUobWF0Y2hlcy5aKTtcbiAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy56KSkge1xuICAgIHpvbmUgPSBuZXcgSUFOQVpvbmUobWF0Y2hlcy56KTtcbiAgfSBlbHNlIHtcbiAgICB6b25lID0gbnVsbDtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5oKSkge1xuICAgIGlmIChtYXRjaGVzLmggPCAxMiAmJiBtYXRjaGVzLmEgPT09IDEpIHtcbiAgICAgIG1hdGNoZXMuaCArPSAxMjtcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMuaCA9PT0gMTIgJiYgbWF0Y2hlcy5hID09PSAwKSB7XG4gICAgICBtYXRjaGVzLmggPSAwO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLkcgPT09IDAgJiYgbWF0Y2hlcy55KSB7XG4gICAgbWF0Y2hlcy55ID0gLW1hdGNoZXMueTtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy51KSkge1xuICAgIG1hdGNoZXMuUyA9IHBhcnNlTWlsbGlzKG1hdGNoZXMudSk7XG4gIH1cblxuICB2YXIgdmFscyA9IE9iamVjdC5rZXlzKG1hdGNoZXMpLnJlZHVjZShmdW5jdGlvbiAociwgaykge1xuICAgIHZhciBmID0gdG9GaWVsZChrKTtcblxuICAgIGlmIChmKSB7XG4gICAgICByW2ZdID0gbWF0Y2hlc1trXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfSwge30pO1xuICByZXR1cm4gW3ZhbHMsIHpvbmVdO1xufVxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgdG9rZW5zID0gRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksXG4gICAgICB1bml0cyA9IHRva2Vucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdW5pdEZvclRva2VuKHQsIGxvY2FsZSk7XG4gIH0pLFxuICAgICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuaW52YWxpZFJlYXNvbjtcbiAgfSk7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvblxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9idWlsZFJlZ2V4ID0gYnVpbGRSZWdleCh1bml0cyksXG4gICAgICAgIHJlZ2V4U3RyaW5nID0gX2J1aWxkUmVnZXhbMF0sXG4gICAgICAgIGhhbmRsZXJzID0gX2J1aWxkUmVnZXhbMV0sXG4gICAgICAgIHJlZ2V4ID0gUmVnRXhwKHJlZ2V4U3RyaW5nLCBcImlcIiksXG4gICAgICAgIF9tYXRjaCA9IG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpLFxuICAgICAgICByYXdNYXRjaGVzID0gX21hdGNoWzBdLFxuICAgICAgICBtYXRjaGVzID0gX21hdGNoWzFdLFxuICAgICAgICBfcmVmNiA9IG1hdGNoZXMgPyBkYXRlVGltZUZyb21NYXRjaGVzKG1hdGNoZXMpIDogW251bGwsIG51bGxdLFxuICAgICAgICByZXN1bHQgPSBfcmVmNlswXSxcbiAgICAgICAgem9uZSA9IF9yZWY2WzFdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgcmVnZXg6IHJlZ2V4LFxuICAgICAgcmF3TWF0Y2hlczogcmF3TWF0Y2hlcyxcbiAgICAgIG1hdGNoZXM6IG1hdGNoZXMsXG4gICAgICByZXN1bHQ6IHJlc3VsdCxcbiAgICAgIHpvbmU6IHpvbmVcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBwYXJzZUZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSB7XG4gIHZhciBfZXhwbGFpbkZyb21Ub2tlbnMgPSBleHBsYWluRnJvbVRva2Vucyhsb2NhbGUsIGlucHV0LCBmb3JtYXQpLFxuICAgICAgcmVzdWx0ID0gX2V4cGxhaW5Gcm9tVG9rZW5zLnJlc3VsdCxcbiAgICAgIHpvbmUgPSBfZXhwbGFpbkZyb21Ub2tlbnMuem9uZSxcbiAgICAgIGludmFsaWRSZWFzb24gPSBfZXhwbGFpbkZyb21Ub2tlbnMuaW52YWxpZFJlYXNvbjtcblxuICByZXR1cm4gW3Jlc3VsdCwgem9uZSwgaW52YWxpZFJlYXNvbl07XG59XG5cbnZhciBub25MZWFwTGFkZGVyID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XSxcbiAgICBsZWFwTGFkZGVyID0gWzAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1XTtcblxuZnVuY3Rpb24gdW5pdE91dE9mUmFuZ2UodW5pdCwgdmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBJbnZhbGlkKFwidW5pdCBvdXQgb2YgcmFuZ2VcIiwgXCJ5b3Ugc3BlY2lmaWVkIFwiICsgdmFsdWUgKyBcIiAob2YgdHlwZSBcIiArIHR5cGVvZiB2YWx1ZSArIFwiKSBhcyBhIFwiICsgdW5pdCArIFwiLCB3aGljaCBpcyBpbnZhbGlkXCIpO1xufVxuXG5mdW5jdGlvbiBkYXlPZldlZWsoeWVhciwgbW9udGgsIGRheSkge1xuICB2YXIganMgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCAtIDEsIGRheSkpLmdldFVUQ0RheSgpO1xuICByZXR1cm4ganMgPT09IDAgPyA3IDoganM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgcmV0dXJuIGRheSArIChpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIpW21vbnRoIC0gMV07XG59XG5cbmZ1bmN0aW9uIHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCkge1xuICB2YXIgdGFibGUgPSBpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIsXG4gICAgICBtb250aDAgPSB0YWJsZS5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gaSA8IG9yZGluYWw7XG4gIH0pLFxuICAgICAgZGF5ID0gb3JkaW5hbCAtIHRhYmxlW21vbnRoMF07XG4gIHJldHVybiB7XG4gICAgbW9udGg6IG1vbnRoMCArIDEsXG4gICAgZGF5OiBkYXlcbiAgfTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5cbmZ1bmN0aW9uIGdyZWdvcmlhblRvV2VlayhncmVnT2JqKSB7XG4gIHZhciB5ZWFyID0gZ3JlZ09iai55ZWFyLFxuICAgICAgbW9udGggPSBncmVnT2JqLm1vbnRoLFxuICAgICAgZGF5ID0gZ3JlZ09iai5kYXksXG4gICAgICBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSksXG4gICAgICB3ZWVrZGF5ID0gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpO1xuICB2YXIgd2Vla051bWJlciA9IE1hdGguZmxvb3IoKG9yZGluYWwgLSB3ZWVrZGF5ICsgMTApIC8gNyksXG4gICAgICB3ZWVrWWVhcjtcblxuICBpZiAod2Vla051bWJlciA8IDEpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgLSAxO1xuICAgIHdlZWtOdW1iZXIgPSB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpO1xuICB9IGVsc2UgaWYgKHdlZWtOdW1iZXIgPiB3ZWVrc0luV2Vla1llYXIoeWVhcikpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgKyAxO1xuICAgIHdlZWtOdW1iZXIgPSAxO1xuICB9IGVsc2Uge1xuICAgIHdlZWtZZWFyID0geWVhcjtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB3ZWVrWWVhcjogd2Vla1llYXIsXG4gICAgd2Vla051bWJlcjogd2Vla051bWJlcixcbiAgICB3ZWVrZGF5OiB3ZWVrZGF5XG4gIH0sIHRpbWVPYmplY3QoZ3JlZ09iaikpO1xufVxuZnVuY3Rpb24gd2Vla1RvR3JlZ29yaWFuKHdlZWtEYXRhKSB7XG4gIHZhciB3ZWVrWWVhciA9IHdlZWtEYXRhLndlZWtZZWFyLFxuICAgICAgd2Vla051bWJlciA9IHdlZWtEYXRhLndlZWtOdW1iZXIsXG4gICAgICB3ZWVrZGF5ID0gd2Vla0RhdGEud2Vla2RheSxcbiAgICAgIHdlZWtkYXlPZkphbjQgPSBkYXlPZldlZWsod2Vla1llYXIsIDEsIDQpLFxuICAgICAgeWVhckluRGF5cyA9IGRheXNJblllYXIod2Vla1llYXIpO1xuICB2YXIgb3JkaW5hbCA9IHdlZWtOdW1iZXIgKiA3ICsgd2Vla2RheSAtIHdlZWtkYXlPZkphbjQgLSAzLFxuICAgICAgeWVhcjtcblxuICBpZiAob3JkaW5hbCA8IDEpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgLSAxO1xuICAgIG9yZGluYWwgKz0gZGF5c0luWWVhcih5ZWFyKTtcbiAgfSBlbHNlIGlmIChvcmRpbmFsID4geWVhckluRGF5cykge1xuICAgIHllYXIgPSB3ZWVrWWVhciArIDE7XG4gICAgb3JkaW5hbCAtPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcbiAgfSBlbHNlIHtcbiAgICB5ZWFyID0gd2Vla1llYXI7XG4gIH1cblxuICB2YXIgX3VuY29tcHV0ZU9yZGluYWwgPSB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpLFxuICAgICAgbW9udGggPSBfdW5jb21wdXRlT3JkaW5hbC5tb250aCxcbiAgICAgIGRheSA9IF91bmNvbXB1dGVPcmRpbmFsLmRheTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBkYXlcbiAgfSwgdGltZU9iamVjdCh3ZWVrRGF0YSkpO1xufVxuZnVuY3Rpb24gZ3JlZ29yaWFuVG9PcmRpbmFsKGdyZWdEYXRhKSB7XG4gIHZhciB5ZWFyID0gZ3JlZ0RhdGEueWVhcixcbiAgICAgIG1vbnRoID0gZ3JlZ0RhdGEubW9udGgsXG4gICAgICBkYXkgPSBncmVnRGF0YS5kYXksXG4gICAgICBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB5ZWFyOiB5ZWFyLFxuICAgIG9yZGluYWw6IG9yZGluYWxcbiAgfSwgdGltZU9iamVjdChncmVnRGF0YSkpO1xufVxuZnVuY3Rpb24gb3JkaW5hbFRvR3JlZ29yaWFuKG9yZGluYWxEYXRhKSB7XG4gIHZhciB5ZWFyID0gb3JkaW5hbERhdGEueWVhcixcbiAgICAgIG9yZGluYWwgPSBvcmRpbmFsRGF0YS5vcmRpbmFsLFxuICAgICAgX3VuY29tcHV0ZU9yZGluYWwyID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSxcbiAgICAgIG1vbnRoID0gX3VuY29tcHV0ZU9yZGluYWwyLm1vbnRoLFxuICAgICAgZGF5ID0gX3VuY29tcHV0ZU9yZGluYWwyLmRheTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBkYXlcbiAgfSwgdGltZU9iamVjdChvcmRpbmFsRGF0YSkpO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZFdlZWtEYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLndlZWtZZWFyKSxcbiAgICAgIHZhbGlkV2VlayA9IG51bWJlckJldHdlZW4ob2JqLndlZWtOdW1iZXIsIDEsIHdlZWtzSW5XZWVrWWVhcihvYmoud2Vla1llYXIpKSxcbiAgICAgIHZhbGlkV2Vla2RheSA9IG51bWJlckJldHdlZW4ob2JqLndlZWtkYXksIDEsIDcpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwid2Vla1llYXJcIiwgb2JqLndlZWtZZWFyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRXZWVrKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwid2Vla1wiLCBvYmoud2Vlayk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vla2RheSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtkYXlcIiwgb2JqLndlZWtkYXkpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZE9yZGluYWxEYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLnllYXIpLFxuICAgICAgdmFsaWRPcmRpbmFsID0gbnVtYmVyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm9yZGluYWxcIiwgb2JqLm9yZGluYWwpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB7XG4gIHZhciB2YWxpZFllYXIgPSBpc051bWJlcihvYmoueWVhciksXG4gICAgICB2YWxpZE1vbnRoID0gbnVtYmVyQmV0d2VlbihvYmoubW9udGgsIDEsIDEyKSxcbiAgICAgIHZhbGlkRGF5ID0gbnVtYmVyQmV0d2VlbihvYmouZGF5LCAxLCBkYXlzSW5Nb250aChvYmoueWVhciwgb2JqLm1vbnRoKSk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ5ZWFyXCIsIG9iai55ZWFyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNb250aCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1vbnRoXCIsIG9iai5tb250aCk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkRGF5KSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwiZGF5XCIsIG9iai5kYXkpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZFRpbWVEYXRhKG9iaikge1xuICB2YXIgdmFsaWRIb3VyID0gbnVtYmVyQmV0d2VlbihvYmouaG91ciwgMCwgMjMpLFxuICAgICAgdmFsaWRNaW51dGUgPSBudW1iZXJCZXR3ZWVuKG9iai5taW51dGUsIDAsIDU5KSxcbiAgICAgIHZhbGlkU2Vjb25kID0gbnVtYmVyQmV0d2VlbihvYmouc2Vjb25kLCAwLCA1OSksXG4gICAgICB2YWxpZE1pbGxpc2Vjb25kID0gbnVtYmVyQmV0d2VlbihvYmoubWlsbGlzZWNvbmQsIDAsIDk5OSk7XG5cbiAgaWYgKCF2YWxpZEhvdXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJob3VyXCIsIG9iai5ob3VyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNaW51dGUpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtaW51dGVcIiwgb2JqLm1pbnV0ZSk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkU2Vjb25kKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwic2Vjb25kXCIsIG9iai5zZWNvbik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTWlsbGlzZWNvbmQpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtaWxsaXNlY29uZFwiLCBvYmoubWlsbGlzZWNvbmQpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgSU5WQUxJRCQyID0gXCJJbnZhbGlkIERhdGVUaW1lXCI7XG5cbmZ1bmN0aW9uIHVuc3VwcG9ydGVkWm9uZSh6b25lKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcInVuc3VwcG9ydGVkIHpvbmVcIiwgXCJ0aGUgem9uZSBcXFwiXCIgKyB6b25lLm5hbWUgKyBcIlxcXCIgaXMgbm90IHN1cHBvcnRlZFwiKTtcbn0gLy8gd2UgY2FjaGUgd2VlayBkYXRhIG9uIHRoZSBEVCBvYmplY3QgYW5kIHRoaXMgaW50ZXJtZWRpYXRlcyB0aGUgY2FjaGVcblxuXG5mdW5jdGlvbiBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKGR0KSB7XG4gIGlmIChkdC53ZWVrRGF0YSA9PT0gbnVsbCkge1xuICAgIGR0LndlZWtEYXRhID0gZ3JlZ29yaWFuVG9XZWVrKGR0LmMpO1xuICB9XG5cbiAgcmV0dXJuIGR0LndlZWtEYXRhO1xufSAvLyBjbG9uZSByZWFsbHkgbWVhbnMsIFwibWFrZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGVzZSBtb2RpZmljYXRpb25zXCIuIGFsbCBcInNldHRlcnNcIiByZWFsbHkgdXNlIHRoaXNcbi8vIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2hpbGUgb25seSBjaGFuZ2luZyBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzXG5cblxuZnVuY3Rpb24gY2xvbmUkMShpbnN0LCBhbHRzKSB7XG4gIHZhciBjdXJyZW50ID0ge1xuICAgIHRzOiBpbnN0LnRzLFxuICAgIHpvbmU6IGluc3Quem9uZSxcbiAgICBjOiBpbnN0LmMsXG4gICAgbzogaW5zdC5vLFxuICAgIGxvYzogaW5zdC5sb2MsXG4gICAgaW52YWxpZDogaW5zdC5pbnZhbGlkXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudCwgYWx0cywge1xuICAgIG9sZDogY3VycmVudFxuICB9KSk7XG59IC8vIGZpbmQgdGhlIHJpZ2h0IG9mZnNldCBhIGdpdmVuIGxvY2FsIHRpbWUuIFRoZSBvIGlucHV0IGlzIG91ciBndWVzcywgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaFxuLy8gb2Zmc2V0IHdlJ2xsIHBpY2sgaW4gYW1iaWd1b3VzIGNhc2VzIChlLmcuIHRoZXJlIGFyZSB0d28gMyBBTXMgYi9jIEZhbGxiYWNrIERTVClcblxuXG5mdW5jdGlvbiBmaXhPZmZzZXQobG9jYWxUUywgbywgdHopIHtcbiAgLy8gT3VyIFVUQyB0aW1lIGlzIGp1c3QgYSBndWVzcyBiZWNhdXNlIG91ciBvZmZzZXQgaXMganVzdCBhIGd1ZXNzXG4gIHZhciB1dGNHdWVzcyA9IGxvY2FsVFMgLSBvICogNjAgKiAxMDAwOyAvLyBUZXN0IHdoZXRoZXIgdGhlIHpvbmUgbWF0Y2hlcyB0aGUgb2Zmc2V0IGZvciB0aGlzIHRzXG5cbiAgdmFyIG8yID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTsgLy8gSWYgc28sIG9mZnNldCBkaWRuJ3QgY2hhbmdlIGFuZCB3ZSdyZSBkb25lXG5cbiAgaWYgKG8gPT09IG8yKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgb107XG4gIH0gLy8gSWYgbm90LCBjaGFuZ2UgdGhlIHRzIGJ5IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBvZmZzZXRcblxuXG4gIHV0Y0d1ZXNzIC09IChvMiAtIG8pICogNjAgKiAxMDAwOyAvLyBJZiB0aGF0IGdpdmVzIHVzIHRoZSBsb2NhbCB0aW1lIHdlIHdhbnQsIHdlJ3JlIGRvbmVcblxuICB2YXIgbzMgPSB0ei5vZmZzZXQodXRjR3Vlc3MpO1xuXG4gIGlmIChvMiA9PT0gbzMpIHtcbiAgICByZXR1cm4gW3V0Y0d1ZXNzLCBvMl07XG4gIH0gLy8gSWYgaXQncyBkaWZmZXJlbnQsIHdlJ3JlIGluIGEgaG9sZSB0aW1lLiBUaGUgb2Zmc2V0IGhhcyBjaGFuZ2VkLCBidXQgdGhlIHdlIGRvbid0IGFkanVzdCB0aGUgdGltZVxuXG5cbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59IC8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5cblxuZnVuY3Rpb24gdHNUb09iaih0cywgb2Zmc2V0KSB7XG4gIHRzICs9IG9mZnNldCAqIDYwICogMTAwMDtcbiAgdmFyIGQgPSBuZXcgRGF0ZSh0cyk7XG4gIHJldHVybiB7XG4gICAgeWVhcjogZC5nZXRVVENGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBkLmdldFVUQ01vbnRoKCkgKyAxLFxuICAgIGRheTogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cjogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZTogZC5nZXRVVENNaW51dGVzKCksXG4gICAgc2Vjb25kOiBkLmdldFVUQ1NlY29uZHMoKSxcbiAgICBtaWxsaXNlY29uZDogZC5nZXRVVENNaWxsaXNlY29uZHMoKVxuICB9O1xufSAvLyBjb3ZlcnQgYSBjYWxlbmRhciBvYmplY3QgdG8gYSBsb2NhbCB0aW1lc3RhbXAgKGVwb2NoLCBidXQgd2l0aCB0aGUgb2Zmc2V0IGJha2VkIGluKVxuXG5cbmZ1bmN0aW9uIG9ialRvTG9jYWxUUyhvYmopIHtcbiAgdmFyIGQgPSBEYXRlLlVUQyhvYmoueWVhciwgb2JqLm1vbnRoIC0gMSwgb2JqLmRheSwgb2JqLmhvdXIsIG9iai5taW51dGUsIG9iai5zZWNvbmQsIG9iai5taWxsaXNlY29uZCk7IC8vIGZvciBsZWdhY3kgcmVhc29ucywgeWVhcnMgYmV0d2VlbiAwIGFuZCA5OSBhcmUgaW50ZXJwcmV0ZWQgYXMgMTlYWDsgcmV2ZXJ0IHRoYXRcblxuICBpZiAob2JqLnllYXIgPCAxMDAgJiYgb2JqLnllYXIgPj0gMCkge1xuICAgIGQgPSBuZXcgRGF0ZShkKTtcbiAgICBkLnNldFVUQ0Z1bGxZZWFyKG9iai55ZWFyKTtcbiAgfVxuXG4gIHJldHVybiArZDtcbn0gLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuXG5cbmZ1bmN0aW9uIG9ialRvVFMob2JqLCBvZmZzZXQsIHpvbmUpIHtcbiAgcmV0dXJuIGZpeE9mZnNldChvYmpUb0xvY2FsVFMob2JqKSwgb2Zmc2V0LCB6b25lKTtcbn0gLy8gY3JlYXRlIGEgbmV3IERUIGluc3RhbmNlIGJ5IGFkZGluZyBhIGR1cmF0aW9uLCBhZGp1c3RpbmcgZm9yIERTVHNcblxuXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICB2YXIgb1ByZSA9IGluc3QubyxcbiAgICAgIHllYXIgPSBpbnN0LmMueWVhciArIGR1ci55ZWFycyxcbiAgICAgIG1vbnRoID0gaW5zdC5jLm1vbnRoICsgZHVyLm1vbnRocyArIGR1ci5xdWFydGVycyAqIDMsXG4gICAgICBjID0gT2JqZWN0LmFzc2lnbih7fSwgaW5zdC5jLCB7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBNYXRoLm1pbihpbnN0LmMuZGF5LCBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpICsgZHVyLmRheXMgKyBkdXIud2Vla3MgKiA3XG4gIH0pLFxuICAgICAgbWlsbGlzVG9BZGQgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtcbiAgICBob3VyczogZHVyLmhvdXJzLFxuICAgIG1pbnV0ZXM6IGR1ci5taW51dGVzLFxuICAgIHNlY29uZHM6IGR1ci5zZWNvbmRzLFxuICAgIG1pbGxpc2Vjb25kczogZHVyLm1pbGxpc2Vjb25kc1xuICB9KS5hcyhcIm1pbGxpc2Vjb25kc1wiKSxcbiAgICAgIGxvY2FsVFMgPSBvYmpUb0xvY2FsVFMoYyk7XG5cbiAgdmFyIF9maXhPZmZzZXQgPSBmaXhPZmZzZXQobG9jYWxUUywgb1ByZSwgaW5zdC56b25lKSxcbiAgICAgIHRzID0gX2ZpeE9mZnNldFswXSxcbiAgICAgIG8gPSBfZml4T2Zmc2V0WzFdO1xuXG4gIGlmIChtaWxsaXNUb0FkZCAhPT0gMCkge1xuICAgIHRzICs9IG1pbGxpc1RvQWRkOyAvLyB0aGF0IGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgb2Zmc2V0IGJ5IGdvaW5nIG92ZXIgYSBEU1QsIGJ1dCB3ZSB3YW50IHRvIGtlZXAgdGhlIHRzIHRoZSBzYW1lXG5cbiAgICBvID0gaW5zdC56b25lLm9mZnNldCh0cyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRzOiB0cyxcbiAgICBvOiBvXG4gIH07XG59IC8vIGhlbHBlciB1c2VmdWwgaW4gdHVybmluZyB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGludG8gcmVhbCBkYXRlc1xuLy8gYnkgaGFuZGxpbmcgdGhlIHpvbmUgb3B0aW9uc1xuXG5cbmZ1bmN0aW9uIHBhcnNlRGF0YVRvRGF0ZVRpbWUocGFyc2VkLCBwYXJzZWRab25lLCBvcHRzLCBmb3JtYXQsIHRleHQpIHtcbiAgdmFyIHNldFpvbmUgPSBvcHRzLnNldFpvbmUsXG4gICAgICB6b25lID0gb3B0cy56b25lO1xuXG4gIGlmIChwYXJzZWQgJiYgT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggIT09IDApIHtcbiAgICB2YXIgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgICBpbnN0ID0gRGF0ZVRpbWUuZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cywge1xuICAgICAgem9uZTogaW50ZXJwcmV0YXRpb25ab25lXG4gICAgfSkpO1xuICAgIHJldHVybiBzZXRab25lID8gaW5zdCA6IGluc3Quc2V0Wm9uZSh6b25lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChuZXcgSW52YWxpZChcInVucGFyc2FibGVcIiwgXCJ0aGUgaW5wdXQgXFxcIlwiICsgdGV4dCArIFwiXFxcIiBjYW4ndCBiZSBwYXJzZWQgYXMgXCIgKyBmb3JtYXQpKTtcbiAgfVxufSAvLyBpZiB5b3Ugd2FudCB0byBvdXRwdXQgYSB0ZWNobmljYWwgZm9ybWF0IChlLmcuIFJGQyAyODIyKSwgdGhpcyBoZWxwZXJcbi8vIGhlbHBzIGhhbmRsZSB0aGUgZGV0YWlsc1xuXG5cbmZ1bmN0aW9uIHRvVGVjaEZvcm1hdChkdCwgZm9ybWF0KSB7XG4gIHJldHVybiBkdC5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZShMb2NhbGUuY3JlYXRlKFwiZW4tVVNcIiksIHtcbiAgICBhbGxvd1o6IHRydWUsXG4gICAgZm9yY2VTaW1wbGU6IHRydWVcbiAgfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmb3JtYXQpIDogbnVsbDtcbn0gLy8gdGVjaG5pY2FsIHRpbWUgZm9ybWF0cyAoZS5nLiB0aGUgdGltZSBwYXJ0IG9mIElTTyA4NjAxKSwgdGFrZSBzb21lIG9wdGlvbnNcbi8vIGFuZCB0aGlzIGNvbW1vbml6ZXMgdGhlaXIgaGFuZGxpbmdcblxuXG5mdW5jdGlvbiB0b1RlY2hUaW1lRm9ybWF0KGR0LCBfcmVmKSB7XG4gIHZhciBfcmVmJHN1cHByZXNzU2Vjb25kcyA9IF9yZWYuc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgc3VwcHJlc3NTZWNvbmRzID0gX3JlZiRzdXBwcmVzc1NlY29uZHMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzdXBwcmVzc1NlY29uZHMsXG4gICAgICBfcmVmJHN1cHByZXNzTWlsbGlzZWMgPSBfcmVmLnN1cHByZXNzTWlsbGlzZWNvbmRzLFxuICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBfcmVmJHN1cHByZXNzTWlsbGlzZWMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzdXBwcmVzc01pbGxpc2VjLFxuICAgICAgX3JlZiRpbmNsdWRlT2Zmc2V0ID0gX3JlZi5pbmNsdWRlT2Zmc2V0LFxuICAgICAgaW5jbHVkZU9mZnNldCA9IF9yZWYkaW5jbHVkZU9mZnNldCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkaW5jbHVkZU9mZnNldCxcbiAgICAgIF9yZWYkaW5jbHVkZVpvbmUgPSBfcmVmLmluY2x1ZGVab25lLFxuICAgICAgaW5jbHVkZVpvbmUgPSBfcmVmJGluY2x1ZGVab25lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkaW5jbHVkZVpvbmUsXG4gICAgICBfcmVmJHNwYWNlWm9uZSA9IF9yZWYuc3BhY2Vab25lLFxuICAgICAgc3BhY2Vab25lID0gX3JlZiRzcGFjZVpvbmUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzcGFjZVpvbmU7XG4gIHZhciBmbXQgPSBcIkhIOm1tXCI7XG5cbiAgaWYgKCFzdXBwcmVzc1NlY29uZHMgfHwgZHQuc2Vjb25kICE9PSAwIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgZm10ICs9IFwiOnNzXCI7XG5cbiAgICBpZiAoIXN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgfVxuICB9XG5cbiAgaWYgKChpbmNsdWRlWm9uZSB8fCBpbmNsdWRlT2Zmc2V0KSAmJiBzcGFjZVpvbmUpIHtcbiAgICBmbXQgKz0gXCIgXCI7XG4gIH1cblxuICBpZiAoaW5jbHVkZVpvbmUpIHtcbiAgICBmbXQgKz0gXCJ6XCI7XG4gIH0gZWxzZSBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGZtdCArPSBcIlpaXCI7XG4gIH1cblxuICByZXR1cm4gdG9UZWNoRm9ybWF0KGR0LCBmbXQpO1xufSAvLyBkZWZhdWx0cyBmb3IgdW5zcGVjaWZpZWQgdW5pdHMgaW4gdGhlIHN1cHBvcnRlZCBjYWxlbmRhcnNcblxuXG52YXIgZGVmYXVsdFVuaXRWYWx1ZXMgPSB7XG4gIG1vbnRoOiAxLFxuICBkYXk6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufSxcbiAgICBkZWZhdWx0V2Vla1VuaXRWYWx1ZXMgPSB7XG4gIHdlZWtOdW1iZXI6IDEsXG4gIHdlZWtkYXk6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufSxcbiAgICBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXMgPSB7XG4gIG9yZGluYWw6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufTsgLy8gVW5pdHMgaW4gdGhlIHN1cHBvcnRlZCBjYWxlbmRhcnMsIHNvcnRlZCBieSBiaWduZXNzXG5cbnZhciBvcmRlcmVkVW5pdHMkMSA9IFtcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgICBvcmRlcmVkV2Vla1VuaXRzID0gW1wid2Vla1llYXJcIiwgXCJ3ZWVrTnVtYmVyXCIsIFwid2Vla2RheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgICBvcmRlcmVkT3JkaW5hbFVuaXRzID0gW1wieWVhclwiLCBcIm9yZGluYWxcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl07IC8vIHN0YW5kYXJkaXplIGNhc2UgYW5kIHBsdXJhbGl0eSBpbiB1bml0c1xuXG5mdW5jdGlvbiBub3JtYWxpemVVbml0KHVuaXQsIGlnbm9yZVVua25vd24pIHtcbiAgaWYgKGlnbm9yZVVua25vd24gPT09IHZvaWQgMCkge1xuICAgIGlnbm9yZVVua25vd24gPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBub3JtYWxpemVkID0ge1xuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG1vbnRoczogXCJtb250aFwiLFxuICAgIGRheTogXCJkYXlcIixcbiAgICBkYXlzOiBcImRheVwiLFxuICAgIGhvdXI6IFwiaG91clwiLFxuICAgIGhvdXJzOiBcImhvdXJcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBzZWNvbmQ6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kczogXCJzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZFwiLFxuICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZFwiLFxuICAgIHdlZWtkYXk6IFwid2Vla2RheVwiLFxuICAgIHdlZWtkYXlzOiBcIndlZWtkYXlcIixcbiAgICB3ZWVrbnVtYmVyOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVrc251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla251bWJlcnM6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWt5ZWFyOiBcIndlZWtZZWFyXCIsXG4gICAgd2Vla3llYXJzOiBcIndlZWtZZWFyXCIsXG4gICAgb3JkaW5hbDogXCJvcmRpbmFsXCJcbiAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG4gIGlmICghaWdub3JlVW5rbm93biAmJiAhbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG4gIHJldHVybiBub3JtYWxpemVkO1xufSAvLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5cblxuZnVuY3Rpb24gcXVpY2tEVChvYmosIHpvbmUpIHtcbiAgLy8gYXNzdW1lIHdlIGhhdmUgdGhlIGhpZ2hlci1vcmRlciB1bml0c1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgb3JkZXJlZFVuaXRzJDEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHUgPSBvcmRlcmVkVW5pdHMkMVtfaV07XG5cbiAgICBpZiAoaXNVbmRlZmluZWQob2JqW3VdKSkge1xuICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGludmFsaWQgPSBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHx8IGhhc0ludmFsaWRUaW1lRGF0YShvYmopO1xuXG4gIGlmIChpbnZhbGlkKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gIH1cblxuICB2YXIgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgIG9mZnNldFByb3ZpcyA9IHpvbmUub2Zmc2V0KHRzTm93KSxcbiAgICAgIF9vYmpUb1RTID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSksXG4gICAgICB0cyA9IF9vYmpUb1RTWzBdLFxuICAgICAgbyA9IF9vYmpUb1RTWzFdO1xuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgIHRzOiB0cyxcbiAgICB6b25lOiB6b25lLFxuICAgIG86IG9cbiAgfSk7XG59XG4vKipcclxuICogQSBEYXRlVGltZSBpcyBhbiBpbW11dGFibGUgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgZGF0ZSBhbmQgdGltZSBhbmQgYWNjb21wYW55aW5nIG1ldGhvZHMuIEl0IGNvbnRhaW5zIGNsYXNzIGFuZCBpbnN0YW5jZSBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLlxyXG4gKlxyXG4gKiBBIERhdGVUaW1lIGNvbXByaXNlcyBvZjpcclxuICogKiBBIHRpbWVzdGFtcC4gRWFjaCBEYXRlVGltZSBpbnN0YW5jZSByZWZlcnMgdG8gYSBzcGVjaWZpYyBtaWxsaXNlY29uZCBvZiB0aGUgVW5peCBlcG9jaC5cclxuICogKiBBIHRpbWUgem9uZS4gRWFjaCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgc3BlY2lmaWMgem9uZSAoYnkgZGVmYXVsdCB0aGUgbG9jYWwgc3lzdGVtJ3Mgem9uZSkuXHJcbiAqICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHRoYXQgZWZmZWN0IGhvdyBvdXRwdXQgc3RyaW5ncyBhcmUgZm9ybWF0dGVkLCBzdWNoIGFzIGBsb2NhbGVgLCBgbnVtYmVyaW5nU3lzdGVtYCwgYW5kIGBvdXRwdXRDYWxlbmRhcmAuXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ1bmN0aW9uYWxpdHkgaXQgcHJvdmlkZXM6XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqOiBUbyBjcmVhdGUgYSBEYXRlVGltZSBmcm9tIGl0cyBjb21wb25lbnRzLCB1c2Ugb25lIG9mIGl0cyBmYWN0b3J5IGNsYXNzIG1ldGhvZHM6IHtAbGluayBsb2NhbH0sIHtAbGluayB1dGN9LCBhbmQgKG1vc3QgZmxleGlibHkpIHtAbGluayBmcm9tT2JqZWN0fS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgc3RhbmRhcmQgc3RyaW5nIGZvcm1hdCwgdXNlIHtAbGluayBmcm9tSVNPfSwge0BsaW5rIGZyb21IVFRQfSwgYW5kIHtAbGluayBmcm9tUkZDMjgyMn0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIGN1c3RvbSBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIGZyb21Gb3JtYXR9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBuYXRpdmUgSlMgZGF0ZSwgdXNlIHtAbGluayBmcm9tSlNEYXRlfS5cclxuICogKiAqKkdyZWdvcmlhbiBjYWxlbmRhciBhbmQgdGltZSoqOiBUbyBleGFtaW5lIHRoZSBHcmVnb3JpYW4gcHJvcGVydGllcyBvZiBhIERhdGVUaW1lIGluZGl2aWR1YWxseSAoaS5lIGFzIG9wcG9zZWQgdG8gY29sbGVjdGl2ZWx5IHRocm91Z2gge0BsaW5rIHRvT2JqZWN0fSksIHVzZSB0aGUge0BsaW5rIHllYXJ9LCB7QGxpbmsgbW9udGh9LFxyXG4gKiB7QGxpbmsgZGF5fSwge0BsaW5rIGhvdXJ9LCB7QGxpbmsgbWludXRlfSwge0BsaW5rIHNlY29uZH0sIHtAbGluayBtaWxsaXNlY29uZH0gYWNjZXNzb3JzLlxyXG4gKiAqICoqV2VlayBjYWxlbmRhcioqOiBGb3IgSVNPIHdlZWsgY2FsZW5kYXIgYXR0cmlidXRlcywgc2VlIHRoZSB7QGxpbmsgd2Vla1llYXJ9LCB7QGxpbmsgd2Vla051bWJlcn0sIGFuZCB7QGxpbmsgd2Vla2RheX0gYWNjZXNzb3JzLlxyXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSB0aGUge0BsaW5rIGxvY2FsZX0gYW5kIHtAbGluayBudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKio6IFRvIHRyYW5zZm9ybSB0aGUgRGF0ZVRpbWUgaW50byBvdGhlciBEYXRlVGltZXMsIHVzZSB7QGxpbmsgc2V0fSwge0BsaW5rIHJlY29uZmlndXJlfSwge0BsaW5rIHNldFpvbmV9LCB7QGxpbmsgc2V0TG9jYWxlfSwge0BsaW5rIHBsdXN9LCB7QGxpbmsgbWludXN9LCB7QGxpbmsgZW5kT2Z9LCB7QGxpbmsgc3RhcnRPZn0sIHtAbGluayB0b1VUQ30sIGFuZCB7QGxpbmsgdG9Mb2NhbH0uXHJcbiAqICogKipPdXRwdXQqKjogVG8gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCB1c2UgdGhlIHtAbGluayB0b0pTT059LCB7QGxpbmsgdG9JU099LCB7QGxpbmsgdG9IVFRQfSwge0BsaW5rIHRvT2JqZWN0fSwge0BsaW5rIHRvUkZDMjgyMn0sIHtAbGluayB0b1N0cmluZ30sIHtAbGluayB0b0xvY2FsZVN0cmluZ30sIHtAbGluayB0b0Zvcm1hdH0sIHtAbGluayB0b01pbGxpc30gYW5kIHtAbGluayB0b0pTRGF0ZX0uXHJcbiAqXHJcbiAqIFRoZXJlJ3MgcGxlbnR5IG90aGVycyBkb2N1bWVudGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3VidGxlciB0b3BpY3MgbGlrZSBpbnRlcm5hdGlvbmFsaXphdGlvbiwgdGltZSB6b25lcywgYWx0ZXJuYXRpdmUgY2FsZW5kYXJzLCB2YWxpZGl0eSwgYW5kIHNvIG9uLCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXHJcbiAqL1xuXG5cbnZhciBEYXRlVGltZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBEYXRlVGltZShjb25maWcpIHtcbiAgICB2YXIgem9uZSA9IGNvbmZpZy56b25lIHx8IFNldHRpbmdzLmRlZmF1bHRab25lLFxuICAgICAgICBpbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgKE51bWJlci5pc05hTihjb25maWcudHMpID8gbmV3IEludmFsaWQoXCJpbnZhbGlkIGlucHV0XCIpIDogbnVsbCkgfHwgKCF6b25lLmlzVmFsaWQgPyB1bnN1cHBvcnRlZFpvbmUoem9uZSkgOiBudWxsKTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLnRzID0gaXNVbmRlZmluZWQoY29uZmlnLnRzKSA/IFNldHRpbmdzLm5vdygpIDogY29uZmlnLnRzO1xuICAgIHZhciBjID0gbnVsbCxcbiAgICAgICAgbyA9IG51bGw7XG5cbiAgICBpZiAoIWludmFsaWQpIHtcbiAgICAgIHZhciB1bmNoYW5nZWQgPSBjb25maWcub2xkICYmIGNvbmZpZy5vbGQudHMgPT09IHRoaXMudHMgJiYgY29uZmlnLm9sZC56b25lLmVxdWFscyh6b25lKTtcbiAgICAgIGMgPSB1bmNoYW5nZWQgPyBjb25maWcub2xkLmMgOiB0c1RvT2JqKHRoaXMudHMsIHpvbmUub2Zmc2V0KHRoaXMudHMpKTtcbiAgICAgIG8gPSB1bmNoYW5nZWQgPyBjb25maWcub2xkLm8gOiB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG5cbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gaW52YWxpZDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmMgPSBjO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubyA9IG87XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pc0x1eG9uRGF0ZVRpbWUgPSB0cnVlO1xuICB9IC8vIENPTlNUUlVDVFxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGxvY2FsIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYGxvY2FsKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IG5vd1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1KSAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubG9jYWwgPSBmdW5jdGlvbiBsb2NhbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogU2V0dGluZ3Mubm93KClcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVpY2tEVCh7XG4gICAgICAgIHllYXI6IHllYXIsXG4gICAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgICAgZGF5OiBkYXksXG4gICAgICAgIGhvdXI6IGhvdXIsXG4gICAgICAgIG1pbnV0ZTogbWludXRlLFxuICAgICAgICBzZWNvbmQ6IHNlY29uZCxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IG1pbGxpc2Vjb25kXG4gICAgICB9LCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBpbiBVVENcclxuICAgKiBAcGFyYW0ge251bWJlcn0geWVhciAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgdXRjKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1KSAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTAuNzY1WlxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUudXRjID0gZnVuY3Rpb24gdXRjKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh5ZWFyKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBTZXR0aW5ncy5ub3coKSxcbiAgICAgICAgem9uZTogRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1aWNrRFQoe1xuICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIGRheTogZGF5LFxuICAgICAgICBob3VyOiBob3VyLFxuICAgICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgICAgc2Vjb25kOiBzZWNvbmQsXG4gICAgICAgIG1pbGxpc2Vjb25kOiBtaWxsaXNlY29uZFxuICAgICAgfSwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUpTRGF0ZSA9IGZ1bmN0aW9uIGZyb21KU0RhdGUoZGF0ZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiBpc0RhdGUoZGF0ZSkgPyBkYXRlLnZhbHVlT2YoKSA6IE5hTixcbiAgICAgIHpvbmU6IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpXG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAoaS5lLiBzaW5jZSAxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21NaWxsaXMgPSBmdW5jdGlvbiBmcm9tTWlsbGlzKG1pbGxpc2Vjb25kcywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTnVtYmVyKG1pbGxpc2Vjb25kcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21NaWxsaXMgcmVxdWlyZXMgYSBudW1lcmljYWwgaW5wdXRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogbWlsbGlzZWNvbmRzLFxuICAgICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKGkuZS4gc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzIC0gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TZWNvbmRzID0gZnVuY3Rpb24gZnJvbVNlY29uZHMoc2Vjb25kcywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTnVtYmVyKHNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tU2Vjb25kcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBzZWNvbmRzICogMTAwMCxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXInIGFuZCAnaG91cicgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoueWVhciAtIGEgeWVhciwgc3VjaCBhcyAxOTg3XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aCAtIGEgbW9udGgsIDEtMTJcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheSAtIGEgZGF5IG9mIHRoZSBtb250aCwgMS0zMSwgZGVwZW5kaW5nIG9uIHRoZSBtb250aFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoub3JkaW5hbCAtIGRheSBvZiB0aGUgeWVhciwgMS0zNjUgb3IgMzY2XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrWWVhciAtIGFuIElTTyB3ZWVrIHllYXJcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtOdW1iZXIgLSBhbiBJU08gd2VlayBudW1iZXIsIGJldHdlZW4gMSBhbmQgNTIgb3IgNTMsIGRlcGVuZGluZyBvbiB0aGUgeWVhclxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla2RheSAtIGFuIElTTyB3ZWVrZGF5LCAxLTcsIHdoZXJlIDEgaXMgTW9uZGF5IGFuZCA3IGlzIFN1bmRheVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91ciAtIGhvdXIgb2YgdGhlIGRheSwgMC0yM1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlIC0gbWludXRlIG9mIHRoZSBob3VyLCAwLTU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5zZWNvbmQgLSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgMC01OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmQgLSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCAwLTk5OVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvYmouem9uZT0nbG9jYWwnXSAtIGludGVycHJldCB0aGUgbnVtYmVycyBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgem9uZS4gQ2FuIHRha2UgYW55IHZhbHVlIHRha2VuIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRab25lKClcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29iai5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iai5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB5ZWFyOiAxOTgyLCBtb250aDogNSwgZGF5OiAyNX0pLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIgfSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wMS0wMVQwMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9KSAvL34+IHRvZGF5IGF0IDEwOjI2OjA2XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICd1dGMnIH0pLFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2LCB6b25lOiAnbG9jYWwnIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICdBbWVyaWNhL05ld19Zb3JrJyB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB3ZWVrWWVhcjogMjAxNiwgd2Vla051bWJlcjogMiwgd2Vla2RheTogMyB9KS50b0lTT0RhdGUoKSAvLz0+ICcyMDE2LTAxLTEzJ1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbU9iamVjdCA9IGZ1bmN0aW9uIGZyb21PYmplY3Qob2JqKSB7XG4gICAgdmFyIHpvbmVUb1VzZSA9IG5vcm1hbGl6ZVpvbmUob2JqLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcblxuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICB2YXIgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgICAgb2Zmc2V0UHJvdmlzID0gem9uZVRvVXNlLm9mZnNldCh0c05vdyksXG4gICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3Qob2JqLCBub3JtYWxpemVVbml0LCB0cnVlKSxcbiAgICAgICAgY29udGFpbnNPcmRpbmFsID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQub3JkaW5hbCksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yID0gY29udGFpbnNHcmVnb3JZZWFyIHx8IGNvbnRhaW5zR3JlZ29yTUQsXG4gICAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyLFxuICAgICAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvYmopOyAvLyBjYXNlczpcbiAgICAvLyBqdXN0IGEgd2Vla2RheSAtPiB0aGlzIHdlZWsncyBpbnN0YW5jZSBvZiB0aGF0IHdlZWtkYXksIG5vIHdvcnJpZXNcbiAgICAvLyAoZ3JlZ29yaWFuIGRhdGEgb3Igb3JkaW5hbCkgKyAod2Vla1llYXIgb3Igd2Vla051bWJlcikgLT4gZXJyb3JcbiAgICAvLyAoZ3JlZ29yaWFuIG1vbnRoIG9yIGRheSkgKyBvcmRpbmFsIC0+IGVycm9yXG4gICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIHdlZWtzIG9yIG9yZGluYWxzIG9yIGdyZWdvcmlhbiwgZGVwZW5kaW5nIG9uIHdoYXQncyBzcGVjaWZpZWRcblxuICAgIGlmICgoY29udGFpbnNHcmVnb3IgfHwgY29udGFpbnNPcmRpbmFsKSAmJiBkZWZpbml0ZVdlZWtEZWYpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIik7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5zR3JlZ29yTUQgJiYgY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheVwiKTtcbiAgICB9XG5cbiAgICB2YXIgdXNlV2Vla0RhdGEgPSBkZWZpbml0ZVdlZWtEZWYgfHwgbm9ybWFsaXplZC53ZWVrZGF5ICYmICFjb250YWluc0dyZWdvcjsgLy8gY29uZmlndXJlIG91cnNlbHZlcyB0byBkZWFsIHdpdGggZ3JlZ29yaWFuIGRhdGVzIG9yIHdlZWsgc3R1ZmZcblxuICAgIHZhciB1bml0cyxcbiAgICAgICAgZGVmYXVsdFZhbHVlcyxcbiAgICAgICAgb2JqTm93ID0gdHNUb09iaih0c05vdywgb2Zmc2V0UHJvdmlzKTtcblxuICAgIGlmICh1c2VXZWVrRGF0YSkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkV2Vla1VuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRXZWVrVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvV2VlayhvYmpOb3cpO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRPcmRpbmFsVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9PcmRpbmFsKG9iak5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFVuaXRzJDE7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfSAvLyBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG1pc3Npbmcgc3R1ZmZcblxuXG4gICAgdmFyIGZvdW5kRmlyc3QgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IHVuaXRzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kyID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmMjtcblxuICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgIGlmIChfaTIgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIF9yZWYyID0gX2l0ZXJhdG9yW19pMisrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pMiA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChfaTIuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWYyID0gX2kyLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgdSA9IF9yZWYyO1xuICAgICAgdmFyIHYgPSBub3JtYWxpemVkW3VdO1xuXG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHYpKSB7XG4gICAgICAgIGZvdW5kRmlyc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0KSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBkZWZhdWx0VmFsdWVzW3VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IG9iak5vd1t1XTtcbiAgICAgIH1cbiAgICB9IC8vIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIHdlIGhhdmUgYXJlIGluIHJhbmdlXG5cblxuICAgIHZhciBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YSA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKSA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgICBpbnZhbGlkID0gaGlnaGVyT3JkZXJJbnZhbGlkIHx8IGhhc0ludmFsaWRUaW1lRGF0YShub3JtYWxpemVkKTtcblxuICAgIGlmIChpbnZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChpbnZhbGlkKTtcbiAgICB9IC8vIGNvbXB1dGUgdGhlIGFjdHVhbCB0aW1lXG5cblxuICAgIHZhciBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YSA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IG5vcm1hbGl6ZWQsXG4gICAgICAgIF9vYmpUb1RTMiA9IG9ialRvVFMoZ3JlZ29yaWFuLCBvZmZzZXRQcm92aXMsIHpvbmVUb1VzZSksXG4gICAgICAgIHRzRmluYWwgPSBfb2JqVG9UUzJbMF0sXG4gICAgICAgIG9mZnNldEZpbmFsID0gX29ialRvVFMyWzFdLFxuICAgICAgICBpbnN0ID0gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0c0ZpbmFsLFxuICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgbzogb2Zmc2V0RmluYWwsXG4gICAgICBsb2M6IGxvY1xuICAgIH0pOyAvLyBncmVnb3JpYW4gZGF0YSArIHdlZWtkYXkgc2VydmVzIG9ubHkgdG8gdmFsaWRhdGVcblxuXG4gICAgaWYgKG5vcm1hbGl6ZWQud2Vla2RheSAmJiBjb250YWluc0dyZWdvciAmJiBvYmoud2Vla2RheSAhPT0gaW5zdC53ZWVrZGF5KSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcIm1pc21hdGNoZWQgd2Vla2RheVwiLCBcInlvdSBjYW4ndCBzcGVjaWZ5IGJvdGggYSB3ZWVrZGF5IG9mIFwiICsgbm9ybWFsaXplZC53ZWVrZGF5ICsgXCIgYW5kIGEgZGF0ZSBvZiBcIiArIGluc3QudG9JU08oKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMrMDY6MDAnLCB7c2V0Wm9uZTogdHJ1ZX0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnLCB7em9uZTogJ3V0Yyd9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtVzA1LTQnKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUlTTyA9IGZ1bmN0aW9uIGZyb21JU08odGV4dCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX3BhcnNlSVNPRGF0ZSA9IHBhcnNlSVNPRGF0ZSh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZUlTT0RhdGVbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VJU09EYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJJU08gODYwMVwiLCB0ZXh0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBSRkMgMjgyMiBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBSRkMgMjgyMiBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZS4gU2luY2UgdGhlIG9mZnNldCBpcyBhbHdheXMgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignMjUgTm92IDIwMTYgMTM6MjM6MTIgR01UJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignVHVlLCAyNSBOb3YgMjAxNiAxMzoyMzoxMiArMDYwMCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzIFonKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVJGQzI4MjIgPSBmdW5jdGlvbiBmcm9tUkZDMjgyMih0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VSRkMyODIyRGF0ZSA9IHBhcnNlUkZDMjgyMkRhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VSRkMyODIyRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVJGQzI4MjJEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJSRkMgMjgyMlwiLCB0ZXh0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIEhUVFAgZGF0ZXMgYXJlIGFsd2F5cyBpbiBVVEMsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggdGhlIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLiBGb3IgSFRUUCBkYXRlcywgdGhpcyBpcyBhbHdheXMgVVRDLCBzbyB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGB6b25lYCBvcHRpb24gdG8gJ3V0YycsIGJ1dCB0aGlzIG9wdGlvbiBpcyBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzaW1pbGFyIG1ldGhvZHMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUhUVFAgPSBmdW5jdGlvbiBmcm9tSFRUUCh0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VIVFRQRGF0ZSA9IHBhcnNlSFRUUERhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VIVFRQRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZUhUVFBEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJIVFRQXCIsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXQgPSBmdW5jdGlvbiBmcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQodGV4dCkgfHwgaXNVbmRlZmluZWQoZm10KSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiZnJvbUZvcm1hdCByZXF1aXJlcyBhbiBpbnB1dCBzdHJpbmcgYW5kIGEgZm9ybWF0XCIpO1xuICAgIH1cblxuICAgIHZhciBfb3B0cyA9IG9wdHMsXG4gICAgICAgIF9vcHRzJGxvY2FsZSA9IF9vcHRzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdHMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX29wdHMkbG9jYWxlLFxuICAgICAgICBfb3B0cyRudW1iZXJpbmdTeXN0ZW0gPSBfb3B0cy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9vcHRzJG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRzJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSksXG4gICAgICAgIF9wYXJzZUZyb21Ub2tlbnMgPSBwYXJzZUZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VGcm9tVG9rZW5zWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlRnJvbVRva2Vuc1sxXSxcbiAgICAgICAgaW52YWxpZCA9IF9wYXJzZUZyb21Ub2tlbnNbMl07XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiZm9ybWF0IFwiICsgZm10LCB0ZXh0KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0IGluc3RlYWRcclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TdHJpbmcgPSBmdW5jdGlvbiBmcm9tU3RyaW5nKHRleHQsIGZtdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgU1FMIGRhdGUsIHRpbWUsIG9yIGRhdGV0aW1lXHJcbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyB6b25lXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgdG8gdGhpcyBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNScpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyKzA2OjAwJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJywgeyBzZXRab25lOiB0cnVlIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInLCB7IHpvbmU6ICdBbWVyaWNhL0xvc19BbmdlbGVzJyB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzA5OjEyOjM0LjM0MicpXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tU1FMID0gZnVuY3Rpb24gZnJvbVNRTCh0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VTUUwgPSBwYXJzZVNRTCh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZVNRTFswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVNRTFsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiU1FMXCIsIHRleHQpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBEYXRlVGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIGlmIChleHBsYW5hdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICBleHBsYW5hdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRlVGltZUVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgaW52YWxpZDogaW52YWxpZFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEYXRlVGltZS4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmlzRGF0ZVRpbWUgPSBmdW5jdGlvbiBpc0RhdGVUaW1lKG8pIHtcbiAgICByZXR1cm4gby5pc0x1eG9uRGF0ZVRpbWU7XG4gIH07IC8vIElORk9cblxuICAvKipcclxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlJyBvciAnZGF5J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnbW9udGgnKTsgLy89PiA3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNywgNCkuZ2V0KCdkYXknKTsgLy89PiA0XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IERhdGVUaW1lLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1t1bml0XTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyB2YWxpZC4gSW52YWxpZCBEYXRlVGltZXMgb2NjdXIgd2hlbjpcclxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBmcm9tIGludmFsaWQgY2FsZW5kYXIgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIDEzdGggbW9udGggb3IgRmVicnVhcnkgMzBcclxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBieSBhbiBvcGVyYXRpb24gb24gYW5vdGhlciBpbnZhbGlkIGRhdGVcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIEludGwgb3B0aW9ucyBmb3IgdGhpcyBEYXRlVGltZS5cclxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpbiB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciBvZiBmb3JtYXR0aW5nIG1ldGhvZHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIHRoZSBzYW1lIG9wdGlvbnMgYXMgdG9Mb2NhbGVTdHJpbmdcclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG4gIF9wcm90by5yZXNvbHZlZExvY2FsZU9wdHMgPSBmdW5jdGlvbiByZXNvbHZlZExvY2FsZU9wdHMob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX0Zvcm1hdHRlciRjcmVhdGUkcmVzID0gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykucmVzb2x2ZWRPcHRpb25zKHRoaXMpLFxuICAgICAgICBsb2NhbGUgPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBjYWxlbmRhciA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5jYWxlbmRhcjtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IGNhbGVuZGFyXG4gICAgfTtcbiAgfTsgLy8gVFJBTlNGT1JNXG5cbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIFVUQy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqXHJcbiAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgc2V0Wm9uZX0oJ3V0YycpXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBvcHRpb25hbGx5LCBhbiBvZmZzZXQgZnJvbSBVVEMgaW4gbWludXRlc1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cz17fV0gLSBvcHRpb25zIHRvIHBhc3MgdG8gYHNldFpvbmUoKWBcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by50b1VUQyA9IGZ1bmN0aW9uIHRvVVRDKG9mZnNldCwgb3B0cykge1xuICAgIGlmIChvZmZzZXQgPT09IHZvaWQgMCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KSwgb3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byB0aGUgaG9zdCdzIGxvY2FsIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEVxdWl2YWxlbnQgdG8gYHNldFpvbmUoJ2xvY2FsJylgXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9Mb2NhbCA9IGZ1bmN0aW9uIHRvTG9jYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShuZXcgTG9jYWxab25lKCkpO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gc3BlY2lmaWVkIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBzZXR0ZXIga2VlcHMgdGhlIHVuZGVybHlpbmcgdGltZSB0aGUgc2FtZSAoYXMgaW4sIHRoZSBzYW1lIFVUQyB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgdG9Mb2NhbH0gYW5kIHtAbGluayB0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBhIHpvbmUgaWRlbnRpZmllci4gQXMgYSBzdHJpbmcsIHRoYXQgY2FuIGJlIGFueSBJQU5BIHpvbmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IGVudmlyb25tZW50LCBvciBhIGZpeGVkLW9mZnNldCBuYW1lIG9mIHRoZSBmb3JtICd1dGMrMycsIG9yIHRoZSBzdHJpbmdzICdsb2NhbCcgb3IgJ3V0YycuIFlvdSBtYXkgYWxzbyBzdXBwbHkgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgWm9uZX0gY2xhc3MuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zZXRab25lID0gZnVuY3Rpb24gc2V0Wm9uZSh6b25lLCBfdGVtcCkge1xuICAgIHZhciBfcmVmMyA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBfcmVmMyRrZWVwTG9jYWxUaW1lID0gX3JlZjMua2VlcExvY2FsVGltZSxcbiAgICAgICAga2VlcExvY2FsVGltZSA9IF9yZWYzJGtlZXBMb2NhbFRpbWUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjMka2VlcExvY2FsVGltZSxcbiAgICAgICAgX3JlZjMka2VlcENhbGVuZGFyVGltID0gX3JlZjMua2VlcENhbGVuZGFyVGltZSxcbiAgICAgICAga2VlcENhbGVuZGFyVGltZSA9IF9yZWYzJGtlZXBDYWxlbmRhclRpbSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRrZWVwQ2FsZW5kYXJUaW07XG5cbiAgICB6b25lID0gbm9ybWFsaXplWm9uZSh6b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG5cbiAgICBpZiAoem9uZS5lcXVhbHModGhpcy56b25lKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmICghem9uZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3VFMgPSBrZWVwTG9jYWxUaW1lIHx8IGtlZXBDYWxlbmRhclRpbWUgLy8ga2VlcENhbGVuZGFyVGltZSBpcyB0aGUgZGVwcmVjYXRlZCBuYW1lIGZvciBrZWVwTG9jYWxUaW1lXG4gICAgICA/IHRoaXMudHMgKyAodGhpcy5vIC0gem9uZS5vZmZzZXQodGhpcy50cykpICogNjAgKiAxMDAwIDogdGhpcy50cztcbiAgICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHtcbiAgICAgICAgdHM6IG5ld1RTLFxuICAgICAgICB6b25lOiB6b25lXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvciBvdXRwdXRDYWxlbmRhci4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIC0gdGhlIHByb3BlcnRpZXMgdG8gc2V0XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8ucmVjb25maWd1cmUgPSBmdW5jdGlvbiByZWNvbmZpZ3VyZShfdGVtcDIpIHtcbiAgICB2YXIgX3JlZjQgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNC5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0Lm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmNC5vdXRwdXRDYWxlbmRhcjtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IG91dHB1dENhbGVuZGFyXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywge1xuICAgICAgbG9jOiBsb2NcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogSnVzdCBhIGNvbnZlbmllbnQgYWxpYXMgZm9yIHJlY29uZmlndXJlKHsgbG9jYWxlIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnNldExvY2FsZSgnZW4tR0InKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnNldExvY2FsZSA9IGZ1bmN0aW9uIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZVxuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogWW91IGNhbiBvbmx5IHNldCB1bml0cyB3aXRoIHRoaXMgbWV0aG9kOyBmb3IgXCJzZXR0aW5nXCIgbWV0YWRhdGEsIHNlZSB7QGxpbmsgcmVjb25maWd1cmV9IGFuZCB7QGxpbmsgc2V0Wm9uZX0uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxyXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IGhvdXI6IDgsIG1pbnV0ZTogMzAgfSlcclxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB3ZWVrZGF5OiA1IH0pXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIG5vcm1hbGl6ZVVuaXQpLFxuICAgICAgICBzZXR0aW5nV2Vla1N0dWZmID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla1llYXIpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtOdW1iZXIpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtkYXkpO1xuICAgIHZhciBtaXhlZDtcblxuICAgIGlmIChzZXR0aW5nV2Vla1N0dWZmKSB7XG4gICAgICBtaXhlZCA9IHdlZWtUb0dyZWdvcmlhbihPYmplY3QuYXNzaWduKGdyZWdvcmlhblRvV2Vlayh0aGlzLmMpLCBub3JtYWxpemVkKSk7XG4gICAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSkge1xuICAgICAgbWl4ZWQgPSBvcmRpbmFsVG9HcmVnb3JpYW4oT2JqZWN0LmFzc2lnbihncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKSwgbm9ybWFsaXplZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy50b09iamVjdCgpLCBub3JtYWxpemVkKTsgLy8gaWYgd2UgZGlkbid0IHNldCB0aGUgZGF5IGJ1dCB3ZSBlbmRlZCB1cCBvbiBhbiBvdmVyZmxvdyBkYXRlLFxuICAgICAgLy8gdXNlIHRoZSBsYXN0IGRheSBvZiB0aGUgcmlnaHQgbW9udGhcblxuICAgICAgaWYgKGlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSkge1xuICAgICAgICBtaXhlZC5kYXkgPSBNYXRoLm1pbihkYXlzSW5Nb250aChtaXhlZC55ZWFyLCBtaXhlZC5tb250aCksIG1peGVkLmRheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9vYmpUb1RTMyA9IG9ialRvVFMobWl4ZWQsIHRoaXMubywgdGhpcy56b25lKSxcbiAgICAgICAgdHMgPSBfb2JqVG9UUzNbMF0sXG4gICAgICAgIG8gPSBfb2JqVG9UUzNbMV07XG5cbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7XG4gICAgICB0czogdHMsXG4gICAgICBvOiBvXG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIEFkZCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXHJcbiAgICpcclxuICAgKiBBZGRpbmcgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG9yIG1pbGxpc2Vjb25kcyBpbmNyZWFzZXMgdGhlIHRpbWVzdGFtcCBieSB0aGUgcmlnaHQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gQWRkaW5nIGRheXMsIG1vbnRocywgb3IgeWVhcnMgc2hpZnRzIHRoZSBjYWxlbmRhciwgYWNjb3VudGluZyBmb3IgRFNUcyBhbmQgbGVhcCB5ZWFycyBhbG9uZyB0aGUgd2F5LiBUaHVzLCBgZHQucGx1cyh7IGhvdXJzOiAyNCB9KWAgbWF5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCB0aW1lIHRoYW4gYGR0LnBsdXMoeyBkYXlzOiAxIH0pYCBpZiB0aGVyZSdzIGEgRFNUIHNoaWZ0IGluIGJldHdlZW4uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cygxMjMpIC8vfj4gaW4gMTIzIG1pbGxpc2Vjb25kc1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cyh7IG1pbnV0ZXM6IDE1IH0pIC8vfj4gaW4gMTUgbWludXRlc1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cyh7IGRheXM6IDEgfSkgLy9+PiB0aGlzIHRpbWUgdG9tb3Jyb3dcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBkYXlzOiAtMSB9KSAvL34+IHRoaXMgdGltZSB5ZXN0ZXJkYXlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBob3VyczogMywgbWludXRlczogMTMgfSkgLy9+PiBpbiAxIGhyLCAxMyBtaW5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSkgLy9+PiBpbiAxIGhyLCAxMyBtaW5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by5wbHVzID0gZnVuY3Rpb24gcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywgYWRqdXN0VGltZSh0aGlzLCBkdXIpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogU3VidHJhY3QgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqIFNlZSB7QGxpbmsgcGx1c31cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgKi9cblxuXG4gIF9wcm90by5taW51cyA9IGZ1bmN0aW9uIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKS5uZWdhdGUoKTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHVuaXQgb2YgdGltZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIFRoZSB1bml0IHRvIGdvIHRvIHRoZSBiZWdpbm5pbmcgb2YuIENhbiBiZSAneWVhcicsICdtb250aCcsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCdtb250aCcpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAzLTAxJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ3llYXInKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMS0wMSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignZGF5JykudG9JU09UaW1lKCk7IC8vPT4gJzAwOjAwLjAwMC0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignaG91cicpLnRvSVNPVGltZSgpOyAvLz0+ICcwNTowMDowMC4wMDAtMDU6MDAnXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc3RhcnRPZiA9IGZ1bmN0aW9uIHN0YXJ0T2YodW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbyA9IHt9LFxuICAgICAgICBub3JtYWxpemVkVW5pdCA9IER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCk7XG5cbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRVbml0KSB7XG4gICAgICBjYXNlIFwieWVhcnNcIjpcbiAgICAgICAgby5tb250aCA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJxdWFydGVyc1wiOlxuICAgICAgY2FzZSBcIm1vbnRoc1wiOlxuICAgICAgICBvLmRheSA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJ3ZWVrc1wiOlxuICAgICAgY2FzZSBcImRheXNcIjpcbiAgICAgICAgby5ob3VyID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcImhvdXJzXCI6XG4gICAgICAgIG8ubWludXRlID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcIm1pbnV0ZXNcIjpcbiAgICAgICAgby5zZWNvbmQgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwic2Vjb25kc1wiOlxuICAgICAgICBvLm1pbGxpc2Vjb25kID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJtaWxsaXNlY29uZHNcIjpcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVW5pdEVycm9yKHVuaXQpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkVW5pdCA9PT0gXCJ3ZWVrc1wiKSB7XG4gICAgICBvLndlZWtkYXkgPSAxO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkVW5pdCA9PT0gXCJxdWFydGVyc1wiKSB7XG4gICAgICB2YXIgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBlbmQgKGkuZS4gdGhlIGxhc3QgbWlsbGlzZWNvbmQpIG9mIGEgdW5pdCBvZiB0aW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgZW5kIG9mLiBDYW4gYmUgJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsIG9yICdtaWxsaXNlY29uZCcuXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ21vbnRoJykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0zMVQyMzo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3llYXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTEyLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2RheScpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMjM6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignaG91cicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMDU6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmVuZE9mID0gZnVuY3Rpb24gZW5kT2YodW5pdCkge1xuICAgIHZhciBfdGhpcyRzdGFydE9mJHBsdXM7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zdGFydE9mKHVuaXQpLnBsdXMoKF90aGlzJHN0YXJ0T2YkcGx1cyA9IHt9LCBfdGhpcyRzdGFydE9mJHBsdXNbdW5pdF0gPSAxLCBfdGhpcyRzdGFydE9mJHBsdXMpKS5taW51cygxKSA6IHRoaXM7XG4gIH07IC8vIE9VVFBVVFxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiAqKllvdSBtYXkgbm90IHdhbnQgdGhpcy4qKiBTZWUge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3IgYSBtb3JlIGZsZXhpYmxlIGZvcm1hdHRpbmcgdG9vbC4gRm9yIGEgdGFibGUgb2YgdG9rZW5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHNlZSBbaGVyZV0oaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uL2RvY3MvbWFudWFsL2Zvcm1hdHRpbmcuaHRtbCN0YWJsZS1vZi10b2tlbnMpLlxyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZS5cclxuICAgKiBAc2VlIGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi9kb2NzL21hbnVhbC9mb3JtYXR0aW5nLmh0bWwjdGFibGUtb2YtdG9rZW5zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRzIHRvIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgQXByIDIyJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuc2V0TG9jYWxlKCdmcicpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgYXZyLiAyMidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcsIHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiAnMjAxNyBhdnIuIDIyJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Gb3JtYXQoXCJISCAnaG91cnMgYW5kJyBtbSAnbWludXRlcydcIikgLy89PiAnMjAgaG91cnMgYW5kIDU1IG1pbnV0ZXMnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4ob3B0cykpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRCQyO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgbG9jYWxpemVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBkYXRlLiBBY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgdGhlIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3IgYW5kIGFueSBwcmVzZXRzIGRlZmluZWQgYnkgTHV4b24sIHN1Y2ggYXMgYERhdGVUaW1lLkRBVEVfRlVMTGAgb3IgYERhdGVUaW1lLlRJTUVfU0lNUExFYC5cclxuICAgKiBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgYnJvd3Nlci1zcGVjaWZpYywgYnV0IGluIGdlbmVyYWwgaXQgd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24uXHJcbiAgICogb2YgdGhlIERhdGVUaW1lIGluIHRoZSBhc3NpZ25lZCBsb2NhbGUuXHJcbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdFxyXG4gICAqIEBwYXJhbSBvcHRzIHtPYmplY3R9IC0gSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBvcHRpb25zIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5zZXRMb2NhbGUoJ2VuLWdiJykudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiAnMjAvMDQvMjAxNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHsgbG9jYWxlOiBcImVuLWdiXCIgfSk7IC8vPT4gJzIwLzA0LzIwMTcnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX0ZVTEwpOyAvLz0+ICdBcHJpbCAyMCwgMjAxNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfU0lNUExFKTsgLy89PiAnMTE6MzIgQU0nXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFVElNRV9TSE9SVCk7IC8vPT4gJzQvMjAvMjAxNywgMTE6MzIgQU0nXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyh7d2Vla2RheTogJ2xvbmcnLCBtb250aDogJ2xvbmcnLCBkYXk6ICcyLWRpZ2l0J30pOyAvLz0+ICdUaHUsIEFwciAyMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHt3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnfSk7IC8vPT4gJ1RodSwgQXByIDIwLCAxMToyNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHtob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnfSk7IC8vPT4gJzExOjMyJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0gREFURV9TSE9SVDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcykgOiBJTlZBTElEJDI7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZm9ybWF0IFwicGFydHNcIiwgaS5lLiBpbmRpdmlkdWFsIHRva2VucyBhbG9uZyB3aXRoIG1ldGFkYXRhLiBUaGlzIGlzIGFsbG93cyBjYWxsZXJzIHRvIHBvc3QtcHJvY2VzcyBpbmRpdmlkdWFsIHNlY3Rpb25zIG9mIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LlxyXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXQvZm9ybWF0VG9QYXJ0c1xyXG4gICAqIEBwYXJhbSBvcHRzIHtPYmplY3R9IC0gSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBvcHRpb25zLCBzYW1lIGFzIGB0b0xvY2FsZVN0cmluZ2AuXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZygpOyAvLz0+IFtcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdkYXknLCB2YWx1ZTogJzI1JyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbW9udGgnLCB2YWx1ZTogJzA1JyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAneWVhcicsIHZhbHVlOiAnMTk4MicgfVxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiBdXHJcbiAgICovXG5cblxuICBfcHJvdG8udG9Mb2NhbGVQYXJ0cyA9IGZ1bmN0aW9uIHRvTG9jYWxlUGFydHMob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKSA6IFtdO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NNaWxsaXNlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU08oKSAvLz0+ICcxOTgyLTA1LTI1VDAwOjAwOjAwLjAwMFonXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0lTTygpIC8vPT4gJzIwMTctMDQtMjJUMjA6NDc6MDUuMzM1LTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9JU08oeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNSdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9JU08gPSBmdW5jdGlvbiB0b0lTTyhvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0lTT0RhdGUoKSArIFwiVFwiICsgdGhpcy50b0lTT1RpbWUob3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSVNPRGF0ZSA9IGZ1bmN0aW9uIHRvSVNPRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwieXl5eS1NTS1kZFwiKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB3ZWVrIGRhdGVcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0lTT1dlZWtEYXRlID0gZnVuY3Rpb24gdG9JU09XZWVrRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwia2tray0nVydXVy1jXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHRpbWUgY29tcG9uZW50XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuaG91cig3KS5taW51dGUoMzQpLnRvSVNPVGltZSgpIC8vPT4gJzA3OjM0OjE5LjM2MVonXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuaG91cig3KS5taW51dGUoMzQpLnRvSVNPVGltZSh7IHN1cHByZXNzU2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcwNzozNFonXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSVNPVGltZSA9IGZ1bmN0aW9uIHRvSVNPVGltZShfdGVtcDMpIHtcbiAgICB2YXIgX3JlZjUgPSBfdGVtcDMgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAzLFxuICAgICAgICBfcmVmNSRzdXBwcmVzc01pbGxpc2UgPSBfcmVmNS5zdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBfcmVmNSRzdXBwcmVzc01pbGxpc2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjUkc3VwcHJlc3NNaWxsaXNlLFxuICAgICAgICBfcmVmNSRzdXBwcmVzc1NlY29uZHMgPSBfcmVmNS5zdXBwcmVzc1NlY29uZHMsXG4gICAgICAgIHN1cHByZXNzU2Vjb25kcyA9IF9yZWY1JHN1cHByZXNzU2Vjb25kcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNSRzdXBwcmVzc1NlY29uZHMsXG4gICAgICAgIF9yZWY1JGluY2x1ZGVPZmZzZXQgPSBfcmVmNS5pbmNsdWRlT2Zmc2V0LFxuICAgICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZjUkaW5jbHVkZU9mZnNldCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWY1JGluY2x1ZGVPZmZzZXQ7XG5cbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7XG4gICAgICBzdXBwcmVzc1NlY29uZHM6IHN1cHByZXNzU2Vjb25kcyxcbiAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzOiBzdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgIGluY2x1ZGVPZmZzZXQ6IGluY2x1ZGVPZmZzZXRcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBSRkMgMjgyMi1jb21wYXRpYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lLCBhbHdheXMgaW4gVVRDXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1JGQzI4MjIoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwICswMDAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1JGQzI4MjIoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIC0wNDAwJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1JGQzI4MjIgPSBmdW5jdGlvbiB0b1JGQzI4MjIoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBIVFRQIGhlYWRlcnMuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgc3RyaW5nIGNvbmZvcm1zIHRvIFJGQyAxMTIzLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIEdNVCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMsIDE5KS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDE5OjAwOjAwIEdNVCdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9IVFRQID0gZnVuY3Rpb24gdG9IVFRQKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcy50b1VUQygpLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgJ0dNVCdcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1NRTERhdGUoKSAvLz0+ICcyMDE0LTA3LTEzJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NRTERhdGUgPSBmdW5jdGlvbiB0b1NRTERhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcInl5eXktTU0tZGRcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlWm9uZT1mYWxzZV0gLSBpbmNsdWRlIHRoZSB6b25lLCBzdWNoIGFzICdBbWVyaWNhL05ld19Zb3JrJy4gT3ZlcmlkZXMgaW5jbHVkZU9mZnNldC5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSAtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSBBbWVyaWNhL05ld19Zb3JrJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NRTFRpbWUgPSBmdW5jdGlvbiB0b1NRTFRpbWUoX3RlbXA0KSB7XG4gICAgdmFyIF9yZWY2ID0gX3RlbXA0ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNCxcbiAgICAgICAgX3JlZjYkaW5jbHVkZU9mZnNldCA9IF9yZWY2LmluY2x1ZGVPZmZzZXQsXG4gICAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmNiRpbmNsdWRlT2Zmc2V0ID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZjYkaW5jbHVkZU9mZnNldCxcbiAgICAgICAgX3JlZjYkaW5jbHVkZVpvbmUgPSBfcmVmNi5pbmNsdWRlWm9uZSxcbiAgICAgICAgaW5jbHVkZVpvbmUgPSBfcmVmNiRpbmNsdWRlWm9uZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNiRpbmNsdWRlWm9uZTtcblxuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHtcbiAgICAgIGluY2x1ZGVPZmZzZXQ6IGluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlWm9uZTogaW5jbHVkZVpvbmUsXG4gICAgICBzcGFjZVpvbmU6IHRydWVcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlWm9uZT1mYWxzZV0gLSBpbmNsdWRlIHRoZSB6b25lLCBzdWNoIGFzICdBbWVyaWNhL05ld19Zb3JrJy4gT3ZlcnJpZGVzIGluY2x1ZGVPZmZzZXQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBaJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1NRTCgpIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIC0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlWm9uZTogdHJ1ZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBBbWVyaWNhL05ld19Zb3JrJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NRTCA9IGZ1bmN0aW9uIHRvU1FMKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvU1FMRGF0ZSgpICsgXCIgXCIgKyB0aGlzLnRvU1FMVGltZShvcHRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0lTTygpIDogSU5WQUxJRCQyO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS4gQWxpYXMgb2Yge0BsaW5rIHRvTWlsbGlzfVxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by52YWx1ZU9mID0gZnVuY3Rpb24gdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9NaWxsaXMgPSBmdW5jdGlvbiB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTjtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLlxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NlY29uZHMgPSBmdW5jdGlvbiB0b1NlY29uZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgLyAxMDAwIDogTmFOO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBKU09OLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvQlNPTiA9IGZ1bmN0aW9uIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCB0aGlzIERhdGVUaW1lJ3MgeWVhciwgbW9udGgsIGRheSwgYW5kIHNvIG9uLlxyXG4gICAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXI6IDIwMTcsIG1vbnRoOiA0LCBkYXk6IDIyLCBob3VyOiAyMCwgbWludXRlOiA0OSwgc2Vjb25kOiA0MiwgbWlsbGlzZWNvbmQ6IDI2OCB9XHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvT2JqZWN0ID0gZnVuY3Rpb24gdG9PYmplY3Qob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuICAgIHZhciBiYXNlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jKTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2Uub3V0cHV0Q2FsZW5kYXIgPSB0aGlzLm91dHB1dENhbGVuZGFyO1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEphdmFzY3JpcHQgRGF0ZSBlcXVpdmFsZW50IHRvIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogQHJldHVybiB7RGF0ZX1cclxuICAgKi9cblxuXG4gIF9wcm90by50b0pTRGF0ZSA9IGZ1bmN0aW9uIHRvSlNEYXRlKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIDogTmFOKTtcbiAgfTsgLy8gQ09NUEFSRVxuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBEYXRlVGltZXMgYXMgYSBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIERhdGVUaW1lIHRvIGNvbXBhcmUgdGhpcyBvbmUgdG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3VuaXQ9WydtaWxsaXNlY29uZHMnXV0gLSB0aGUgdW5pdCBvciBhcnJheSBvZiB1bml0cyAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gaW5jbHVkZSBpbiB0aGUgZHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIHZhciBpMSA9IERhdGVUaW1lLmZyb21JU08oJzE5ODItMDUtMjVUMDk6NDUnKSxcclxuICAgKiAgICAgaTIgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgzLTEwLTE0VDEwOjMwJyk7XHJcbiAgICogaTIuZGlmZihpMSkudG9PYmplY3QoKSAvLz0+IHsgbWlsbGlzZWNvbmRzOiA0MzgwNzUwMDAwMCB9XHJcbiAgICogaTIuZGlmZihpMSwgJ2hvdXJzJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDEyMTY4Ljc1IH1cclxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LjAzMTI1IH1cclxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJywgJ2hvdXJzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LCBob3VyczogMC43NSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uZGlmZiA9IGZ1bmN0aW9uIGRpZmYob3RoZXJEYXRlVGltZSwgdW5pdCwgb3B0cykge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXJEYXRlVGltZS5pc1ZhbGlkKSByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWQgfHwgb3RoZXJEYXRlVGltZS5pbnZhbGlkKTtcblxuICAgIHZhciB1bml0cyA9IG1heWJlQXJyYXkodW5pdCkubWFwKER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpLFxuICAgICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgICBlYXJsaWVyID0gb3RoZXJJc0xhdGVyID8gdGhpcyA6IG90aGVyRGF0ZVRpbWUsXG4gICAgICAgIGxhdGVyID0gb3RoZXJJc0xhdGVyID8gb3RoZXJEYXRlVGltZSA6IHRoaXMsXG4gICAgICAgIGRpZmZlZCA9IF9kaWZmKGVhcmxpZXIsIGxhdGVyLCB1bml0cywgb3B0cyk7XG5cbiAgICByZXR1cm4gb3RoZXJJc0xhdGVyID8gZGlmZmVkLm5lZ2F0ZSgpIDogZGlmZmVkO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXHJcbiAgICogU2VlIHtAbGluayBkaWZmfVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uZGlmZk5vdyA9IGZ1bmN0aW9uIGRpZmZOb3codW5pdCwgb3B0cykge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kaWZmKERhdGVUaW1lLmxvY2FsKCksIHVuaXQsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgc3Bhbm5pbmcgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBlbmQgcG9pbnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8udW50aWwgPSBmdW5jdGlvbiB1bnRpbChvdGhlckRhdGVUaW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEludGVydmFsLmZyb21EYXRlVGltZXModGhpcywgb3RoZXJEYXRlVGltZSkgOiB0aGlzO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIERhdGVUaW1lIGlzIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZSBhcyBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuaGFzU2FtZShvdGhlckRULCAnZGF5Jyk7IC8vfj4gdHJ1ZSBpZiBib3RoIHRoZSBzYW1lIGNhbGVuZGFyIGRheVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uaGFzU2FtZSA9IGZ1bmN0aW9uIGhhc1NhbWUob3RoZXJEYXRlVGltZSwgdW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodW5pdCA9PT0gXCJtaWxsaXNlY29uZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaW5wdXRNcyA9IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0KSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gdGhpcy5lbmRPZih1bml0KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIEVxdWFsaXR5IGNoZWNrXHJcbiAgICogVHdvIERhdGVUaW1lcyBhcmUgZXF1YWwgaWZmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBoYXZlIHRoZSBzYW1lIHpvbmUgYW5kIGxvY2F0aW9uLCBhbmQgYXJlIGJvdGggdmFsaWQuXHJcbiAgICogVG8gY29tcGFyZSBqdXN0IHRoZSBtaWxsaXNlY29uZCB2YWx1ZXMsIHVzZSBgK2R0MSA9PT0gfmR0MmAuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXIgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgJiYgb3RoZXIuaXNWYWxpZCAmJiB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXIudmFsdWVPZigpICYmIHRoaXMuem9uZS5lcXVhbHMob3RoZXIuem9uZSkgJiYgdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWluIG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1pbiBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5taW4gPSBmdW5jdGlvbiBtaW4oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBpLnZhbHVlT2YoKTtcbiAgICB9LCBNYXRoLm1pbik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWF4IG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1heGltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1heCBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5tYXggPSBmdW5jdGlvbiBtYXgoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBkYXRlVGltZXMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWF4KTtcbiAgfTsgLy8gTUlTQ1xuXG4gIC8qKlxyXG4gICAqIEV4cGxhaW4gaG93IGEgc3RyaW5nIHdvdWxkIGJlIHBhcnNlZCBieSBmcm9tRm9ybWF0KClcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCB0aGUgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGluIChzZWUgZGVzY3JpcHRpb24pXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRha2VuIGJ5IGZyb21Gb3JtYXQoKVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluID0gZnVuY3Rpb24gZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICAgIF9vcHRpb25zJGxvY2FsZSA9IF9vcHRpb25zLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdGlvbnMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX29wdGlvbnMkbG9jYWxlLFxuICAgICAgICBfb3B0aW9ucyRudW1iZXJpbmdTeXMgPSBfb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9vcHRpb25zJG51bWJlcmluZ1N5cyA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRpb25zJG51bWJlcmluZ1N5cyxcbiAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZVRvVXNlLCB0ZXh0LCBmbXQpO1xuICB9O1xuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVN0cmluZ0V4cGxhaW4gPSBmdW5jdGlvbiBmcm9tU3RyaW5nRXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyk7XG4gIH07IC8vIEZPUk1BVCBQUkVTRVRTXG5cbiAgLyoqXHJcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAxMC8xNC8xOTgzXHJcbiAgICogQHR5cGUge09iamVjdH1cclxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhEYXRlVGltZSwgW3tcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA9PT0gbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhpcyBEYXRlVGltZSBpcyBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZFJlYXNvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5yZWFzb24gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkRXhwbGFuYXRpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQuZXhwbGFuYXRpb24gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9jYWxlIG9mIGEgRGF0ZVRpbWUsIHN1Y2ggJ2VuLUdCJy4gVGhlIGxvY2FsZSBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIERhdGVUaW1lLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibnVtYmVyaW5nU3lzdGVtXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG91dHB1dCBjYWxlbmRhciBvZiBhIERhdGVUaW1lLCBzdWNoICdpc2xhbWljJy4gVGhlIG91dHB1dCBjYWxlbmRhciBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvdXRwdXRDYWxlbmRhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLm91dHB1dENhbGVuZGFyIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHRpbWUgem9uZS5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInpvbmVOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLm5hbWUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgeWVhclxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnllYXIgLy89PiAyMDE3XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ5ZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnllYXIgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBxdWFydGVyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucXVhcnRlciAvLz0+IDJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInF1YXJ0ZXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBNYXRoLmNlaWwodGhpcy5jLm1vbnRoIC8gMykgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtb250aCAoMS0xMikuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkubW9udGggLy89PiA1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5tb250aCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgbW9udGggKDEtMzBpc2gpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLmRheSAvLz0+IDI1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkYXlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaG91ciBvZiB0aGUgZGF5ICgwLTIzKS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5KS5ob3VyIC8vPT4gOVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaG91clwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWludXRlIG9mIHRoZSBob3VyICgwLTU5KS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCkubWludXRlIC8vPT4gMzBcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbnV0ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5taW51dGUgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSAoMC01OSkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzAsIDUyKS5zZWNvbmQgLy89PiA1MlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2Vjb25kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQgKDAtOTk5KS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIsIDY1NCkubWlsbGlzZWNvbmQgLy89PiA2NTRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbGxpc2Vjb25kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgd2VlayB5ZWFyXHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla1llYXIgLy89PiAyMDE1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla1llYXIgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB3ZWVrIG51bWJlciBvZiB0aGUgd2VlayB5ZWFyICgxLTUyaXNoKS5cclxuICAgICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLndlZWtOdW1iZXIgLy89PiAyMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla051bWJlclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla051bWJlciA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgd2Vlay5cclxuICAgICAqIDEgaXMgTW9uZGF5IGFuZCA3IGlzIFN1bmRheVxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMSwgMzEpLndlZWtkYXkgLy89PiA0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrZGF5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrZGF5IDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgb3JkaW5hbCAoaS5lLiB0aGUgZGF5IG9mIHRoZSB5ZWFyKVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm9yZGluYWwgLy89PiAxNDVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ8RGF0ZVRpbWV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9yZGluYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKS5vcmRpbmFsIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgbW9udGggbmFtZSwgc3VjaCBhcyAnT2N0Jy5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS5tb250aFNob3J0IC8vPT4gT2N0XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aFNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoXCJzaG9ydFwiLCB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdG9iZXInLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoTG9uZyAvLz0+IE9jdG9iZXJcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1vbnRoTG9uZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKFwibG9uZ1wiLCB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCB3ZWVrZGF5LCBzdWNoIGFzICdNb24nLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLndlZWtkYXlTaG9ydCAvLz0+IE1vblxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla2RheVNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cyhcInNob3J0XCIsIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyB3ZWVrZGF5LCBzdWNoIGFzICdNb25kYXknLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLndlZWtkYXlMb25nIC8vPT4gTW9uZGF5XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrZGF5TG9uZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ud2Vla2RheXMoXCJsb25nXCIsIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgVVRDIG9mZnNldCBvZiB0aGlzIERhdGVUaW1lIGluIG1pbnV0ZXNcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkub2Zmc2V0IC8vPT4gLTI0MFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkub2Zmc2V0IC8vPT4gMFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib2Zmc2V0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLm9mZnNldCh0aGlzLnRzKSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoZSB6b25lJ3MgY3VycmVudCBvZmZzZXQsIGZvciBleGFtcGxlIFwiRVNUXCIgb3IgXCJFRFRcIi5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib2Zmc2V0TmFtZVNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9uZyBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVhc3Rlcm4gU3RhbmRhcmQgVGltZVwiIG9yIFwiRWFzdGVybiBEYXlsaWdodCBUaW1lXCIuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9mZnNldE5hbWVMb25nXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiBcImxvbmdcIixcbiAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHdoZXRoZXIgdGhpcyB6b25lJ3Mgb2Zmc2V0IGV2ZXIgY2hhbmdlcywgYXMgaW4gYSBEU1QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNPZmZzZXRGaXhlZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuem9uZS51bml2ZXJzYWwgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyBpbiBhIERTVC5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc0luRFNUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc09mZnNldEZpeGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHtcbiAgICAgICAgICBtb250aDogMVxuICAgICAgICB9KS5vZmZzZXQgfHwgdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7XG4gICAgICAgICAgbW9udGg6IDVcbiAgICAgICAgfSkub2Zmc2V0O1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYpLmlzSW5MZWFwWWVhciAvLz0+IHRydWVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmlzSW5MZWFwWWVhciAvLz0+IGZhbHNlXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbkxlYXBZZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyBtb250aFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMykuZGF5c0luTW9udGggLy89PiAzMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGF5c0luTW9udGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5kYXlzSW5ZZWFyIC8vPT4gMzY2XHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkYXlzSW5ZZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZGF5c0luWWVhcih0aGlzLnllYXIpIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDA0KS53ZWVrc0luV2Vla1llYXIgLy89PiA1M1xyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndlZWtzSW5XZWVrWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHdlZWtzSW5XZWVrWWVhcih0aGlzLndlZWtZZWFyKSA6IE5hTjtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJEQVRFX1NIT1JUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURV9TSE9SVDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFX01FRFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVfTUVEO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFX0ZVTExcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFX0ZVTEw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnVHVlc2RheSwgT2N0b2JlciAxNCwgMTk4MydcclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVfSFVHRVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVfSFVHRTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV9TSU1QTEVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FX1NJTVBMRTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FX1dJVEhfU0VDT05EUztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfV0lUSF9TSE9SVF9PRkZTRVRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV9XSVRIX0xPTkdfT0ZGU0VUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV9XSVRIX0xPTkdfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FXzI0X1NJTVBMRVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfU0lNUExFO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FXzI0X1dJVEhfU0VDT05EU1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9TRUNPTkRTO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRWFzdGVybiBEYXlsaWdodCBUaW1lJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfU0hPUlRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9TSE9SVDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9NRURcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9NRUQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfRlVMTFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0ZVTEw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMDozMyBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpZGF5LCBPY3RvYmVyIDE0LCAxOTgzLCA5OjMwIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfSFVHRVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0hVR0U7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpZGF5LCBPY3RvYmVyIDE0LCAxOTgzLCA5OjMwOjMzIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRGF0ZVRpbWU7XG59KCk7XG5mdW5jdGlvbiBmcmllbmRseURhdGVUaW1lKGRhdGVUaW1laXNoKSB7XG4gIGlmIChEYXRlVGltZS5pc0RhdGVUaW1lKGRhdGVUaW1laXNoKSkge1xuICAgIHJldHVybiBkYXRlVGltZWlzaDtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaCAmJiBkYXRlVGltZWlzaC52YWx1ZU9mICYmIGlzTnVtYmVyKGRhdGVUaW1laXNoLnZhbHVlT2YoKSkpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggJiYgdHlwZW9mIGRhdGVUaW1laXNoID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21PYmplY3QoZGF0ZVRpbWVpc2gpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIlVua25vd24gZGF0ZXRpbWUgYXJndW1lbnQ6IFwiICsgZGF0ZVRpbWVpc2ggKyBcIiwgb2YgdHlwZSBcIiArIHR5cGVvZiBkYXRlVGltZWlzaCk7XG4gIH1cbn1cblxuZXhwb3J0cy5EYXRlVGltZSA9IERhdGVUaW1lO1xuZXhwb3J0cy5EdXJhdGlvbiA9IER1cmF0aW9uO1xuZXhwb3J0cy5JbnRlcnZhbCA9IEludGVydmFsO1xuZXhwb3J0cy5JbmZvID0gSW5mbztcbmV4cG9ydHMuWm9uZSA9IFpvbmU7XG5leHBvcnRzLkZpeGVkT2Zmc2V0Wm9uZSA9IEZpeGVkT2Zmc2V0Wm9uZTtcbmV4cG9ydHMuSUFOQVpvbmUgPSBJQU5BWm9uZTtcbmV4cG9ydHMuTG9jYWxab25lID0gTG9jYWxab25lO1xuZXhwb3J0cy5TZXR0aW5ncyA9IFNldHRpbmdzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHV4b24uanMubWFwXG4iXX0=
11928
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19jb29raWUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19lc3ZnLmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy9zcGFyay9faWNvbnMuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19tb2RhbC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3NlYXJjaC5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3NpZGViYXIuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL19zdGFjay5qcyIsImFwcC9hc3NldHMvamF2YXNjcmlwdHMvc3BhcmsvX3RyZWUuanMiLCJhcHAvYXNzZXRzL2phdmFzY3JpcHRzL3NwYXJrL3NoaW1zL19kYXRhc2V0LmpzIiwiYXBwL2Fzc2V0cy9qYXZhc2NyaXB0cy9zcGFyay9zcGFyay5qcyIsIm5vZGVfbW9kdWxlcy9iZWFuL2JlYW4uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9hZnRlci1hbmltYXRpb24uanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvYW5pbWF0aW9uLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9idWJibGUtZm9ybS1ldmVudHMuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvY2FsbGJhY2stbWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9kZWJvdW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9kZWxheS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9tZWRpYS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9wYWdlLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3JlcGVhdC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9yZXNpemUuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvc2Nyb2xsLmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtZXZlbnQvbGliL3NoaW1zL2N1c3RvbS1ldmVudC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi9zdWJtaXQuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS1ldmVudC9saWIvdGFwLWV2ZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLWV2ZW50L2xpYi90aHJvdHRsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvZ2dsZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBvc2UtdG9vbGJveC9saWIvZWFzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL2Zyb210b3AuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zY3JvbGx0by5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3NoaW1zL19jbGFzc2xpc3QuanMiLCJub2RlX21vZHVsZXMvY29tcG9zZS10b29sYm94L2xpYi9zaGltcy9fb2JqZWN0LmFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb3NlLXRvb2xib3gvbGliL3RpbWUuanMiLCJub2RlX21vZHVsZXMvY29va2llX2pzL2Nvb2tpZS5qcyIsIm5vZGVfbW9kdWxlcy9rZXltYXN0ZXIva2V5bWFzdGVyLmpzIiwibm9kZV9tb2R1bGVzL2x1eG9uL2J1aWxkL2Nqcy1icm93c2VyL2x1eG9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0YUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2d0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbk5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwidmFyIHRvb2xib3ggPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIGNvb2tpZSA9IHJlcXVpcmUoICdjb29raWVfanMnICkuY29va2llXG5cbmZ1bmN0aW9uIHVwZGF0ZSAoIGtleSwgZGF0YSwgb3B0aW9ucyApIHtcbiAgdmFyIG9sZF9kYXRhID0gZ2V0KCBrZXkgKVxuICBzZXQoIGtleSwgdG9vbGJveC5tZXJnZSggb2xkX2RhdGEsIGRhdGEpLCBvcHRpb25zIClcbn1cblxuZnVuY3Rpb24gZ2V0ICgga2V5ICkge1xuICB2YXIgZGF0YSA9IGNvb2tpZS5nZXQoIGtleSApXG4gIHJldHVybiBkYXRhID8gSlNPTi5wYXJzZSggZGF0YSkgOiB7fVxufVxuXG5mdW5jdGlvbiBzZXQgKCBrZXksIHZhbHVlLCBvcHRpb25zICkge1xuICBvcHRpb25zID0gdG9vbGJveC5tZXJnZSggeyBwYXRoOiAnLycgfSwgb3B0aW9ucyB8fCB7fSApXG4gIGNvb2tpZS5zZXQoIGtleSwgSlNPTi5zdHJpbmdpZnkoIHZhbHVlICksIG9wdGlvbnMgKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXQsXG4gIGdldDogZ2V0LFxuICB1cGRhdGU6IHVwZGF0ZVxufVxuIiwiKGZ1bmN0aW9uKCl7XG4gIHZhciBuYW1lc1xuXG4gIGZ1bmN0aW9uIGF0dHIoIHNvdXJjZSwgbmFtZSApe1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09ICdvYmplY3QnKVxuICAgICAgcmV0dXJuIG5hbWUrJz1cIicrc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSsnXCIgJ1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBuYW1lKyc9XCInK3NvdXJjZSsnXCIgJyB9XG5cbiAgZnVuY3Rpb24gZGFzaGVyaXplKCBpbnB1dCApIHtcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvW1xcVyxfXS9nLCAnLScpLnJlcGxhY2UoLy17Mix9L2csICctJylcbiAgfVxuXG4gIGZ1bmN0aW9uIHN2Z05hbWUoIG5hbWUgKSB7XG4gICAgcmV0dXJuIFwic3ZnLVwiK2Rhc2hlcml6ZSggbmFtZSApXG4gIH1cblxuICBmdW5jdGlvbiB1c2UoIG5hbWUsIG9wdGlvbnMgKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICB2YXIgaWQgPSBkYXNoZXJpemUoIG5hbWUgKVxuICAgIHZhciBzeW1ib2wgPSBzdmdzKClbaWRdXG5cbiAgICBpZiAoIHN5bWJvbCApIHtcbiAgICAgIHZhciBwYXJlbnQgPSBzeW1ib2wucGFyZW50RWxlbWVudFxuICAgICAgdmFyIHByZWZpeCA9IHBhcmVudC5kYXRhc2V0LnByZWZpeFxuICAgICAgdmFyIGJhc2UgICA9IHBhcmVudC5kYXRhc2V0LnN5bWJvbENsYXNzXG5cbiAgICAgIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCggJzxzdmc+PHVzZSB4bGluazpocmVmPVwiIycgKyBwcmVmaXggKyAnLScgKyBpZCArICdcIi8+PC9zdmc+JyApLmZpcnN0Q2hpbGQ7XG4gICAgICBzdmcuc2V0QXR0cmlidXRlKCAnY2xhc3MnLCBiYXNlICsgJyAnICsgcHJlZml4ICsgJy0nICsgaWQgKyAnICcgKyAoIG9wdGlvbnMuY2xhc3MgfHwgJycgKS50cmltKCkgKVxuICAgICAgc3ZnLnNldEF0dHJpYnV0ZSggJ3ZpZXdCb3gnLCBzeW1ib2wuZ2V0QXR0cmlidXRlKCAndmlld0JveCcgKSApXG5cbiAgICAgIGlmICggISggb3B0aW9ucy53aWR0aCB8fCBvcHRpb25zLmhlaWdodCB8fCBvcHRpb25zLnNjYWxlICkgKSB7XG5cbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAgc3ltYm9sLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSlcbiAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnaGVpZ2h0Jywgc3ltYm9sLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JykpXG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgaWYgKCBvcHRpb25zLndpZHRoICkgIHN2Zy5zZXRBdHRyaWJ1dGUoICd3aWR0aCcsICBvcHRpb25zLndpZHRoIClcbiAgICAgICAgaWYgKCBvcHRpb25zLmhlaWdodCApIHN2Zy5zZXRBdHRyaWJ1dGUoICdoZWlnaHQnLCBvcHRpb25zLmhlaWdodCApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdmdcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGZpbmQgXCInK25hbWUrJ1wiIHN2ZyBzeW1ib2wuIEVuc3VyZSB0aGF0IHN2ZyBzY3JpcHRzIGFyZSBsb2FkZWQnKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN2Z3MoKXtcbiAgICBpZiAoICFuYW1lcyApIHtcbiAgICAgIG5hbWVzID0ge31cbiAgICAgIHZhciBzeW1ib2xzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdzdmdbaWRePWVzdmddIHN5bWJvbCcgKSApXG4gICAgICBzeW1ib2xzLmZvckVhY2goIGZ1bmN0aW9uKCBzeW1ib2wgKSB7XG4gICAgICAgIG5hbWVzW3N5bWJvbC5kYXRhc2V0Lm5hbWVdID0gc3ltYm9sXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gbmFtZXNcbiAgfVxuXG4gIHZhciBlc3ZnID0ge1xuICAgIHN2Z3M6IHN2Z3MsXG4gICAgdXNlOiB1c2VcbiAgfVxuXG4gIC8vIEhhbmRsZSBUdXJib2xpbmtzIHBhZ2UgY2hhbmdlIGV2ZW50c1xuICBpZiAoIHdpbmRvdy5UdXJib2xpbmtzICkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwidHVyYm9saW5rczpsb2FkXCIsIGZ1bmN0aW9uKCBldmVudCApIHsgbmFtZXMgPSBudWxsOyBlc3ZnLnN2Z3MoKSB9KVxuICB9XG5cbiAgaWYoIHR5cGVvZiggbW9kdWxlICkgIT0gJ3VuZGVmaW5lZCcgKSB7IG1vZHVsZS5leHBvcnRzID0gZXN2ZyB9XG4gIGVsc2Ugd2luZG93LmVzdmcgPSBlc3ZnXG5cbn0pKCkiLCIoZnVuY3Rpb24oKXtcblxuICBmdW5jdGlvbiBlbWJlZCgpIHtcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNlc3ZnLXN2Zy1pY29ucycpKSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgJzxzdmcgaWQ9XCJlc3ZnLXN2Zy1pY29uc1wiIGRhdGEtc3ltYm9sLWNsYXNzPVwiaWNvblwiIGRhdGEtcHJlZml4PVwic3ZnXCIgdmVyc2lvbj1cIjEuMVwiIHN0eWxlPVwiaGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGVcIiBkYXRhLXR1cmJvbGlua3MtcGVybWFuZW50PjxkZWZzPjxjbGlwUGF0aCBpZD1cImRlZi1zdmctcXVlc3Rpb24tMFwiPjxyZWN0IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIGZpbGw9XCJ3aGl0ZVwiLz48L2NsaXBQYXRoPjwvZGVmcz48c3ltYm9sIGlkPVwic3ZnLWFkZFwiIGRhdGEtbmFtZT1cImFkZFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0wIDEyQzAgMTIuMzk3OCAwLjE1ODAzNSAxMi43Nzk0IDAuNDM5MzQgMTMuMDYwN0MwLjcyMDY0NCAxMy4zNDIgMS4xMDIxOCAxMy41IDEuNSAxMy41SDEwLjI1QzEwLjMxNjMgMTMuNSAxMC4zNzk5IDEzLjUyNjMgMTAuNDI2OCAxMy41NzMyQzEwLjQ3MzcgMTMuNjIwMSAxMC41IDEzLjY4MzcgMTAuNSAxMy43NVYyMi41QzEwLjUgMjIuODk3OCAxMC42NTggMjMuMjc5NCAxMC45MzkzIDIzLjU2MDdDMTEuMjIwNiAyMy44NDIgMTEuNjAyMiAyNCAxMiAyNEMxMi4zOTc4IDI0IDEyLjc3OTQgMjMuODQyIDEzLjA2MDcgMjMuNTYwN0MxMy4zNDIgMjMuMjc5NCAxMy41IDIyLjg5NzggMTMuNSAyMi41VjEzLjc1QzEzLjUgMTMuNjgzNyAxMy41MjYzIDEzLjYyMDEgMTMuNTczMiAxMy41NzMyQzEzLjYyMDEgMTMuNTI2MyAxMy42ODM3IDEzLjUgMTMuNzUgMTMuNUgyMi41QzIyLjg5NzggMTMuNSAyMy4yNzk0IDEzLjM0MiAyMy41NjA3IDEzLjA2MDdDMjMuODQyIDEyLjc3OTQgMjQgMTIuMzk3OCAyNCAxMkMyNCAxMS42MDIyIDIzLjg0MiAxMS4yMjA2IDIzLjU2MDcgMTAuOTM5M0MyMy4yNzk0IDEwLjY1OCAyMi44OTc4IDEwLjUgMjIuNSAxMC41SDEzLjc1QzEzLjY4MzcgMTAuNSAxMy42MjAxIDEwLjQ3MzcgMTMuNTczMiAxMC40MjY4QzEzLjUyNjMgMTAuMzc5OSAxMy41IDEwLjMxNjMgMTMuNSAxMC4yNVYxLjVDMTMuNSAxLjEwMjE4IDEzLjM0MiAwLjcyMDY0NCAxMy4wNjA3IDAuNDM5MzRDMTIuNzc5NCAwLjE1ODAzNSAxMi4zOTc4IDAgMTIgMEMxMS42MDIyIDAgMTEuMjIwNiAwLjE1ODAzNSAxMC45MzkzIDAuNDM5MzRDMTAuNjU4IDAuNzIwNjQ0IDEwLjUgMS4xMDIxOCAxMC41IDEuNVYxMC4yNUMxMC41IDEwLjMxNjMgMTAuNDczNyAxMC4zNzk5IDEwLjQyNjggMTAuNDI2OEMxMC4zNzk5IDEwLjQ3MzcgMTAuMzE2MyAxMC41IDEwLjI1IDEwLjVIMS41QzEuMTAyMTggMTAuNSAwLjcyMDY0NCAxMC42NTggMC40MzkzNCAxMC45MzkzQzAuMTU4MDM1IDExLjIyMDYgMCAxMS42MDIyIDAgMTJIMFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1hZG1pbi11c2VyXCIgZGF0YS1uYW1lPVwiYWRtaW4tdXNlclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xMy4wMTkgMTYuNUMxMy4wMTkgMTYuMjM0OCAxMi45MTM2IDE1Ljk4MDQgMTIuNzI2MSAxNS43OTI5QzEyLjUzODYgMTUuNjA1NCAxMi4yODQyIDE1LjUgMTIuMDE5IDE1LjVIOC4xMDVDOC4wNDg5NCAxNS41MDA2IDcuOTk0MzUgMTUuNDgyMSA3Ljk1MDE5IDE1LjQ0NzZDNy45MDYwMyAxNS40MTMxIDcuODc0OTMgMTUuMzY0NSA3Ljg2MiAxNS4zMUM3LjYyMDY2IDE0LjIyMzMgNy41MDE1OSAxMy4xMTMxIDcuNTA3IDEyQzcuNTA1MjcgMTEuMDYwOCA3LjU5MDI5IDEwLjEyMzUgNy43NjEgOS4yQzcuNzczMjIgOS4xNDI5NSA3LjgwNDc4IDkuMDkxODggNy44NTAzNCA5LjA1NTQzQzcuODk1OSA5LjAxODk4IDcuOTUyNjYgOC45OTk0IDguMDExIDlDMTguODg0IDkgMjEuNTY2IDkuMDA4IDIyLjI5MSA4Ljk4MkMyMi40NTM2IDguOTkxNjYgMjIuNjE1OCA4Ljk1ODc0IDIyLjc2MTggOC44ODY0OUMyMi45MDc3IDguODE0MjUgMjMuMDMyMyA4LjcwNTE4IDIzLjEyMzIgOC41NzAwNkMyMy4yMTQgOC40MzQ5NCAyMy4yNjgxIDguMjc4NDQgMjMuMjggOC4xMTYwNEMyMy4yOTE5IDcuOTUzNjMgMjMuMjYxMiA3Ljc5MDkyIDIzLjE5MSA3LjY0NEMyMi4zMTY4IDUuMzc3NDQgMjAuNzcyMSAzLjQzMTQyIDE4Ljc2MyAyLjA2NTYyQzE2Ljc1NCAwLjY5OTgzMSAxNC4zNzYyIC0wLjAyMDc2NDcgMTEuOTQ3IDEuNjU2MjRlLTA2QzguODI3NzYgMC4wNzQyNjU0IDUuODU0NjcgMS4zMzcxNCAzLjYzNTUzIDMuNTMwNDRDMS40MTYzOCA1LjcyMzc1IDAuMTE4Nzg0IDguNjgxODQgMC4wMDc5OTg1NSAxMS44Qy0wLjA1MDY1NTcgMTQuOTI2NyAxLjExNjMyIDE3Ljk1MjIgMy4yNTk0IDIwLjIyOTZDNS40MDI0NyAyMi41MDcxIDguMzUxNTQgMjMuODU1NyAxMS40NzYgMjMuOTg3SDExLjUyQzExLjc2MTggMjMuOTg3NCAxMS45OTU1IDIzLjkwMDEgMTIuMTc3OSAyMy43NDE0QzEyLjM2MDMgMjMuNTgyNyAxMi40NzkgMjMuMzYzMyAxMi41MTIxIDIzLjEyMzhDMTIuNTQ1MiAyMi44ODQyIDEyLjQ5MDMgMjIuNjQwOSAxMi4zNTc4IDIyLjQzODdDMTIuMjI1MiAyMi4yMzY1IDEyLjAyMzggMjIuMDg5MiAxMS43OTEgMjIuMDI0QzExLjU5NCAyMS45NTcxIDExLjQyNDYgMjEuODI3IDExLjMwOSAyMS42NTRDMTAuMzgxOSAyMC40NDYgOS41MzI4NyAxOS4xODAxIDguNzY3IDE3Ljg2NEM4Ljc0NjgyIDE3LjgyNTkgOC43MzY4NCAxNy43ODMyIDguNzM4MDIgMTcuNzQwMUM4LjczOTIxIDE3LjY5NyA4Ljc1MTUyIDE3LjY1NSA4Ljc3Mzc2IDE3LjYxOEM4Ljc5NjAxIDE3LjU4MTEgOC44Mjc0MiAxNy41NTA1IDguODY0OTYgMTcuNTI5M0M4LjkwMjUgMTcuNTA4MSA4Ljk0NDg4IDE3LjQ5NyA4Ljk4OCAxNy40OTdIMTIuMDE5QzEyLjI4MzcgMTcuNDk3IDEyLjUzNzYgMTcuMzkyMSAxMi43MjUgMTcuMjA1MkMxMi45MTI1IDE3LjAxODMgMTMuMDE4MiAxNi43NjQ3IDEzLjAxOSAxNi41Wk01LjggMTUuMkM1LjgwNzYxIDE1LjIzNjMgNS44MDY5OSAxNS4yNzM5IDUuNzk4MTggMTUuMzFDNS43ODkzOCAxNS4zNDYxIDUuNzcyNjMgMTUuMzc5NyA1Ljc0OTE0IDE1LjQwODVDNS43MjU2NSAxNS40MzczIDUuNjk2MDIgMTUuNDYwNCA1LjY2MjQzIDE1LjQ3NjJDNS42Mjg4NCAxNS40OTIxIDUuNTkyMTMgMTUuNTAwMiA1LjU1NSAxNS41SDIuODE4QzIuNzY2MjQgMTUuNDk5OSAyLjcxNTc5IDE1LjQ4MzggMi42NzM1NCAxNS40NTM5QzIuNjMxMjkgMTUuNDI0IDIuNTk5MzIgMTUuMzgxOCAyLjU4MiAxNS4zMzNDMS44NzgxIDEzLjM1MTIgMS44MTg5NSAxMS4xOTc1IDIuNDEzIDkuMThDMi40MjgyOSA5LjEyODE2IDIuNDU5OTEgOS4wODI2MyAyLjUwMzE1IDkuMDUwMkMyLjU0NjM5IDkuMDE3NzcgMi41OTg5NSA5LjAwMDE2IDIuNjUzIDlINS40NkM1LjQ5NTkzIDkuMDAwMzUgNS41MzEzNyA5LjAwODM3IDUuNTYzOTUgOS4wMjM1NEM1LjU5NjUyIDkuMDM4NyA1LjYyNTQ4IDkuMDYwNjYgNS42NDg4NyA5LjA4Nzk0QzUuNjcyMjYgOS4xMTUyMSA1LjY4OTU1IDkuMTQ3MTcgNS42OTk1OCA5LjE4MTY4QzUuNzA5NiA5LjIxNjE5IDUuNzEyMTMgOS4yNTI0NCA1LjcwNyA5LjI4OEM1LjU3MTYzIDEwLjE4NTYgNS41MDQ3NyAxMS4wOTIyIDUuNTA3IDEyQzUuNTA0MTkgMTMuMDczNSA1LjYwMjI5IDE0LjE0NDkgNS44IDE1LjJWMTUuMlpNMTEuODU5IDIuMjdDMTEuOTAxNSAyLjIzOTc3IDExLjk1MjMgMi4yMjM1MyAxMi4wMDQ1IDIuMjIzNTNDMTIuMDU2NiAyLjIyMzUzIDEyLjEwNzUgMi4yMzk3NyAxMi4xNSAyLjI3QzEzLjY1MjkgMy4zOTMwNyAxNC44MTU4IDQuOTEwMDIgMTUuNTEgNi42NTNDMTUuNTI2IDYuNjkxMDUgMTUuNTMyNCA2LjczMjQ4IDE1LjUyODUgNi43NzM1OEMxNS41MjQ2IDYuODE0NjggMTUuNTEwNiA2Ljg1NDE3IDE1LjQ4NzcgNi44ODg1NEMxNS40NjQ4IDYuOTIyOSAxNS40MzM4IDYuOTUxMDcgMTUuMzk3NCA2Ljk3MDUyQzE1LjM2MDkgNi45ODk5NyAxNS4zMjAzIDcuMDAwMSAxNS4yNzkgN0g4LjcyOUM4LjY4Nzk5IDcuMDAwMTQgOC42NDc2IDYuOTkwMDYgOC42MTE0NiA2Ljk3MDY4QzguNTc1MzIgNi45NTEzIDguNTQ0NTggNi45MjMyMyA4LjUyMiA2Ljg4OUM4LjQ5OTA5IDYuODU0NTUgOC40ODUwOSA2LjgxNDk2IDguNDgxMjUgNi43NzM3N0M4LjQ3NzQxIDYuNzMyNTkgOC40ODM4NSA2LjY5MTA5IDguNSA2LjY1M0M5LjE4OTEgNC45MDczOSAxMC4zNTI2IDMuMzg5MjQgMTEuODU5IDIuMjdWMi4yN1pNMjAuNDQgNi42MTRDMjAuNDY0NSA2LjY1MTgzIDIwLjQ3ODQgNi42OTU1OSAyMC40ODAxIDYuNzQwNjRDMjAuNDgxNyA2Ljc4NTY5IDIwLjQ3MTIgNi44MzAzNiAyMC40NDk2IDYuODY5OTJDMjAuNDI4IDYuOTA5NDcgMjAuMzk2MSA2Ljk0MjQ1IDIwLjM1NzIgNi45NjUzNUMyMC4zMTg0IDYuOTg4MjUgMjAuMjc0MSA3LjAwMDIyIDIwLjIyOSA3SDE3Ljk0NkMxNy44OTM0IDcuMDAwMDIgMTcuODQyMiA2Ljk4MzUyIDE3Ljc5OTQgNi45NTI4NEMxNy43NTY3IDYuOTIyMTYgMTcuNzI0OCA2Ljg3ODg0IDE3LjcwOCA2LjgyOUMxNy4yOTY2IDUuNTcyNjIgMTYuNjk3OSA0LjM4NTU3IDE1LjkzMiAzLjMwOEMxNS44OTk5IDMuMjYzMDYgMTUuODgzNSAzLjIwODc1IDE1Ljg4NTUgMy4xNTM1NEMxNS44ODc1IDMuMDk4MzMgMTUuOTA3NyAzLjA0NTM0IDE1Ljk0MyAzLjAwMjg0QzE1Ljk3ODMgMi45NjAzNSAxNi4wMjY3IDIuOTMwNzQgMTYuMDgwNiAyLjkxODY1QzE2LjEzNDUgMi45MDY1NSAxNi4xOTA5IDIuOTEyNjYgMTYuMjQxIDIuOTM2QzE3Ljk2NDUgMy43MzM4NiAxOS40MjIxIDUuMDEwNjIgMjAuNDQgNi42MTRWNi42MTRaTTcuNzQgMi45NjhDNy43OTAwMiAyLjk0NDE1IDcuODQ2NTYgMi45Mzc2IDcuOTAwNzEgMi45NDkzOEM3Ljk1NDg2IDIuOTYxMTYgOC4wMDM1NyAyLjk5MDU5IDguMDM5MTcgMy4wMzMwN0M4LjA3NDc3IDMuMDc1NTQgOC4wOTUyNSAzLjEyODYzIDguMDk3MzkgMy4xODQwMUM4LjA5OTU0IDMuMjM5MzkgOC4wODMyMSAzLjI5MzkxIDguMDUxIDMuMzM5QzcuMjk4NDUgNC40MDgxOCA2LjcwOTk1IDUuNTgzODMgNi4zMDUgNi44MjdDNi4yODg3NyA2Ljg3NzE0IDYuMjU3MTEgNi45MjA4NiA2LjIxNDU1IDYuOTUxOTNDNi4xNzE5OSA2Ljk4MyA2LjEyMDY5IDYuOTk5ODIgNi4wNjggN0gzLjgwNUMzLjc2MDE2IDYuOTk5OTMgMy43MTYxNiA2Ljk4Nzc5IDMuNjc3NjIgNi45NjQ4N0MzLjYzOTA4IDYuOTQxOTUgMy42MDc0MSA2LjkwOTA4IDMuNTg1OTQgNi44Njk3MUMzLjU2NDQ3IDYuODMwMzUgMy41NTM5OCA2Ljc4NTkzIDMuNTU1NTcgNi43NDExMkMzLjU1NzE3IDYuNjk2MyAzLjU3MDc4IDYuNjUyNzQgMy41OTUgNi42MTVDNC42MDk0MyA1LjAzNjUgNi4wNDUyIDMuNzczMjQgNy43NCAyLjk2OFYyLjk2OFpNOC4wOTEgMjAuN0M4LjEyMzEzIDIwLjc0NDkgOC4xMzk0OCAyMC43OTkzIDguMTM3NDggMjAuODU0NUM4LjEzNTQ4IDIwLjkwOTcgOC4xMTUyNSAyMC45NjI3IDguMDc5OTUgMjEuMDA1MkM4LjA0NDY1IDIxLjA0NzcgNy45OTYyNyAyMS4wNzczIDcuOTQyMzcgMjEuMDg5NEM3Ljg4ODQ2IDIxLjEwMTUgNy44MzIwNyAyMS4wOTUzIDcuNzgyIDIxLjA3MkM2LjI0NzE2IDIwLjM1OTEgNC45MTg4NSAxOS4yNjc2IDMuOTIyIDE3LjlDMy44OTQxNCAxNy44NjI5IDMuODc3MTggMTcuODE4NyAzLjg3MzAxIDE3Ljc3MjVDMy44Njg4NCAxNy43MjYyIDMuODc3NjMgMTcuNjc5NyAzLjg5ODM5IDE3LjYzODJDMy45MTkxNSAxNy41OTY3IDMuOTUxMDcgMTcuNTYxNyAzLjk5MDU3IDE3LjUzNzNDNC4wMzAwNiAxNy41MTI5IDQuMDc1NTcgMTcuNSA0LjEyMiAxNy41SDYuMjQ2QzYuMjk2OTMgMTcuNTAwMiA2LjM0NjYgMTcuNTE1OSA2LjM4ODQgMTcuNTQ1QzYuNDMwMTkgMTcuNTc0MiA2LjQ2MjE0IDE3LjYxNTMgNi40OCAxNy42NjNDNi44ODE3IDE4Ljc0MTUgNy40MjMzMyAxOS43NjI2IDguMDkxIDIwLjdWMjAuN1pcIi8+PHBhdGggZD1cIk0xOC43NjkgMTcuN0MxOS40NDQxIDE3LjcwMDIgMjAuMTA0MSAxNy41MDAyIDIwLjY2NTUgMTcuMTI1MkMyMS4yMjcgMTYuNzUwMyAyMS42NjQ2IDE2LjIxNzIgMjEuOTIzIDE1LjU5MzZDMjIuMTgxNSAxNC45Njk5IDIyLjI0OTEgMTQuMjgzNiAyMi4xMTc1IDEzLjYyMTRDMjEuOTg1OCAxMi45NTkzIDIxLjY2MDcgMTIuMzUxIDIxLjE4MzQgMTEuODczNkMyMC43MDYgMTEuMzk2MyAyMC4wOTc4IDExLjA3MTIgMTkuNDM1NiAxMC45Mzk1QzE4Ljc3MzQgMTAuODA3OSAxOC4wODcxIDEwLjg3NTUgMTcuNDYzNCAxMS4xMzRDMTYuODM5OCAxMS4zOTI0IDE2LjMwNjcgMTEuODMgMTUuOTMxOCAxMi4zOTE1QzE1LjU1NjggMTIuOTUyOSAxNS4zNTY4IDEzLjYxMjkgMTUuMzU3IDE0LjI4OEMxNS4zNTcgMTUuMTkyOSAxNS43MTY1IDE2LjA2MDggMTYuMzU2NCAxNi43MDA3QzE2Ljk5NjIgMTcuMzQwNSAxNy44NjQxIDE3LjcgMTguNzY5IDE3LjdaXCIvPjxwYXRoIGQ9XCJNMTMuNTQ4IDIzLjQ0NUMxMy41NDA1IDIzLjUxNSAxMy41NDc5IDIzLjU4NTcgMTMuNTY5NyAyMy42NTI2QzEzLjU5MTUgMjMuNzE5NiAxMy42MjcxIDIzLjc4MTEgMTMuNjc0MyAyMy44MzMzQzEzLjcyMTUgMjMuODg1NSAxMy43NzkyIDIzLjkyNzIgMTMuODQzNiAyMy45NTU2QzEzLjkwOCAyMy45ODM5IDEzLjk3NzYgMjMuOTk4NCAxNC4wNDggMjMuOTk4SDIzLjQ5NUMyMy41NjU0IDIzLjk5ODQgMjMuNjM1IDIzLjk4MzkgMjMuNjk5NCAyMy45NTU2QzIzLjc2MzggMjMuOTI3MiAyMy44MjE1IDIzLjg4NTUgMjMuODY4NyAyMy44MzMzQzIzLjkxNTkgMjMuNzgxMSAyMy45NTE1IDIzLjcxOTYgMjMuOTczMyAyMy42NTI2QzIzLjk5NTEgMjMuNTg1NyAyNC4wMDI1IDIzLjUxNSAyMy45OTUgMjMuNDQ1QzIzLjg1ODkgMjIuMTU1MiAyMy4yNTAxIDIwLjk2MTQgMjIuMjg2MSAyMC4wOTM4QzIxLjMyMjEgMTkuMjI2MSAyMC4wNzEgMTguNzQ2IDE4Ljc3NCAxOC43NDZDMTcuNDc3IDE4Ljc0NiAxNi4yMjU5IDE5LjIyNjEgMTUuMjYxOSAyMC4wOTM4QzE0LjI5NzkgMjAuOTYxNCAxMy42ODkxIDIyLjE1NTIgMTMuNTUzIDIzLjQ0NUgxMy41NDhaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctY2hldnJvbi1kb3duXCIgZGF0YS1uYW1lPVwiY2hldnJvbi1kb3duXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTEuMjQ5IDcuMjA3TDEyLjIzMyAxOS42NzhDMTIuMzMyNSAxOS43ODE4IDEyLjQ1MiAxOS44NjQ0IDEyLjU4NDIgMTkuOTIwOEMxMi43MTY0IDE5Ljk3NzIgMTIuODU4NyAyMC4wMDYzIDEzLjAwMjUgMjAuMDA2M0MxMy4xNDYzIDIwLjAwNjMgMTMuMjg4NiAxOS45NzcyIDEzLjQyMDggMTkuOTIwOEMxMy41NTMgMTkuODY0NCAxMy42NzI1IDE5Ljc4MTggMTMuNzcyIDE5LjY3OEwyNC43NTEgNy4yMDdDMjQuODM4OCA3LjEwODA3IDI0LjkwNTggNi45OTI1IDI0Ljk0ODEgNi44NjcxNUMyNC45OTA0IDYuNzQxOCAyNS4wMDcgNi42MDkyNCAyNC45OTcgNi40NzczNEMyNC45ODcgNi4zNDU0MyAyNC45NTA2IDYuMjE2ODggMjQuODkgNi4wOTkzMkMyNC44Mjk0IDUuOTgxNzYgMjQuNzQ1NyA1Ljg3NzU5IDI0LjY0NCA1Ljc5M0wyMi43OTQgNC4yMzZDMjIuNTg3NyA0LjA2MjA4IDIyLjMyMTMgMy45NzYyNCAyMi4wNTIzIDMuOTk3QzIxLjc4MzIgNC4wMTc3NyAyMS41MzMyIDQuMTQzNDggMjEuMzU2IDQuMzQ3TDEzLjE5MSAxMy44QzEzLjE2NzUgMTMuODI3MyAxMy4xMzg0IDEzLjg0OTIgMTMuMTA1NyAxMy44NjQyQzEzLjA3MyAxMy44NzkyIDEzLjAzNzUgMTMuODg2OSAxMy4wMDE1IDEzLjg4NjlDMTIuOTY1NSAxMy44ODY5IDEyLjkzIDEzLjg3OTIgMTIuODk3MyAxMy44NjQyQzEyLjg2NDYgMTMuODQ5MiAxMi44MzU1IDEzLjgyNzMgMTIuODEyIDEzLjhMNC42NDQgNC4zNDZDNC40NjY2OSA0LjE0MzQyIDQuMjE2NTQgNC4wMTkwNiAzLjk0OCA0QzMuODE0ODUgMy45ODgxMyAzLjY4MDY3IDQuMDAzMDggMy41NTM0IDQuMDQzOTZDMy40MjYxMiA0LjA4NDgzIDMuMzA4MzQgNC4xNTA4MiAzLjIwNyA0LjIzOEwxLjM1NiA1Ljc5M0MxLjI1MzcyIDUuODc3NDQgMS4xNjk0OSA1Ljk4MTYxIDEuMTA4MzMgNi4wOTkyOUMxLjA0NzE3IDYuMjE2OTggMS4wMTAzMiA2LjM0NTc3IDEgNi40NzhDMC45ODk5OSA2LjYxMDA0IDEuMDA2OSA2Ljc0Mjc0IDEuMDQ5NyA2Ljg2ODA1QzEuMDkyNSA2Ljk5MzM2IDEuMTYwMzEgNy4xMDg2OCAxLjI0OSA3LjIwN1pcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1jaGV2cm9uLXVwXCIgZGF0YS1uYW1lPVwiY2hldnJvbi11cFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMy43NTEgMTYuNzkzTDEyLjc2NyA0LjMyMkMxMi42Njc1IDQuMjE4MjIgMTIuNTQ4IDQuMTM1NjMgMTIuNDE1OCA0LjA3OTIyQzEyLjI4MzYgNC4wMjI4IDEyLjE0MTMgMy45OTM3MiAxMS45OTc1IDMuOTkzNzJDMTEuODUzNyAzLjk5MzcyIDExLjcxMTQgNC4wMjI4IDExLjU3OTIgNC4wNzkyMkMxMS40NDcgNC4xMzU2MyAxMS4zMjc1IDQuMjE4MjIgMTEuMjI4IDQuMzIyTDAuMjQ4OTk4IDE2Ljc5M0MwLjE2MTE4OCAxNi44OTE5IDAuMDk0MTU5OSAxNy4wMDc1IDAuMDUxODk3NSAxNy4xMzI5QzAuMDA5NjM1MTUgMTcuMjU4MiAtMC4wMDY5OTk2IDE3LjM5MDggMC4wMDI5ODE3MyAxNy41MjI3QzAuMDEyOTYzMSAxNy42NTQ2IDAuMDQ5MzU2OCAxNy43ODMxIDAuMTEgMTcuOTAwN0MwLjE3MDY0NCAxOC4wMTgyIDAuMjU0MyAxOC4xMjI0IDAuMzU1OTk4IDE4LjIwN0wyLjIwNiAxOS43NjRDMi40MTIyOSAxOS45Mzc5IDIuNjc4NyAyMC4wMjM4IDIuOTQ3NzMgMjAuMDAzQzMuMjE2NzYgMTkuOTgyMiAzLjQ2Njg0IDE5Ljg1NjUgMy42NDQgMTkuNjUzTDExLjgwOSAxMC4yQzExLjgzMjUgMTAuMTcyNyAxMS44NjE1IDEwLjE1MDggMTEuODk0MyAxMC4xMzU4QzExLjkyNyAxMC4xMjA4IDExLjk2MjUgMTAuMTEzMSAxMS45OTg1IDEwLjExMzFDMTIuMDM0NSAxMC4xMTMxIDEyLjA3IDEwLjEyMDggMTIuMTAyNyAxMC4xMzU4QzEyLjEzNTQgMTAuMTUwOCAxMi4xNjQ1IDEwLjE3MjcgMTIuMTg4IDEwLjJMMjAuMzU2IDE5LjY1QzIwLjQ0NCAxOS43NTEzIDIwLjU1MTEgMTkuODM0MyAyMC42NzEzIDE5Ljg5NDJDMjAuNzkxNCAxOS45NTQxIDIwLjkyMjEgMTkuOTg5NyAyMS4wNTYgMTkuOTk5QzIxLjE4OTEgMjAuMDEwOSAyMS4zMjMzIDE5Ljk5NTkgMjEuNDUwNiAxOS45NTVDMjEuNTc3OSAxOS45MTQyIDIxLjY5NTcgMTkuODQ4MiAyMS43OTcgMTkuNzYxTDIzLjY0OCAxOC4yMDNDMjMuNzQ5NSAxOC4xMTgyIDIzLjgzMjkgMTguMDE0IDIzLjg5MzQgMTcuODk2NUMyMy45NTM5IDE3Ljc3ODkgMjMuOTkwMiAxNy42NTA0IDI0LjAwMDEgMTcuNTE4NkMyNC4wMTAxIDE3LjM4NjggMjMuOTkzNiAxNy4yNTQzIDIzLjk1MTUgMTcuMTI5QzIzLjkwOTQgMTcuMDAzNyAyMy44NDI1IDE2Ljg4ODEgMjMuNzU1IDE2Ljc4OUwyMy43NTEgMTYuNzkzWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNsb3NlXCIgZGF0YS1uYW1lPVwiY2xvc2VcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgPjxwYXRoIGQ9XCJNMC40MzkwMDUgMjEuNDRDMC4xNTc3NDMgMjEuNzIxNCAtMC4wMDAyMTU3NzEgMjIuMTAzIC0wLjAwMDEyMTk5NyAyMi41MDA5Qy0yLjgyMjI5ZS0wNSAyMi44OTg3IDAuMTU4MTEgMjMuMjgwMiAwLjQzOTUwNSAyMy41NjE1QzAuNzIwOSAyMy44NDI4IDEuMTAyNSAyNC4wMDA3IDEuNTAwMzYgMjQuMDAwNkMxLjg5ODIyIDI0LjAwMDUgMi4yNzk3NCAyMy44NDI0IDIuNTYxMDEgMjMuNTYxTDExLjgyMyAxNC4zQzExLjg0NjIgMTQuMjc2NyAxMS44NzM4IDE0LjI1ODIgMTEuOTA0MiAxNC4yNDU2QzExLjkzNDYgMTQuMjMzIDExLjk2NzEgMTQuMjI2NiAxMiAxNC4yMjY2QzEyLjAzMjkgMTQuMjI2NiAxMi4wNjU0IDE0LjIzMyAxMi4wOTU4IDE0LjI0NTZDMTIuMTI2MiAxNC4yNTgyIDEyLjE1MzggMTQuMjc2NyAxMi4xNzcgMTQuM0wyMS40MzkgMjMuNTYzQzIxLjU3ODMgMjMuNzAyMyAyMS43NDM2IDIzLjgxMjkgMjEuOTI1NiAyMy44ODgzQzIyLjEwNzYgMjMuOTYzNyAyMi4zMDI3IDI0LjAwMjYgMjIuNDk5NyAyNC4wMDI2QzIyLjY5NjcgMjQuMDAyNyAyMi44OTE3IDIzLjk2MzkgMjMuMDczOCAyMy44ODg2QzIzLjI1NTggMjMuODEzMiAyMy40MjEyIDIzLjcwMjggMjMuNTYwNSAyMy41NjM1QzIzLjY5OTggMjMuNDI0MiAyMy44MTA0IDIzLjI1ODkgMjMuODg1OCAyMy4wNzY5QzIzLjk2MTIgMjIuODk0OSAyNC4wMDAxIDIyLjY5OTkgMjQuMDAwMSAyMi41MDI5QzI0LjAwMDIgMjIuMzA1OSAyMy45NjE0IDIyLjExMDggMjMuODg2MSAyMS45Mjg4QzIzLjgxMDcgMjEuNzQ2NyAyMy43MDAzIDIxLjU4MTMgMjMuNTYxIDIxLjQ0MkwxNC4zIDEyLjE3N0MxNC4yNzY3IDEyLjE1MzggMTQuMjU4MyAxMi4xMjYyIDE0LjI0NTYgMTIuMDk1OEMxNC4yMzMgMTIuMDY1NCAxNC4yMjY2IDEyLjAzMjkgMTQuMjI2NiAxMkMxNC4yMjY2IDExLjk2NzEgMTQuMjMzIDExLjkzNDYgMTQuMjQ1NiAxMS45MDQyQzE0LjI1ODMgMTEuODczOCAxNC4yNzY3IDExLjg0NjIgMTQuMyAxMS44MjNMMjMuNTYzIDIuNTYxQzIzLjg0NDMgMi4yNzkzNCAyNC4wMDIxIDEuODk3NDkgMjQuMDAxOCAxLjQ5OTQ0QzI0LjAwMTYgMS4xMDEzOSAyMy44NDMyIDAuNzE5NzYyIDIzLjU2MTUgMC40Mzg1QzIzLjI3OTggMC4xNTcyMzggMjIuODk4IC0wLjAwMDYxNTY2NCAyMi40OTk5IC0wLjAwMDMzNDM2NEMyMi4xMDE5IC01LjMwNjQ5ZS0wNSAyMS43MjAzIDAuMTU4MzQgMjEuNDM5IDAuNDRMMTIuMTc3IDkuN0MxMi4xNTM4IDkuNzIzMjggMTIuMTI2MiA5Ljc0MTc1IDEyLjA5NTggOS43NTQzNkMxMi4wNjU0IDkuNzY2OTYgMTIuMDMyOSA5Ljc3MzQ1IDEyIDkuNzczNDVDMTEuOTY3MSA5Ljc3MzQ1IDExLjkzNDYgOS43NjY5NiAxMS45MDQyIDkuNzU0MzZDMTEuODczOCA5Ljc0MTc1IDExLjg0NjIgOS43MjMyOCAxMS44MjMgOS43TDIuNTYxMDEgMC40NEMyLjQyMTc0IDAuMzAwNjY3IDIuMjU2MzkgMC4xOTAxMyAyLjA3NDQxIDAuMTE0Njk4QzEuODkyNDIgMC4wMzkyNjcgMS42OTczNiAwLjAwMDQxOTE0NCAxLjUwMDM2IDAuMDAwMzcyNzE1QzEuMTAyNSAwLjAwMDI3ODk0NyAwLjcyMDkgMC4xNTgyMzggMC40Mzk1MDUgMC40Mzk1QzAuMTU4MTEgMC43MjA3NjIgLTIuODI2MDRlLTA1IDEuMTAyMjkgLTAuMDAwMTIyMDI5IDEuNTAwMTVDLTAuMDAwMjE1Nzk3IDEuODk4IDAuMTU3NzQzIDIuMjc5NjEgMC40MzkwMDUgMi41NjFMOS43IDExLjgyM0M5LjcyMzI5IDExLjg0NjIgOS43NDE3NiAxMS44NzM4IDkuNzU0MzYgMTEuOTA0MkM5Ljc2Njk2IDExLjkzNDYgOS43NzM0NSAxMS45NjcxIDkuNzczNDUgMTJDOS43NzM0NSAxMi4wMzI5IDkuNzY2OTYgMTIuMDY1NCA5Ljc1NDM2IDEyLjA5NThDOS43NDE3NiAxMi4xMjYyIDkuNzIzMjkgMTIuMTUzOCA5LjcgMTIuMTc3TDAuNDM5MDA1IDIxLjQ0WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWNvbnRhY3RcIiBkYXRhLW5hbWU9XCJjb250YWN0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTI0LjAwMDEgMjFDMjMuOTk3OSAxOS4wMTE1IDIzLjIwNzEgMTcuMTA1MSAyMS44MDEgMTUuNjk5QzIwLjM5NSAxNC4yOTMgMTguNDg4NSAxMy41MDIxIDE2LjUwMDEgMTMuNUMxNS42OTE2IDEzLjUwMDMgMTQuODg4NiAxMy42MzMgMTQuMTIzMSAxMy44OTNDMTQuMDQyOCAxMy45MTk4IDEzLjk3MDYgMTMuOTY2NSAxMy45MTMzIDE0LjAyODhDMTMuODU2IDE0LjA5MTEgMTMuODE1NSAxNC4xNjcgMTMuNzk1NSAxNC4yNDkyQzEzLjc3NTUgMTQuMzMxNCAxMy43NzY3IDE0LjQxNzQgMTMuNzk5MSAxNC40OTkxQzEzLjgyMTQgMTQuNTgwNyAxMy44NjQgMTQuNjU1MyAxMy45MjMxIDE0LjcxNkMxNS41NzM3IDE2LjM5MTEgMTYuNDk5MyAxOC42NDgzIDE2LjUwMDEgMjFWMjEuMDI0QzE2LjQ5OTEgMjEuMDg2MiAxNi41MTA2IDIxLjE0NzkgMTYuNTMzNyAyMS4yMDU2QzE2LjU1NjkgMjEuMjYzMyAxNi41OTEzIDIxLjMxNTkgMTYuNjM0OSAyMS4zNjAyQzE2LjY3ODYgMjEuNDA0NSAxNi43MzA2IDIxLjQzOTYgMTYuNzg3OSAyMS40NjM2QzE2Ljg0NTMgMjEuNDg3NiAxNi45MDY5IDIxLjUgMTYuOTY5MSAyMS41SDIzLjUwMDFDMjMuNjMyNyAyMS41IDIzLjc1OTggMjEuNDQ3MyAyMy44NTM2IDIxLjM1MzZDMjMuOTQ3NCAyMS4yNTk4IDI0LjAwMDEgMjEuMTMyNiAyNC4wMDAxIDIxWlwiLz48cGF0aCBkPVwiTTEzLjY3NSA1LjUzMDAxQzEzLjgwNzggNS45NDA1NCAxMy45MDEyIDYuMzYyNzggMTMuOTU0IDYuNzkxMDFDMTMuOTYzNCA2Ljg2OTQxIDEzLjk5MTIgNi45NDQ0NiAxNC4wMzUyIDcuMDEwMDNDMTQuMDc5MiA3LjA3NTYxIDE0LjEzODEgNy4xMjk4MyAxNC4yMDcxIDcuMTY4MjZDMTQuMjc2IDcuMjA2NyAxNC4zNTMxIDcuMjI4MjYgMTQuNDMyIDcuMjMxMTdDMTQuNTEwOSA3LjIzNDA4IDE0LjU4OTQgNy4yMTgyNiAxNC42NjEgNy4xODUwMUMxNS4zMjc1IDYuODc1OTcgMTUuOTMwMiA2LjQ0NDg4IDE2LjQzOCA1LjkxNDAxQzE2LjQ2MTQgNS44ODk2MyAxNi40ODk2IDUuODcwMjQgMTYuNTIwNyA1Ljg1Njk5QzE2LjU1MTggNS44NDM3NCAxNi41ODUyIDUuODM2OTEgMTYuNjE5IDUuODM2OTFDMTYuNjUyOCA1LjgzNjkxIDE2LjY4NjMgNS44NDM3NCAxNi43MTc0IDUuODU2OTlDMTYuNzQ4NSA1Ljg3MDI0IDE2Ljc3NjYgNS44ODk2MyAxNi44IDUuOTE0MDFDMTcuNDgwNSA2LjYyNjYyIDE4LjMyOTIgNy4xNTY4NSAxOS4yNjggNy40NTYwMUMxOS4zODE0IDcuNDkyMjUgMTkuNDc4MSA3LjU2Nzc1IDE5LjU0MDggNy42Njg5NEMxOS42MDM1IDcuNzcwMTIgMTkuNjI4MSA3Ljg5MDM1IDE5LjYxIDguMDA4MDFDMTkuNDk5MSA4LjcyNzA5IDE5LjEzNDggOS4zODI4MiAxOC41ODI4IDkuODU2ODVDMTguMDMwOCAxMC4zMzA5IDE3LjMyNzYgMTAuNTkyIDE2LjYgMTAuNTkzQzE2LjE4NzkgMTAuNTkzNCAxNS43OCAxMC41MDk0IDE1LjQwMTYgMTAuMzQ2QzE1LjAyMzIgMTAuMTgyNiAxNC42ODIzIDkuOTQzMzMgMTQuNCA5LjY0MzAxQzE0LjM0MTkgOS41ODE2NCAxNC4yNjkyIDkuNTM2IDE0LjE4ODYgOS41MTAzNkMxNC4xMDgxIDkuNDg0NzIgMTQuMDIyNCA5LjQ3OTkxIDEzLjkzOTUgOS40OTY0QzEzLjg1NjYgOS41MTI4OCAxMy43NzkyIDkuNTUwMSAxMy43MTQ2IDkuNjA0NkMxMy42NSA5LjY1OTA5IDEzLjYwMDIgOS43MjkwOCAxMy41NyA5LjgwODAxQzEzLjQ1MzQgMTAuMTEyNCAxMy4zMTQgMTAuNDA3NiAxMy4xNTMgMTAuNjkxQzEzLjA5NjMgMTAuNzkwMiAxMy4wNzUzIDEwLjkwNTkgMTMuMDkzNSAxMS4wMTg3QzEzLjExMTcgMTEuMTMxNSAxMy4xNjggMTEuMjM0NyAxMy4yNTMgMTEuMzExQzE0LjEzOTYgMTIuMTA5MSAxNS4yODI4IDEyLjU2MyAxNi40NzU0IDEyLjU5MDRDMTcuNjY4IDEyLjYxNzcgMTguODMwOCAxMi4yMTY3IDE5Ljc1MyAxMS40NkMxOS43ODM0IDExLjQzNSAxOS44MTkyIDExLjQxNzUgMTkuODU3NiAxMS40MDlDMTkuODk2IDExLjQwMDQgMTkuOTM1OCAxMS40MDEgMTkuOTczOSAxMS40MTA4QzIwLjAxMiAxMS40MjA1IDIwLjA0NzMgMTEuNDM5MSAyMC4wNzY4IDExLjQ2NUMyMC4xMDY0IDExLjQ5MSAyMC4xMjk0IDExLjUyMzUgMjAuMTQ0IDExLjU2QzIwLjI3MTUgMTEuODk2OSAyMC40MzMgMTIuMjE5OSAyMC42MjYgMTIuNTI0QzIwLjY5NTUgMTIuNjM3OSAyMC43ODcxIDEyLjczNjggMjAuODk1NCAxMi44MTQ4QzIxLjAwMzcgMTIuODkyNyAyMS4xMjY1IDEyLjk0ODIgMjEuMjU2NiAxMi45NzhDMjEuMzg2NyAxMy4wMDc4IDIxLjUyMTQgMTMuMDExMiAyMS42NTI4IDEyLjk4ODFDMjEuNzg0MyAxMi45NjUgMjEuOTA5NyAxMi45MTU4IDIyLjAyMTkgMTIuODQzNUMyMi4xMzQgMTIuNzcxMSAyMi4yMzA1IDEyLjY3NzEgMjIuMzA1NyAxMi41NjY4QzIyLjM4MDkgMTIuNDU2NiAyMi40MzMzIDEyLjMzMjQgMjIuNDU5OCAxMi4yMDE2QzIyLjQ4NjMgMTIuMDcwOSAyMi40ODYzIDExLjkzNjEgMjIuNDU5OSAxMS44MDUzQzIyLjQzMzUgMTEuNjc0NSAyMi4zODEyIDExLjU1MDMgMjIuMzA2IDExLjQ0QzIxLjgzNjIgMTAuNjUzNCAyMS42MDQyIDkuNzQ3NjEgMjEuNjM4IDguODMyMDFWNy41NDYwMUMyMS42NCA2LjU3NjE5IDIxLjM2MTkgNS42MjY0MiAyMC44MzcxIDQuODEwODdDMjAuMzEyMyAzLjk5NTMxIDE5LjU2MzEgMy4zNDg2OSAxOC42Nzk2IDIuOTQ4NzFDMTcuNzk2MSAyLjU0ODczIDE2LjgxNTkgMi40MTI0MiAxNS44NTY4IDIuNTU2MTdDMTQuODk3NiAyLjY5OTkxIDE0LjAwMDQgMy4xMTc2IDEzLjI3MyAzLjc1OTAxQzEzLjE4NjggMy44MzU2NiAxMy4xMjk4IDMuOTM5NzcgMTMuMTExNSA0LjA1MzY3QzEzLjA5MzMgNC4xNjc1OCAxMy4xMTUgNC4yODQyOSAxMy4xNzMgNC4zODQwMUMxMy4zODEyIDQuNzQ2NzkgMTMuNTQ5NSA1LjEzMTAzIDEzLjY3NSA1LjUzMDAxVjUuNTMwMDFaXCIvPjxwYXRoIGQ9XCJNMTIuNSA3LjVDMTIuNSA2LjUxMTEgMTIuMjA2OCA1LjU0NDQgMTEuNjU3MyA0LjcyMjE1QzExLjEwNzkgMy44OTk5MSAxMC4zMjcgMy4yNTkwNCA5LjQxMzQyIDIuODgwNkM4LjQ5OTc5IDIuNTAyMTcgNy40OTQ0NiAyLjQwMzE1IDYuNTI0NTUgMi41OTYwOEM1LjU1NDY1IDIuNzg5IDQuNjYzNzMgMy4yNjUyMSAzLjk2NDQ3IDMuOTY0NDdDMy4yNjUyMSA0LjY2MzczIDIuNzg5IDUuNTU0NjUgMi41OTYwOCA2LjUyNDU1QzIuNDAzMTUgNy40OTQ0NiAyLjUwMjE3IDguNDk5NzkgMi44ODA2IDkuNDEzNDJDMy4yNTkwNCAxMC4zMjcgMy44OTk5MSAxMS4xMDc5IDQuNzIyMTUgMTEuNjU3M0M1LjU0NDQgMTIuMjA2OCA2LjUxMTEgMTIuNSA3LjUgMTIuNUM4LjgyNTYgMTIuNDk4NCAxMC4wOTY0IDExLjk3MTEgMTEuMDMzOCAxMS4wMzM4QzExLjk3MTEgMTAuMDk2NCAxMi40OTg0IDguODI1NiAxMi41IDcuNVY3LjVaTTQuNiA2Ljc1N0M0LjYxOTkyIDYuNjgyMDYgNC42NTY5OSA2LjYxMjc4IDQuNzA4MjkgNi41NTQ2NEM0Ljc1OTYgNi40OTY0OSA0LjgyMzcyIDYuNDUxMDcgNC44OTU1OSA2LjQyMTk3QzQuOTY3NDcgNi4zOTI4NyA1LjA0NTEyIDYuMzgwODkgNS4xMjI0MyA2LjM4Njk3QzUuMTk5NzMgNi4zOTMwNSA1LjI3NDU2IDYuNDE3MDMgNS4zNDEgNi40NTdDNi40Mjg1MyA3LjEzMDcxIDcuNjgwNzMgNy40OTE1OSA4Ljk2IDcuNUM5LjI3MDk2IDcuNDk5NDEgOS41ODE0NiA3LjQ3NjAyIDkuODg5IDcuNDNDOS45NjU5NCA3LjQxODUxIDEwLjA0NDUgNy40MjUxMyAxMC4xMTg0IDcuNDQ5MzNDMTAuMTkyMyA3LjQ3MzUzIDEwLjI1OTYgNy41MTQ2NSAxMC4zMTQ4IDcuNTY5NDFDMTAuMzcwMSA3LjYyNDE3IDEwLjQxMTggNy42OTEwNiAxMC40MzY2IDcuNzY0NzdDMTAuNDYxNSA3LjgzODQ4IDEwLjQ2ODggNy45MTY5NyAxMC40NTggNy45OTRDMTAuMzMyNyA4LjczNTE1IDkuOTMzNjkgOS40MDIyNCA5LjM0MDAxIDkuODYzMjdDOC43NDYzMiAxMC4zMjQzIDguMDAxMiAxMC41NDU3IDcuMjUyMTEgMTAuNDgzNUM2LjUwMzAxIDEwLjQyMTQgNS44MDQ1MiAxMC4wODA0IDUuMjk0ODcgOS41Mjc4N0M0Ljc4NTIyIDguOTc1MzYgNC41MDE1NiA4LjI1MTY3IDQuNSA3LjVDNC41MDAzNyA3LjI0OTAxIDQuNTMzOTkgNi45OTkxNiA0LjYgNi43NTdWNi43NTdaXCIvPjxwYXRoIGQ9XCJNMTUgMjFDMTUgMTkuMDEwOSAxNC4yMDk4IDE3LjEwMzIgMTIuODAzMyAxNS42OTY3QzExLjM5NjggMTQuMjkwMiA5LjQ4OTEyIDEzLjUgNy41IDEzLjVDNS41MTA4OCAxMy41IDMuNjAzMjIgMTQuMjkwMiAyLjE5NjcgMTUuNjk2N0MwLjc5MDE3NiAxNy4xMDMyIDAgMTkuMDEwOSAwIDIxQzAgMjEuMTMyNiAwLjA1MjY3ODQgMjEuMjU5OCAwLjE0NjQ0NyAyMS4zNTM2QzAuMjQwMjE1IDIxLjQ0NzMgMC4zNjczOTIgMjEuNSAwLjUgMjEuNUgxNC41QzE0LjYzMjYgMjEuNSAxNC43NTk4IDIxLjQ0NzMgMTQuODUzNiAyMS4zNTM2QzE0Ljk0NzMgMjEuMjU5OCAxNSAyMS4xMzI2IDE1IDIxWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWRhc2hib2FyZFwiIGRhdGEtbmFtZT1cImRhc2hib2FyZFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0xMiAwQzkuNjI2NjMgMCA3LjMwNjU1IDAuNzAzNzg4IDUuMzMzMTYgMi4wMjIzNkMzLjM1OTc3IDMuMzQwOTQgMS44MjE3IDUuMjE1MDkgMC45MTM0NTEgNy40MDc4QzAuMDA1MTk5NDMgOS42MDA1MSAtMC4yMzI0NDEgMTIuMDEzMyAwLjIzMDU4MiAxNC4zNDExQzAuNjkzNjA1IDE2LjY2ODkgMS44MzY0OSAxOC44MDcxIDMuNTE0NzIgMjAuNDg1M0M1LjE5Mjk1IDIyLjE2MzUgNy4zMzExNSAyMy4zMDY0IDkuNjU4OTIgMjMuNzY5NEMxMS45ODY3IDI0LjIzMjQgMTQuMzk5NSAyMy45OTQ4IDE2LjU5MjIgMjMuMDg2NkMxOC43ODQ5IDIyLjE3ODMgMjAuNjU5MSAyMC42NDAyIDIxLjk3NzYgMTguNjY2OEMyMy4yOTYyIDE2LjY5MzUgMjQgMTQuMzczNCAyNCAxMkMyMy45OTY2IDguODE4NDYgMjIuNzMxMiA1Ljc2ODIxIDIwLjQ4MTUgMy41MTg1MkMxOC4yMzE4IDEuMjY4ODMgMTUuMTgxNSAwLjAwMzQ0MTA4IDEyIDBWMFpNNS4xNDUwMSA4LjkxTDQuMjc5MDEgOC40MUM0LjEwNjYxIDguMzEwNTQgMy45ODA3OSA4LjE0NjY4IDMuOTI5MjIgNy45NTQ0NUMzLjg3NzY1IDcuNzYyMjMgMy45MDQ1NSA3LjU1NzM5IDQuMDA0MDEgNy4zODVDNC4xMDM0NiA3LjIxMjYxIDQuMjY3MzMgNy4wODY3OSA0LjQ1OTU1IDcuMDM1MjJDNC42NTE3OCA2Ljk4MzY0IDQuODU2NjEgNy4wMTA1NCA1LjAyOTAxIDcuMTFMNS44OTUwMSA3LjYxQzYuMDM4MyA3LjY5MjQ5IDYuMTUwMzIgNy44MjAwMSA2LjIxMzY1IDcuOTcyNzRDNi4yNzY5OCA4LjEyNTQ4IDYuMjg4MDYgOC4yOTQ4NiA2LjI0NTE3IDguNDU0NTRDNi4yMDIyOSA4LjYxNDIyIDYuMTA3ODQgOC43NTUyNSA1Ljk3NjUxIDguODU1NzFDNS44NDUxOSA4Ljk1NjE2IDUuNjg0MzUgOS4wMTA0MSA1LjUxOTAxIDkuMDFDNS4zODc2NiA5LjAxMDU0IDUuMjU4NTUgOC45NzYwMiA1LjE0NTAxIDguOTFWOC45MVpNNS4yNTAwMSAxMS45OTFDNS4yNTAwMSAxMi4xODk5IDUuMTcwOTkgMTIuMzgwNyA1LjAzMDM0IDEyLjUyMTNDNC44ODk2OCAxMi42NjIgNC42OTg5MiAxMi43NDEgNC41MDAwMSAxMi43NDFIMy41MDAwMUMzLjMwMTA5IDEyLjc0MSAzLjExMDMzIDEyLjY2MiAyLjk2OTY4IDEyLjUyMTNDMi44MjkwMiAxMi4zODA3IDIuNzUwMDEgMTIuMTg5OSAyLjc1MDAxIDExLjk5MUMyLjc1MDAxIDExLjc5MjEgMi44MjkwMiAxMS42MDEzIDIuOTY5NjggMTEuNDYwN0MzLjExMDMzIDExLjMyIDMuMzAxMDkgMTEuMjQxIDMuNTAwMDEgMTEuMjQxSDQuNTAwMDFDNC42OTg5MiAxMS4yNDEgNC44ODk2OCAxMS4zMiA1LjAzMDM0IDExLjQ2MDdDNS4xNzA5OSAxMS42MDEzIDUuMjUwMDEgMTEuNzkyMSA1LjI1MDAxIDExLjk5MVpNMTQuMjQgMTJDMTQuMjQgMTIuNDQ1IDE0LjEwOCAxMi44OCAxMy44NjA4IDEzLjI1QzEzLjYxMzYgMTMuNjIgMTMuMjYyMiAxMy45MDg0IDEyLjg1MSAxNC4wNzg3QzEyLjQzOTkgMTQuMjQ5IDExLjk4NzUgMTQuMjkzNiAxMS41NTExIDE0LjIwNjhDMTEuMTE0NiAxNC4xMiAxMC43MTM3IDEzLjkwNTcgMTAuMzk5IDEzLjU5MUMxMC4wODQzIDEzLjI3NjMgOS44NzAwNiAxMi44NzU0IDkuNzgzMjQgMTIuNDM5QzkuNjk2NDIgMTIuMDAyNSA5Ljc0MDk4IDExLjU1MDEgOS45MTEyOCAxMS4xMzlDMTAuMDgxNiAxMC43Mjc4IDEwLjM3IDEwLjM3NjQgMTAuNzQgMTAuMTI5MkMxMS4xMSA5Ljg4MTk2IDExLjU0NSA5Ljc1IDExLjk5IDkuNzVDMTIuMDE1NCA5Ljc1MDE0IDEyLjA0MDggOS43NTE4MSAxMi4wNjYgOS43NTVDMTIuMTExMiA5Ljc1OTU1IDEyLjE1NjcgOS43NTE3MSAxMi4xOTc4IDkuNzMyMzNDMTIuMjM4OCA5LjcxMjk1IDEyLjI3MzggOS42ODI3NiAxMi4yOTkgOS42NDVMMTUuNjk5IDQuNTcxQzE1Ljc3MTkgNC40NjEyOCAxNS44NjU3IDQuMzY3MDQgMTUuOTc1MSA0LjI5MzY5QzE2LjA4NDUgNC4yMjAzMyAxNi4yMDczIDQuMTY5MyAxNi4zMzY0IDQuMTQzNTRDMTYuNDY1NiA0LjExNzc3IDE2LjU5ODYgNC4xMTc3OCAxNi43Mjc3IDQuMTQzNTVDMTYuODU2OSA0LjE2OTMyIDE2Ljk3OTcgNC4yMjAzNSAxNy4wODkgNC4yOTM3MUMxNy4xOTg0IDQuMzY3MDcgMTcuMjkyMiA0LjQ2MTMxIDE3LjM2NTEgNC41NzEwM0MxNy40MzggNC42ODA3NSAxNy40ODg0IDQuODAzNzggMTcuNTEzNiA0LjkzMzA2QzE3LjUzODggNS4wNjIzMyAxNy41MzgyIDUuMTk1MzEgMTcuNTExOCA1LjMyNDM1QzE3LjQ4NTUgNS40NTMzOSAxNy40MzM5IDUuNTc1OTUgMTcuMzYgNS42ODVMMTMuOTkzIDEwLjcxQzEzLjk2NzkgMTAuNzQ3NSAxMy45NTM1IDEwLjc5MTEgMTMuOTUxMiAxMC44MzYyQzEzLjk0ODkgMTAuODgxMyAxMy45NTg5IDEwLjkyNjEgMTMuOTggMTAuOTY2QzE0LjE0OTYgMTEuMjg0MyAxNC4yMzg5IDExLjYzOTMgMTQuMjQgMTJWMTJaTTEyLjc1OCA0LjU1OEMxMi43NTggNC43NTY5MSAxMi42NzkgNC45NDc2OCAxMi41MzgzIDUuMDg4MzNDMTIuMzk3NyA1LjIyODk4IDEyLjIwNjkgNS4zMDggMTIuMDA4IDUuMzA4QzExLjgwOTEgNS4zMDggMTEuNjE4MyA1LjIyODk4IDExLjQ3NzcgNS4wODgzM0MxMS4zMzcgNC45NDc2OCAxMS4yNTggNC43NTY5MSAxMS4yNTggNC41NThWMy41NThDMTEuMjU4IDMuMzU5MDkgMTEuMzM3IDMuMTY4MzIgMTEuNDc3NyAzLjAyNzY3QzExLjYxODMgMi44ODcwMiAxMS44MDkxIDIuODA4IDEyLjAwOCAyLjgwOEMxMi4yMDY5IDIuODA4IDEyLjM5NzcgMi44ODcwMiAxMi41MzgzIDMuMDI3NjdDMTIuNjc5IDMuMTY4MzIgMTIuNzU4IDMuMzU5MDkgMTIuNzU4IDMuNTU4VjQuNTU4Wk03LjM5MzAxIDQuMDI1QzcuNDc4MjQgMy45NzU1OSA3LjU3MjQgMy45NDM1IDcuNjcwMDcgMy45MzA1OUM3Ljc2Nzc0IDMuOTE3NjcgNy44NjcgMy45MjQxNyA3Ljk2MjE1IDMuOTQ5NzNDOC4wNTczIDMuOTc1MjggOC4xNDY0NiA0LjAxOTM4IDguMjI0NTIgNC4wNzk0OUM4LjMwMjU4IDQuMTM5NiA4LjM2Nzk5IDQuMjE0NTQgOC40MTcwMSA0LjNMOC45MTcwMSA1LjE2NkM4Ljk2NjQ2IDUuMjUxMTggOC45OTg2IDUuMzQ1MjggOS4wMTE1OSA1LjQ0MjkxQzkuMDI0NTggNS41NDA1NCA5LjAxODE2IDUuNjM5NzcgOC45OTI3MSA1LjczNDkxQzguOTY3MjUgNS44MzAwNiA4LjkyMzI1IDUuOTE5MjQgOC44NjMyNCA1Ljk5NzMzQzguODAzMjMgNi4wNzU0MyA4LjcyODM5IDYuMTQwOSA4LjY0MzAxIDYuMTlDOC41Mjk0NiA2LjI1NjAyIDguNDAwMzUgNi4yOTA1NCA4LjI2OTAxIDYuMjlDOC4xMzcyMyA2LjI5MDI5IDguMDA3NzIgNi4yNTU3NiA3Ljg5MzU4IDYuMTg5OTFDNy43Nzk0NCA2LjEyNDA2IDcuNjg0NzIgNi4wMjkyMiA3LjYxOTAxIDUuOTE1TDcuMTE5MDEgNS4wNDlDNy4wNjk2OSA0Ljk2Mzc5IDcuMDM3NjUgNC44Njk2OSA3LjAyNDczIDQuNzcyMDlDNy4wMTE4MSA0LjY3NDQ5IDcuMDE4MjYgNC41NzUzIDcuMDQzNzEgNC40ODAxOUM3LjA2OTE2IDQuMzg1MDkgNy4xMTMxIDQuMjk1OTMgNy4xNzMwNCA0LjIxNzgyQzcuMjMyOTggNC4xMzk3MiA3LjMwNzcyIDQuMDc0MTkgNy4zOTMwMSA0LjAyNVY0LjAyNVpNNy41MDAwMSAxN0M3LjUwMDAxIDE2Ljg2NzQgNy41NTI2OCAxNi43NDAyIDcuNjQ2NDUgMTYuNjQ2NEM3Ljc0MDIyIDE2LjU1MjcgNy44Njc0IDE2LjUgOC4wMDAwMSAxNi41SDE2QzE2LjEzMjYgMTYuNSAxNi4yNTk4IDE2LjU1MjcgMTYuMzUzNiAxNi42NDY0QzE2LjQ0NzMgMTYuNzQwMiAxNi41IDE2Ljg2NzQgMTYuNSAxN1YxOUMxNi41IDE5LjEzMjYgMTYuNDQ3MyAxOS4yNTk4IDE2LjM1MzYgMTkuMzUzNkMxNi4yNTk4IDE5LjQ0NzMgMTYuMTMyNiAxOS41IDE2IDE5LjVIOC4wMDAwMUM3Ljg2NzQgMTkuNSA3Ljc0MDIyIDE5LjQ0NzMgNy42NDY0NSAxOS4zNTM2QzcuNTUyNjggMTkuMjU5OCA3LjUwMDAxIDE5LjEzMjYgNy41MDAwMSAxOVYxN1pNMTcuODA5IDguN0MxNy43MDk3IDguNTI3ODUgMTcuNjgyNyA4LjMyMzMgMTcuNzM0MSA4LjEzMTNDMTcuNzg1NSA3LjkzOTMgMTcuOTExIDcuNzc1NTQgMTguMDgzIDcuNjc2TDE4Ljk0OSA3LjE3NkMxOS4xMjE0IDcuMDc2NTQgMTkuMzI2MiA3LjA0OTY0IDE5LjUxODUgNy4xMDEyMkMxOS43MTA3IDcuMTUyNzkgMTkuODc0NiA3LjI3ODYxIDE5Ljk3NCA3LjQ1MUMyMC4wNzM1IDcuNjIzMzkgMjAuMTAwNCA3LjgyODIzIDIwLjA0ODggOC4wMjA0NUMxOS45OTcyIDguMjEyNjggMTkuODcxNCA4LjM3NjU0IDE5LjY5OSA4LjQ3NkwxOC44MzIgOC45NzZDMTguNjU5NyA5LjA3NDg1IDE4LjQ1NTIgOS4xMDEzMSAxOC4yNjM0IDkuMDQ5NTZDMTguMDcxNiA4Ljk5NzgyIDE3LjkwODIgOC44NzIxIDE3LjgwOSA4LjdaTTE4LjY5IDEyLjA2NUMxOC42OSAxMS44NjYxIDE4Ljc2OSAxMS42NzUzIDE4LjkwOTcgMTEuNTM0N0MxOS4wNTAzIDExLjM5NCAxOS4yNDExIDExLjMxNSAxOS40NCAxMS4zMTVIMjAuNDRDMjAuNjM4OSAxMS4zMTUgMjAuODI5NyAxMS4zOTQgMjAuOTcwMyAxMS41MzQ3QzIxLjExMSAxMS42NzUzIDIxLjE5IDExLjg2NjEgMjEuMTkgMTIuMDY1QzIxLjE5IDEyLjI2MzkgMjEuMTExIDEyLjQ1NDcgMjAuOTcwMyAxMi41OTUzQzIwLjgyOTcgMTIuNzM2IDIwLjYzODkgMTIuODE1IDIwLjQ0IDEyLjgxNUgxOS40NEMxOS4yNDEzIDEyLjgxNSAxOS4wNTA3IDEyLjczNjEgMTguOTEgMTIuNTk1N0MxOC43Njk0IDEyLjQ1NTIgMTguNjkwMyAxMi4yNjQ3IDE4LjY5IDEyLjA2NlYxMi4wNjVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctZnVlbFwiIGRhdGEtbmFtZT1cImZ1ZWxcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yMy45OSAzLjM1ODU4QzI0LjAyNzUgMy42MjExMyAyMy45NTkxIDMuODg3ODMgMjMuOCA0LjFMMjEuNzUgNi44MzNWOEgyM0MyMy4xMzI2IDggMjMuMjU5OCA4LjA1MjY4IDIzLjM1MzYgOC4xNDY0NUMyMy40NDczIDguMjQwMjEgMjMuNSA4LjM2NzM5IDIzLjUgOC41VjExQzIzLjUgMTEuMDgyMyAyMy40Nzk2IDExLjE2MzQgMjMuNDQwNyAxMS4yMzZDMjMuNDAxOCAxMS4zMDg1IDIzLjM0NTYgMTEuMzcwNCAyMy4yNzcgMTEuNDE2TDIxLjc3NyAxMi40MTZMMjEuNzUgMTIuNDMzVjE1LjVDMjEuNzUgMTYuMjk1NiAyMS40MzM5IDE3LjA1ODcgMjAuODcxMyAxNy42MjEzQzIwLjMwODcgMTguMTgzOSAxOS41NDU2IDE4LjUgMTguNzUgMTguNUgxOC41QzE4LjM2NzQgMTguNSAxOC4yNDAyIDE4LjU1MjcgMTguMTQ2NCAxOC42NDY0QzE4LjA1MjcgMTguNzQwMiAxOCAxOC44Njc0IDE4IDE5VjIyLjVDMTggMjIuODk3OCAxNy44NDIgMjMuMjc5NCAxNy41NjA3IDIzLjU2MDdDMTcuMjc5NCAyMy44NDIgMTYuODk3OCAyNCAxNi41IDI0SDMuNUMzLjEwMjE4IDI0IDIuNzIwNjQgMjMuODQyIDIuNDM5MzQgMjMuNTYwN0MyLjE1ODA0IDIzLjI3OTQgMiAyMi44OTc4IDIgMjIuNVYxLjVDMiAxLjEwMjE4IDIuMTU4MDQgMC43MjA2NDQgMi40MzkzNCAwLjQzOTM0QzIuNzIwNjQgMC4xNTgwMzUgMy4xMDIxOCAwIDMuNSAwSDE2LjVDMTYuODk3OCAwIDE3LjI3OTQgMC4xNTgwMzUgMTcuNTYwNyAwLjQzOTM0QzE3Ljg0MiAwLjcyMDY0NCAxOCAxLjEwMjE4IDE4IDEuNVYxNkMxOCAxNi4xMzI2IDE4LjA1MjcgMTYuMjU5OCAxOC4xNDY0IDE2LjM1MzZDMTguMjQwMiAxNi40NDczIDE4LjM2NzQgMTYuNSAxOC41IDE2LjVIMTguNzVDMTkuMDE1MiAxNi41IDE5LjI2OTYgMTYuMzk0NiAxOS40NTcxIDE2LjIwNzFDMTkuNjQ0NiAxNi4wMTk2IDE5Ljc1IDE1Ljc2NTIgMTkuNzUgMTUuNVY2LjVDMTkuNzUgNi4yODM2MyAxOS44MjAyIDYuMDczMSAxOS45NSA1LjlMMjIuMiAyLjlDMjIuMzU5MSAyLjY4NzgzIDIyLjU5NiAyLjU0NzU2IDIyLjg1ODYgMi41MTAwNUMyMi45ODg2IDIuNDkxNDggMjMuMTIxIDIuNDk4NjkgMjMuMjQ4MiAyLjUzMTI5QzIzLjM3NTQgMi41NjM4OCAyMy40OTQ5IDIuNjIxMjEgMjMuNiAyLjdDMjMuODEyMiAyLjg1OTEzIDIzLjk1MjQgMy4wOTYwMyAyMy45OSAzLjM1ODU4Wk0xNS44NTM2IDcuODUzNTVDMTUuOTQ3MyA3Ljc1OTc5IDE2IDcuNjMyNjEgMTYgNy41VjIuNUMxNiAyLjM2NzM5IDE1Ljk0NzMgMi4yNDAyMSAxNS44NTM2IDIuMTQ2NDVDMTUuNzU5OCAyLjA1MjY4IDE1LjYzMjYgMiAxNS41IDJINC41QzQuMzY3MzkgMiA0LjI0MDIxIDIuMDUyNjggNC4xNDY0NSAyLjE0NjQ1QzQuMDUyNjggMi4yNDAyMSA0IDIuMzY3MzkgNCAyLjVWNy41QzQgNy42MzI2MSA0LjA1MjY4IDcuNzU5NzkgNC4xNDY0NSA3Ljg1MzU1QzQuMjQwMjEgNy45NDczMiA0LjM2NzM5IDggNC41IDhIMTUuNUMxNS42MzI2IDggMTUuNzU5OCA3Ljk0NzMyIDE1Ljg1MzYgNy44NTM1NVpNMTMgMTFDMTIuNDQ3NyAxMSAxMiAxMS40NDc3IDEyIDEyVjE2QzEyIDE2LjU1MjMgMTIuNDQ3NyAxNyAxMyAxN0gxNEMxNC41NTIzIDE3IDE1IDE2LjU1MjMgMTUgMTZWMTJDMTUgMTEuNDQ3NyAxNC41NTIzIDExIDE0IDExSDEzWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWluc3BlY3Rpb25cIiBkYXRhLW5hbWU9XCJpbnNwZWN0aW9uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTEyIDBDOS42MjY2MyAwIDcuMzA2NTUgMC43MDM3ODggNS4zMzMxNiAyLjAyMjM2QzMuMzU5NzcgMy4zNDA5NCAxLjgyMTcgNS4yMTUwOSAwLjkxMzQ1MSA3LjQwNzhDMC4wMDUxOTk0MyA5LjYwMDUxIC0wLjIzMjQ0MSAxMi4wMTMzIDAuMjMwNTgyIDE0LjM0MTFDMC42OTM2MDUgMTYuNjY4OSAxLjgzNjQ5IDE4LjgwNzEgMy41MTQ3MiAyMC40ODUzQzUuMTkyOTUgMjIuMTYzNSA3LjMzMTE1IDIzLjMwNjQgOS42NTg5MiAyMy43Njk0QzExLjk4NjcgMjQuMjMyNCAxNC4zOTk1IDIzLjk5NDggMTYuNTkyMiAyMy4wODY2QzE4Ljc4NDkgMjIuMTc4MyAyMC42NTkxIDIwLjY0MDIgMjEuOTc3NiAxOC42NjY4QzIzLjI5NjIgMTYuNjkzNSAyNCAxNC4zNzM0IDI0IDEyQzIzLjk5NjMgOC44MTg1NCAyMi43MzA4IDUuNzY4NDQgMjAuNDgxMiAzLjUxODgxQzE4LjIzMTYgMS4yNjkxOCAxNS4xODE1IDAuMDAzNzA1MjIgMTIgMFYwWk0xOC45MjcgOC4yTDEyLjA4MiAxNy40ODlDMTIuMDAxMiAxNy41OTYyIDExLjg5OTggMTcuNjg2MyAxMS43ODM4IDE3Ljc1MzlDMTEuNjY3OCAxNy44MjE1IDExLjUzOTUgMTcuODY1NCAxMS40MDY0IDE3Ljg4MjlDMTEuMjczMyAxNy45MDA0IDExLjEzOCAxNy44OTEyIDExLjAwODUgMTcuODU1OEMxMC44NzkgMTcuODIwNSAxMC43NTc4IDE3Ljc1OTcgMTAuNjUyIDE3LjY3N0w1Ljc2NDAxIDEzLjc2OUM1LjY2MTQ0IDEzLjY4NjkgNS41NzYwNSAxMy41ODU1IDUuNTEyNyAxMy40NzA0QzUuNDQ5MzYgMTMuMzU1MyA1LjQwOTMgMTMuMjI4OSA1LjM5NDgxIDEzLjA5ODNDNS4zNjU1NiAxMi44MzQ2IDUuNDQyMjQgMTIuNTcwMSA1LjYwODAxIDEyLjM2M0M1Ljc3Mzc3IDEyLjE1NTkgNi4wMTUwMiAxMi4wMjMxIDYuMjc4NyAxMS45OTM4QzYuNTQyMzcgMTEuOTY0NiA2LjgwNjg3IDEyLjA0MTIgNy4wMTQwMSAxMi4yMDdMMTEuMDkgMTUuNDY4TDE3LjMxNyA3LjAxN0MxNy4zOTIgNi45MDQ1MSAxNy40ODkgNi44MDgzOCAxNy42MDIxIDYuNzM0NDNDMTcuNzE1MyA2LjY2MDQ4IDE3Ljg0MjMgNi42MTAyNSAxNy45NzU0IDYuNTg2NzZDMTguMTA4NSA2LjU2MzI3IDE4LjI0NSA2LjU2NzAyIDE4LjM3NjcgNi41OTc3N0MxOC41MDgzIDYuNjI4NTMgMTguNjMyMyA2LjY4NTY1IDE4Ljc0MTMgNi43NjU3QzE4Ljg1MDIgNi44NDU3NCAxOC45NDE4IDYuOTQ3MDUgMTkuMDEwNSA3LjA2MzQ4QzE5LjA3OTIgNy4xNzk5MiAxOS4xMjM1IDcuMzA5MDcgMTkuMTQwOSA3LjQ0MzEzQzE5LjE1ODIgNy41NzcxOSAxOS4xNDgyIDcuNzEzMzkgMTkuMTExNSA3Ljg0MzQ3QzE5LjA3NDcgNy45NzM1NiAxOS4wMTIgOC4wOTQ4NSAxOC45MjcgOC4yWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWlzc3VlXCIgZGF0YS1uYW1lPVwiaXNzdWVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjMgMTAuNTg2TDEzLjQxNCAxQzEzLjAzODkgMC42MjUwNTkgMTIuNTMwMyAwLjQxNDQyOSAxMiAwLjQxNDQyOUMxMS40Njk3IDAuNDE0NDI5IDEwLjk2MTEgMC42MjUwNTkgMTAuNTg2IDFMMSAxMC41ODdDMC42MjUwNTkgMTAuOTYyMSAwLjQxNDQyOSAxMS40NzA3IDAuNDE0NDI5IDEyLjAwMUMwLjQxNDQyOSAxMi41MzEzIDAuNjI1MDU5IDEzLjAzOTkgMSAxMy40MTVMMTAuNTg2IDIzQzEwLjk2MTEgMjMuMzc0OSAxMS40Njk3IDIzLjU4NTYgMTIgMjMuNTg1NkMxMi41MzAzIDIzLjU4NTYgMTMuMDM4OSAyMy4zNzQ5IDEzLjQxNCAyM0wyMyAxMy40MTVDMjMuMTg1OCAxMy4yMjkzIDIzLjMzMzIgMTMuMDA4OCAyMy40MzM4IDEyLjc2NjFDMjMuNTM0MyAxMi41MjM0IDIzLjU4NjEgMTIuMjYzMiAyMy41ODYxIDEyLjAwMDVDMjMuNTg2MSAxMS43Mzc4IDIzLjUzNDMgMTEuNDc3NyAyMy40MzM4IDExLjIzNDlDMjMuMzMzMiAxMC45OTIyIDIzLjE4NTggMTAuNzcxNyAyMyAxMC41ODZaTTExLjA2OCA2LjQxN0MxMS4wNjggNi4xNTE3OCAxMS4xNzM0IDUuODk3NDMgMTEuMzYwOSA1LjcwOTg5QzExLjU0ODQgNS41MjIzNiAxMS44MDI4IDUuNDE3IDEyLjA2OCA1LjQxN0MxMi4zMzMyIDUuNDE3IDEyLjU4NzYgNS41MjIzNiAxMi43NzUxIDUuNzA5ODlDMTIuOTYyNiA1Ljg5NzQzIDEzLjA2OCA2LjE1MTc4IDEzLjA2OCA2LjQxN1YxMi40MTdDMTMuMDY4IDEyLjY4MjIgMTIuOTYyNiAxMi45MzY2IDEyLjc3NTEgMTMuMTI0MUMxMi41ODc2IDEzLjMxMTYgMTIuMzMzMiAxMy40MTcgMTIuMDY4IDEzLjQxN0MxMS44MDI4IDEzLjQxNyAxMS41NDg0IDEzLjMxMTYgMTEuMzYwOSAxMy4xMjQxQzExLjE3MzQgMTIuOTM2NiAxMS4wNjggMTIuNjgyMiAxMS4wNjggMTIuNDE3VjYuNDE3Wk0xMi4xMTkgMTcuOTI3SDEyLjA5MUMxMS42OTY3IDE3LjkyNTUgMTEuMzE4MyAxNy43NzE3IDExLjAzNDYgMTcuNDk3OEMxMC43NTEgMTcuMjIzOSAxMC41ODQyIDE2Ljg1MSAxMC41NjkgMTYuNDU3QzEwLjU2MTcgMTYuMjYxIDEwLjU5MzUgMTYuMDY1NSAxMC42NjI2IDE1Ljg4MTlDMTAuNzMxOCAxNS42OTgzIDEwLjgzNjggMTUuNTMwNCAxMC45NzE3IDE1LjM4NzlDMTEuMTA2NSAxNS4yNDU0IDExLjI2ODQgMTUuMTMxMyAxMS40NDc5IDE1LjA1MjFDMTEuNjI3NCAxNC45NzMgMTEuODIwOSAxNC45MzA1IDEyLjAxNyAxNC45MjdIMTIuMDQ1QzEyLjQzOTQgMTQuOTI4IDEyLjgxODIgMTUuMDgxNiAxMy4xMDE5IDE1LjM1NTZDMTMuMzg1NiAxNS42Mjk3IDEzLjU1MjMgMTYuMDAyOCAxMy41NjcgMTYuMzk3QzEzLjU3NDMgMTYuNTkzIDEzLjU0MjUgMTYuNzg4NSAxMy40NzM0IDE2Ljk3MjFDMTMuNDA0MiAxNy4xNTU3IDEzLjI5OTIgMTcuMzIzNiAxMy4xNjQzIDE3LjQ2NjFDMTMuMDI5NSAxNy42MDg2IDEyLjg2NzYgMTcuNzIyNyAxMi42ODgxIDE3LjgwMTlDMTIuNTA4NiAxNy44ODEgMTIuMzE1MSAxNy45MjM1IDEyLjExOSAxNy45MjdaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbGVhZGVyYm9hcmRcIiBkYXRhLW5hbWU9XCJsZWFkZXJib2FyZFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk01LjUgOS41SDEuNUMxLjEwMjE4IDkuNSAwLjcyMDY0NCA5LjY1ODA0IDAuNDM5MzQgOS45MzkzNEMwLjE1ODAzNSAxMC4yMjA2IDAgMTAuNjAyMiAwIDExTDAgMjBDMCAyMC4zOTc4IDAuMTU4MDM1IDIwLjc3OTQgMC40MzkzNCAyMS4wNjA3QzAuNzIwNjQ0IDIxLjM0MiAxLjEwMjE4IDIxLjUgMS41IDIxLjVINS41QzUuNjMyNjEgMjEuNSA1Ljc1OTc5IDIxLjQ0NzMgNS44NTM1NSAyMS4zNTM2QzUuOTQ3MzIgMjEuMjU5OCA2IDIxLjEzMjYgNiAyMVYxMEM2IDkuODY3MzkgNS45NDczMiA5Ljc0MDIxIDUuODUzNTUgOS42NDY0NUM1Ljc1OTc5IDkuNTUyNjggNS42MzI2MSA5LjUgNS41IDkuNVpcIi8+PHBhdGggZD1cIk0yMi41IDEzLjVIMTguNUMxOC4zNjc0IDEzLjUgMTguMjQwMiAxMy41NTI3IDE4LjE0NjQgMTMuNjQ2NEMxOC4wNTI3IDEzLjc0MDIgMTggMTMuODY3NCAxOCAxNFYyMUMxOCAyMS4xMzI2IDE4LjA1MjcgMjEuMjU5OCAxOC4xNDY0IDIxLjM1MzZDMTguMjQwMiAyMS40NDczIDE4LjM2NzQgMjEuNSAxOC41IDIxLjVIMjIuNUMyMi44OTc4IDIxLjUgMjMuMjc5NCAyMS4zNDIgMjMuNTYwNyAyMS4wNjA3QzIzLjg0MiAyMC43Nzk0IDI0IDIwLjM5NzggMjQgMjBWMTVDMjQgMTQuNjAyMiAyMy44NDIgMTQuMjIwNiAyMy41NjA3IDEzLjkzOTNDMjMuMjc5NCAxMy42NTggMjIuODk3OCAxMy41IDIyLjUgMTMuNVpcIi8+PHBhdGggZD1cIk0xNSAyLjVIOUM4LjYwMjE4IDIuNSA4LjIyMDY0IDIuNjU4MDQgNy45MzkzNCAyLjkzOTM0QzcuNjU4MDQgMy4yMjA2NCA3LjUgMy42MDIxOCA3LjUgNFYyMUM3LjUgMjEuMTMyNiA3LjU1MjY4IDIxLjI1OTggNy42NDY0NSAyMS4zNTM2QzcuNzQwMjEgMjEuNDQ3MyA3Ljg2NzM5IDIxLjUgOCAyMS41SDE2QzE2LjEzMjYgMjEuNSAxNi4yNTk4IDIxLjQ0NzMgMTYuMzUzNiAyMS4zNTM2QzE2LjQ0NzMgMjEuMjU5OCAxNi41IDIxLjEzMjYgMTYuNSAyMVY0QzE2LjUgMy42MDIxOCAxNi4zNDIgMy4yMjA2NCAxNi4wNjA3IDIuOTM5MzRDMTUuNzc5NCAyLjY1ODA0IDE1LjM5NzggMi41IDE1IDIuNVpNMTMgMTAuNzVIMTFDMTAuODAxMSAxMC43NSAxMC42MTAzIDEwLjY3MSAxMC40Njk3IDEwLjUzMDNDMTAuMzI5IDEwLjM4OTcgMTAuMjUgMTAuMTk4OSAxMC4yNSAxMEMxMC4yNSA5LjgwMTA5IDEwLjMyOSA5LjYxMDMyIDEwLjQ2OTcgOS40Njk2N0MxMC42MTAzIDkuMzI5MDIgMTAuODAxMSA5LjI1IDExIDkuMjVDMTEuMDY2MyA5LjI1IDExLjEyOTkgOS4yMjM2NiAxMS4xNzY4IDkuMTc2NzhDMTEuMjIzNyA5LjEyOTg5IDExLjI1IDkuMDY2MyAxMS4yNSA5VjdDMTEuMjUgNi45MzM3IDExLjIyMzcgNi44NzAxMSAxMS4xNzY4IDYuODIzMjJDMTEuMTI5OSA2Ljc3NjM0IDExLjA2NjMgNi43NSAxMSA2Ljc1QzEwLjgwMTEgNi43NSAxMC42MTAzIDYuNjcwOTggMTAuNDY5NyA2LjUzMDMzQzEwLjMyOSA2LjM4OTY4IDEwLjI1IDYuMTk4OTEgMTAuMjUgNkMxMC4yNSA1LjgwMTA5IDEwLjMyOSA1LjYxMDMyIDEwLjQ2OTcgNS40Njk2N0MxMC42MTAzIDUuMzI5MDIgMTAuODAxMSA1LjI1IDExIDUuMjVIMTEuNUMxMS44MzE0IDUuMjUwNTMgMTIuMTQ5IDUuMzgyMzkgMTIuMzgzMyA1LjYxNjdDMTIuNjE3NiA1Ljg1MTAxIDEyLjc0OTUgNi4xNjg2NCAxMi43NSA2LjVWOUMxMi43NSA5LjA2NjMgMTIuNzc2MyA5LjEyOTg5IDEyLjgyMzIgOS4xNzY3OEMxMi44NzAxIDkuMjIzNjYgMTIuOTMzNyA5LjI1IDEzIDkuMjVDMTMuMTk4OSA5LjI1IDEzLjM4OTcgOS4zMjkwMiAxMy41MzAzIDkuNDY5NjdDMTMuNjcxIDkuNjEwMzIgMTMuNzUgOS44MDEwOSAxMy43NSAxMEMxMy43NSAxMC4xOTg5IDEzLjY3MSAxMC4zODk3IDEzLjUzMDMgMTAuNTMwM0MxMy4zODk3IDEwLjY3MSAxMy4xOTg5IDEwLjc1IDEzIDEwLjc1WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLWxvZ29cIiBkYXRhLW5hbWU9XCJsb2dvXCIgdmlld0JveD1cIjAgMCA4OC40MiA1Mi4yOFwiIHdpZHRoPVwiODhcIiBoZWlnaHQ9XCI1MlwiPjx0aXRsZT5mbGVldGlvLWxvZ28tbWFyay1vbmx5PC90aXRsZT48Zz48Zz48cGF0aCBkPVwiTTc2LjQ0LDE2LjE1QTQuNDksNC40OSwwLDAsMCw3MiwxOS44OUw2NC4zLDBIMTcuNzZMMTAsMTkuODlhNC40OSw0LjQ5LDAsMSwwLTQuNDIsNS4yNlY0OGwxMC42Ny03Ljc0aC0uMjNhNiw2LDAsMSwxLDUuNjItMy45MmwuMTEtLjA4TDU0LDQ4LjU3bDIyLjQ2LTEzVjI1LjE1YTQuNSw0LjUsMCwwLDAsMC05Wm0tMzMsNC41SDE0TDIwLjUsNEg2MS41Nkw2OCwyMC42NUg2NC40NWMwLS4wNiwwLS4xMiwwLS4xOGExMC41LDEwLjUsMCwxLDAtMjEsMEM0My40NiwyMC41Myw0My40NywyMC41OSw0My40NywyMC42NVptMy41LDBjMC0uMDYsMC0uMTIsMC0uMThhNyw3LDAsMCwxLDE0LDBjMCwuMDYsMCwuMTIsMCwuMThaTTY2LDQwLjMyYTYsNiwwLDEsMSw2LTZBNiw2LDAsMCwxLDY2LDQwLjMyWlwiIGZpbGw9XCIjMjQyYjJlXCIvPjxwb2x5Z29uIHBvaW50cz1cIjg4LjQyIDI4LjM0IDg0LjY4IDM3LjU2IDgzLjE5IDM1LjA3IDUzLjk2IDUyLjI4IDIxLjczIDM5LjUxIDAgNTIuMjggMjEuNzMgMzIuMzcgNTMuOTYgNDUuMTIgNzkuOTcgMjkuNzEgNzguNTIgMjcuMjcgODguNDIgMjguMzRcIiBmaWxsPVwiIzE4Y2M2Y1wiLz48L2c+PC9nPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbWFwXCIgZGF0YS1uYW1lPVwibWFwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTEuNzk5OTcgMTguMDI1TDAuNDY2OTY2IDIyLjAyNUMwLjM5MTc1OCAyMi4yNTAzIDAuMzcxMTE3IDIyLjQ5MDIgMC40MDY3NDIgMjIuNzI1QzAuNDQyMzY4IDIyLjk1OTggMC41MzMyNDEgMjMuMTgyOCAwLjY3MTg4NSAyMy4zNzU2QzAuODEwNTI4IDIzLjU2ODUgMC45OTI5NzkgMjMuNzI1NiAxLjIwNDIyIDIzLjgzNDJDMS40MTU0NyAyMy45NDI3IDEuNjQ5NDcgMjMuOTk5NiAxLjg4Njk3IDI0SDIyLjExM0MyMi4zNTA2IDIzLjk5OTkgMjIuNTg0OSAyMy45NDMzIDIyLjc5NjQgMjMuODM0OUMyMy4wMDc5IDIzLjcyNjQgMjMuMTkwNiAyMy41NjkzIDIzLjMyOTUgMjMuMzc2NUMyMy40NjgzIDIzLjE4MzYgMjMuNTU5NCAyMi45NjA1IDIzLjU5NTEgMjIuNzI1NUMyMy42MzA4IDIyLjQ5MDUgMjMuNjEwMiAyMi4yNTA0IDIzLjUzNSAyMi4wMjVMMjIuMjAyIDE4LjAyNUMyMi4xMDI0IDE3LjcyNjYgMjEuOTExNSAxNy40NjcxIDIxLjY1NjMgMTcuMjgzMkMyMS40MDExIDE3LjA5OTIgMjEuMDk0NSAxNy4wMDAyIDIwLjc4IDE3SDE1LjIxMUMxNS4xNjg0IDE3LjAwMDEgMTUuMTI2NSAxNy4wMTA5IDE1LjA4OTMgMTcuMDMxNkMxNS4wNTIgMTcuMDUyMiAxNS4wMjA2IDE3LjA4MTkgMTQuOTk4IDE3LjExOEMxNC4yMTIgMTguMzg4IDEzLjU1NCAxOS4zOCAxMy4yNDQgMTkuODRDMTMuMTA2NyAyMC4wNDM4IDEyLjkyMTQgMjAuMjEwNyAxMi43MDQ1IDIwLjMyNjFDMTIuNDg3NiAyMC40NDE1IDEyLjI0NTcgMjAuNTAxOSAxMiAyMC41MDE5QzExLjc1NDMgMjAuNTAxOSAxMS41MTIzIDIwLjQ0MTUgMTEuMjk1NCAyMC4zMjYxQzExLjA3ODUgMjAuMjEwNyAxMC44OTMzIDIwLjA0MzggMTAuNzU2IDE5Ljg0QzEwLjQ0NiAxOS4zOCA5Ljc4Nzk3IDE4LjM4OCA5LjAwMTk3IDE3LjExOEM4Ljk3OTI1IDE3LjA4MiA4Ljk0NzgzIDE3LjA1MjMgOC45MTA2IDE3LjAzMTdDOC44NzMzNiAxNy4wMTExIDguODMxNTMgMTcuMDAwMiA4Ljc4ODk3IDE3SDMuMjIwOTdDMi45MDY1NyAxNy4wMDA0IDIuNjAwMjQgMTcuMDk5NSAyLjM0NTI2IDE3LjI4MzVDMi4wOTAyNyAxNy40Njc0IDEuODk5NTMgMTcuNzI2OCAxLjc5OTk3IDE4LjAyNVYxOC4wMjVaXCIvPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMi4xMTg0IDE4Ljc3MDFDMTIuMDgyIDE4Ljc4OTYgMTIuMDQxMyAxOC43OTk5IDEyIDE4LjhDMTEuOTU4OSAxOC44IDExLjkxODQgMTguNzkwMiAxMS44ODIgMTguNzcxMkMxMS44NDU2IDE4Ljc1MjIgMTEuODE0NCAxOC43MjQ3IDExLjc5MSAxOC42OTFDMTAuNjk3IDE3LjAzMSA1LjY3Mzk1IDkuMjQ4OTcgNS42NzM5NSA2LjE5OTk3QzUuNjgxOTIgNS4zNzc0MiA1Ljg1MTkgNC41NjQ0OSA2LjE3NDE5IDMuODA3NjZDNi40OTY0NyAzLjA1MDgyIDYuOTY0NzMgMi4zNjQ5MSA3LjU1MjIyIDEuNzg5MTNDOC4xMzk3IDEuMjEzMzUgOC44MzQ4OSAwLjc1ODk3NyA5LjU5ODA1IDAuNDUxOTg0QzEwLjM2MTIgMC4xNDQ5OTIgMTEuMTc3NCAtMC4wMDg2MDQyOSAxMiAtMi41NzExMWUtMDVDMTIuODIyNSAtMC4wMDg0NzI0NyAxMy42Mzg2IDAuMTQ1MjE0IDE0LjQwMTcgMC40NTIyNTNDMTUuMTY0OCAwLjc1OTI5MyAxNS44NTk5IDEuMjEzNjcgMTYuNDQ3NCAxLjc4OTQzQzE3LjAzNDkgMi4zNjUxOCAxNy41MDMxIDMuMDUxMDQgMTcuODI1NCAzLjgwNzgyQzE4LjE0NzggNC41NjQ1OSAxOC4zMTc5IDUuMzc3NDUgMTguMzI2IDYuMTk5OTdDMTguMzI2IDkuMjQ1OTcgMTMuMyAxNy4wMjkgMTIuMjA5IDE4LjY4OEMxMi4xODYgMTguNzIyNCAxMi4xNTQ5IDE4Ljc1MDYgMTIuMTE4NCAxOC43NzAxWk0xMiA4Ljk5OTk3QzEzLjY1NjkgOC45OTk5NyAxNSA3LjY1NjgyIDE1IDUuOTk5OTdDMTUgNC4zNDMxMiAxMy42NTY5IDIuOTk5OTcgMTIgMi45OTk5N0MxMC4zNDMxIDIuOTk5OTcgOSA0LjM0MzEyIDkgNS45OTk5N0M5IDcuNjU2ODIgMTAuMzQzMSA4Ljk5OTk3IDEyIDguOTk5OTdaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctbmF2LW1lbnVcIiBkYXRhLW5hbWU9XCJuYXYtbWVudVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMi45NTY1IDNIMS4wNDM0OEMwLjQ2NzE4MSAzIDAgMy40NDc3MiAwIDRWNUMwIDUuNTUyMjggMC40NjcxODEgNiAxLjA0MzQ4IDZIMjIuOTU2NUMyMy41MzI4IDYgMjQgNS41NTIyOCAyNCA1VjRDMjQgMy40NDc3MiAyMy41MzI4IDMgMjIuOTU2NSAzWlwiLz48cGF0aCBkPVwiTTIyLjk1NjUgMTAuNUgxLjA0MzQ4QzAuNDY3MTgxIDEwLjUgMCAxMC45NDc3IDAgMTEuNVYxMi41QzAgMTMuMDUyMyAwLjQ2NzE4MSAxMy41IDEuMDQzNDggMTMuNUgyMi45NTY1QzIzLjUzMjggMTMuNSAyNCAxMy4wNTIzIDI0IDEyLjVWMTEuNUMyNCAxMC45NDc3IDIzLjUzMjggMTAuNSAyMi45NTY1IDEwLjVaXCIvPjxwYXRoIGQ9XCJNMjIuOTU2NSAxOEgxLjA0MzQ4QzAuNDY3MTgxIDE4IDAgMTguNDQ3NyAwIDE5VjIwQzAgMjAuNTUyMyAwLjQ2NzE4MSAyMSAxLjA0MzQ4IDIxSDIyLjk1NjVDMjMuNTMyOCAyMSAyNCAyMC41NTIzIDI0IDIwVjE5QzI0IDE4LjQ0NzcgMjMuNTMyOCAxOCAyMi45NTY1IDE4WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXBhcnRcIiBkYXRhLW5hbWU9XCJwYXJ0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTE1Ljk3MyA4LjI3MUMxNi4wMTY2IDguMjUxMTEgMTYuMDUzNiA4LjIxOTA5IDE2LjA3OTYgOC4xNzg3NUMxNi4xMDU1IDguMTM4NDEgMTYuMTE5MyA4LjA5MTQ2IDE2LjExOTMgOC4wNDM1QzE2LjExOTMgNy45OTU1NCAxNi4xMDU1IDcuOTQ4NTggMTYuMDc5NiA3LjkwODI1QzE2LjA1MzYgNy44Njc5MSAxNi4wMTY2IDcuODM1ODkgMTUuOTczIDcuODE2TDYuMjE1OTYgMy4zNjhDNi4xNTIwNSAzLjMzOTYxIDYuMDgyOSAzLjMyNDk0IDYuMDEyOTYgMy4zMjQ5NEM1Ljk0MzAzIDMuMzI0OTQgNS44NzM4NyAzLjMzOTYxIDUuODA5OTYgMy4zNjhMMS45OTI5NiA1LjAyNEMxLjk0Nzg3IDUuMDQzMjEgMS45MDk0MSA1LjA3NTI2IDEuODgyMzggNS4xMTYxNUMxLjg1NTM1IDUuMTU3MDQgMS44NDA5NCA1LjIwNDk4IDEuODQwOTQgNS4yNTRDMS44NDA5NCA1LjMwMzAyIDEuODU1MzUgNS4zNTA5NiAxLjg4MjM4IDUuMzkxODVDMS45MDk0MSA1LjQzMjc0IDEuOTQ3ODcgNS40NjQ3OSAxLjk5Mjk2IDUuNDg0TDEyLjI4MyA5Ljc3MkMxMi4zNDY1IDkuNzk4NTkgMTIuNDE0OCA5LjgxMTc4IDEyLjQ4MzYgOS44MTA3NUMxMi41NTI0IDkuODA5NzEgMTIuNjIwMyA5Ljc5NDQ4IDEyLjY4MyA5Ljc2NkwxNS45NzMgOC4yNzFaXCIvPjxwYXRoIGQ9XCJNMjIuMDYyIDUuNUMyMi4xMDU5IDUuNDgwMjUgMjIuMTQzMiA1LjQ0ODIyIDIyLjE2OTQgNS40MDc3N0MyMi4xOTU2IDUuMzY3MzIgMjIuMjA5NSA1LjMyMDE3IDIyLjIwOTUgNS4yNzJDMjIuMjA5NSA1LjIyMzgzIDIyLjE5NTYgNS4xNzY2OSAyMi4xNjk0IDUuMTM2MjRDMjIuMTQzMiA1LjA5NTc5IDIyLjEwNTkgNS4wNjM3NiAyMi4wNjIgNS4wNDRMMTIuNCAwLjg0NzAwNEMxMi4yNzM5IDAuNzkxOTQxIDEyLjEzNzcgMC43NjM1MTkgMTIgMC43NjM1MTlDMTEuODYyNCAwLjc2MzUxOSAxMS43MjYyIDAuNzkxOTQxIDExLjYgMC44NDcwMDRMOC4zODAwMiAyLjI0N0M4LjMzNTggMi4yNjY2MyA4LjI5ODIzIDIuMjk4NjcgOC4yNzE4NSAyLjMzOTIzQzguMjQ1NDggMi4zNzk3OSA4LjIzMTQ1IDIuNDI3MTMgOC4yMzE0NSAyLjQ3NTVDOC4yMzE0NSAyLjUyMzg4IDguMjQ1NDggMi41NzEyMiA4LjI3MTg1IDIuNjExNzhDOC4yOTgyMyAyLjY1MjM0IDguMzM1OCAyLjY4NDM4IDguMzgwMDIgMi43MDRMMTguMDggNy4xMjZDMTguMTQ1IDcuMTU1NTcgMTguMjE1NiA3LjE3MDg3IDE4LjI4NyA3LjE3MDg3QzE4LjM1ODQgNy4xNzA4NyAxOC40MjkgNy4xNTU1NyAxOC40OTQgNy4xMjZMMjIuMDYyIDUuNVpcIi8+PHBhdGggZD1cIk0wLjg0NiA2LjYzMDAxQzAuODA3OTk4IDYuNjE0MiAwLjc2NjY4MyA2LjYwODAyIDAuNzI1NzIgNi42MTIwMkMwLjY4NDc1OCA2LjYxNjAyIDAuNjQ1NDE2IDYuNjMwMDcgMC42MTExODYgNi42NTI5MkMwLjU3Njk1NyA2LjY3NTc3IDAuNTQ4ODk5IDYuNzA2NzIgMC41Mjk1MDMgNi43NDMwMkMwLjUxMDEwNyA2Ljc3OTMyIDAuNDk5OTczIDYuODE5ODUgMC41IDYuODYxMDFWMTguMDA3QzAuNDk5OTg0IDE4LjIwNDQgMC41NTgzNzIgMTguMzk3MyAwLjY2NzgxMSAxOC41NjE2QzAuNzc3MjUgMTguNzI1OCAwLjkzMjg0NiAxOC44NTQgMS4xMTUgMTguOTNMMTEuNCAyMy4yMTdDMTEuNDM4IDIzLjIzMjggMTEuNDc5MyAyMy4yMzkgMTEuNTIwMyAyMy4yMzVDMTEuNTYxMiAyMy4yMzEgMTEuNjAwNiAyMy4yMTY5IDExLjYzNDggMjMuMTk0MUMxMS42NjkgMjMuMTcxMiAxMS42OTcxIDIzLjE0MDMgMTEuNzE2NSAyMy4xMDRDMTEuNzM1OSAyMy4wNjc3IDExLjc0NiAyMy4wMjcyIDExLjc0NiAyMi45ODZWMTEuMzRDMTEuNzQ1OSAxMS4yOTA2IDExLjczMTIgMTEuMjQyNCAxMS43MDM4IDExLjIwMTNDMTEuNjc2NSAxMS4xNjAyIDExLjYzNzUgMTEuMTI4MSAxMS41OTIgMTEuMTA5TDAuODQ2IDYuNjMwMDFaXCIvPjxwYXRoIGQ9XCJNMTMuMjUgMjIuOTQ0QzEzLjI1MDIgMjIuOTg1NyAxMy4yNjA4IDIzLjAyNjcgMTMuMjgwOSAyMy4wNjMzQzEzLjMwMDkgMjMuMDk5OSAxMy4zMjk4IDIzLjEzMDkgMTMuMzY0OCAyMy4xNTM1QzEzLjM5OTkgMjMuMTc2MSAxMy40NCAyMy4xODk3IDEzLjQ4MTYgMjMuMTkyOUMxMy41MjMyIDIzLjE5NjEgMTMuNTY0OSAyMy4xODkgMTMuNjAzIDIzLjE3MkwyMi45MTQgMTguOTRDMjMuMDg4NyAxOC44NjA2IDIzLjIzNjggMTguNzMyNSAyMy4zNDA4IDE4LjU3MTFDMjMuNDQ0NyAxOC40MDk4IDIzLjQ5OTkgMTguMjIxOSAyMy41IDE4LjAzVjYuODg2MDFDMjMuNSA2Ljg0NDIgMjMuNDg5NiA2LjgwMzA1IDIzLjQ2OTYgNi43NjYzM0MyMy40NDk2IDYuNzI5NjEgMjMuNDIwOCA2LjY5ODQ4IDIzLjM4NTYgNi42NzU4QzIzLjM1MDUgNi42NTMxMiAyMy4zMTAzIDYuNjM5NiAyMy4yNjg2IDYuNjM2NUMyMy4yMjY5IDYuNjMzMzkgMjMuMTg1MSA2LjY0MDc4IDIzLjE0NyA2LjY1ODAxTDEzLjQgMTEuMDlDMTMuMzU2MiAxMS4xMDk2IDEzLjMxODkgMTEuMTQxNCAxMy4yOTI4IDExLjE4MTdDMTMuMjY2NyAxMS4yMjIgMTMuMjUyOSAxMS4yNjkgMTMuMjUzIDExLjMxN0wxMy4yNSAyMi45NDRaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctcGxhY2VcIiBkYXRhLW5hbWU9XCJwbGFjZVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk04IDBDNS44NzkgMC4wMDIzODIxMSAzLjg0NTU1IDAuODQ2MDAyIDIuMzQ1NzggMi4zNDU3OEMwLjg0NjAwMiAzLjg0NTU1IDAuMDAyMzgyMTEgNS44NzkgMCA4QzAgMTEuMzQzIDQuNTA5IDE4LjkxMiA2LjU3NiAyMi4yQzYuNjMzMzEgMjIuMjkxNyA2LjcxODgxIDIyLjM2MjQgNi44MTk2OCAyMi40MDE0QzYuOTIwNTUgMjIuNDQwNCA3LjAzMTM1IDIyLjQ0NTYgNy4xMzU0NiAyMi40MTYzQzcuMjM5NTYgMjIuMzg3MSA3LjMzMTM3IDIyLjMyNDggNy4zOTcwOSAyMi4yMzg5QzcuNDYyODIgMjIuMTUzIDcuNDk4OTMgMjIuMDQ4MSA3LjUgMjEuOTRWMTZDNy40OTk5MiAxNS42Mjg2IDcuNjAzMjUgMTUuMjY0NSA3Ljc5ODQyIDE0Ljk0ODZDNy45OTM1OCAxNC42MzI2IDguMjcyODcgMTQuMzc3MiA4LjYwNSAxNC4yMTFMMTEuNjA1IDEyLjcxMUMxMS44ODMgMTIuNTcyNCAxMi4xODk0IDEyLjUwMDMgMTIuNSAxMi41MDAzQzEyLjgxMDYgMTIuNTAwMyAxMy4xMTcgMTIuNTcyNCAxMy4zOTUgMTIuNzExTDEzLjk0IDEyLjk4NEMxNC4wMDA2IDEzLjAxNDQgMTQuMDY2OCAxMy4wMzIyIDE0LjEzNDUgMTMuMDM2MkMxNC4yMDIyIDEzLjA0MDIgMTQuMjcgMTMuMDMwNCAxNC4zMzM4IDEzLjAwNzRDMTQuMzk3NiAxMi45ODQ0IDE0LjQ1NjEgMTIuOTQ4NiAxNC41MDU2IDEyLjkwMjNDMTQuNTU1MSAxMi44NTYgMTQuNTk0NyAxMi44MDAxIDE0LjYyMiAxMi43MzhDMTUuMzY3OSAxMS4yNTY1IDE1LjgzNSA5LjY1MDQ1IDE2IDhDMTUuOTk3NiA1Ljg3OSAxNS4xNTQgMy44NDU1NSAxMy42NTQyIDIuMzQ1NzhDMTIuMTU0NCAwLjg0NjAwMiAxMC4xMjEgMC4wMDIzODIxMSA4IDBWMFpNOCAxMUM3LjQwNjY2IDExIDYuODI2NjQgMTAuODI0MSA2LjMzMzI5IDEwLjQ5NDRDNS44Mzk5NCAxMC4xNjQ4IDUuNDU1NDIgOS42OTYyMyA1LjIyODM2IDkuMTQ4MDVDNS4wMDEzIDguNTk5ODcgNC45NDE4OSA3Ljk5NjY3IDUuMDU3NjQgNy40MTQ3M0M1LjE3MzQgNi44MzI3OSA1LjQ1OTEyIDYuMjk4MjQgNS44Nzg2OCA1Ljg3ODY4QzYuMjk4MjQgNS40NTkxMiA2LjgzMjc5IDUuMTczNCA3LjQxNDczIDUuMDU3NjRDNy45OTY2NyA0Ljk0MTg5IDguNTk5ODcgNS4wMDEzIDkuMTQ4MDUgNS4yMjgzNkM5LjY5NjIzIDUuNDU1NDIgMTAuMTY0OCA1LjgzOTk0IDEwLjQ5NDQgNi4zMzMyOUMxMC44MjQxIDYuODI2NjQgMTEgNy40MDY2NiAxMSA4QzExIDguNzk1NjUgMTAuNjgzOSA5LjU1ODcxIDEwLjEyMTMgMTAuMTIxM0M5LjU1ODcxIDEwLjY4MzkgOC43OTU2NSAxMSA4IDExWlwiLz48cGF0aCBkPVwiTTE1LjcyNCAxNS41NTNMMTIuNzI0IDE0LjA1M0MxMi42NTQ1IDE0LjAxODIgMTIuNTc3OCAxNCAxMi41IDE0QzEyLjQyMjIgMTQgMTIuMzQ1NSAxNC4wMTgyIDEyLjI3NiAxNC4wNTNMOS4yNzYgMTUuNTUzQzkuMTkzMDUgMTUuNTk0NiA5LjEyMzMxIDE1LjY1ODQgOS4wNzQ1NiAxNS43MzczQzkuMDI1ODIgMTUuODE2MyA5IDE1LjkwNzIgOSAxNlYyMy41QzkgMjMuNjMyNiA5LjA1MjY4IDIzLjc1OTggOS4xNDY0NSAyMy44NTM2QzkuMjQwMjEgMjMuOTQ3MyA5LjM2NzM5IDI0IDkuNSAyNEgxMUMxMS4xMzI2IDI0IDExLjI1OTggMjMuOTQ3MyAxMS4zNTM2IDIzLjg1MzZDMTEuNDQ3MyAyMy43NTk4IDExLjUgMjMuNjMyNiAxMS41IDIzLjVWMjIuNUMxMS41IDIyLjM2NzQgMTEuNTUyNyAyMi4yNDAyIDExLjY0NjQgMjIuMTQ2NEMxMS43NDAyIDIyLjA1MjcgMTEuODY3NCAyMiAxMiAyMkgxM0MxMy4xMzI2IDIyIDEzLjI1OTggMjIuMDUyNyAxMy4zNTM2IDIyLjE0NjRDMTMuNDQ3MyAyMi4yNDAyIDEzLjUgMjIuMzY3NCAxMy41IDIyLjVWMjMuNUMxMy41IDIzLjYzMjYgMTMuNTUyNyAyMy43NTk4IDEzLjY0NjQgMjMuODUzNkMxMy43NDAyIDIzLjk0NzMgMTMuODY3NCAyNCAxNCAyNEgxNS41QzE1LjYzMjYgMjQgMTUuNzU5OCAyMy45NDczIDE1Ljg1MzYgMjMuODUzNkMxNS45NDczIDIzLjc1OTggMTYgMjMuNjMyNiAxNiAyMy41VjE2QzE2IDE1LjkwNzIgMTUuOTc0MiAxNS44MTYzIDE1LjkyNTQgMTUuNzM3M0MxNS44NzY3IDE1LjY1ODQgMTUuODA2OSAxNS41OTQ2IDE1LjcyNCAxNS41NTNaTTE0IDIwSDExQzEwLjg2NzQgMjAgMTAuNzQwMiAxOS45NDczIDEwLjY0NjQgMTkuODUzNkMxMC41NTI3IDE5Ljc1OTggMTAuNSAxOS42MzI2IDEwLjUgMTkuNUMxMC41IDE5LjM2NzQgMTAuNTUyNyAxOS4yNDAyIDEwLjY0NjQgMTkuMTQ2NEMxMC43NDAyIDE5LjA1MjcgMTAuODY3NCAxOSAxMSAxOUgxNEMxNC4xMzI2IDE5IDE0LjI1OTggMTkuMDUyNyAxNC4zNTM2IDE5LjE0NjRDMTQuNDQ3MyAxOS4yNDAyIDE0LjUgMTkuMzY3NCAxNC41IDE5LjVDMTQuNSAxOS42MzI2IDE0LjQ0NzMgMTkuNzU5OCAxNC4zNTM2IDE5Ljg1MzZDMTQuMjU5OCAxOS45NDczIDE0LjEzMjYgMjAgMTQgMjBaTTE0IDE3LjVIMTFDMTAuODY3NCAxNy41IDEwLjc0MDIgMTcuNDQ3MyAxMC42NDY0IDE3LjM1MzZDMTAuNTUyNyAxNy4yNTk4IDEwLjUgMTcuMTMyNiAxMC41IDE3QzEwLjUgMTYuODY3NCAxMC41NTI3IDE2Ljc0MDIgMTAuNjQ2NCAxNi42NDY0QzEwLjc0MDIgMTYuNTUyNyAxMC44Njc0IDE2LjUgMTEgMTYuNUgxNEMxNC4xMzI2IDE2LjUgMTQuMjU5OCAxNi41NTI3IDE0LjM1MzYgMTYuNjQ2NEMxNC40NDczIDE2Ljc0MDIgMTQuNSAxNi44Njc0IDE0LjUgMTdDMTQuNSAxNy4xMzI2IDE0LjQ0NzMgMTcuMjU5OCAxNC4zNTM2IDE3LjM1MzZDMTQuMjU5OCAxNy40NDczIDE0LjEzMjYgMTcuNSAxNCAxNy41WlwiLz48cGF0aCBkPVwiTTIzLjY5MiAxMi4wMzhMMTcuNjkyIDkuNTM4QzE3LjYxNiA5LjUwNjM5IDE3LjUzMzQgOS40OTQwMyAxNy40NTE0IDkuNTAyMDNDMTcuMzY5NSA5LjUxMDAyIDE3LjI5MDggOS41MzgxMiAxNy4yMjI0IDkuNTgzODJDMTcuMTUzOSA5LjYyOTUzIDE3LjA5NzggOS42OTE0MyAxNy4wNTkgOS43NjQwM0MxNy4wMjAyIDkuODM2NjMgMTYuOTk5OSA5LjkxNzY4IDE3IDEwVjIzLjVDMTcgMjMuNjMyNiAxNy4wNTI3IDIzLjc1OTggMTcuMTQ2NCAyMy44NTM2QzE3LjI0MDIgMjMuOTQ3MyAxNy4zNjc0IDI0IDE3LjUgMjRIMjMuNUMyMy42MzI2IDI0IDIzLjc1OTggMjMuOTQ3MyAyMy44NTM2IDIzLjg1MzZDMjMuOTQ3MyAyMy43NTk4IDI0IDIzLjYzMjYgMjQgMjMuNVYxMi41QzI0LjAwMDEgMTIuNDAxMiAyMy45NzA4IDEyLjMwNDUgMjMuOTE2IDEyLjIyMjNDMjMuODYxMiAxMi4xNDAxIDIzLjc4MzIgMTIuMDc1OSAyMy42OTIgMTIuMDM4Wk0yMiAyMEgxOUMxOC44Njc0IDIwIDE4Ljc0MDIgMTkuOTQ3MyAxOC42NDY0IDE5Ljg1MzZDMTguNTUyNyAxOS43NTk4IDE4LjUgMTkuNjMyNiAxOC41IDE5LjVDMTguNSAxOS4zNjc0IDE4LjU1MjcgMTkuMjQwMiAxOC42NDY0IDE5LjE0NjRDMTguNzQwMiAxOS4wNTI3IDE4Ljg2NzQgMTkgMTkgMTlIMjJDMjIuMTMyNiAxOSAyMi4yNTk4IDE5LjA1MjcgMjIuMzUzNiAxOS4xNDY0QzIyLjQ0NzMgMTkuMjQwMiAyMi41IDE5LjM2NzQgMjIuNSAxOS41QzIyLjUgMTkuNjMyNiAyMi40NDczIDE5Ljc1OTggMjIuMzUzNiAxOS44NTM2QzIyLjI1OTggMTkuOTQ3MyAyMi4xMzI2IDIwIDIyIDIwWk0yMiAxNy41SDE5QzE4Ljg2NzQgMTcuNSAxOC43NDAyIDE3LjQ0NzMgMTguNjQ2NCAxNy4zNTM2QzE4LjU1MjcgMTcuMjU5OCAxOC41IDE3LjEzMjYgMTguNSAxN0MxOC41IDE2Ljg2NzQgMTguNTUyNyAxNi43NDAyIDE4LjY0NjQgMTYuNjQ2NEMxOC43NDAyIDE2LjU1MjcgMTguODY3NCAxNi41IDE5IDE2LjVIMjJDMjIuMTMyNiAxNi41IDIyLjI1OTggMTYuNTUyNyAyMi4zNTM2IDE2LjY0NjRDMjIuNDQ3MyAxNi43NDAyIDIyLjUgMTYuODY3NCAyMi41IDE3QzIyLjUgMTcuMTMyNiAyMi40NDczIDE3LjI1OTggMjIuMzUzNiAxNy4zNTM2QzIyLjI1OTggMTcuNDQ3MyAyMi4xMzI2IDE3LjUgMjIgMTcuNVpNMjIgMTVIMTlDMTguODY3NCAxNSAxOC43NDAyIDE0Ljk0NzMgMTguNjQ2NCAxNC44NTM2QzE4LjU1MjcgMTQuNzU5OCAxOC41IDE0LjYzMjYgMTguNSAxNC41QzE4LjUgMTQuMzY3NCAxOC41NTI3IDE0LjI0MDIgMTguNjQ2NCAxNC4xNDY0QzE4Ljc0MDIgMTQuMDUyNyAxOC44Njc0IDE0IDE5IDE0SDIyQzIyLjEzMjYgMTQgMjIuMjU5OCAxNC4wNTI3IDIyLjM1MzYgMTQuMTQ2NEMyMi40NDczIDE0LjI0MDIgMjIuNSAxNC4zNjc0IDIyLjUgMTQuNUMyMi41IDE0LjYzMjYgMjIuNDQ3MyAxNC43NTk4IDIyLjM1MzYgMTQuODUzNkMyMi4yNTk4IDE0Ljk0NzMgMjIuMTMyNiAxNSAyMiAxNVpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1xdWVzdGlvblwiIGRhdGEtbmFtZT1cInF1ZXN0aW9uXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48ZyBjbGlwLXBhdGg9XCJ1cmwoI2RlZi1zdmctcXVlc3Rpb24tMClcIj48cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCIgY2xpcC1ydWxlPVwiZXZlbm9kZFwiIGQ9XCJNMTAuMTYxOCAzLjQ0NzQ3QzEwLjgxMzIgMy4xMTA0NSAxMS41NDQ2IDIuOTU4OTUgMTIuMjc2MiAzLjAwOTUzQzEzLjAwNzggMy4wNjAxMSAxMy43MTE0IDMuMzEwODMgMTQuMzEwMSAzLjczNDI5QzE0LjkwODkgNC4xNTc3NCAxNS4zNzk3IDQuNzM3NjMgMTUuNjcxMSA1LjQxMDU4QzE1Ljk2MjUgNi4wODM1MyAxNi4wNjM0IDYuODIzNjUgMTUuOTYyNiA3LjU1MDAzQzE1Ljg2MTggOC4yNzY0MiAxNS41NjMzIDguOTYxMTIgMTUuMDk5NiA5LjUyOTMxQzE0LjYzNiAxMC4wOTc1IDE0LjAyNTEgMTAuNTI3MyAxMy4zMzM3IDEwLjc3MTdDMTIuNTA0NyAxMS4wNjQ4IDExLjc4NyAxMS42MDc4IDExLjI3OTUgMTIuMzI1OUMxMC43NzIyIDEzLjA0MzggMTAuNSAxMy45MDIgMTAuNTAwMyAxNC43ODFMMTAuNSAxNS41QzEwLjUgMTYuMzI4NCAxMS4xNzE2IDE3IDEyIDE3QzEyLjgyODQgMTcgMTMuNSAxNi4zMjg0IDEzLjUgMTUuNUwxMy41MDAzIDE0Ljc3OTVDMTMuNTAwMSAxNC41MjA4IDEzLjU4MDIgMTQuMjY4NSAxMy43Mjk1IDE0LjA1NzNDMTMuODc4NyAxMy44NDYxIDE0LjA4OTggMTMuNjg2NCAxNC4zMzM3IDEzLjYwMDJDMTUuNTQzNiAxMy4xNzI0IDE2LjYxMjcgMTIuNDIwMyAxNy40MjQgMTEuNDI2QzE4LjIzNTMgMTAuNDMxNyAxOC43NTc3IDkuMjMzNDcgMTguOTM0MSA3Ljk2MjMzQzE5LjExMDUgNi42OTExOSAxOC45MzQgNS4zOTYwMyAxOC40MjQgNC4yMTg0QzE3LjkxNDEgMy4wNDA3NyAxNy4wOTAyIDIuMDI1OTggMTYuMDQyNCAxLjI4NDk2QzE0Ljk5NDcgMC41NDM5MzggMTMuNzYzNCAwLjEwNTE5MiAxMi40ODMxIDAuMDE2Njc0NUMxMS4yMDI4IC0wLjA3MTg0MjYgOS45MjI4OSAwLjE5MzI3NyA4Ljc4MzEzIDAuNzgzMDU1QzcuNjQzMzYgMS4zNzI4MyA2LjY4NzY1IDIuMjY0NTcgNi4wMjA0NiAzLjM2MDgyQzUuMzUzMjYgNC40NTcwNiA1LjAwMDI1IDUuNzE1NjEgNSA2Ljk5ODkzQzQuOTk5ODQgNy44MjczNiA1LjY3MTI5IDguNDk5MDYgNi40OTk3MSA4LjQ5OTIyQzcuMzI4MTQgOC40OTkzNyA3Ljk5OTg0IDcuODI3OTMgOCA2Ljk5OTVDOC4wMDAxNCA2LjI2NjE2IDguMjAxODcgNS41NDY5NiA4LjU4MzEzIDQuOTIwNTJDOC45NjQ0IDQuMjk0MDggOS41MTA1MyAzLjc4NDUgMTAuMTYxOCAzLjQ0NzQ3Wk0xMiAyNEMxMy4yNDI2IDI0IDE0LjI1IDIyLjk5MjYgMTQuMjUgMjEuNzVDMTQuMjUgMjAuNTA3NCAxMy4yNDI2IDE5LjUgMTIgMTkuNUMxMC43NTc0IDE5LjUgOS43NSAyMC41MDc0IDkuNzUgMjEuNzVDOS43NSAyMi45OTI2IDEwLjc1NzQgMjQgMTIgMjRaXCIvPjwvZz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXJlbWluZGVyXCIgZGF0YS1uYW1lPVwicmVtaW5kZXJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0xMy41IDMuMTgyNjJWMS41QzEzLjUgMS4xMDIxOCAxMy4zNDIgMC43MjA2NDQgMTMuMDYwNyAwLjQzOTM0QzEyLjc3OTQgMC4xNTgwMzUgMTIuMzk3OCAwIDEyIDBDMTEuNjAyMiAwIDExLjIyMDYgMC4xNTgwMzUgMTAuOTM5MyAwLjQzOTM0QzEwLjY1OCAwLjcyMDY0NCAxMC41IDEuMTAyMTggMTAuNSAxLjVWMy4xODI2MkM4LjgzMzEyIDMuNjA0NjkgNy4zNDI3NCA0LjU1NzA2IDYuMjU3OTggNS45MDNDNS4wNjU4MyA3LjM4MjE4IDQuNDQyMjYgOS4yMzkwOSA0LjUgMTEuMTM4VjE2QzQuNSAxNi4zOTc4IDQuMzQxOTYgMTYuNzc5NCA0LjA2MDY2IDE3LjA2MDdDMy43NzkzNiAxNy4zNDIgMy4zOTc4MiAxNy41IDMgMTcuNUMyLjczNDc4IDE3LjUgMi40ODA0MyAxNy42MDU0IDIuMjkyODkgMTcuNzkyOUMyLjEwNTM2IDE3Ljk4MDQgMiAxOC4yMzQ4IDIgMTguNUMyIDE4Ljc2NTIgMi4xMDUzNiAxOS4wMTk2IDIuMjkyODkgMTkuMjA3MUMyLjQ4MDQzIDE5LjM5NDYgMi43MzQ3OCAxOS41IDMgMTkuNUgyMUMyMS4yNjUyIDE5LjUgMjEuNTE5NiAxOS4zOTQ2IDIxLjcwNzEgMTkuMjA3MUMyMS44OTQ2IDE5LjAxOTYgMjIgMTguNzY1MiAyMiAxOC41QzIyIDE4LjIzNDggMjEuODk0NiAxNy45ODA0IDIxLjcwNzEgMTcuNzkyOUMyMS41MTk2IDE3LjYwNTQgMjEuMjY1MiAxNy41IDIxIDE3LjVDMjAuNjAyMiAxNy41IDIwLjIyMDYgMTcuMzQyIDE5LjkzOTMgMTcuMDYwN0MxOS42NTggMTYuNzc5NCAxOS41IDE2LjM5NzggMTkuNSAxNlYxMS4xMzhDMTkuNTU3NyA5LjIzOTA5IDE4LjkzNDIgNy4zODIxOCAxNy43NDIgNS45MDNDMTYuNjU3MyA0LjU1NzA2IDE1LjE2NjkgMy42MDQ2OSAxMy41IDMuMTgyNjJaTTE0LjIzNiAyMUg5Ljc2NDAxQzkuNzAyNjMgMjEuMDAwMSA5LjY0MzQzIDIxLjAyMjggOS41OTc2OSAyMS4wNjM3QzkuNTUxOTYgMjEuMTA0NyA5LjUyMjg4IDIxLjE2MSA5LjUxNjAxIDIxLjIyMkM5LjUwNTExIDIxLjMxNDMgOS40OTk3NyAyMS40MDcxIDkuNTAwMDEgMjEuNUM5LjUwMDAxIDIyLjE2MyA5Ljc2MzQgMjIuNzk4OSAxMC4yMzIyIDIzLjI2NzhDMTAuNzAxMSAyMy43MzY2IDExLjMzNyAyNCAxMiAyNEMxMi42NjMgMjQgMTMuMjk4OSAyMy43MzY2IDEzLjc2NzggMjMuMjY3OEMxNC4yMzY2IDIyLjc5ODkgMTQuNSAyMi4xNjMgMTQuNSAyMS41QzE0LjUwMDIgMjEuNDA3MSAxNC40OTQ5IDIxLjMxNDMgMTQuNDg0IDIxLjIyMkMxNC40Nzc2IDIxLjE2MDggMTQuNDQ4NiAyMS4xMDQyIDE0LjQwMjggMjEuMDYzMkMxNC4zNTcgMjEuMDIyMiAxNC4yOTc1IDIwLjk5OTcgMTQuMjM2IDIxWlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXJlcG9ydFwiIGRhdGEtbmFtZT1cInJlcG9ydFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiA+PHBhdGggZD1cIk0yMyAxMC41QzIzLjEzMjYgMTAuNSAyMy4yNTk4IDEwLjQ0NzMgMjMuMzUzNiAxMC4zNTM2QzIzLjQ0NzMgMTAuMjU5OCAyMy41IDEwLjEzMjYgMjMuNSAxMEMyMy40OTY4IDcuMzQ4ODEgMjIuNDQyMiA0LjgwNzEyIDIwLjU2NzYgMi45MzI0NEMxOC42OTI5IDEuMDU3NzYgMTYuMTUxMiAwLjAwMzE3NTcyIDEzLjUgMEMxMy4zNjc0IDAgMTMuMjQwMiAwLjA1MjY3ODQgMTMuMTQ2NCAwLjE0NjQ0N0MxMy4wNTI3IDAuMjQwMjE1IDEzIDAuMzY3MzkyIDEzIDAuNVY5LjUyNUMxMy4wMDAzIDkuNzgzNiAxMy4xMDMgMTAuMDMxNSAxMy4yODU4IDEwLjIxNDVDMTMuNDY4NiAxMC4zOTc0IDEzLjcxNjQgMTAuNTAwNSAxMy45NzUgMTAuNTAxTDIzIDEwLjVaXCIvPjxwYXRoIGQ9XCJNMjMuNSAxMkgxNEMxMy44NTI3IDExLjk4MTIgMTMuNzAzMiAxMi4wMTE0IDEzLjU3NDcgMTIuMDg1OUMxMy40NDYxIDEyLjE2MDUgMTMuMzQ1NyAxMi4yNzUyIDEzLjI4ODggMTIuNDEyNUMxMy4yMzIgMTIuNTQ5NyAxMy4yMjE5IDEyLjcwMTkgMTMuMjYgMTIuODQ1NUMxMy4yOTgyIDEyLjk4OSAxMy4zODI1IDEzLjExNjEgMTMuNSAxMy4yMDdMMjAuMjE4IDE5LjkyNUMyMC4zMTE4IDIwLjAxODcgMjAuNDM4OSAyMC4wNzE0IDIwLjU3MTUgMjAuMDcxNEMyMC43MDQxIDIwLjA3MTQgMjAuODMxMyAyMC4wMTg3IDIwLjkyNSAxOS45MjVDMjEuOTAzIDE4Ljk1MjEgMjIuNjc4MyAxNy43OTUgMjMuMjA2MiAxNi41MjA1QzIzLjczNCAxNS4yNDYgMjQuMDAzOCAxMy44Nzk1IDI0IDEyLjVDMjQgMTIuMzY3NCAyMy45NDc0IDEyLjI0MDIgMjMuODUzNiAxMi4xNDY0QzIzLjc1OTggMTIuMDUyNyAyMy42MzI2IDEyIDIzLjUgMTJaXCIvPjxwYXRoIGQ9XCJNMTAuNTg4IDI0QzExLjk1NDIgMjMuOTk3MSAxMy4zMDYyIDIzLjcyMyAxNC41NjU3IDIzLjE5MzZDMTUuODI1MiAyMi42NjQyIDE2Ljk2NyAyMS44OSAxNy45MjUgMjAuOTE2QzE4LjAxODggMjAuODIyMiAxOC4wNzE0IDIwLjY5NTEgMTguMDcxNCAyMC41NjI1QzE4LjA3MTQgMjAuNDI5OSAxOC4wMTg4IDIwLjMwMjggMTcuOTI1IDIwLjIwOUwxMS4yMDcgMTMuNDkxQzExLjA4ODkgMTMuMzQ5MiAxMS4wMTY3IDEzLjE3NDggMTEgMTIuOTkxVjMuNDkxQzExIDMuMzU4MzkgMTAuOTQ3MyAzLjIzMTIxIDEwLjg1MzYgMy4xMzc0NEMxMC43NTk4IDMuMDQzNjggMTAuNjMyNiAyLjk5MSAxMC41IDIuOTkxQzcuNzE0MDUgMy4wMDI2NyA1LjA0NjgzIDQuMTIwNTggMy4wODUxMSA2LjA5ODgxQzEuMTIzMzggOC4wNzcwMyAwLjAyNzg1MTUgMTAuNzUzNSAwLjAzOTUyMSAxMy41Mzk1QzAuMDUxMTkwNSAxNi4zMjU1IDEuMTY5MSAxOC45OTI3IDMuMTQ3MzMgMjAuOTU0NEM1LjEyNTU2IDIyLjkxNjEgNy44MDIwNSAyNC4wMTE3IDEwLjU4OCAyNFYyNFpcIi8+PC9zeW1ib2w+PHN5bWJvbCBpZD1cInN2Zy1zZWFyY2hcIiBkYXRhLW5hbWU9XCJzZWFyY2hcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgd2lkdGg9XCIyNVwiIGhlaWdodD1cIjI1XCIgPjxwYXRoIGQ9XCJNMjQuNDE0IDIxLjU5MUwxOS43NjkgMTYuOTQ2QzIxLjE4MzMgMTQuODI4OSAyMS43NTk2IDEyLjI2MTMgMjEuMzg1NyA5Ljc0Mjg1QzIxLjAxMTggNy4yMjQzNSAxOS43MTQ1IDQuOTM0OTcgMTcuNzQ2MSAzLjMyMDAyQzE1Ljc3NzggMS43MDUwNiAxMy4yNzkgMC44ODAwMDggMTAuNzM2IDEuMDA1MzRDOC4xOTMwMyAxLjEzMDY3IDUuNzg3NTYgMi4xOTc0MiAzLjk4NzUyIDMuOTk4MUMyLjE4NzQ4IDUuNzk4NzggMS4xMjE1NyA4LjIwNDYzIDAuOTk3MTQzIDEwLjc0NzdDMC44NzI3MTIgMTMuMjkwNyAxLjY5ODY1IDE1Ljc4OTEgMy4zMTQzIDE3Ljc1N0M0LjkyOTk1IDE5LjcyNDggNy4yMTk3OSAyMS4wMjEzIDkuNzM4NDEgMjEuMzk0M0MxMi4yNTcgMjEuNzY3MiAxNC44MjQ0IDIxLjE5MDEgMTYuOTQxIDE5Ljc3NUwyMS41ODYgMjQuNDE5QzIxLjk2NDIgMjQuNzg3OSAyMi40NzE2IDI0Ljk5NDQgMjMgMjQuOTk0NEMyMy41Mjg0IDI0Ljk5NDQgMjQuMDM1OCAyNC43ODc5IDI0LjQxNCAyNC40MTlDMjQuNzg4OSAyNC4wNDM5IDI0Ljk5OTYgMjMuNTM1MyAyNC45OTk2IDIzLjAwNUMyNC45OTk2IDIyLjQ3NDcgMjQuNzg4OSAyMS45NjYxIDI0LjQxNCAyMS41OTFaTTExLjI1IDQuMDA1QzEyLjY4MzkgNC4wMDUgMTQuMDg1NiA0LjQzMDIxIDE1LjI3NzkgNS4yMjY4NUMxNi40NzAxIDYuMDIzNDkgMTcuMzk5NCA3LjE1NTc4IDE3Ljk0ODEgOC40ODA1NUMxOC40OTY5IDkuODA1MzEgMTguNjQwNCAxMS4yNjMgMTguMzYwNyAxMi42Njk0QzE4LjA4MDkgMTQuMDc1OCAxNy4zOTA1IDE1LjM2NzYgMTYuMzc2NSAxNi4zODE1QzE1LjM2MjYgMTcuMzk1NSAxNC4wNzA4IDE4LjA4NTkgMTIuNjY0NCAxOC4zNjU3QzExLjI1OCAxOC42NDU0IDkuODAwMzEgMTguNTAxOSA4LjQ3NTU0IDE3Ljk1MzFDNy4xNTA3OCAxNy40MDQ0IDYuMDE4NDggMTYuNDc1MSA1LjIyMTg0IDE1LjI4MjlDNC40MjUyIDE0LjA5MDYgNCAxMi42ODg5IDQgMTEuMjU1QzQuMDAyMTEgOS4zMzI4MyA0Ljc2NjYzIDcuNDg5OTkgNi4xMjU4MSA2LjEzMDgxQzcuNDg0OTkgNC43NzE2MyA5LjMyNzgzIDQuMDA3MTIgMTEuMjUgNC4wMDVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctc2VydmljZVwiIGRhdGEtbmFtZT1cInNlcnZpY2VcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjMuNTgyIDQuOTg2QzIzLjU1NTggNC45MDQyIDIzLjUwOSA0LjgzMDUxIDIzLjQ0NjEgNC43NzIwNUMyMy4zODMyIDQuNzEzNTggMjMuMzA2MyA0LjY3MjMxIDIzLjIyMjggNC42NTIyMUMyMy4xMzkzIDQuNjMyMTIgMjMuMDUyIDQuNjMzODcgMjIuOTY5NCA0LjY1NzNDMjIuODg2NyA0LjY4MDc0IDIyLjgxMTUgNC43MjUwNiAyMi43NTEgNC43ODZMMTkuMTk0IDguMzQxQzE5LjE0MiA4LjM5MjkyIDE5LjA3OTIgOC40MzI3NCAxOS4wMTAxIDguNDU3NjNDMTguOTQwOSA4LjQ4MjUyIDE4Ljg2NzIgOC40OTE4NiAxOC43OTQgOC40ODVMMTYuMiA4LjI0OUMxNi4wODM2IDguMjM4NTEgMTUuOTc0NSA4LjE4NzU0IDE1Ljg5MTcgOC4xMDQ5NkMxNS44MDkgOC4wMjIzOSAxNS43NTc4IDcuOTEzNDIgMTUuNzQ3IDcuNzk3TDE1LjUxMyA1LjJDMTUuNTA2MyA1LjEyNjc3IDE1LjUxNTggNS4wNTI5NSAxNS41NDA4IDQuOTgzODFDMTUuNTY1OSA0LjkxNDY3IDE1LjYwNTkgNC44NTE5MSAxNS42NTggNC44TDE5LjIxNiAxLjI0MkMxOS4yNzY3IDEuMTgxNDYgMTkuMzIwOCAxLjEwNjMzIDE5LjM0NDEgMS4wMjM4MkMxOS4zNjc0IDAuOTQxMzEzIDE5LjM2OTEgMC44NTQyMDQgMTkuMzQ5IDAuNzcwODU4QzE5LjMyODkgMC42ODc1MTIgMTkuMjg3NyAwLjYxMDczMSAxOS4yMjk0IDAuNTQ3ODg4QzE5LjE3MTEgMC40ODUwNDQgMTkuMDk3NiAwLjQzODI1MSAxOS4wMTYgMC40MTIwMDFDMTcuNzcwNyAwLjA0NjIwNjcgMTYuNDQ5NiAwLjAyNDY4NzkgMTUuMTkzMSAwLjM0OTczM0MxMy45MzY2IDAuNjc0Nzc3IDEyLjc5MTcgMS4zMzQyNCAxMS44OCAyLjI1OEMxMC45MTMgMy4yMTcyMiAxMC4yNDc1IDQuNDM4MiA5Ljk2NTMzIDUuNzcwNzJDOS42ODMxOSA3LjEwMzI0IDkuNzk2NzQgOC40ODkxNyAxMC4yOTIgOS43NThDMTAuMzI5NCA5Ljg0NjY5IDEwLjMzOTkgOS45NDQ0NSAxMC4zMjIxIDEwLjAzOTFDMTAuMzA0MyAxMC4xMzM3IDEwLjI1OTEgMTAuMjIxIDEwLjE5MiAxMC4yOUwwLjkxMjAwMSAxOS41NjNDMC41Mzc0MzYgMTkuOTIyMyAwLjI3OTgzOCAyMC4zODYxIDAuMTcyODA4IDIwLjg5MzlDMC4wNjU3NzgzIDIxLjQwMTggMC4xMTQyODUgMjEuOTMwMSAwLjMxMjAwMSAyMi40MUMwLjQ3ODQ5NCAyMi43NzkxIDAuNzMxNjY0IDIzLjEwMjUgMS4wNDk5OCAyMy4zNTI3QzEuMzY4MjkgMjMuNjAyOSAxLjc0MjMyIDIzLjc3MjUgMi4xNDAyNyAyMy44NDcxQzIuNTM4MjIgMjMuOTIxOCAyLjk0ODMgMjMuODk5MiAzLjMzNTY0IDIzLjc4MTNDMy43MjI5OCAyMy42NjM0IDQuMDc2MTEgMjMuNDUzNyA0LjM2NSAyMy4xN0wxMy43IDEzLjgzNEMxMy43NjkzIDEzLjc2NzMgMTMuODU2NSAxMy43MjIyIDEzLjk1MSAxMy43MDQ1QzE0LjA0NTYgMTMuNjg2NyAxNC4xNDMyIDEzLjY5NyAxNC4yMzIgMTMuNzM0QzE1LjQ5ODUgMTQuMjMzNyAxNi44ODM2IDE0LjM1MTcgMTguMjE2NCAxNC4wNzM0QzE5LjU0OTEgMTMuNzk1MSAyMC43NzEzIDEzLjEzMjcgMjEuNzMyIDEyLjE2OEMyMi42NjEgMTEuMjUwMSAyMy4zMjM3IDEwLjA5NzQgMjMuNjQ5NSA4LjgzMjY1QzIzLjk3NTMgNy41Njc5MyAyMy45NTE5IDYuMjM4NTIgMjMuNTgyIDQuOTg2VjQuOTg2WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXNldHRpbmdzXCIgZGF0YS1uYW1lPVwic2V0dGluZ3NcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGQ9XCJNMjIuNSA5LjVIMjAuNjM4QzIwLjQ1MjkgOC44NjAyIDIwLjE5NyA4LjI0MzA1IDE5Ljg3NSA3LjY2TDIxLjE5MiA2LjM0NEMyMS4zMzE0IDYuMjA0NyAyMS40NDIgNi4wMzkzIDIxLjUxNzQgNS44NTcyNUMyMS41OTI4IDUuNjc1MiAyMS42MzE3IDUuNDgwMDYgMjEuNjMxNyA1LjI4M0MyMS42MzE3IDUuMDg1OTQgMjEuNTkyOCA0Ljg5MDggMjEuNTE3NCA0LjcwODc1QzIxLjQ0MiA0LjUyNjcgMjEuMzMxNCA0LjM2MTMgMjEuMTkyIDQuMjIyTDE5Ljc3NyAyLjgwOUMxOS40OTU3IDIuNTI3NzkgMTkuMTE0MiAyLjM2OTgyIDE4LjcxNjUgMi4zNjk4MkMxOC4zMTg4IDIuMzY5ODIgMTcuOTM3MyAyLjUyNzc5IDE3LjY1NiAyLjgwOUwxNi4zMzggNC4xMjZDMTUuNzU1OCAzLjgwMzggMTUuMTM5MiAzLjU0Nzg3IDE0LjUgMy4zNjNWMS41QzE0LjUgMS4xMDIxOCAxNC4zNDIgMC43MjA2NDQgMTQuMDYwNyAwLjQzOTM0QzEzLjc3OTQgMC4xNTgwMzUgMTMuMzk3OCAwIDEzIDBMMTEgMEMxMC42MDIyIDAgMTAuMjIwNiAwLjE1ODAzNSA5LjkzOTM0IDAuNDM5MzRDOS42NTgwNCAwLjcyMDY0NCA5LjUgMS4xMDIxOCA5LjUgMS41VjMuMzYzQzguODYwNTggMy41NDgzIDguMjQzNzggMy44MDQyIDcuNjYxIDQuMTI2TDYuMzQzIDIuODA5QzYuMDYxNzEgMi41Mjc3OSA1LjY4MDI1IDIuMzY5ODIgNS4yODI1IDIuMzY5ODJDNC44ODQ3NSAyLjM2OTgyIDQuNTAzMjkgMi41Mjc3OSA0LjIyMiAyLjgwOUwyLjgwNyA0LjIyM0MyLjY2NzYxIDQuMzYyMyAyLjU1NzA0IDQuNTI3NyAyLjQ4MTU5IDQuNzA5NzVDMi40MDYxNSA0Ljg5MTggMi4zNjczMiA1LjA4Njk0IDIuMzY3MzIgNS4yODRDMi4zNjczMiA1LjQ4MTA2IDIuNDA2MTUgNS42NzYyIDIuNDgxNTkgNS44NTgyNUMyLjU1NzA0IDYuMDQwMyAyLjY2NzYxIDYuMjA1NyAyLjgwNyA2LjM0NUw0LjEyNSA3LjY2MkMzLjgwMjU5IDguMjQ0MTQgMy41NDY2NSA4Ljg2MDY3IDMuMzYyIDkuNUgxLjVDMS4xMDIxOCA5LjUgMC43MjA2NDQgOS42NTgwNCAwLjQzOTM0IDkuOTM5MzRDMC4xNTgwMzUgMTAuMjIwNiAwIDEwLjYwMjIgMCAxMUwwIDEzQzAgMTMuMzk3OCAwLjE1ODAzNSAxMy43Nzk0IDAuNDM5MzQgMTQuMDYwN0MwLjcyMDY0NCAxNC4zNDIgMS4xMDIxOCAxNC41IDEuNSAxNC41SDMuMzYyQzMuNTQ2NTcgMTUuMTM5NyAzLjgwMjUyIDE1Ljc1NjUgNC4xMjUgMTYuMzM5TDIuODA2IDE3LjY1OEMyLjUyNDc5IDE3LjkzOTMgMi4zNjY4MiAxOC4zMjA4IDIuMzY2ODIgMTguNzE4NUMyLjM2NjgyIDE5LjExNjIgMi41MjQ3OSAxOS40OTc3IDIuODA2IDE5Ljc3OUw0LjIyIDIxLjE5M0M0LjUwNjgyIDIxLjQ2NCA0Ljg4NjQzIDIxLjYxNDkgNS4yODEgMjEuNjE0OUM1LjY3NTU3IDIxLjYxNDkgNi4wNTUxOCAyMS40NjQgNi4zNDIgMjEuMTkzTDcuNjYgMTkuODc2QzguMjQzMDkgMjAuMTk4MSA4Ljg2MDIyIDIwLjQ1NDQgOS41IDIwLjY0VjIyLjVDOS41IDIyLjg5NzggOS42NTgwNCAyMy4yNzk0IDkuOTM5MzQgMjMuNTYwN0MxMC4yMjA2IDIzLjg0MiAxMC42MDIyIDI0IDExIDI0SDEzQzEzLjM5NzggMjQgMTMuNzc5NCAyMy44NDIgMTQuMDYwNyAyMy41NjA3QzE0LjM0MiAyMy4yNzk0IDE0LjUgMjIuODk3OCAxNC41IDIyLjVWMjAuNjRDMTUuMTM5NCAyMC40NTQ3IDE1Ljc1NjIgMjAuMTk4OCAxNi4zMzkgMTkuODc3TDE3LjY1NyAyMS4xOTRDMTcuOTM4MyAyMS40NzUyIDE4LjMxOTggMjEuNjMzMiAxOC43MTc1IDIxLjYzMzJDMTkuMTE1MiAyMS42MzMyIDE5LjQ5NjcgMjEuNDc1MiAxOS43NzggMjEuMTk0TDIxLjE5MiAxOS43OEMyMS40NzMyIDE5LjQ5ODcgMjEuNjMxMiAxOS4xMTcyIDIxLjYzMTIgMTguNzE5NUMyMS42MzEyIDE4LjMyMTggMjEuNDczMiAxNy45NDAzIDIxLjE5MiAxNy42NTlMMTkuODc1IDE2LjM0MkMyMC4xOTczIDE1Ljc1OTEgMjAuNDUzMiAxNS4xNDE5IDIwLjYzOCAxNC41MDJIMjIuNUMyMi42OTcyIDE0LjUwMiAyMi44OTI0IDE0LjQ2MzEgMjMuMDc0NSAxNC4zODc2QzIzLjI1NjYgMTQuMzEyMSAyMy40MjIxIDE0LjIwMTUgMjMuNTYxNCAxNC4wNjJDMjMuNzAwNyAxMy45MjI1IDIzLjgxMTEgMTMuNzU2OSAyMy44ODY0IDEzLjU3NDZDMjMuOTYxNyAxMy4zOTI0IDI0LjAwMDMgMTMuMTk3MiAyNCAxM1YxMUMyNCAxMC42MDIyIDIzLjg0MiAxMC4yMjA2IDIzLjU2MDcgOS45MzkzNEMyMy4yNzk0IDkuNjU4MDQgMjIuODk3OCA5LjUgMjIuNSA5LjVaTTEyIDE3QzExLjAxMTEgMTcgMTAuMDQ0NCAxNi43MDY4IDkuMjIyMTUgMTYuMTU3M0M4LjM5OTkgMTUuNjA3OSA3Ljc1OTA0IDE0LjgyNyA3LjM4MDYgMTMuOTEzNEM3LjAwMjE2IDEyLjk5OTggNi45MDMxNSAxMS45OTQ1IDcuMDk2MDcgMTEuMDI0NUM3LjI4OSAxMC4wNTQ2IDcuNzY1MiA5LjE2MzczIDguNDY0NDcgOC40NjQ0N0M5LjE2MzczIDcuNzY1MiAxMC4wNTQ2IDcuMjg5IDExLjAyNDUgNy4wOTYwN0MxMS45OTQ1IDYuOTAzMTUgMTIuOTk5OCA3LjAwMjE2IDEzLjkxMzQgNy4zODA2QzE0LjgyNyA3Ljc1OTA0IDE1LjYwNzkgOC4zOTk5IDE2LjE1NzMgOS4yMjIxNUMxNi43MDY4IDEwLjA0NDQgMTcgMTEuMDExMSAxNyAxMkMxNi45OTg0IDEzLjMyNTYgMTYuNDcxMSAxNC41OTY0IDE1LjUzMzggMTUuNTMzOEMxNC41OTY0IDE2LjQ3MTEgMTMuMzI1NiAxNi45OTg0IDEyIDE3VjE3WlwiLz48L3N5bWJvbD48c3ltYm9sIGlkPVwic3ZnLXRyaXBcIiBkYXRhLW5hbWU9XCJ0cmlwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTE5LjAxMiAxNC41NTJDMTguOTk4OCAxNC41MTk4IDE4Ljk3ODcgMTQuNDkwOCAxOC45NTMxIDE0LjQ2NzFDMTguOTI3NiAxNC40NDM1IDE4Ljg5NzEgMTQuNDI1NyAxOC44NjQgMTQuNDE1QzE4LjU1MDEgMTQuMzEzNCAxOC4yNjY3IDE0LjEzNDYgMTguMDQgMTMuODk1QzE2LjM0IDEyLjA4IDEzLjUgOC42MDkgMTMuNSA1Ljc1QzEzLjUgNS41NzkgMTMuNTA5IDUuNDExIDEzLjUyNCA1LjI0NEMxMy41MzkgNS4wNzcgMTMuNjA0IDQuNzUgMTMuMjc1IDQuNzVIMTJDMTEuOTMzNyA0Ljc1IDExLjg3MDEgNC43NzYzNCAxMS44MjMyIDQuODIzMjJDMTEuNzc2MyA0Ljg3MDExIDExLjc1IDQuOTMzNyAxMS43NSA1VjcuNzVDMTEuNzUgNy45NDg5MSAxMS42NzA5IDguMTM5NjggMTEuNTMwMyA4LjI4MDMzQzExLjM4OTYgOC40MjA5OCAxMS4xOTg5IDguNSAxMSA4LjVDMTAuODAxIDguNSAxMC42MTAzIDguNDIwOTggMTAuNDY5NiA4LjI4MDMzQzEwLjMyOSA4LjEzOTY4IDEwLjI1IDcuOTQ4OTEgMTAuMjUgNy43NVY1QzEwLjI1IDQuOTMzNyAxMC4yMjM2IDQuODcwMTEgMTAuMTc2NyA0LjgyMzIyQzEwLjEyOTkgNC43NzYzNCAxMC4wNjYzIDQuNzUgOS45OTk5NiA0Ljc1SDcuMTgwOTZDNy4wODA1OSA0Ljc1MDA2IDYuOTgyNTYgNC43ODAzMyA2Ljg5OTYzIDQuODM2ODdDNi44MTY2OSA0Ljg5MzQgNi43NTI3IDQuOTczNTkgNi43MTU5NiA1LjA2N0wwLjAzMzk2MDUgMjIuMDY3QzAuMDA0MTIyOTEgMjIuMTQyOSAtMC4wMDY3MTE0NiAyMi4yMjQ5IDAuMDAyNDAxMjIgMjIuMzA1OUMwLjAxMTUxMzkgMjIuMzg2OSAwLjA0MDI5NzIgMjIuNDY0NSAwLjA4NjI0MzYgMjIuNTMxOEMwLjEzMjE5IDIyLjU5OTEgMC4xOTM5MDYgMjIuNjU0MiAwLjI2NjAxNCAyMi42OTIzQzAuMzM4MTIzIDIyLjczMDMgMC40MTg0MzcgMjIuNzUwMSAwLjQ5OTk2IDIyLjc1SDkuOTk5OTZDMTAuMDY2MyAyMi43NSAxMC4xMjk5IDIyLjcyMzcgMTAuMTc2NyAyMi42NzY4QzEwLjIyMzYgMjIuNjI5OSAxMC4yNSAyMi41NjYzIDEwLjI1IDIyLjVWMTkuNzVDMTAuMjUgMTkuNTUxMSAxMC4zMjkgMTkuMzYwMyAxMC40Njk2IDE5LjIxOTdDMTAuNjEwMyAxOS4wNzkgMTAuODAxIDE5IDExIDE5QzExLjE5ODkgMTkgMTEuMzg5NiAxOS4wNzkgMTEuNTMwMyAxOS4yMTk3QzExLjY3MDkgMTkuMzYwMyAxMS43NSAxOS41NTExIDExLjc1IDE5Ljc1VjIyLjVDMTEuNzUgMjIuNTY2MyAxMS43NzYzIDIyLjYyOTkgMTEuODIzMiAyMi42NzY4QzExLjg3MDEgMjIuNzIzNyAxMS45MzM3IDIyLjc1IDEyIDIyLjc1SDIxLjVDMjEuNTgxNSAyMi43NTAxIDIxLjY2MTggMjIuNzMwMyAyMS43MzM5IDIyLjY5MjNDMjEuODA2IDIyLjY1NDIgMjEuODY3NyAyMi41OTkxIDIxLjkxMzcgMjIuNTMxOEMyMS45NTk2IDIyLjQ2NDUgMjEuOTg4NCAyMi4zODY5IDIxLjk5NzUgMjIuMzA1OUMyMi4wMDY2IDIyLjIyNDkgMjEuOTk1OCAyMi4xNDI5IDIxLjk2NiAyMi4wNjdMMTkuMDEyIDE0LjU1MlpNMTEuNzUgMTUuNzUyQzExLjc1IDE1Ljk1MDkgMTEuNjcwOSAxNi4xNDE3IDExLjUzMDMgMTYuMjgyM0MxMS4zODk2IDE2LjQyMyAxMS4xOTg5IDE2LjUwMiAxMSAxNi41MDJDMTAuODAxIDE2LjUwMiAxMC42MTAzIDE2LjQyMyAxMC40Njk2IDE2LjI4MjNDMTAuMzI5IDE2LjE0MTcgMTAuMjUgMTUuOTUwOSAxMC4yNSAxNS43NTJWMTEuNzUyQzEwLjI1IDExLjU1MzEgMTAuMzI5IDExLjM2MjMgMTAuNDY5NiAxMS4yMjE3QzEwLjYxMDMgMTEuMDgxIDEwLjgwMSAxMS4wMDIgMTEgMTEuMDAyQzExLjE5ODkgMTEuMDAyIDExLjM4OTYgMTEuMDgxIDExLjUzMDMgMTEuMjIxN0MxMS42NzA5IDExLjM2MjMgMTEuNzUgMTEuNTUzMSAxMS43NSAxMS43NTJWMTUuNzUyWlwiLz48cGF0aCBkPVwiTTE5Ljg2NCAxMi44N0MyMC45MzUgMTEuNzIzIDI0IDguMjI2IDI0IDUuNzVDMjQgNC41NTY1MyAyMy41MjU5IDMuNDExOTMgMjIuNjgyIDIuNTY4MDJDMjEuODM4MSAxLjcyNDExIDIwLjY5MzUgMS4yNSAxOS41IDEuMjVDMTguMzA2NSAxLjI1IDE3LjE2MTkgMS43MjQxMSAxNi4zMTggMi41NjgwMkMxNS40NzQxIDMuNDExOTMgMTUgNC41NTY1MyAxNSA1Ljc1QzE1IDguMjI2IDE4LjA2NSAxMS43MjMgMTkuMTM2IDEyLjg3QzE5LjE4MjcgMTIuOTE5NiAxOS4yMzkyIDEyLjk1OTIgMTkuMzAxOCAxMi45ODYyQzE5LjM2NDMgMTMuMDEzMyAxOS40MzE4IDEzLjAyNzIgMTkuNSAxMy4wMjcyQzE5LjU2ODIgMTMuMDI3MiAxOS42MzU3IDEzLjAxMzMgMTkuNjk4MiAxMi45ODYyQzE5Ljc2MDggMTIuOTU5MiAxOS44MTczIDEyLjkxOTYgMTkuODY0IDEyLjg3VjEyLjg3Wk0xOCA1Ljc1QzE4IDUuNDUzMzMgMTguMDg4IDUuMTYzMzIgMTguMjUyOCA0LjkxNjY0QzE4LjQxNzYgNC42Njk5NyAxOC42NTE5IDQuNDc3NzEgMTguOTI2IDQuMzY0MThDMTkuMjAwMSA0LjI1MDY1IDE5LjUwMTcgNC4yMjA5NCAxOS43OTI2IDQuMjc4ODJDMjAuMDgzNiA0LjMzNjcgMjAuMzUwOSA0LjQ3OTU2IDIwLjU2MDcgNC42ODkzNEMyMC43NzA0IDQuODk5MTIgMjAuOTEzMyA1LjE2NjM5IDIwLjk3MTIgNS40NTczNkMyMS4wMjkxIDUuNzQ4MzQgMjAuOTk5MyA2LjA0OTk0IDIwLjg4NTggNi4zMjQwM0MyMC43NzIzIDYuNTk4MTEgMjAuNTggNi44MzIzOCAyMC4zMzM0IDYuOTk3MkMyMC4wODY3IDcuMTYyMDMgMTkuNzk2NyA3LjI1IDE5LjUgNy4yNUMxOS4xMDIyIDcuMjUgMTguNzIwNiA3LjA5MTk2IDE4LjQzOTMgNi44MTA2NkMxOC4xNTggNi41MjkzNiAxOCA2LjE0NzgyIDE4IDUuNzVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdmVoaWNsZVwiIGRhdGEtbmFtZT1cInZlaGljbGVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBjbGlwLXJ1bGU9XCJldmVub2RkXCIgZD1cIk0yMi4xOTI5IDEwLjMzMDhDMjIuMjA0OCAxMC4zNTc4IDIyLjIyMTQgMTAuMzgyNiAyMi4yNDIgMTAuNDA0QzIzLjA0OCAxMS4yMzM5IDIzLjQ5OTIgMTIuMzQ1MSAyMy41IDEzLjUwMlYxNS41MDJDMjMuNDk4NCAxNi4wMDMyIDIzLjM0NTcgMTYuNDkyNCAyMy4wNjE4IDE2LjkwNTVDMjIuNzk2NiAxNy4yOTE2IDIyLjQyODQgMTcuNTk0NiAyMiAxNy43ODA2VjIwQzIyIDIwLjU1MjMgMjEuNTUyMyAyMSAyMSAyMUgxOUMxOC40NDc3IDIxIDE4IDIwLjU1MjMgMTggMjBWMTcuODE3Mkw2IDE3LjgxNDhWMjBDNiAyMC41NTIzIDUuNTUyMjggMjEgNSAyMUgzQzIuNDQ3NzIgMjEgMiAyMC41NTIzIDIgMjBWMTcuNzc2NkMxLjU3MTU2IDE3LjU5MDYgMS4yMDMzNCAxNy4yODc2IDAuOTM4MTE1IDE2LjkwMTVDMC42NTQyOTkgMTYuNDg4NCAwLjUwMTYxMyAxNS45OTkyIDAuNDk5OTgzIDE1LjQ5OFYxMy40OThDMC41MDE1MTQgMTIuMzQzNiAwLjk1MTUwNiAxMS4yMzQ5IDEuNzU0OTggMTAuNDA2QzEuNzgxMzcgMTAuMzc4NiAxLjgwMTE5IDEwLjM0NTUgMS44MTI5NyAxMC4zMDkzTDEuODEzNDEgMTAuMzA4OEMxLjgxNDUzIDEwLjMwNDIgMS44MTU1MyAxMC4yOTk1IDEuODE2MzkgMTAuMjk0N0MxLjgyNTE3IDEwLjI0NjUgMS44MTk1NiAxMC4xOTY3IDEuODAwMjcgMTAuMTUxN0MxLjc4MDk4IDEwLjEwNjYgMS43NDg4NSAxMC4wNjgxIDEuNzA3ODkgMTAuMDQxMkMxLjY2NjkzIDEwLjAxNDIgMS42MTg5NCA5Ljk5OTkgMS41Njk5IDEwSDEuMjgxOThDMS4wMTY3NyAxMCAwLjc2MjQxMSA5Ljg5NDY0IDAuNTc0ODc1IDkuNzA3MTFDMC4zODczMzggOS41MTk1NyAwLjI4MTk4MiA5LjI2NTIyIDAuMjgxOTgyIDlWOEMwLjI4MTk4MiA3LjczNDc4IDAuMzg3MzM4IDcuNDgwNDMgMC41NzQ4NzUgNy4yOTI4OUMwLjc2MjQxMSA3LjEwNTM2IDEuMDE2NzcgNyAxLjI4MTk4IDdIMi42MzE5OEMyLjg2NDc0IDcuMDAwNjIgMy4wOTQyIDcuMDU1MSAzLjMwMjM4IDcuMTU5MkMzLjQ4MzggNy4yNDk5MSAzLjY0NDc3IDcuMzc2MTQgMy43NzU5MSA3LjUzMDA3TDMuNzg3NTggNy41MDE2NUMzLjgxMTk3IDcuNDY5NDUgMy44MjgyMyA3LjQzMTg0IDMuODM0OTggNy4zOTIwMUw0LjIzNDk4IDUuMDA5MDFDNC4zNDk1NSA0LjMwNzM3IDQuNzEwMjkgMy42Njk0OCA1LjI1MjUzIDMuMjA5N0M1Ljc5NDc3IDIuNzQ5OTIgNi40ODMwNSAyLjQ5ODMyIDcuMTkzOTggMi41MDAwMUgxNi44MDJDMTcuNTEyNiAyLjQ5ODI1IDE4LjIwMDcgMi43NDk1NiAxOC43NDI5IDMuMjA4OTRDMTkuMjg1MSAzLjY2ODMyIDE5LjY0NiA0LjMwNTc0IDE5Ljc2MSA1LjAwNzAxTDIwLjE2MSA3LjM5MDAxQzIwLjE2NzYgNy40Mjk4MSAyMC4xODM3IDcuNDY3NDMgMjAuMjA4IDcuNDk5NjRDMjAuMjE0NSA3LjUwODI5IDIwLjIyMTYgNy41MTY0OCAyMC4yMjkxIDcuNTI0MTdDMjAuMzU5MyA3LjM3MjkxIDIwLjUxODUgNy4yNDg3NCAyMC42OTc2IDcuMTU5MkMyMC45MDU4IDcuMDU1MSAyMS4xMzUyIDcuMDAwNjIgMjEuMzY4IDdIMjIuNzE4QzIyLjk4MzIgNyAyMy4yMzc2IDcuMTA1MzYgMjMuNDI1MSA3LjI5Mjg5QzIzLjYxMjYgNy40ODA0MyAyMy43MTggNy43MzQ3OCAyMy43MTggOFY5QzIzLjcxOCA5LjI2NTIyIDIzLjYxMjYgOS41MTk1NyAyMy40MjUxIDkuNzA3MTFDMjMuMjM3NiA5Ljg5NDY0IDIyLjk4MzIgMTAgMjIuNzE4IDEwSDIyLjQzMDFDMjIuMzgxIDkuOTk5OSAyMi4zMzMgMTAuMDE0MiAyMi4yOTIxIDEwLjA0MTJDMjIuMjUxMSAxMC4wNjgxIDIyLjIxOSAxMC4xMDY2IDIyLjE5OTcgMTAuMTUxN0MyMi4xODA0IDEwLjE5NjcgMjIuMTc0OCAxMC4yNDY1IDIyLjE4MzYgMTAuMjk0N0MyMi4xODU4IDEwLjMwNyAyMi4xODg5IDEwLjMxOTEgMjIuMTkyOSAxMC4zMzA4Wk03LjE5Mzk4IDQuNTAyMDFIMTYuODA2QzE3LjA0MjcgNC41MDIxMiAxNy4yNzE3IDQuNTg2MTkgMTcuNDUyMiA0LjczOTI3QzE3LjYzMjggNC44OTIzNSAxNy43NTMyIDUuMTA0NTEgMTcuNzkyIDUuMzM4MDFMMTguMjcxIDguMjExMDFDMTguMjc2MyA4LjI0NjQxIDE4LjI3NDEgOC4yODI1NCAxOC4yNjQ1IDguMzE3MDJDMTguMjU0OCA4LjM1MTUgMTguMjM3OSA4LjM4MzUzIDE4LjIxNSA4LjQxMTAxQzE4LjE5MTUgOC40Mzg2NyAxOC4xNjIyIDguNDYwODcgMTguMTI5MiA4LjQ3NjA3QzE4LjA5NjIgOC40OTEyNyAxOC4wNjAzIDguNDk5MDkgMTguMDI0IDguNDk5MDFINS45NzU5OEM1LjkzOTY1IDguNDk5MDcgNS45MDM3NCA4LjQ5MTIgNS44NzA3NiA4LjQ3NTk3QzUuODM3NzggOC40NjA3MyA1LjgwODUxIDguNDM4NDkgNS43ODUgOC40MTA3OUM1Ljc2MTQ5IDguMzgzMDkgNS43NDQzIDguMzUwNiA1LjczNDYyIDguMzE1NThDNS43MjQ5NSA4LjI4MDU2IDUuNzIzMDIgOC4yNDM4NSA1LjcyODk4IDguMjA4MDFMNi4yMDc5OCA1LjMzNTAxQzYuMjQ3NDQgNS4xMDIwNiA2LjM2ODEgNC44OTA2IDYuNTQ4NTkgNC43MzgxMkM2LjcyOTA3IDQuNTg1NjUgNi45NTc3MSA0LjUwMiA3LjE5Mzk4IDQuNTAyMDFaTTcgMTMuNUM3IDE0LjMyODQgNi4zMjg0MyAxNSA1LjUgMTVDNC42NzE1NyAxNSA0IDE0LjMyODQgNCAxMy41QzQgMTIuNjcxNiA0LjY3MTU3IDEyIDUuNSAxMkM2LjMyODQzIDEyIDcgMTIuNjcxNiA3IDEzLjVaTTE4LjUgMTVDMTkuMzI4NCAxNSAyMCAxNC4zMjg0IDIwIDEzLjVDMjAgMTIuNjcxNiAxOS4zMjg0IDEyIDE4LjUgMTJDMTcuNjcxNiAxMiAxNyAxMi42NzE2IDE3IDEzLjVDMTcgMTQuMzI4NCAxNy42NzE2IDE1IDE4LjUgMTVaXCIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9XCJzdmctdmVuZG9yXCIgZGF0YS1uYW1lPVwidmVuZG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiID48cGF0aCBkPVwiTTIxLjM3OSAxMS45QzIwLjgwNzQgMTEuODkxNSAyMC4yNDU1IDExLjc1MDYgMTkuNzM3NSAxMS40ODg0QzE5LjIyOTUgMTEuMjI2MyAxOC43ODkxIDEwLjg0OTkgMTguNDUxIDEwLjM4OUMxOC40Mjc3IDEwLjM1OCAxOC4zOTc1IDEwLjMzMjggMTguMzYyOCAxMC4zMTU0QzE4LjMyODEgMTAuMjk4IDE4LjI4OTggMTAuMjg5IDE4LjI1MSAxMC4yODlDMTguMjEyMiAxMC4yODkgMTguMTczOSAxMC4yOTggMTguMTM5MiAxMC4zMTU0QzE4LjEwNDUgMTAuMzMyOCAxOC4wNzQzIDEwLjM1OCAxOC4wNTEgMTAuMzg5QzE3LjcxODkgMTAuODU2MyAxNy4yNzk5IDExLjIzNzMgMTYuNzcwNSAxMS41MDAyQzE2LjI2MTEgMTEuNzYzMSAxNS42OTYyIDExLjkwMDMgMTUuMTIzIDExLjkwMDNDMTQuNTQ5OCAxMS45MDAzIDEzLjk4NDkgMTEuNzYzMSAxMy40NzU1IDExLjUwMDJDMTIuOTY2MSAxMS4yMzczIDEyLjUyNyAxMC44NTYzIDEyLjE5NSAxMC4zODlDMTIuMTcxNyAxMC4zNTggMTIuMTQxNSAxMC4zMzI4IDEyLjEwNjggMTAuMzE1NEMxMi4wNzIxIDEwLjI5OCAxMi4wMzM4IDEwLjI4OSAxMS45OTUgMTAuMjg5QzExLjk1NjIgMTAuMjg5IDExLjkxNzkgMTAuMjk4IDExLjg4MzIgMTAuMzE1NEMxMS44NDg1IDEwLjMzMjggMTEuODE4MyAxMC4zNTggMTEuNzk1IDEwLjM4OUMxMS40NTc2IDEwLjg0OSAxMS4wMTgzIDExLjIyNDggMTAuNTExNiAxMS40ODY5QzEwLjAwNDkgMTEuNzQ5IDkuNDQ0NDEgMTEuODkwNCA4Ljg3Mzk5IDExLjlDOC4zMDIyMSAxMS44OTE2IDcuNzQwMTYgMTEuNzUwOCA3LjIzMTk2IDExLjQ4ODZDNi43MjM3NiAxMS4yMjY1IDYuMjgzMjQgMTAuODUwMSA1Ljk0NDk5IDEwLjM4OUM1LjkyMTcgMTAuMzU4IDUuODkxNTEgMTAuMzMyOCA1Ljg1Njc5IDEwLjMxNTRDNS44MjIwOCAxMC4yOTggNS43ODM4IDEwLjI4OSA1Ljc0NDk5IDEwLjI4OUM1LjcwNjE4IDEwLjI4OSA1LjY2NzkgMTAuMjk4IDUuNjMzMTkgMTAuMzE1NEM1LjU5ODQ3IDEwLjMzMjggNS41NjgyOCAxMC4zNTggNS41NDQ5OSAxMC4zODlDNS4yMDcyNSAxMC44NDk0IDQuNzY3NTMgMTEuMjI1NCA0LjI2MDI1IDExLjQ4NzVDMy43NTI5OCAxMS43NDk3IDMuMTkxOTIgMTEuODkwOCAyLjYyMDk5IDExLjlDMi40OTI2OCAxMS44OTk4IDIuMzY0NDkgMTEuODkyNCAyLjIzNjk5IDExLjg3OEMyLjIwMTk0IDExLjg3MzkgMi4xNjY0MiAxMS44NzczIDIuMTMyNzggMTEuODg3OUMyLjA5OTEzIDExLjg5ODYgMi4wNjgxNCAxMS45MTYzIDIuMDQxODYgMTEuOTM5OEMyLjAxNTU3IDExLjk2MzQgMS45OTQ1OSAxMS45OTIyIDEuOTgwMyAxMi4wMjQ1QzEuOTY2MDEgMTIuMDU2OCAxLjk1ODc1IDEyLjA5MTcgMS45NTg5OSAxMi4xMjdWMjEuMTVDMS45NTg5OSAyMS41NDc4IDIuMTE3MDMgMjEuOTI5NCAyLjM5ODMzIDIyLjIxMDdDMi42Nzk2MyAyMi40OTIgMy4wNjExNyAyMi42NSAzLjQ1ODk5IDIyLjY1SDIwLjQ1OUMyMC44NTY4IDIyLjY1IDIxLjIzODMgMjIuNDkyIDIxLjUxOTcgMjIuMjEwN0MyMS44MDEgMjEuOTI5NCAyMS45NTkgMjEuNTQ3OCAyMS45NTkgMjEuMTVWMTIuMTM0QzIxLjk1ODggMTIuMDk5MiAyMS45NTE1IDEyLjA2NDggMjEuOTM3NCAxMi4wMzI5QzIxLjkyMzMgMTIuMDAxMSAyMS45MDI3IDExLjk3MjUgMjEuODc3IDExLjk0OUMyMS44NTE0IDExLjkyNTYgMjEuODIxMiAxMS45MDc4IDIxLjc4ODMgMTEuODk2N0MyMS43NTU0IDExLjg4NTcgMjEuNzIwNSAxMS44ODE3IDIxLjY4NiAxMS44ODVDMjEuNTg0IDExLjg5NCAyMS40ODIgMTEuOSAyMS4zNzkgMTEuOVpNMTQuOTU3IDE1LjAxQzE0Ljk2MjQgMTQuOTA5MiAxNS4wMDc1IDE0LjgxNDYgMTUuMDgyNSAxNC43NDdDMTUuMTU3NSAxNC42NzkzIDE1LjI1NjEgMTQuNjQ0MSAxNS4zNTcgMTQuNjQ5SDE4LjU1N0MxOC42NTc4IDE0LjY0NDEgMTguNzU2NSAxNC42NzkzIDE4LjgzMTUgMTQuNzQ3QzE4LjkwNjQgMTQuODE0NiAxOC45NTE2IDE0LjkwOTIgMTguOTU3IDE1LjAxVjIwLjE0OUMxOC45NTcgMjAuMjgxNiAxOC45MDQzIDIwLjQwODggMTguODEwNSAyMC41MDI2QzE4LjcxNjggMjAuNTk2MyAxOC41ODk2IDIwLjY0OSAxOC40NTcgMjAuNjQ5SDE1LjQ1N0MxNS4zMjQ0IDIwLjY0OSAxNS4xOTcyIDIwLjU5NjMgMTUuMTAzNCAyMC41MDI2QzE1LjAwOTcgMjAuNDA4OCAxNC45NTcgMjAuMjgxNiAxNC45NTcgMjAuMTQ5VjE1LjAxWk01LjQ1Njk5IDE0Ljk4MkM1LjQ2MjY2IDE0Ljg4ODMgNS41MDUxOSAxNC44MDA3IDUuNTc1MjcgMTQuNzM4M0M1LjY0NTM2IDE0LjY3NTkgNS43MzczIDE0LjY0MzggNS44MzA5OSAxNC42NDlIMTEuMDc4QzExLjE3MTggMTQuNjQzOCAxMS4yNjM4IDE0LjY3NTkgMTEuMzM0MSAxNC43MzgzQzExLjQwNDMgMTQuODAwNiAxMS40NDcxIDE0Ljg4ODIgMTEuNDUzIDE0Ljk4MlYxOC4zMTZDMTEuNDQ3MSAxOC40MDk4IDExLjQwNDMgMTguNDk3NCAxMS4zMzQxIDE4LjU1OTdDMTEuMjYzOCAxOC42MjIxIDExLjE3MTggMTguNjU0MiAxMS4wNzggMTguNjQ5SDUuODMwOTlDNS43MzczIDE4LjY1NDIgNS42NDUzNiAxOC42MjIxIDUuNTc1MjcgMTguNTU5N0M1LjUwNTE5IDE4LjQ5NzMgNS40NjI2NiAxOC40MDk3IDUuNDU2OTkgMTguMzE2VjE0Ljk4MlpcIi8+PHBhdGggZD1cIk0yMS4zNzkgMTAuNEMyMS45MDE4IDEwLjM2NTggMjIuMzk5OSAxMC4xNjU0IDIyLjgwMDcgOS44MjgxMkMyMy4yMDE2IDkuNDkwODEgMjMuNDg0MSA5LjAzNDIxIDIzLjYwNyA4LjUyNDk5QzIzLjc0NDMgOC4wNzc5NCAyMy43Mzk4IDcuNTk5MzUgMjMuNTk0IDcuMTU0OTlMMjEuNzk0IDEuNjg0OTlDMjEuNzc1NyAxLjYwMTAxIDIxLjczMjcgMS41MjQ0MyAyMS42NzA1IDEuNDY1MDlDMjEuNjA4MyAxLjQwNTc1IDIxLjUyOTggMS4zNjYzNyAyMS40NDUgMS4zNTE5OUgyLjU1MTA0QzIuNDY2MjkgMS4zNjYzNyAyLjM4Nzc4IDEuNDA1NzUgMi4zMjU1OSAxLjQ2NTA5QzIuMjYzNCAxLjUyNDQzIDIuMjIwMzcgMS42MDEwMSAyLjIwMjA0IDEuNjg0OTlMMC40MDUwMzggNy4xNTI5OUMwLjI2MDE0OSA3LjU5Nzg4IDAuMjU1OTU5IDguMDc2NjMgMC4zOTMwMzggOC41MjM5OUMwLjUxNTgyNyA5LjAzMzQgMC43OTgyNTkgOS40OTAyMSAxLjE5OTA5IDkuODI3NzJDMS41OTk5MiAxMC4xNjUyIDIuMDk4MTYgMTAuMzY1NyAyLjYyMTA0IDEwLjRDMy4zMTUzOCAxMC4zMjc2IDMuOTUzNTkgOS45ODU2NCA0LjM5ODQ2IDkuNDQ3NjRDNC44NDMzMyA4LjkwOTY1IDUuMDU5MzQgOC4yMTg1NyA1LjAwMDA0IDcuNTIyOTlDNS4wMDAwNCA3LjMyNDA4IDUuMDc5MDYgNy4xMzMzMSA1LjIxOTcxIDYuOTkyNjZDNS4zNjAzNiA2Ljg1MjAxIDUuNTUxMTMgNi43NzI5OSA1Ljc1MDA0IDYuNzcyOTlDNS45NDg5NSA2Ljc3Mjk5IDYuMTM5NzIgNi44NTIwMSA2LjI4MDM3IDYuOTkyNjZDNi40MjEwMiA3LjEzMzMxIDYuNTAwMDQgNy4zMjQwOCA2LjUwMDA0IDcuNTIyOTlDNi40NDA2NyA4LjIxNzc5IDYuNjU2IDguOTA4MTggNy4wOTk4MiA5LjQ0NjA0QzcuNTQzNjQgOS45ODM5IDguMTgwNiAxMC4zMjY0IDguODc0MDQgMTAuNEM5LjU2Nzg0IDEwLjMyNjkgMTAuMjA1MyA5Ljk4NDYgMTAuNjQ5NSA5LjQ0NjY4QzExLjA5MzggOC45MDg3NyAxMS4zMDk0IDguMjE4MSAxMS4yNSA3LjUyMjk5QzExLjI1IDcuMzI0MDggMTEuMzI5MSA3LjEzMzMxIDExLjQ2OTcgNi45OTI2NkMxMS42MTA0IDYuODUyMDEgMTEuODAxMSA2Ljc3Mjk5IDEyIDYuNzcyOTlDMTIuMTk5IDYuNzcyOTkgMTIuMzg5NyA2Ljg1MjAxIDEyLjUzMDQgNi45OTI2NkMxMi42NzEgNy4xMzMzMSAxMi43NSA3LjMyNDA4IDEyLjc1IDcuNTIyOTlDMTIuNjkwNyA4LjIxODI2IDEyLjkwNjQgOC45MDkwNiAxMy4zNTA5IDkuNDQ3QzEzLjc5NTMgOS45ODQ5NCAxNC40MzMxIDEwLjMyNzEgMTUuMTI3IDEwLjRDMTUuODIwNCAxMC4zMjY0IDE2LjQ1NzMgOS45ODM4NyAxNi45MDA5IDkuNDQ1OThDMTcuMzQ0NiA4LjkwODA4IDE3LjU1OTcgOC4yMTc2OSAxNy41IDcuNTIyOTlDMTcuNSA3LjMyNDA4IDE3LjU3OTEgNy4xMzMzMSAxNy43MTk3IDYuOTkyNjZDMTcuODYwNCA2Ljg1MjAxIDE4LjA1MTEgNi43NzI5OSAxOC4yNSA2Ljc3Mjk5QzE4LjQ0OSA2Ljc3Mjk5IDE4LjYzOTcgNi44NTIwMSAxOC43ODA0IDYuOTkyNjZDMTguOTIxIDcuMTMzMzEgMTkgNy4zMjQwOCAxOSA3LjUyMjk5QzE4Ljk0MSA4LjIxODUxIDE5LjE1NzEgOC45MDk0NSAxOS42MDE5IDkuNDQ3MzlDMjAuMDQ2NyA5Ljk4NTMyIDIwLjY4NDggMTAuMzI3MyAyMS4zNzkgMTAuNFpcIi8+PC9zeW1ib2w+PC9zdmc+JylcbiAgICB9XG4gIH1cblxuICAvLyBJZiBET00gaXMgYWxyZWFkeSByZWFkeSwgZW1iZWQgU1ZHc1xuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAnaW50ZXJhY3RpdmUnKSB7IGVtYmVkKCkgfVxuXG4gIC8vIEhhbmRsZSBUdXJib2xpbmtzIHBhZ2UgY2hhbmdlIGV2ZW50c1xuICBpZiAoIHdpbmRvdy5UdXJib2xpbmtzICkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0dXJib2xpbmtzOmxvYWRcIiwgZnVuY3Rpb24oZXZlbnQpIHsgZW1iZWQoKSB9KVxuICB9XG5cbiAgLy8gSGFuZGxlIHN0YW5kYXJkIERPTSByZWFkeSBldmVudHNcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgZnVuY3Rpb24oZXZlbnQpIHsgZW1iZWQoKSB9KVxufSkoKSIsInZhciB0b29sYm94ICAgICAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ICAgICAgICA9IHRvb2xib3guZXZlbnQsXG4gICAgRXZlbnRNYW5hZ2VyID0gRXZlbnQuY2FsbGJhY2tNYW5hZ2VyLFxuICAgIFN0YWNrTWFuYWdlciA9IHJlcXVpcmUoICcuL19zdGFjaycgKVxuICAgIGluaXRpYWxpemVkICA9IGZhbHNlLFxuICAgIE1vZGFscyAgICAgICA9IFtdLFxuICAgIFN0YWNrICAgICAgICA9IFtdLFxuICAgIEZvY3VzU3RhY2sgICA9IFtdXG5cbi8vIENTUyBzdHlsZXMgdG8gaGVscCBwcmV2ZW50IHN0cmF5IG1vZGFsIGNsaWNrcyAoZG9lc24ndCB3b3JrIGluIGxlc3MgdGhhbiBJRSAxMSlcbnZhciBzdHlsZSAgICAgICAgPSAnPHN0eWxlIGlkPVwibW9kYWwtdG9nZ2xlLXN0eWxlXCI+Ym9keVtkYXRhLWFjdGl2ZS1tb2RhbF0gKiB7IHBvaW50ZXItZXZlbnRzOiBub25lIH0gLmFjdGl2ZS1tb2RhbCwgLmFjdGl2ZS1tb2RhbCAqIHsgcG9pbnRlci1ldmVudHM6IGFsbCB9PC9zdHlsZT4nXG5cbi8vIHR5cGVzIG9mIG1vZGFsc1xuLy8gTWVudSAtIHRyaWdnZXIgdG9nZ2xlcywgY2xpY2tpbmcgb3V0c2lkZSBjbG9zZXNcbi8vIFBhbmVsIC0gdHJpZ2dlciBvcGVucywgYnV0IGRvZXMgbm90IGNsb3NlLCBjbGlja2luZyBvdXRzaWRlIGNsb3Nlc1xuLy8gRGlhbG9nIC0gdHJpZ2dlciBvcGVucywgY2xpY2tpbmcgb3V0c2lkZSBpcyBpZ25vcmVkLCBtdXN0IGJlIGNsb3NlZCBieSBjbGlja2luZyBhIGNsb3NlIGJ1dHRvbiBvciB0aGUgZXNjYXBlIGtleVxuXG5cbnZhciBNb2RhbCA9IHtcbiAgbmV3OiBmdW5jdGlvbiggZWwsIHR5cGUsIHRyaWdnZXIgKSB7XG5cbiAgICAvLyBDaGVjayBpZiBhIG1vZGFsIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgIC8vIFRoaXMgbWlnaHQgaGFwcGVuIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgdHJpZ2dlciBmb3IgYSBtb2RhbFxuICAgIHZhciBtID0gZ2V0TW9kYWwoIGVsIClcbiAgICBpZiAoIG0gKSB7XG4gICAgICAvLyBSZWdpc3RlciB0aGUgdHJpZ2dlciBhbmQgcmV0dXJuXG4gICAgICBpZiAoIHRyaWdnZXIgKSBtLnRyaWdnZXJzLnB1c2goIHRyaWdnZXIgKVxuICAgICAgcmV0dXJuIGdldE1vZGFsKCBlbCApXG4gICAgfVxuXG4gICAgdmFyIG1vZGFsID0ge1xuICAgICAgdHJpZ2dlcnM6IFtdLFxuICAgICAgX21vZGFsOiAgIHRydWUsXG4gICAgICB0eXBlOiAgICAgdHlwZSxcbiAgICAgIGlkOiAgICAgICBNb2RhbHMubGVuZ3RoLFxuICAgICAgZWw6ICAgICAgIGVsLFxuXG4gICAgICBldmVudHM6IHtcbiAgICAgICAgb3BlbjogRXZlbnRNYW5hZ2VyLm5ldygpLFxuICAgICAgICBjbG9zZTogRXZlbnRNYW5hZ2VyLm5ldygpXG4gICAgICB9LFxuXG4gICAgICBpc09wZW46IGZhbHNlXG4gICAgfVxuXG4gICAgbW9kYWxbIHR5cGUgXSA9IHRydWUgLy8gY29udmVuaWVuY2UgdHlwZSBjaGVja1xuICAgIE1vZGFscy5wdXNoKCBtb2RhbCApXG5cbiAgICAvLyBUYWcgbW9kYWwgZWxlbWVudCB3aXRoIGFuIGlkXG4gICAgZWwuZGF0YXNldC5tb2RhbElkID0gbW9kYWwuaWRcbiAgICAvLyBIaWRlIG1vZGFsIGJ5IGRlZmF1bHRcbiAgICBlbC5jbGFzc0xpc3QuYWRkKCAnaGlkZGVuJyApXG4gICAgZWwuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCB0cnVlIClcbiAgICBlbC5zZXRBdHRyaWJ1dGUoICdhcmlhLW1vZGFsJywgdHJ1ZSApXG5cbiAgICAvLyBSZWdpc3RlciBlbGVtZW50cyB3aGljaCB0cmlnZ2VyIHRoZSBtb2RhbFxuICAgIGlmICggdHJpZ2dlciApIG1vZGFsLnRyaWdnZXJzLnB1c2goIHRyaWdnZXIgKVxuXG4gICAgbW9kYWwub24gPSBmdW5jdGlvbiAoIHR5cGUsIGNhbGxiYWNrICkge1xuICAgICAgaWYgKCBtb2RhbC5ldmVudHNbdHlwZV0gKSB7XG4gICAgICAgIG1vZGFsLmV2ZW50c1t0eXBlXS5hZGQoIGNhbGxiYWNrIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgZGVmYXVsdCBvcGVuaW5nIGJlaGF2aW9yXG4gICAgbW9kYWwub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICggbW9kYWwuaXNPcGVuICkgcmV0dXJuXG4gICAgICBtb2RhbC5pc09wZW4gPSB0cnVlXG4gICAgICBtb2RhbC5ldmVudHMub3Blbi5zdGFydCgpXG4gICAgICBtb2RhbC5ldmVudHMuY2xvc2Uuc3RvcCgpXG5cbiAgICAgIC8vIExpc3RlbiB0byBlc2NhcGUga2V5IHByZXNzZXMgaW4gJ21vZGFsLWFjdGl2ZScgc2NvcGVcbiAgICAgIGlmICggIVN0YWNrLmxlbmd0aCApIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2tleWRvd24nLCBrZXlQcmVzcyApXG5cbiAgICAgIEZvY3VzU3RhY2sucHVzaCggZG9jdW1lbnQuYWN0aXZlRWxlbWVudCApXG4gICAgICBTdGFjay5wdXNoKCBtb2RhbCApXG5cbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCggJ21vZGFsLWFjdGl2ZScgKVxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGRlbicgKVxuICAgICAgZWwuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCBmYWxzZSApXG5cbiAgICAgIC8vIFNldCBzdGF0ZSBvbiBtb2RhbCB0cmlnZ2Vyc1xuICAgICAgbW9kYWwudHJpZ2dlcnMuZm9yRWFjaCggZnVuY3Rpb24oIGVsICkge1xuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnbW9kYWwtYWN0aXZlJyApXG4gICAgICB9KVxuXG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtaXMtY2xvc2luZycgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ21vZGFsLWlzLW9wZW5pbmcnIClcblxuICAgICAgLy8gQWZ0ZXIgb3BlbmluZyBhbmltYXRpb24sIHJlbW92ZSBhbmltYXRpb24gY2xhc3NcbiAgICAgIEV2ZW50LmFmdGVyQW5pbWF0aW9uKCBlbCwgbW9kYWwuZXZlbnRzLm9wZW4uZmlyZSwgNTApXG4gICAgfVxuXG4gICAgLy8gQWRkIGZpcnN0IG9wZW4gY2FsbGJhY2tcbiAgICBtb2RhbC5ldmVudHMub3Blbi5hZGQoIGZ1bmN0aW9uICgpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdtb2RhbC1pcy1vcGVuaW5nJyApXG4gICAgfSlcblxuICAgIG1vZGFsLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCAhbW9kYWwuaXNPcGVuICkgcmV0dXJuXG5cbiAgICAgIC8vIFRvZ2dsZSBldmVudCBjYWxsYmFja3NcbiAgICAgIG1vZGFsLmV2ZW50cy5vcGVuLnN0b3AoKVxuICAgICAgbW9kYWwuZXZlbnRzLmNsb3NlLnN0YXJ0KClcblxuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ21vZGFsLWlzLW9wZW5pbmcnIClcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdtb2RhbC1pcy1jbG9zaW5nJyApXG4gICAgICBcbiAgICAgIC8vIEFmdGVyIGNsb3NpbmcgYW5pbWF0aW9uLCBoaWRlLCBwb3Agc3RhY2ssIGZpcmUgY2xvc2UgZXZlbnRzLlxuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBtb2RhbC5ldmVudHMuY2xvc2UuZmlyZSwgNTAgKVxuICAgIH1cblxuICAgIC8vIEFkZCBmaXJzdCBjbG9zZSBjYWxsYmFja1xuICAgIG1vZGFsLmV2ZW50cy5jbG9zZS5hZGQoIGZ1bmN0aW9uKCl7XG4gICAgICBtb2RhbC5pc09wZW4gPSBmYWxzZVxuXG4gICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnbW9kYWwtaXMtY2xvc2luZycgKVxuICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2hpZGRlbicgKVxuICAgICAgZWwuc2V0QXR0cmlidXRlKCAnYXJpYS1oaWRkZW4nLCB0cnVlIClcblxuICAgICAgLy8gU2V0IHN0YXRlIG9uIG1vZGFsIHRyaWdnZXJzXG4gICAgICBtb2RhbC50cmlnZ2Vycy5mb3JFYWNoKCBmdW5jdGlvbiggZWwgKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoICdtb2RhbC1hY3RpdmUnIClcbiAgICAgIH0pXG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSB0aGlzIG1vZGFsIGZyb20gdGhlIHN0YWNrXG4gICAgICBTdGFjay5wb3AoKVxuXG4gICAgICAvLyBSZXN0b3JlIGZvdWNzIGZvciBkaWFsb2dzIGFuZCBtb2RhbCBtZW51c1xuICAgICAgLy8gVGhpcyByZXR1cm5zIHVzZXJzIHRvIHRoZWlyIHBsYWNlIG9uIHRoZSBwYWdlXG4gICAgICAvLyBUaGlzIGRvZXNuJ3Qgb2NjdXIgb24gbW9kYWwgcGFuZWxzIGJlY2F1c2UgZm9jdXNpbmdcbiAgICAgIC8vIG9wZW5zIHBhbmVscy4gVGhlcmUgbWF5IGJlIGEgZ29vZCBmaXggZm9yIHRoaXMgYXQgc29tZSBwb2ludC5cbiAgICAgIHZhciBmb2N1c0VsID0gRm9jdXNTdGFjay5wb3AoKVxuICAgICAgaWYgKCBtb2RhbC5kaWFsb2cgfHwgbW9kYWwubWVudSApIGZvY3VzRWwuZm9jdXMoKVxuXG4gICAgICAvLyBJZiBpdCdzIHRoZSBsYXN0IG1vZGFsIG9wZW4sIHJlc3RvcmUgbm9uLW1vZGFsIHN0YXRlXG4gICAgICBpZiAoICFTdGFjay5sZW5ndGggKSB7XG4gICAgICAgIEV2ZW50Lm9mZiggZG9jdW1lbnQsICdrZXlkb3duJywga2V5UHJlc3MgKVxuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoICdtb2RhbC1hY3RpdmUnIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgcmV0dXJuIG1vZGFsXG4gIH1cbn1cblxuLy8gQWRkIGV2ZW50cyB0byBtb2RhbFxuZnVuY3Rpb24gb24gKCBzZWxlY3RvciwgZXZlbnQsIGNhbGxiYWNrICkge1xuICB2YXIgbW9kYWwgPSBnZXRNb2RhbCggc2VsZWN0b3IgKVxuICBpZiAoIG1vZGFsICYmIG1vZGFsLmV2ZW50c1tldmVudF0gKSB7XG4gICAgbW9kYWwuZXZlbnRzW2V2ZW50XS5hZGQoIGNhbGxiYWNrIClcbiAgICByZXR1cm4gbW9kYWxcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZSAoIG1vZGFsICkge1xuICAvLyBEaWQgdGhleSBzcGVjaWZ5IGEgbW9kYWwgdG8gY2xvc2U/XG4gIGlmICggdHlwZW9mIG1vZGFsICE9ICd1bmRlZmluZWQnICkge1xuICAgIG1vZGFsID0gZ2V0TW9kYWwoIG1vZGFsIClcbiAgICBpZiAoIG1vZGFsICkgbW9kYWwuY2xvc2UoKVxuXG4gIC8vIE5vPyBBc3N1bWUgY3VycmVudCBtb2RhbCBzaG91bGQgYmUgY2xvc2VkXG4gIH0gZWxzZSB7XG4gICAgbW9kYWwgPSBhY3RpdmVNb2RhbCgpXG4gICAgaWYgKCBtb2RhbCApIG1vZGFsLmNsb3NlKClcbiAgfVxuXG4gIHJldHVybiBtb2RhbFxufVxuXG5mdW5jdGlvbiBvcGVuICggbW9kYWwgKSB7XG4gIG1vZGFsID0gZ2V0TW9kYWwoIG1vZGFsIClcbiAgaWYgKCBtb2RhbCApIG1vZGFsLm9wZW4oKVxuXG4gIHJldHVybiBtb2RhbFxufVxuXG4vLyBDbGlja3Mgd2hpY2ggb2NjdXIgd2hlbiBhIG1vZGFsIGlzIGFjdGl2ZVxuZnVuY3Rpb24gYWN0aXZlQ2xpY2sgKCBldmVudCApIHtcbiAgdmFyIG1vZGFsID0gYWN0aXZlTW9kYWwoKVxuXG4gIC8vIERpZCB0aGUgY2xpY2sgaGFwcGVuIGluIHNpZGUgdGhlIG1vZGFsLCBvciBpbiBhIG1vZGFsIHNhZmUgY29udHJvbD9cbiAgdmFyIG1vZGFsQ2xpY2sgPSB0b29sYm94LmdldENsb3Nlc3QoIGV2ZW50LnRhcmdldCwgJ1tkYXRhLW1vZGFsLWlkPVwiJyttb2RhbC5pZCsnXCJdJyApXG4gIHZhciBwYW5lbENsaWNrID0gbW9kYWwucGFuZWwgJiYgdG9vbGJveC5nZXRDbG9zZXN0KCBldmVudC50YXJnZXQsICdbZGF0YS1mb3ItbW9kYWw9XCInK21vZGFsLmlkKydcIl0nIClcblxuICAvLyBTdG9wIHRoZSBjbGljayBpZiBpdCBoYXBwZW5lZCBvdXRzaWRlIHRoZSBtb2RhbCBvciBwYW5lbCBjb250cm9sXG4gIGlmICggIW1vZGFsQ2xpY2sgJiYgIXBhbmVsQ2xpY2sgKSB7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICBpZiAoIG1vZGFsLnBhbmVsICkgbW9kYWwuY2xvc2UoKVxuICB9XG59XG5cbi8vIFVzZSB0aGUgc3RhY2sgcG9zaXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IG1vZGFsXG5mdW5jdGlvbiBhY3RpdmVNb2RhbCAoKSB7XG4gIHJldHVybiBTdGFja1sgU3RhY2subGVuZ3RoIC0gMSBdXG59XG5cbmZ1bmN0aW9uIGFjdGl2ZVBhbmVsICgpIHtcbiAgcmV0dXJuIGFjdGl2ZU1vZGFsKCkucXVlcnlTZWxlY3RvciggJ1thcmlhLW1vZGFsPXRydWVdW2FyaWEtZXhwYW5kZWQ9dHJ1ZV0nIClcbn1cblxuZnVuY3Rpb24gaXNFbGVtZW50ICggaXRlbSApIHtcbiAgcmV0dXJuIGl0ZW0uY29uc3RydWN0b3IudG9TdHJpbmcoKS5zZWFyY2goL0hUTUwuK0VsZW1lbnQvKSA+IC0xXG59XG5cbi8vIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBieSBpZCBvciBzZWxlY3RvclxuZnVuY3Rpb24gZ2V0TW9kYWwgKCBzZWFyY2ggKSB7XG5cbiAgLy8gRG9uJ3QgYWNjZXB0IGdhcmJhZ2UgaW5wdXRcbiAgaWYgKCAhc2VhcmNoICkgcmV0dXJuXG5cbiAgLy8gV2FzIGEgbW9kYWwgb2JqZWN0IHBhc3NlZCBpbj8gSnVzdCByZXR1cm4gaXRcbiAgaWYgKCBzZWFyY2guX21vZGFsICkgcmV0dXJuIHNlYXJjaFxuXG4gIC8vIElzIGl0IGFscmVhZHkgcmVnaXN0ZXJlZD8gKHBhc3NlZCBhbiBpZClcbiAgaWYgKCBNb2RhbHNbIHNlYXJjaCBdICkgcmV0dXJuIE1vZGFsc1sgc2VhcmNoIF1cblxuICAvLyBUcnkgbW9kYWwgdHJpZ2dlcnNcbiAgaWYgKCBpc0VsZW1lbnQoIHNlYXJjaCApICkge1xuICAgIC8vIElzIGl0IGEgbW9kYWwgdHJpZ2dlcj9cbiAgICBpZiAoIHNlYXJjaC5kYXRhc2V0LmZvck1vZGFsICkgcmV0dXJuIE1vZGFsc1sgc2VhcmNoLmRhdGFzZXQuZm9yTW9kYWwgXVxuICAgIFxuICAgIC8vIElzIGl0IHRoZSBjaGlsZCBvZiBhIG1vZGFsIHRyaWdnZXI/XG4gICAgdmFyIHBhcmVudCA9IHRvb2xib3guZ2V0Q2xvc2VzdCggc2VhcmNoICwgJ1tkYXRhLWZvci1tb2RhbF0nIClcbiAgICBpZiAoIHBhcmVudCApIHJldHVybiBNb2RhbHNbIHBhcmVudC5kYXRhc2V0LmZvck1vZGFsIF1cbiAgfVxuXG4gIGlmICggdHlwZW9mIHNlYXJjaCA9PT0gJ3N0cmluZycgKSB7XG5cbiAgICAvLyBXZWxsLCBsZXQncyBob3BlIGl0J3MgYSBET00gc2VsZWN0b3JcbiAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBzZWFyY2ggKVxuXG4gICAgLy8gSWYgaXQgaXMgd29vIGhvb1xuICAgIGlmICggbW9kYWwgJiYgbW9kYWwuZGF0YXNldC5tb2RhbElkICkge1xuICAgICAgcmV0dXJuIE1vZGFsc1sgbW9kYWwuZGF0YXNldC5tb2RhbElkIF1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoKSB7XG4gIC8vIFNlYXJjaCBmb3IgdGhyZWUgdHlwZXMgb2YgbW9kYWxzXG4gIFsncGFuZWwnLCAnbWVudScsICdkaWFsb2cnXS5mb3JFYWNoKCBmdW5jdGlvbiggdHlwZSApIHtcbiAgICB0b29sYm94LmVhY2goIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1zaG93LScrdHlwZSsnXScgKSwgZnVuY3Rpb24oIHRyaWdnZXJFbCApIHtcbiAgICAgIHZhciBtb2RhbEVsXG5cbiAgICAgIC8vIEdldCBzZWxlY3RvclxuICAgICAgdmFyIHNlbGVjdG9yID0gdHJpZ2dlckVsLmdldEF0dHJpYnV0ZSggJ2RhdGEtc2hvdy0nK3R5cGUgKVxuICAgICAgaWYgKCBzZWxlY3RvciApIG1vZGFsRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApXG5cbiAgICAgIGlmICggbW9kYWxFbCApIHtcbiAgICAgICAgdmFyIG1vZGFsID0gTW9kYWwubmV3KCBtb2RhbEVsLCB0eXBlLCB0cmlnZ2VyRWwgKVxuXG4gICAgICAgIC8vIEFzc2lnbiB0aGUgdHJpZ2dlciB0byB0aGlzIG1vZGFsSWQgZm9yIGVhc3kgcmVmZXJlbmNlIGxhdGVyXG4gICAgICAgIHRyaWdnZXJFbC5kYXRhc2V0LmZvck1vZGFsID0gbW9kYWwuaWRcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIGlmICggTW9kYWxzLmxlbmd0aCA+IDAgJiYgIWluaXRpYWxpemVkICkge1xuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCAnYWZ0ZXJiZWdpbicsIHN0eWxlICkgXG4gICAgaW5pdGlhbGl6ZWQgPSB0cnVlXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJpZ2dlckV2ZW50ICggZXZlbnQgKSB7XG4gIHZhciBtb2RhbCA9IGdldE1vZGFsKCBldmVudC5jdXJyZW50VGFyZ2V0IClcbiAgdmFyIGVsID0gZXZlbnQuY3VycmVudFRhcmdldFxuXG4gIGlmICggZWwudGFnTmFtZSA9PSAnSU5QVVQnICkge1xuXG4gICAgLy8gRG9uJ3Qgb3BlbiB3aGVuIGlucHV0IGlzIGZvY3VzZWRcbiAgICAvL2lmICggZXZlbnQudHlwZSA9PSAnZm9jdXNpbicgJiYgZWwudmFsdWUgPT0gJycgKSByZXR1cm5cblxuICAgIC8vIERvIG5vdCB0cmlnZ2VyIG9wZW4gaWYgaW5wdXQgZXZlbnQgY2xlYXJzIGlucHV0IHZhbHVlXG4gICAgaWYgKCBldmVudC50eXBlID09ICdpbnB1dCcgJiYgZWwudmFsdWUgPT0gJycgKSByZXR1cm5cbiAgfVxuXG4gIC8vIERvbid0IGZvbGxvdyBsaW5rcyB1c2VkIHRvIHRyaWdnZXIgbW9kYWxzXG4gIGlmICggZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdhJyAmJiBlbC5ocmVmID09ICcjJyApIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuXG4gIG9wZW4oIG1vZGFsIClcblxufVxuXG5mdW5jdGlvbiBrZXlQcmVzcyAoIGV2ZW50ICkge1xuICB2YXIgYWN0aXZlRWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG5cbiAgLy8gRVNDIHdhcyBwcmVzc2VkXG4gIGlmICggRXZlbnQua2V5LmlzUHJlc3NlZChcImVzY1wiKSApIHtcbiAgICAvLyBBIHdheSB0byBzdG9wIGNsZWFyaW5nIHRoZSBpbnB1dCB2YWx1ZVxuICAgIC8vaWYgKCBhY3RpdmVFbC50YWdOYW1lID09ICdJTlBVVCcgJiYgYWN0aXZlRWwudmFsdWUgIT0gJycgKSB7XG4gICAgICAvL2V2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAvL31cbiAgICByZXR1cm4gY2xvc2UoKVxuICB9XG5cbiAgaWYgKCBhY3RpdmVNb2RhbCgpLm1vZGFsICYmIEV2ZW50LmtleS5pc1ByZXNzZWQoXCJ0YWJcIikgKSB7XG4gICAgZm9jdXNOZXh0KCBldmVudCApXG4gIH1cblxuICAvLyBcbiAgaWYgKCBhY3RpdmVNb2RhbCgpLnBhbmVsIHx8IGFjdGl2ZU1vZGFsKCkubWVudSApIHtcbiAgICB2YXIgbGlua1xuXG4gICAgaWYgKCBFdmVudC5rZXkuaXNQcmVzc2VkKFwiZG93blwiKSApIHtcbiAgICAgIC8vIFByZXZlbnQgcGFnZSBzY3JvbGxpbmcgYXMgYSByZXN1bHQgb2Yga2V5cHJlc3NcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGxpbmsgPSBnZXROZXh0TGluaygpXG4gICAgfVxuXG4gICAgaWYgKCBFdmVudC5rZXkuaXNQcmVzc2VkKFwidXBcIikgKSB7XG4gICAgICAvLyBQcmV2ZW50IHBhZ2Ugc2Nyb2xsaW5nIGFzIGEgcmVzdWx0IG9mIGtleXByZXNzXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBsaW5rID0gZ2V0UHJldmlvdXNMaW5rKClcbiAgICB9XG5cbiAgICAvLyBPbmx5IGZvY3VzIGlmIHRoZXJlIGlzIGEgbmV4dCBvciBwcmV2aW91cyBsaW5rIHRvIG1vdmUgdG9cbiAgICAvLyBBdCB0b3Agb3IgYm90dG9tIG9mIGEgbGlzdCB0aGVyZSBpcyBubyBcIm5leHRcIiBvciBcInByZXZpb3VzXCJcbiAgICBpZiAoIGxpbmsgKSBsaW5rLmZvY3VzKClcblxuICB9XG59XG5cbmZ1bmN0aW9uIGZvY3VzTmV4dCggZXZlbnQgKSB7XG4gIHZhciBtb2RhbEVsICAgICA9IGFjdGl2ZU1vZGFsKCkuZWwsXG4gICAgICBmb2N1c2FibGUgICA9IG1vZGFsRWwucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQ6bm90KFt0eXBlPWhpZGRlbl0pLCB0ZXh0YXJlYSwgc2VsZWN0LCBidXR0b24nKSxcbiAgICAgIGZpcnN0ICAgICAgID0gZm9jdXNhYmxlWzBdLFxuICAgICAgbGFzdCAgICAgICAgPSBmb2N1c2FibGVbZm9jdXNhYmxlLmxlbmd0aCAtIDFdLFxuICAgICAgZm9jdXNlZCAgICAgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG5cbiAgLy8gSWYgZm9jdXNlZCBvbiB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCwgdGFiIHRvIHRoZSBmaXJzdCBlbGVtZW50LlxuICBpZiAoIGZvY3VzZWQgPT0gbGFzdCAmJiAhRXZlbnQua2V5LnNoaWZ0ICkge1xuICAgIGlmICggZXZlbnQgKXsgZXZlbnQucHJldmVudERlZmF1bHQoKSB9XG4gICAgZmlyc3QuZm9jdXMoKVxuICB9XG5cbiAgaWYgKCBmb2N1c2VkID09IGZpcnN0ICYmIEV2ZW50LmtleS5zaGlmdCApIHtcbiAgICBpZiAoIGV2ZW50ICl7IGV2ZW50LnByZXZlbnREZWZhdWx0KCkgfVxuICAgIGxhc3QuZm9jdXMoKVxuICB9XG5cbiAgLy8gRm9jdXMgb24gdGhlIGZpcnN0IGVsZW1lbnQgaWYgdGhlIGZvY3VzZWQgZWxlbWVudCBpcyBub3QgYSBjaGlsZCBvZiB0aGUgbW9kYWxcbiAgaWYgKCAhZm9jdXNlZCB8fCAhdG9vbGJveC5jaGlsZE9mKCBmb2N1c2VkLCBtb2RhbEVsICkgKSB7XG4gICAgZmlyc3QuZm9jdXMoKVxuICB9XG59XG5cbi8vIEZpbmQgdGhlIG5leHQgZm9jdXNhYmxlIGxpbmtcbmZ1bmN0aW9uIGdldE5leHRMaW5rIChlbCkge1xuICB2YXIgaXRlbXMgPSBsaW5rcygpXG4gIHZhciBwb3MgPSBhY3RpdmVQb3NpdGlvbigpXG5cbiAgLy8gTm8gYWN0aXZlIGVsZW1lbnQ6IHJldHVybiBmaXJzdCBlbGVtZW50XG4gIGlmICggcG9zID09IC0xICkgcmV0dXJuIGl0ZW1zWyAwIF1cblxuICAvLyBMYXN0IGVsZW1lbnQgZm9jdXNlZCwgcmV0dXJuIG5vdGhpbmcgKG5vIG5leHQgZWxlbWVudClcbiAgZWxzZSBpZiAoIHBvcyA9PSBpdGVtcy5sZW5ndGggKSByZXR1cm5cblxuICAvLyByZXR1cm4gbmV4dCBmb2N1c2FibGUgbGlua1xuICBlbHNlIHJldHVybiBpdGVtc1sgcG9zICsgMSBdXG59XG5cbi8vIEZpbmQgdGhlIHByZXZpb3VzIGZvY3VzYWJsZSBsaW5rXG5mdW5jdGlvbiBnZXRQcmV2aW91c0xpbmsgKGVsKSB7XG4gIHZhciBpdGVtcyA9IGxpbmtzKClcbiAgdmFyIHBvcyA9IGFjdGl2ZVBvc2l0aW9uKClcblxuICAvLyBObyBwcmV2aW91cyBlbGVtZW50IHRvIHNlbGVjdFxuICBpZiAoIHBvcyA9PSAtMSB8fCBwb3MgPT0gMCApIHJldHVyblxuXG4gIC8vIHJldHVybiBwcmV2aW91cyBmb2N1c2FibGUgbGlua1xuICBlbHNlIHJldHVybiBpdGVtc1sgcG9zIC0gMSBdXG59XG5cbi8vIFNlYXJjaCBsaW5rcyBpbiB0aGUgY3VycmVudCBtb2RhbCBmb3IgYW4gYWN0aXZlIChmb2N1c2VkKSBlbGVtZW50XG5mdW5jdGlvbiBhY3RpdmVQb3NpdGlvbiAoKSB7XG4gIHJldHVybiBsaW5rcygpLmluZGV4T2YoIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgKVxufVxuXG4vLyBSZXR1cm4gYWxsIGxpbmtzIGluIGN1cnJlbnQgbW9kYWxcbmZ1bmN0aW9uIGxpbmtzICgpIHtcbiAgcmV0dXJuIHRvb2xib3guc2xpY2UoIGFjdGl2ZU1vZGFsKCkuZWwucXVlcnlTZWxlY3RvckFsbCggJ2EnICkgKS5maWx0ZXIoIGZ1bmN0aW9uKCBhICkge1xuICAgIHJldHVybiAhdG9vbGJveC5nZXRDbG9zZXN0KCBhLCAnW2FyaWEtaGlkZGVuPVwidHJ1ZVwiXScgKVxuICB9KVxufVxuXG5mdW5jdGlvbiBzZXR1cCAoKSB7XG4gIEV2ZW50LmNoYW5nZSggZnVuY3Rpb24oKSB7XG4gICAgaW5pdCgpXG5cbiAgICAvLyBDaGVjayBhbGwgYm9keSBjbGlja3MgdG8gc2VlIGlmIHRoZXkgc2hvdWxkIGJlIHBlcm1pdHRlZFxuICAgIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJ2JvZHkubW9kYWwtYWN0aXZlJywgYWN0aXZlQ2xpY2ssIHsgdXNlQ2FwdHVyZTogdHJ1ZSB9KSBcblxuICAgIC8vIFRyaWdnZXIgbW9kYWxzIG9uIGlucHV0IGV2ZW50cyAobGlrZSBhIHNlYXJjaCByZXN1bHRzIHBhbmVsIHRoYXQgd2FpdHMgdW50aWwgdHlwaW5nIHRvIHNob3cpXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnaW5wdXQnLCAnaW5wdXRbZGF0YS1mb3ItbW9kYWxdLCBbZGF0YS1mb3ItbW9kYWxdIGlucHV0JywgRXZlbnQuZGVib3VuY2UoIHRyaWdnZXJFdmVudCwgNTAsIHsgbGVhZGluZzogdHJ1ZSB9KSApXG4gICAgXG4gICAgLy8gVHJpZ2dlciBtb2RhbHMgb24ga2V5dXAgZXZlbnRzIGluIGlucHV0cyAobGlrZSBhIHNlYXJjaCByZXN1bHRzIHBhbmVsIHRoYXQgd2FpdHMgdW50aWwgdHlwaW5nIHRvIHNob3cpXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2sgZm9jdXNpbicsICdpbnB1dFtkYXRhLWZvci1tb2RhbF0sIFtkYXRhLWZvci1tb2RhbF0gaW5wdXQnLCB0cmlnZ2VyRXZlbnQgKVxuXG4gICAgLy8gVHJpZ2dlciBtb2RhbHMgb24gY2xpY2sgZXZlbnRzIGZvciBhbmNob3JzIGFuZCBidXR0b25zXG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnYVtkYXRhLWZvci1tb2RhbF0sIGJ1dHRvbltkYXRhLWZvci1tb2RhbF0sIFtkYXRhLWZvci1tb2RhbF0gYSwgW2RhdGEtZm9yLW1vZGFsXSBidXR0b24nLCB0cmlnZ2VyRXZlbnQgKVxuXG4gICAgRXZlbnQua2V5T24oICdlc2MnLCBjbG9zZSApXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBuZXc6IE1vZGFsLm5ldyxcbiAgbGlua3M6IGxpbmtzLFxuICBzZXR1cDogc2V0dXAsXG4gIG1vZGFsczogTW9kYWxzLFxuICBpbml0OiBpbml0LFxuICBnZXQ6IGdldE1vZGFsLFxuICBhY3RpdmU6IGFjdGl2ZU1vZGFsLFxuICBvbjogb24sXG4gIGlzRWxlbWVudDogaXNFbGVtZW50XG59XG4iLCJ2YXIgdG9vbGJveCAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApLFxuICAgIEV2ZW50ICAgID0gdG9vbGJveC5ldmVudCxcbiAgICBtb2RhbCAgICA9IHJlcXVpcmUoICcuL19tb2RhbCcgKSxcbiAgICBzdGFjayAgICA9IHJlcXVpcmUoICcuL19zdGFjaycgKVxuXG4vLyBGb2N1cyBvbiBzZWFyY2ggd2hlbiBgL2Aga2V5IGlzIHByZXNzZWRcbkV2ZW50LmtleU9uKCAnLycsIGZ1bmN0aW9uKGV2ZW50KXsgXG4gIHZhciBxID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW25hbWU9cV0nKVxuICBpZiAoIHEgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIHEuZm9jdXMoKVxuICB9XG59KVxuXG4vLyBSZXNldCBzZWFyY2ggcmVzdWx0cyBwYW5lbCB3aGVuIHF1ZXJ5IGlzIGNsZWFyZWRcbkV2ZW50LnJlYWR5KCBmdW5jdGlvbigpIHtcbiAgdmFyIHNlYXJjaFN0YWNrID0gc3RhY2suZ2V0KCAnI3NlYXJjaC1zdGFjaycgKVxuICB2YXIgcSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuYW1lPXFdJylcbiAgdmFyIHNlYXJjaE1vZGFsID0gbW9kYWwuZ2V0KCAnI3NlYXJjaC1yZXN1bHRzJyApXG5cbiAgaWYgKCAhc2VhcmNoTW9kYWwgfHwgIXEgKSByZXR1cm5cblxuICBmdW5jdGlvbiBrZXlXYXRjaGVyICggZXZlbnQgKSB7XG4gICAgdmFyIGZvY3VzRWwgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG5cbiAgICAvLyBJZiBhIGxldHRlciwgbnVtYmVyLCBvciBiYWNrc3BhY2UgaXMgcHJlc3NlZCBmb2N1cyBvbiBzZWFyY2ggaW5wdXRcbiAgICBpZiAoIGZvY3VzRWwgIT0gcSAmJiBldmVudC5rZXkubGVuZ3RoID09PSAxIHx8IEV2ZW50LmtleS5pc1ByZXNzZWQoXCJiYWNrc3BhY2VcIikgKSB7XG4gICAgICBxLmZvY3VzKClcblxuICAgIC8vIFJlc3RvcmUgZGVmYXVsdCBzZWFyY2ggaW5wdXQgYmVoYXZpb3JcbiAgICAvLyBXaGVuIGZvdWNzZWQsIGVzYyBjbGVhcnMgaW5wdXRcbiAgICB9IGVsc2UgaWYgKCBmb2N1c0VsID09IHEgJiYgRXZlbnQua2V5LmlzUHJlc3NlZCggXCJlc2NcIiApICkge1xuICAgICAgcS52YWx1ZSA9ICcnXG4gICAgfVxuICB9XG5cbiAgLy8gU2Nyb2xsIGFsbCBuYXZzIGJhY2sgdG8gdG9wXG4gIGZ1bmN0aW9uIHJlc2V0U2Nyb2xsICgpIHtcbiAgICB0b29sYm94LmVhY2goIHNlYXJjaFN0YWNrLnJvb3QucXVlcnlTZWxlY3RvckFsbCggJ25hdicgKSwgZnVuY3Rpb24gKG5hdikge1xuICAgICAgbmF2LnNjcm9sbFRvcCA9IDBcbiAgICB9KVxuICB9XG5cbiAgc2VhcmNoTW9kYWwub24oICdvcGVuJywgZnVuY3Rpb24oKSB7XG4gICAgRXZlbnQub24oIGRvY3VtZW50LCAna2V5ZG93bicsIGtleVdhdGNoZXIgKVxuICB9KVxuXG4gIC8vIFJlc2V0IHN0YWNrIHdoZW4gbW9kYWwgaXMgY2xvc2VkIGFuZCBxdWVyeSBpcyBjbGVhclxuICBzZWFyY2hNb2RhbC5vbiggJ2Nsb3NlJywgZnVuY3Rpb24oKSB7XG4gICAgLy8gUmVzdG9yZSBzdGF0ZSBvZiBzZWFyY2ggcGFuZWxcbiAgICBpZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICdpbnB1dFtuYW1lPXFdJyApLnZhbHVlID09ICcnICkge1xuICAgICAgc2VhcmNoU3RhY2sucmVzZXQoKVxuICAgICAgcmVzZXRTY3JvbGwoKVxuICAgIH1cblxuICAgIEV2ZW50Lm9mZiggZG9jdW1lbnQsICdrZXlkb3duJywga2V5V2F0Y2hlciApXG4gIH0pXG5cbiAgLy8gU2hvdyBmaXJzdCBwYW5lbCBzdGFjayB3aGVuIHF1ZXJ5IGlzIGNsZWFyZWRcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnaW5wdXQnLCAnW25hbWU9cV0nLCBFdmVudC5kZWJvdW5jZSggZnVuY3Rpb24gKCBldmVudCApIHtcbiAgICBpZiAoIGV2ZW50LmN1cnJlbnRUYXJnZXQudmFsdWUgPT0gJycgKSB7XG4gICAgICBzZWFyY2hTdGFjay5zaG93KCAwIClcbiAgICAgIHJlc2V0U2Nyb2xsKClcbiAgICB9XG4gIH0sIDUwICkpXG5cbiAgLy8gV2lyZSB1cCBjbGVhciBzZWFyY2ggaW5wdXQgYmVoYXZpb3JcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnY2xpY2snLCAnLmNsZWFyLXNlYXJjaCcsIGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICB2YXIgYnV0dG9uID0gZXZlbnQuY3VycmVudFRhcmdldFxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXG4gICAgdmFyIHNlYXJjaElucHV0ID0gdG9vbGJveC5nZXRDbG9zZXN0KCBidXR0b24sICdsYWJlbCcgKS5xdWVyeVNlbGVjdG9yKCAnLmlucHV0LWNvbnRhaW5lciBpbnB1dCcgKVxuICAgIHNlYXJjaElucHV0LnZhbHVlID0gJydcbiAgICBFdmVudC5maXJlKCBzZWFyY2hJbnB1dCwgJ2lucHV0JyApXG5cbiAgICBzZWFyY2hJbnB1dC5mb2N1cygpXG4gIH0sIHsgdXNlQ2FwdHVyZTogdHJ1ZSB9KVxufSlcbiIsInZhciB0b29sYm94ICAgICA9IHJlcXVpcmUoICdjb21wb3NlLXRvb2xib3gnICksXG4gICAgY29va2llICAgICAgPSByZXF1aXJlKCAnLi9fY29va2llJyApLFxuICAgIEV2ZW50ICAgICAgID0gdG9vbGJveC5ldmVudFxuXG5FdmVudC5yZWFkeSggZnVuY3Rpb24oKSB7XG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2NsaWNrJywgJy5zaWRlYmFyLW5hdi10b2dnbGUnLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QudG9nZ2xlKCAnaGlkZS1zaWRlYmFyJyApXG5cbiAgICB2YXIgdmlzaWJsZSA9ICFkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyggJ2hpZGUtc2lkZWJhcicgKVxuICAgIGNvb2tpZS51cGRhdGUoICdzaWRlYmFyLW5hdicsIHsgc2lkZWJhcjogdmlzaWJsZSB9IClcbiAgfSlcbiAgaWYgKCBjb29raWUuZ2V0KCAnc2lkZWJhci1uYXYnICkuc2lkZWJhciA9PT0gZmFsc2UgKSBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoICdoaWRlLXNpZGViYXInIClcbn0pXG4iLCJ2YXIgdG9vbGJveCAgICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBFdmVudCAgICAgICAgPSB0b29sYm94LmV2ZW50LFxuICAgIFN0YWNrcyAgICAgICA9IFtdXG5cbnZhciBTdGFjayA9IHtcbiAgbmV3OiBmdW5jdGlvbiggcm9vdCApIHtcblxuICAgIGlmICggIWlzRWxlbWVudCggcm9vdCApICkgcm9vdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIHJvb3QgKVxuXG4gICAgLy8gRG9uJ3QgYWRkIGEgbmV3IHN0YWNrIGlmIG5vIGVsZW1lbnQgZm91bmQgb3IgaWYgc3RhY2sgYWxyZWFkeSBleGlzdHNcbiAgICBpZiAoICFpc0VsZW1lbnQoIHJvb3QgKSB8fCByb290LmRhdGFzZXQuc3RhY2tJZCApIHJldHVyblxuXG4gICAgLy8gU2V0IHVwIHN0YWNrIGJ5IHNlYXJjaGluZyBET00gbm9kZSB1bmRlciBpdC5cbiAgICAvLyBUaGUgZmlyc3QgY2hpbGQgZm91bmQgd2lsbCBiZSBzZXQgdXAgYXMgYSBkZWZhdWx0XG4gICAgLy8gQWZ0ZXIgdGhhdCBlYWNoIGNoaWxkIHdpbGwgYmUgYWRkZWQgYXMgYSBzdGFjayBwdXNoXG5cbiAgICB2YXIgc3RhY2sgPSB7XG4gICAgICByb290OiByb290LFxuICAgICAgY3VycmVudDogMCxcbiAgICAgIHBhbmVsczogW10sXG4gICAgICBmb2N1czogW10sXG5cbiAgICAgIGFkZDogZnVuY3Rpb24gKCBwYW5lbEVsLCBuYW1lICkge1xuICAgICAgICBwYW5lbEVsLmRhdGFzZXQuc3RhY2tJbmRleCA9IHN0YWNrLnBhbmVscy5sZW5ndGhcblxuICAgICAgICAvLyBIaWRlIGFsbCBwYW5lbHMgYnV0IHRoZSBmaXJzdCBwYW5lbFxuICAgICAgICBpZiAoIHN0YWNrLnBhbmVscy5sZW5ndGggPT0gMCApIHsgXG4gICAgICAgICAgc2hvd0VsKCBwYW5lbEVsIClcbiAgICAgICAgfSBlbHNlIHsgXG4gICAgICAgICAgaGlkZUVsKCBwYW5lbEVsIClcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWNrLnBhbmVscy5wdXNoKCBwYW5lbEVsIClcbiAgICAgIH0sXG5cbiAgICAgIC8vIFJlc2V0IHN0YWNrIHRvIGZpcnN0IHBhbmVsXG4gICAgICByZXNldDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIEFscmVhZHkgcmVzZXQ/IFdlJ3JlIGRvbmUuXG4gICAgICAgIGlmICggc3RhY2suY3VycmVudCA9PSAwICkgcmV0dXJuXG5cbiAgICAgICAgLy8gSWYgaGlkZGVuLCBtYW51YWxseSByZXNldCBhbGxcbiAgICAgICAgaWYgKCBzdGFjay5yb290Lm9mZnNldFBhcmVudCA9PSBudWxsICkge1xuICAgICAgICAgIHN0YWNrLmZvY3VzID0gW10gLy8gQ2xlYXIgZm9jdXMgc3RhY2tcblxuICAgICAgICAgIC8vIEhpZGUgYW5kIHJlc2V0IHNjcm9sbCBvbiBhbGwgcGFuZWxzXG4gICAgICAgICAgc3RhY2sucGFuZWxzLmZvckVhY2goIGZ1bmN0aW9uKCBlbCApIHsgXG4gICAgICAgICAgICBlbC5zY3JvbGxUb3AgPSAwXG4gICAgICAgICAgICBoaWRlRWwoIGVsIClcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gU2hvdyBmaXJzdCBwYW5lbFxuICAgICAgICAgIHN0YWNrLmN1cnJlbnQgPSAwXG4gICAgICAgICAgc2hvd0VsKCBzdGFjay5wYW5lbHNbMF0gKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm90IGhpZGRlbiwgZGlzbWlzcyBjdXJyZW50IHBhbmVsIGFuZCByZXNldCB0byBmaXJzdCBwYW5lbFxuICAgICAgICBlbHNlIHN0YWNrLnNob3coIDAgKVxuICAgICAgfSxcblxuICAgICAgLy8gU2hvdyBhIHNwZWNpZmljIHBhbmVsLCBoaWRpbmcgYWxsIG90aGVyc1xuICAgICAgc2hvdzogZnVuY3Rpb24gKCBuYW1lICkge1xuICAgICAgICB2YXIgcGFuZWwgPSBzdGFjay5maW5kUGFuZWwoIG5hbWUgKVxuXG4gICAgICAgIC8vIElmIGEgcGFuZWwgaXNuJ3QgdGhlIGN1cnJlbnQgcGFuZWxcbiAgICAgICAgLy8gZGlzbWlzcyBpdCBiZWZvcmUgZ29pbmcgdG8gdGhlIHJlcXVlc3RlZCBwYW5lbFxuICAgICAgICBpZiAoIHBhbmVsICYmIHBhbmVsICE9IHN0YWNrLmN1cnJlbnRQYW5lbCgpICkge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIERpc21pc3MgdGhlIGN1cnJlbnQgcGFuZWwgYW5kIHdpdGggdGhlIGNhbGxiYWNrIGxvYWQgaW4gdGhlIG5leHQgcGFuZWxcbiAgICAgICAgICByZXR1cm4gc3RhY2suZGlzbWlzcyggc3RhY2suZGlyZWN0aW9uKCBwYW5lbCApLCBmdW5jdGlvbigpIHsgXG4gICAgICAgICAgICBzdGFjay5lbnRlciggcGFuZWwgKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgZW50ZXI6IGZ1bmN0aW9uICggZWwgKSB7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBzdGFjay5kaXJlY3Rpb24oIGVsIClcbiAgICAgICAgZWwuZGF0YXNldC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cbiAgICAgICAgc3RhY2suY3VycmVudCA9IE51bWJlciggZWwuZGF0YXNldC5zdGFja0luZGV4IClcblxuICAgICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsLmRhdGFzZXQuZGlyZWN0aW9uID0gJydcbiAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnZW50ZXInIClcbiAgICAgICAgfSwgNTAgKVxuXG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdlbnRlcicgKVxuICAgICAgICBzaG93RWwoIGVsIClcblxuICAgICAgICBpZiAoIGRpcmVjdGlvbiA9PSAnZm9yd2FyZCcgKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGZvY3VzZWQgZWxlbWVudCB3YXMgaW4gdGhlIHN0YWNrXG4gICAgICAgICAgLy9pZiAoIHRvb2xib3guY2hpbGRPZiggc3RhY2subGFzdEZvY3VzKCksIHN0YWNrLnJvb3QgKSApIHtcblxuICAgICAgICAgICAgLy8gZm9jdXMgb24gdGhlIGZpcnN0IGlucHV0XG4gICAgICAgICAgICAvL3ZhciBmaXJzdEl0ZW0gPSBlbC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQ6bm90KFtoaWRkZW5dKSwgdGV4dGFyZWEsIHNlbGVjdCwgYVt0YWJpbmRleF0nIClcbiAgICAgICAgICAgIC8vaWYgKCBmaXJzdEl0ZW0gKSBmaXJzdEl0ZW0uZm9jdXMoKVxuICAgICAgICAgIFxuICAgICAgICAgIC8vfVxuXG4gICAgICAgIC8vIEZvY3VzIG9uIHRoZSBwcmV2aW91cyBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgfSBlbHNlIGlmICggZGlyZWN0aW9uID09ICdyZXZlcnNlJyAmJiBzdGFjay5mb2N1cy5sZW5ndGggPiAwICkge1xuICAgICAgICAgIHN0YWNrLmZvY3VzLnBvcCgpLmZvY3VzKClcbiAgICAgICAgfSAgICAgIFxuICAgICAgfSxcblxuICAgICAgZGlzbWlzczogZnVuY3Rpb24gKCBkaXJlY3Rpb24sIGNhbGxiYWNrICkge1xuXG4gICAgICAgIHZhciBlbCA9IHN0YWNrLmN1cnJlbnRQYW5lbCgpXG5cbiAgICAgICAgaWYgKCBkaXJlY3Rpb24gPT0gJ2ZvcndhcmQnIClcbiAgICAgICAgICBzdGFjay5mb2N1cy5wdXNoKCBkb2N1bWVudC5hY3RpdmVFbGVtZW50IClcblxuICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnZW50ZXInIClcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCggJ2V4aXQnIClcbiAgICAgICAgZWwuZGF0YXNldC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cblxuICAgICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEVuc3VyZSBwYW5lbCBpcyBzY3JvbGxlZCB0byB0b3BcbiAgICAgICAgICBpZiAoIGRpcmVjdGlvbiA9PSAncmV2ZXJzZScgKSBlbC5zY3JvbGxUb3AgPSAwXG5cbiAgICAgICAgICBoaWRlRWwoIGVsIClcbiAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKCAnZXhpdCcgKVxuICAgICAgICAgIGVsLmRhdGFzZXQuZGlyZWN0aW9uID0gJydcblxuICAgICAgICAgIGlmICggdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nICkgY2FsbGJhY2soKVxuXG4gICAgICAgIH0sIDUwIClcblxuICAgICAgfSxcblxuICAgICAgbGFzdEZvY3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHN0YWNrLmZvY3VzWyBzdGFjay5mb2N1cy5sZW5ndGggLTEgXSBcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZpbmQgYSBwYW5lbCBieSBuYW1lIG9yIGluZGV4XG4gICAgICBmaW5kUGFuZWw6IGZ1bmN0aW9uICggbmFtZSApIHtcbiAgICAgICAgaWYgKCBpc0VsZW1lbnQoIG5hbWUgKSApIFxuICAgICAgICAgIHJldHVybiBuYW1lIFxuICAgICAgICBlbHNlIFxuICAgICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1zdGFjaz1cIicrbmFtZSsnXCJdLCBbZGF0YS1zdGFjay1pbmRleD1cIicrbmFtZSsnXCJdJyApXG4gICAgICB9LFxuXG4gICAgICAvLyBXYWxrIGJhY2t3YXJkcyBpbiB0aGUgc3RhY2ssIHNob3dpbmcgdGhlIHBhbmVsIHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IHBhbmVsXG4gICAgICBiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0YWNrLnNob3coIHN0YWNrLnBhbmVsc1sgc3RhY2suY3VycmVudCAtIDEgXSApXG4gICAgICB9LFxuXG4gICAgICAvLyBhZGQgYXJpYS1oaWRkZW49ZmFsc2UgdG8gdGhlIGZpcnN0IGhpZGRlbiBlbGVtZW50XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0YWNrLnNob3coIHN0YWNrLnBhbmVsc1sgc3RhY2suY3VycmVudCArIDEgXSApXG4gICAgICB9LFxuXG4gICAgICBkaXJlY3Rpb246IGZ1bmN0aW9uKCBwYW5lbCApIHtcbiAgICAgICAgdmFyIGluZGV4ID0gc3RhY2sucGFuZWxJbmRleCggcGFuZWwgKVxuXG4gICAgICAgIGlmICggaW5kZXggPT0gc3RhY2suY3VycmVudCApIHJldHVybiAnbm9uZSdcbiAgICAgICAgZWxzZSByZXR1cm4gKCBzdGFjay5jdXJyZW50IDwgaW5kZXggKSA/ICdmb3J3YXJkJyA6ICdyZXZlcnNlJ1xuICAgICAgIFxuICAgICAgfSxcblxuICAgICAgY3VycmVudFBhbmVsOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG4gICAgICAgIGlmICggbmFtZSApIHtcbiAgICAgICAgICByZXR1cm4gc3RhY2sucGFuZWxzWyBzdGFjay5jdXJyZW50IF0gPT0gc3RhY2suZmluZFBhbmVsKCBuYW1lIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhY2sucGFuZWxzWyBzdGFjay5jdXJyZW50IF1cbiAgICAgIH0sXG5cbiAgICAgIHBhbmVsSW5kZXg6IGZ1bmN0aW9uICggcGFuZWwgKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIoIHBhbmVsLmRhdGFzZXQuc3RhY2tJbmRleCApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgcXVlcnlhYmxlIHN0YWNrIGlkXG4gICAgcm9vdC5kYXRhc2V0LnN0YWNrSWQgPSBTdGFja3MubGVuZ3RoXG5cbiAgICBTdGFja3MucHVzaCggc3RhY2sgKVxuICAgIHRvb2xib3guZWFjaCggcm9vdC5jaGlsZHJlbiwgc3RhY2suYWRkIClcblxuICAgIHJldHVybiBzdGFja1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dFbCAoIGVsICkge1xuICBlbC5zZXRBdHRyaWJ1dGUoICdhcmlhLWhpZGRlbicsIGZhbHNlIClcbn1cblxuZnVuY3Rpb24gaGlkZUVsICggZWwgKSB7XG4gIGVsLnNldEF0dHJpYnV0ZSggJ2FyaWEtaGlkZGVuJywgdHJ1ZSApXG59XG5cbmZ1bmN0aW9uIGlzRWxlbWVudCAoIGl0ZW0gKSB7XG4gIHJldHVybiBpdGVtLmNvbnN0cnVjdG9yLnRvU3RyaW5nKCkuc2VhcmNoKC9IVE1MLitFbGVtZW50LykgPiAtMVxufVxuXG5mdW5jdGlvbiBuYXZDbGljayAoIGV2ZW50ICkge1xuICB2YXIgZWwgPSBldmVudC5jdXJyZW50VGFyZ2V0XG4gIHZhciBwYW5lbCA9IGVsLmRhdGFzZXQuc3RhY2tOYXZcbiAgdmFyIHN0YWNrID0gZ2V0U3RhY2soIHRvb2xib3guZ2V0Q2xvc2VzdCggZWwsICdbZGF0YS1zdGFjaz1cInJvb3RcIl0nICkgKVxuICBpZiAoICFzdGFjayApIHJldHVyblxuXG4gIGlmICggcGFuZWwgPT0gJ25leHQnICkgc3RhY2submV4dCgpXG4gIGVsc2UgaWYgKCBwYW5lbCA9PSAnYmFjaycgKSBzdGFjay5iYWNrKClcbiAgZWxzZSBpZiAoIHN0YWNrLmZpbmRQYW5lbCggcGFuZWwgKSApIHN0YWNrLnNob3coIHBhbmVsIClcbiAgZWxzZSByZXR1cm5cblxuICAvL2V2ZW50LnByZXZlbnREZWZhdWx0KClcbn1cblxuZnVuY3Rpb24gcHJldlBhbmVsICggZXZlbnQgKSB7XG4gIHZhciBzdGFjayA9IGdldFN0YWNrKCB0b29sYm94LmdldENsb3Nlc3QoIGV2ZW50LnRhcmdldCwgJ1tkYXRhLXN0YWNrPVwicm9vdFwiXScgKSApXG4gIHN0YWNrLmJhY2soKVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG59XG5cbmZ1bmN0aW9uIHNldHVwICgpIHtcbiAgRXZlbnQuY2hhbmdlKCBmdW5jdGlvbigpIHtcbiAgICB0b29sYm94LmVhY2goIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoICdbZGF0YS1zdGFjaz1cInJvb3RcIl0nKSwgU3RhY2submV3IClcbiAgfSlcblxuICAvLyBMb2NhbGlzZSBjbGlja3MgdG8gYSBzdGFjayByb290XG4gIC8vIEZ1dHVyZTogY29uc2lkZXIgZXhwYW5kaW5nIHRoaXMgdG8gYWxsb3cgY29udHJvbHMgdG8gbGl2ZSBhbnl3aGVyZSBhbmQgcG9pbnQgdG8gYSBzdGFja1xuICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbZGF0YS1zdGFjaz1cInJvb3RcIl0gW2RhdGEtc3RhY2stbmF2XScsIG5hdkNsaWNrIClcbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2sgKCBzZWFyY2ggKSB7XG5cbiAgaWYgKCBpc0VsZW1lbnQoIHNlYXJjaCApICkge1xuICAgIGlmICggc2VhcmNoLmRhdGFzZXQuc3RhY2tJZCApIHJldHVybiBTdGFja3NbIHNlYXJjaC5kYXRhc2V0LnN0YWNrSWQgXVxuICB9XG5cbiAgaWYgKCB0eXBlb2Ygc2VhcmNoID09PSAnc3RyaW5nJyApIHtcblxuICAgIC8vIFdlbGwsIGxldCdzIGhvcGUgaXQncyBhIERPTSBzZWxlY3RvclxuICAgIHZhciBzdGFjayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIHNlYXJjaCApXG5cbiAgICAvLyBJZiBpdCBpcyB3b28gaG9vXG4gICAgaWYgKCBzdGFjayAmJiBzdGFjay5kYXRhc2V0LnN0YWNrSWQgKSB7XG4gICAgICByZXR1cm4gU3RhY2tzWyBzdGFjay5kYXRhc2V0LnN0YWNrSWQgXVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbmV3OiBTdGFjay5uZXcsXG4gIHNldHVwOiBzZXR1cCxcbiAgZ2V0OiBnZXRTdGFjayxcbiAgc3RhY2tzOiBTdGFja3Ncbn1cbiIsIi8vIFB1cnBvc2U6IFRvZ2dsZXMgZXhwYW5zaW9uIG9mIHRyZWUgbmF2IGFuZCBzdG9yZXMgY29va2llcyB0byByZXRhaW4gc3RhdGVcbi8vXG4vLyBVc2FnZTpcbi8vIC0gVHJlZXMgbXVzdCBoYXZlIGEgW2RhdGEtdHJlZT0ndHJlZS1rZXknXVxuLy8gLSBOb2RlcyBhcmUgbmFtZWQgYnkgW2RhdGEtbm9kZT0nbm9kZS1uYW1lJ11cbi8vXG4vLyBDb29raWVzIGFyZSBzdG9yZWQgYXMgdHJlZS1rZXkgPT4geyBub2RlLW5hbWU6IHRydWUgfVxuLy8gbm9kZSBib29sZWFuIG1hdGNoZXMgYXJpYS1leHBhbmRlZCBzdGF0ZVxuLy9cblxudmFyIHRvb2xib3ggICAgID0gcmVxdWlyZSggJ2NvbXBvc2UtdG9vbGJveCcgKSxcbiAgICBjb29raWUgICAgICA9IHJlcXVpcmUoICcuL19jb29raWUnICksXG4gICAgRXZlbnQgICAgICAgPSB0b29sYm94LmV2ZW50XG5cbmZ1bmN0aW9uIHNldENvb2tpZSAoIG5vZGUgKSB7XG4gIGlmICggbm9kZS5kYXRhc2V0Lm5vZGUgKSB7XG4gICAgdmFyIHRyZWUgPSB0b29sYm94LmdldENsb3Nlc3QoIG5vZGUsICdbZGF0YS10cmVlXScgKVxuICAgIGlmICggdHJlZSApIHtcbiAgICAgIGRhdGEgPSB7fVxuICAgICAgZGF0YVsgbm9kZS5kYXRhc2V0Lm5vZGUgXSA9IG5vZGUuZ2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcgKSA9PSAndHJ1ZSdcbiAgICAgIGNvb2tpZS51cGRhdGUoIHRyZWUuZGF0YXNldC50cmVlLCBkYXRhIClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xpY2sgKCBldmVudCApIHtcbiAgdmFyIHRhcmdldCAgID0gZXZlbnQuY3VycmVudFRhcmdldCxcbiAgICAgIHBhcmVudCAgID0gdGFyZ2V0LnBhcmVudEVsZW1lbnQsXG4gICAgICBleHBhbmRlZCA9IHBhcmVudC5nZXRBdHRyaWJ1dGUoICdhcmlhLWV4cGFuZGVkJyApXG5cbiAgLy8gQWRkIGEgY2xhc3NuYW1lIHRvIGluZGljYXRlIHRoYXQgaXQgd2FzIG1hbnVhbGx5IHRyaWdnZXJlZFxuICAvLyBUaGlzIGFsbG93cyBmb3IgYW5pbWF0aW5nIGludGVyYWN0aW9ucywgYnV0IG5vdCBvdGhlciBhdHRyaWJ1dGUgY2hhbmdlc1xuICBwYXJlbnQuY2xhc3NMaXN0LmFkZCggJ3RyaWdnZXJlZCcgKVxuICBwYXJlbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1leHBhbmRlZCcsIGV4cGFuZGVkICE9ICd0cnVlJyApXG5cbiAgc2V0Q29va2llKCBwYXJlbnQgKVxufVxuXG4vLyBTZXRzIHRyZWUgbmF2IHN0YXRlIGJhc2VkIG9mZiBvZiBjb29raWVzXG5mdW5jdGlvbiByZXN0b3JlTmF2ICgpIHtcbiAgdG9vbGJveC5lYWNoKCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnW2RhdGEtdHJlZV0nICksIGZ1bmN0aW9uKCB0cmVlICkge1xuICAgIHZhciBrZXkgPSB0cmVlLmRhdGFzZXQudHJlZVxuICAgIGlmICgga2V5ICkge1xuICAgICAgdmFyIGRhdGEgPSBjb29raWUuZ2V0KCBrZXkgKVxuXG4gICAgICBPYmplY3Qua2V5cyggZGF0YSApLmZvckVhY2goIGZ1bmN0aW9uKCBub2RlICkge1xuICAgICAgICB2YXIgbm9kZUVsID0gdHJlZS5xdWVyeVNlbGVjdG9yKCAnW2RhdGEtbm9kZT0nK25vZGUrJ10nIClcbiAgICAgICAgLy8gVXNlIGNvb2tpZXMgdG8gZXhwYW5kLlxuICAgICAgICBpZiAoIG5vZGVFbCAmJiBkYXRhW25vZGVdID09ICd0cnVlJyApIG5vZGVFbC5zZXRBdHRyaWJ1dGUoICdhcmlhLWV4cGFuZGVkJywgZGF0YVtub2RlXSApXG4gICAgICB9KVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIEV2ZW50LnJlYWR5KCBmdW5jdGlvbigpIHtcblxuICAgIC8vIFRoZSBmaXJzdCBjaGlsZCBvZiBhIG5vZGUgaXMgdGhlIHRyaWdnZXJcbiAgICBFdmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbYXJpYS1leHBhbmRlZF0gPiAqOmZpcnN0LWNoaWxkJywgY2xpY2sgKVxuXG4gICAgLy8gU2V0IHN0YXRlcyBhY2NvcmRpbmcgdG8gY29va2llc1xuICAgIC8vcmVzdG9yZU5hdigpXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXR1cDogc2V0dXBcbn1cbiIsIi8qKlxuICogQWRkIGRhdGFzZXQgc3VwcG9ydCB0byBlbGVtZW50c1xuICogTm8gZ2xvYmFscywgbm8gb3ZlcnJpZGluZyBwcm90b3R5cGUgd2l0aCBub24tc3RhbmRhcmQgbWV0aG9kcywgXG4gKiAgIGhhbmRsZXMgQ2FtZWxDYXNlIHByb3Blcmx5LCBhdHRlbXB0cyB0byB1c2Ugc3RhbmRhcmQgXG4gKiAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgpIChhbmQgRnVuY3Rpb24gYmluZCgpKSBtZXRob2RzLCBcbiAqICAgZmFsbHMgYmFjayB0byBuYXRpdmUgaW1wbGVtZW50YXRpb24gd2hlbiBleGlzdGluZ1xuICogSW5zcGlyZWQgYnkgaHR0cDovL2NvZGUuZWxpZ3JleS5jb20vaHRtbDUvZGF0YXNldC8gXG4gKiAgICh2aWEgaHR0cHM6Ly9naXRodWIuY29tL2FkYWxnaXNvL2h0bWw1LWRhdGFzZXQvYmxvYi9tYXN0ZXIvaHRtbDUtZGF0YXNldC5qcyApXG4gKiBEZXBlbmRzIG9uIEZ1bmN0aW9uLmJpbmQgYW5kIE9iamVjdC5kZWZpbmVQcm9wZXJ0eS9PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIChzaGltcyBiZWxvdylcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBYMTEvTUlUIExpY2Vuc2VcbiovXG5cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCNDb21wYXRpYmlsaXR5XG5pZiAoIUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kKSB7XG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAob1RoaXMpIHtcbiAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8gY2xvc2VzdCB0aGluZyBwb3NzaWJsZSB0byB0aGUgRUNNQVNjcmlwdCA1IGludGVybmFsIElzQ2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAtIHdoYXQgaXMgdHJ5aW5nIHRvIGJlIGJvdW5kIGlzIG5vdCBjYWxsYWJsZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXG4gICAgICAgICAgICBmVG9CaW5kID0gdGhpcyxcbiAgICAgICAgICAgIEZOT1AgPSBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICAgIGZCb3VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZlRvQmluZC5hcHBseShcbiAgICAgICAgICAgICAgICAgICAgdGhpcyBpbnN0YW5jZW9mIEZOT1AgJiYgb1RoaXMgPyB0aGlzIDogb1RoaXMsXG4gICAgICAgICAgICAgICAgICAgYUFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICBGTk9QLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuICAgICAgICBmQm91bmQucHJvdG90eXBlID0gbmV3IEZOT1AoKTtcblxuICAgICAgICByZXR1cm4gZkJvdW5kO1xuICAgIH07XG59XG5cbi8qXG4gKiBYY2Nlc3NvcnMgU3RhbmRhcmQ6IENyb3NzLWJyb3dzZXIgRUNNQVNjcmlwdCA1IGFjY2Vzc29yc1xuICogaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL1hjY2Vzc29yc1xuICogXG4gKiAyMDEwLTA2LTIxXG4gKiBcbiAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cbiAqIFxuICogQSBzaGltIHRoYXQgcGFydGlhbGx5IGltcGxlbWVudHMgT2JqZWN0LmRlZmluZVByb3BlcnR5LFxuICogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciwgYW5kIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIGluIGJyb3dzZXJzIHRoYXQgaGF2ZVxuICogbGVnYWN5IF9fKGRlZmluZXxsb29rdXApW0dTXWV0dGVyX18gc3VwcG9ydC5cbiAqIFxuICogTGljZW5zZWQgdW5kZXIgdGhlIFgxMS9NSVQgTGljZW5zZVxuICogICBTZWUgTElDRU5TRS5tZFxuKi9cblxuLy8gUmVtb3ZlZCBhIGZldyBKU0xpbnQgb3B0aW9ucyBhcyBOb3RlcGFkKysgSlNMaW50IHZhbGlkYXRvciBjb21wbGFpbmluZyBhbmQgXG4vLyAgIG1hZGUgY29tcGx5IHdpdGggSlNMaW50OyBhbHNvIG1vdmVkICd1c2Ugc3RyaWN0JyBpbnNpZGUgZnVuY3Rpb25cbi8qanNsaW50IHdoaXRlOiB0cnVlLCB1bmRlZjogdHJ1ZSwgcGx1c3BsdXM6IHRydWUsXG4gIGJpdHdpc2U6IHRydWUsIHJlZ2V4cDogdHJ1ZSwgbmV3Y2FwOiB0cnVlLCBtYXhsZW46IDkwICovXG5cbi8qISBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9YY2Nlc3NvcnMvYmxvYi9tYXN0ZXIveGNjZXNzb3JzLXN0YW5kYXJkLmpzKi9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICBkZWZpbmVHZXR0ZXIgPSBPYmplY3RQcm90by5fX2RlZmluZUdldHRlcl9fLFxuICAgIGRlZmluZVNldHRlciA9IE9iamVjdFByb3RvLl9fZGVmaW5lU2V0dGVyX18sXG4gICAgbG9va3VwR2V0dGVyID0gT2JqZWN0UHJvdG8uX19sb29rdXBHZXR0ZXJfXyxcbiAgICBsb29rdXBTZXR0ZXIgPSBPYmplY3RQcm90by5fX2xvb2t1cFNldHRlcl9fLFxuICAgIGhhc093blByb3AgPSBPYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcbiAgICBcbiAgICBpZiAoZGVmaW5lR2V0dGVyICYmIGRlZmluZVNldHRlciAmJiBsb29rdXBHZXR0ZXIgJiYgbG9va3VwU2V0dGVyKSB7XG5cbiAgICAgICAgaWYgKCFPYmplY3QuZGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHsgLy8gYWxsIGFyZ3VtZW50cyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnRzIG5vdCBvcHRpb25hbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcHJvcCArPSBcIlwiOyAvLyBjb252ZXJ0IHByb3AgdG8gc3RyaW5nXG5cbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcC5jYWxsKGRlc2NyaXB0b3IsIFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsb29rdXBHZXR0ZXIuY2FsbChvYmosIHByb3ApICYmICFsb29rdXBTZXR0ZXIuY2FsbChvYmosIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHByb3BlcnR5IGRlZmluZWQgYW5kIG5vIHByZS1leGlzdGluZyBhY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtwcm9wXSA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoKGhhc093blByb3AuY2FsbChkZXNjcmlwdG9yLCBcImdldFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIGhhc093blByb3AuY2FsbChkZXNjcmlwdG9yLCBcInNldFwiKSkpIFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yIGhhcyBhIHZhbHVlIHByb3AgYnV0IGFjY2Vzc29yIGFscmVhZHkgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHNwZWNpZnkgYW4gYWNjZXNzb3IgYW5kIGEgdmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjYW4ndCBzd2l0Y2ggb2ZmIHRoZXNlIGZlYXR1cmVzIGluIEVDTUFTY3JpcHQgM1xuICAgICAgICAgICAgICAgIC8vIHNvIHRocm93IGEgVHlwZUVycm9yIGlmIGFueSBhcmUgZmFsc2VcbiAgICAgICAgICAgICAgICBpZiAoIShkZXNjcmlwdG9yLndyaXRhYmxlICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZSAmJiBcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgZG9lcyBub3Qgc3VwcG9ydFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGZhbHNlIGZvciBjb25maWd1cmFibGUsIGVudW1lcmFibGUsIG9yIHdyaXRhYmxlLlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmdldCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVHZXR0ZXIuY2FsbChvYmosIHByb3AsIGRlc2NyaXB0b3IuZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZVNldHRlci5jYWxsKG9iaiwgcHJvcCwgZGVzY3JpcHRvci5zZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gKG9iaiwgcHJvcCkge1xuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgeyAvLyBhbGwgYXJndW1lbnRzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudHMgbm90IG9wdGlvbmFsLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcHJvcCArPSBcIlwiOyAvLyBjb252ZXJ0IHByb3AgdG8gc3RyaW5nXG5cbiAgICAgICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlICA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlICAgIDogdHJ1ZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0dGVyID0gbG9va3VwR2V0dGVyLmNhbGwob2JqLCBwcm9wKSxcbiAgICAgICAgICAgICAgICBzZXR0ZXIgPSBsb29rdXBTZXR0ZXIuY2FsbChvYmosIHByb3ApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wLmNhbGwob2JqLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0IG9yIGlzIGluaGVyaXRlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFnZXR0ZXIgJiYgIXNldHRlcikgeyAvLyBub3QgYW4gYWNjZXNzb3Igc28gcmV0dXJuIHByb3BcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IG9ialtwcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gYWNjZXNzb3IsIHJlbW92ZSBkZXNjcmlwdG9yLndyaXRhYmxlO1xuICAgICAgICAgICAgICAgIC8vIHBvcHVsYXRlIGRlc2NyaXB0b3IuZ2V0IGFuZCBkZXNjcmlwdG9yLnNldCAoSUUncyBiZWhhdmlvcilcbiAgICAgICAgICAgICAgICBkZWxldGUgZGVzY3JpcHRvci53cml0YWJsZTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldCA9IGRlc2NyaXB0b3Iuc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmIChnZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXQgPSBnZXR0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5zZXQgPSBzZXR0ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKG9iaiwgcHJvcHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvcDtcbiAgICAgICAgICAgICAgICBmb3IgKHByb3AgaW4gcHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc093blByb3AuY2FsbChwcm9wcywgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIHByb3BzW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG59KCkpO1xuXG4vLyBCZWdpbiBkYXRhc2V0IGNvZGVcblxuaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZGF0YXNldCAmJiBcbiAgICAgICAgIC8vIEZGIGlzIGVtcHR5IHdoaWxlIElFIGdpdmVzIGVtcHR5IG9iamVjdFxuICAgICAgICAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudC5wcm90b3R5cGUsICdkYXRhc2V0JykgIHx8XG4gICAgICAgICFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQucHJvdG90eXBlLCAnZGF0YXNldCcpLmdldClcbiAgICApIHtcbiAgICB2YXIgcHJvcERlc2NyaXB0b3IgPSB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgdmFyIGksIFxuICAgICAgICAgICAgICAgIHRoYXQgPSB0aGlzLFxuICAgICAgICAgICAgICAgIEhUTUw1X0RPTVN0cmluZ01hcCwgXG4gICAgICAgICAgICAgICAgYXR0clZhbCwgYXR0ck5hbWUsIHByb3BOYW1lLFxuICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgIGF0dHNMZW5ndGggPSBhdHRyaWJ1dGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB0b1VwcGVyQ2FzZSA9IGZ1bmN0aW9uIChuMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjAuY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24gKGF0dHJOYW1lLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpID8gXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgdmFsdWUpIDogXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7IC8vIFNpbXVsYXRlIERPTVN0cmluZ01hcCB3L2FjY2Vzc29yIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAvLyBUZXN0IHNldHRpbmcgYWNjZXNzb3Igb24gbm9ybWFsIG9iamVjdFxuICAgICAgICAgICAgICAgICh7fSkuX19kZWZpbmVHZXR0ZXJfXygndGVzdCcsIGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXAgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlMSkgeyAvLyBVc2UgYSBET00gb2JqZWN0IGZvciBJRThcbiAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdHRzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZpeDogVGhpcyB0ZXN0IHJlYWxseSBzaG91bGQgYWxsb3cgYW55IFhNTCBOYW1lIHdpdGhvdXQgXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBjb2xvbnMgKGFuZCBub24tdXBwZXJjYXNlIGZvciBYSFRNTClcbiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5uYW1lICYmIFxuICAgICAgICAgICAgICAgICAgICAoL15kYXRhLVxcd1tcXHdcXC1dKiQvKS50ZXN0KGF0dHJpYnV0ZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBhdHRyVmFsID0gYXR0cmlidXRlLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHJpYnV0ZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgdG8gQ2FtZWxDYXNlXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lID0gYXR0ck5hbWUuc3Vic3RyKDUpLnJlcGxhY2UoLy0uL2csIHRvVXBwZXJDYXNlKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MNV9ET01TdHJpbmdNYXAsIHByb3BOYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdGhpcy5lbnVtZXJhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZ2V0dGVyLmJpbmQoYXR0clZhbCB8fCAnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBzZXR0ZXIuYmluZCh0aGF0LCBhdHRyTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlMikgeyAvLyBpZiBhY2Nlc3NvcnMgYXJlIG5vdCB3b3JraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBIVE1MNV9ET01TdHJpbmdNYXBbcHJvcE5hbWVdID0gYXR0clZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIVE1MNV9ET01TdHJpbmdNYXA7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEZGIGVudW1lcmF0ZXMgb3ZlciBlbGVtZW50J3MgZGF0YXNldCwgYnV0IG5vdCBcbiAgICAgICAgLy8gICBFbGVtZW50LnByb3RvdHlwZS5kYXRhc2V0OyBJRTkgaXRlcmF0ZXMgb3ZlciBib3RoXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgJ2RhdGFzZXQnLCBwcm9wRGVzY3JpcHRvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwcm9wRGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZmFsc2U7IC8vIElFOCBkb2VzIG5vdCBhbGxvdyBzZXR0aW5nIHRvIHRydWVcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCAnZGF0YXNldCcsIHByb3BEZXNjcmlwdG9yKTtcbiAgICB9XG59XG4iLCIvLyBSZXF1aXJlIG1vZHVsZXMsIGFkZCBjb2RlLCBldGNcbnJlcXVpcmUoICcuL3NoaW1zL19kYXRhc2V0JyApXG52YXIgZXN2ZyAgICAgPSByZXF1aXJlKCAnLi9fZXN2ZycgKVxudmFyIGljb25zICAgID0gcmVxdWlyZSggJy4vX2ljb25zJyApXG52YXIgdG9nZ2xlciAgPSByZXF1aXJlKCAnY29tcG9zZS10b2dnbGVyJyApXG52YXIgdG9vbGJveCAgPSByZXF1aXJlKCAnY29tcG9zZS10b29sYm94JyApXG52YXIgbW9kYWwgICAgPSByZXF1aXJlKCAnLi9fbW9kYWwnIClcbnZhciBzdGFjayAgICA9IHJlcXVpcmUoICcuL19zdGFjaycgKVxudmFyIHNlYXJjaCAgID0gcmVxdWlyZSggJy4vX3NlYXJjaCcgKVxudmFyIHRyZWUgICAgID0gcmVxdWlyZSggJy4vX3RyZWUnIClcbnZhciBjb29raWUgICA9IHJlcXVpcmUoICcuL19jb29raWUnIClcblxucmVxdWlyZSggJy4vX3NpZGViYXInIClcblxubW9kYWwuc2V0dXAoKVxuc3RhY2suc2V0dXAoKVxudHJlZS5zZXR1cCgpXG5cbndpbmRvdy5zcGFyayA9IG1vZHVsZS5leHBvcnRzID0gdG9vbGJveC5tZXJnZSh7XG4gIGVzdmc6IGVzdmcsXG4gIHRvZ2dsZXI6IHRvZ2dsZXIsXG4gIG1vZGFsOiBtb2RhbCxcbiAgc3RhY2s6IHN0YWNrLFxuICBjb29raWU6IGNvb2tpZSxcbiAgYmVhbjogcmVxdWlyZSggJ2JlYW4nIClcbn0sIHRvb2xib3ggKVxuXG4vLyBTaW1wbGUgaWdub3JlIGNsaWNrIG9uIGFuY2hvciB0cmlnZ2Vyc1xudG9vbGJveC5ldmVudC5vbiggZG9jdW1lbnQsICdjbGljaycsICdbaHJlZj1cIiNcIl0nLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG59KVxuIiwiLyohXG4gICogQmVhbiAtIGNvcHlyaWdodCAoYykgSmFjb2IgVGhvcm50b24gMjAxMS0yMDEyXG4gICogaHR0cHM6Ly9naXRodWIuY29tL2ZhdC9iZWFuXG4gICogTUlUIGxpY2Vuc2VcbiAgKi9cbihmdW5jdGlvbiAobmFtZSwgY29udGV4dCwgZGVmaW5pdGlvbikge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKClcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIGRlZmluZShkZWZpbml0aW9uKVxuICBlbHNlIGNvbnRleHRbbmFtZV0gPSBkZWZpbml0aW9uKClcbn0pKCdiZWFuJywgdGhpcywgZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQpIHtcbiAgbmFtZSAgICA9IG5hbWUgICAgfHwgJ2JlYW4nXG4gIGNvbnRleHQgPSBjb250ZXh0IHx8IHRoaXNcblxuICB2YXIgd2luICAgICAgICAgICAgPSB3aW5kb3dcbiAgICAsIG9sZCAgICAgICAgICAgID0gY29udGV4dFtuYW1lXVxuICAgICwgbmFtZXNwYWNlUmVnZXggPSAvW15cXC5dKig/PVxcLi4qKVxcLnwuKi9cbiAgICAsIG5hbWVSZWdleCAgICAgID0gL1xcLi4qL1xuICAgICwgYWRkRXZlbnQgICAgICAgPSAnYWRkRXZlbnRMaXN0ZW5lcidcbiAgICAsIHJlbW92ZUV2ZW50ICAgID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInXG4gICAgLCBkb2MgICAgICAgICAgICA9IGRvY3VtZW50IHx8IHt9XG4gICAgLCByb290ICAgICAgICAgICA9IGRvYy5kb2N1bWVudEVsZW1lbnQgfHwge31cbiAgICAsIFczQ19NT0RFTCAgICAgID0gcm9vdFthZGRFdmVudF1cbiAgICAsIGV2ZW50U3VwcG9ydCAgID0gVzNDX01PREVMID8gYWRkRXZlbnQgOiAnYXR0YWNoRXZlbnQnXG4gICAgLCBPTkUgICAgICAgICAgICA9IHt9IC8vIHNpbmdsZXRvbiBmb3IgcXVpY2sgbWF0Y2hpbmcgbWFraW5nIGFkZCgpIGRvIG9uZSgpXG5cbiAgICAsIHNsaWNlICAgICAgICAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gICAgLCBzdHIyYXJyICAgICAgICA9IGZ1bmN0aW9uIChzLCBkKSB7IHJldHVybiBzLnNwbGl0KGQgfHwgJyAnKSB9XG4gICAgLCBpc1N0cmluZyAgICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnc3RyaW5nJyB9XG4gICAgLCBpc0Z1bmN0aW9uICAgICA9IGZ1bmN0aW9uIChvKSB7IHJldHVybiB0eXBlb2YgbyA9PSAnZnVuY3Rpb24nIH1cbiAgICAsIGlzT2JqZWN0ICAgICAgID0gZnVuY3Rpb24gKG8pIHsgcmV0dXJuIHR5cGVvZiBvID09ICdvYmplY3QnIH1cblxuICAgIC8vIFRyeSB0byBidWlsZCBhbiBvcHRpb25zIG9iamVjdC4gSWYgYW55IGtleSBpbiBgbWF5YmVPcHRpb25zYFxuICAgIC8vIG1hdGNoZXMgYSBrZXkgaW4gYGRlZmF1bHRzYCwgaXQgd2lsbCBiZSBjb3BpZWQgaW50byBhIGNsb25lXG4gICAgLy8gb2YgYGRlZmF1bHRzYCwgdGh1cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0LlxuICAgICwgYnVpbGRPcHRpb25zID0gZnVuY3Rpb24gKG9yaWdpbmFsRGVmYXVsdHMsIG1heWJlT3B0aW9ucykge1xuICAgICAgICB2YXIgZGVmYXVsdHMgPSB7fVxuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvcmlnaW5hbERlZmF1bHRzKSB7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsRGVmYXVsdHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgZGVmYXVsdHNba2V5XSA9IG9yaWdpbmFsRGVmYXVsdHNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzT2JqZWN0KG1heWJlT3B0aW9ucykpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdHM7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGtleSBpbiBkZWZhdWx0cykge1xuICAgICAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG1heWJlT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICBkZWZhdWx0c1trZXldID0gbWF5YmVPcHRpb25zW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdHNcbiAgICAgIH1cblxuICAgICAgLy8gZXZlbnRzIHRoYXQgd2UgY29uc2lkZXIgdG8gYmUgJ25hdGl2ZScsIGFueXRoaW5nIG5vdCBpbiB0aGlzIGxpc3Qgd2lsbFxuICAgICAgLy8gYmUgdHJlYXRlZCBhcyBhIGN1c3RvbSBldmVudFxuICAgICwgc3RhbmRhcmROYXRpdmVFdmVudHMgPVxuICAgICAgICAnY2xpY2sgZGJsY2xpY2sgbW91c2V1cCBtb3VzZWRvd24gY29udGV4dG1lbnUgJyAgICAgICAgICAgICAgICAgICsgLy8gbW91c2UgYnV0dG9uc1xuICAgICAgICAnbW91c2V3aGVlbCBtb3VzZW11bHRpd2hlZWwgRE9NTW91c2VTY3JvbGwgJyAgICAgICAgICAgICAgICAgICAgICsgLy8gbW91c2Ugd2hlZWxcbiAgICAgICAgJ21vdXNlb3ZlciBtb3VzZW91dCBtb3VzZW1vdmUgc2VsZWN0c3RhcnQgc2VsZWN0ZW5kICcgICAgICAgICAgICArIC8vIG1vdXNlIG1vdmVtZW50XG4gICAgICAgICdrZXlkb3duIGtleXByZXNzIGtleXVwICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBrZXlib2FyZFxuICAgICAgICAnb3JpZW50YXRpb25jaGFuZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gbW9iaWxlXG4gICAgICAgICdmb2N1cyBibHVyIGNoYW5nZSByZXNldCBzZWxlY3Qgc3VibWl0ICcgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyBmb3JtIGVsZW1lbnRzXG4gICAgICAgICdsb2FkIHVubG9hZCBiZWZvcmV1bmxvYWQgcmVzaXplIG1vdmUgRE9NQ29udGVudExvYWRlZCAnICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ3JlYWR5c3RhdGVjaGFuZ2UgbWVzc2FnZSAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIHdpbmRvd1xuICAgICAgICAnZXJyb3IgYWJvcnQgc2Nyb2xsICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzY1xuICAgICAgLy8gZWxlbWVudC5maXJlRXZlbnQoJ29uWFlaJy4uLiBpcyBub3QgZm9yZ2l2aW5nIGlmIHdlIHRyeSB0byBmaXJlIGFuIGV2ZW50XG4gICAgICAvLyB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgZXhpc3QsIHNvIG1ha2Ugc3VyZSB3ZSBvbmx5IGRvIHRoZXNlIG9uIG5ld2VyIGJyb3dzZXJzXG4gICAgLCB3M2NOYXRpdmVFdmVudHMgPVxuICAgICAgICAnc2hvdyAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gbW91c2UgYnV0dG9uc1xuICAgICAgICAnaW5wdXQgaW52YWxpZCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgLy8gZm9ybSBlbGVtZW50c1xuICAgICAgICAndG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWwgJyAgICAgICAgICAgICAgICAgICAgICsgLy8gdG91Y2hcbiAgICAgICAgJ2dlc3R1cmVzdGFydCBnZXN0dXJlY2hhbmdlIGdlc3R1cmVlbmQgJyAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIGdlc3R1cmVcbiAgICAgICAgJ3RleHRpbnB1dCAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIFRleHRFdmVudFxuICAgICAgICAncmVhZHlzdGF0ZWNoYW5nZSBwYWdlc2hvdyBwYWdlaGlkZSBwb3BzdGF0ZSAnICAgICAgICAgICAgICAgICAgICsgLy8gd2luZG93XG4gICAgICAgICdoYXNoY2hhbmdlIG9mZmxpbmUgb25saW5lICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAvLyB3aW5kb3dcbiAgICAgICAgJ2FmdGVycHJpbnQgYmVmb3JlcHJpbnQgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIHByaW50aW5nXG4gICAgICAgICdkcmFnc3RhcnQgZHJhZ2VudGVyIGRyYWdvdmVyIGRyYWdsZWF2ZSBkcmFnIGRyb3AgZHJhZ2VuZCAnICAgICAgKyAvLyBkbmRcbiAgICAgICAgJ2xvYWRzdGFydCBwcm9ncmVzcyBzdXNwZW5kIGVtcHRpZWQgc3RhbGxlZCBsb2FkbWV0YWRhdGEgJyAgICAgICArIC8vIG1lZGlhXG4gICAgICAgICdsb2FkZWRkYXRhIGNhbnBsYXkgY2FucGxheXRocm91Z2ggcGxheWluZyB3YWl0aW5nIHNlZWtpbmcgJyAgICAgKyAvLyBtZWRpYVxuICAgICAgICAnc2Vla2VkIGVuZGVkIGR1cmF0aW9uY2hhbmdlIHRpbWV1cGRhdGUgcGxheSBwYXVzZSByYXRlY2hhbmdlICcgICsgLy8gbWVkaWFcbiAgICAgICAgJ3ZvbHVtZWNoYW5nZSBjdWVjaGFuZ2UgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIC8vIG1lZGlhXG4gICAgICAgICdjaGVja2luZyBub3VwZGF0ZSBkb3dubG9hZGluZyBjYWNoZWQgdXBkYXRlcmVhZHkgb2Jzb2xldGUgJyAgICAgICAvLyBhcHBjYWNoZVxuXG4gICAgICAvLyBjb252ZXJ0IHRvIGEgaGFzaCBmb3IgcXVpY2sgbG9va3Vwc1xuICAgICwgbmF0aXZlRXZlbnRzID0gKGZ1bmN0aW9uIChoYXNoLCBldmVudHMsIGkpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgZXZlbnRzW2ldICYmIChoYXNoW2V2ZW50c1tpXV0gPSAxKVxuICAgICAgICByZXR1cm4gaGFzaFxuICAgICAgfSh7fSwgc3RyMmFycihzdGFuZGFyZE5hdGl2ZUV2ZW50cyArIChXM0NfTU9ERUwgPyB3M2NOYXRpdmVFdmVudHMgOiAnJykpKSlcblxuICAgICAgLy8gY3VzdG9tIGV2ZW50cyBhcmUgZXZlbnRzIHRoYXQgd2UgKmZha2UqLCB0aGV5IGFyZSBub3QgcHJvdmlkZWQgbmF0aXZlbHkgYnV0XG4gICAgICAvLyB3ZSBjYW4gdXNlIG5hdGl2ZSBldmVudHMgdG8gZ2VuZXJhdGUgdGhlbVxuICAgICwgY3VzdG9tRXZlbnRzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlzQW5jZXN0b3IgPSAnY29tcGFyZURvY3VtZW50UG9zaXRpb24nIGluIHJvb3RcbiAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIChjb250YWluZXIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudCkgJiAxNikgPT09IDE2XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6ICdjb250YWlucycgaW4gcm9vdFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIubm9kZVR5cGUgPT09IDkgfHwgY29udGFpbmVyID09PSB3aW5kb3cgPyByb290IDogY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIgIT09IGVsZW1lbnQgJiYgY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoZWxlbWVudCwgY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlKSBpZiAoZWxlbWVudCA9PT0gY29udGFpbmVyKSByZXR1cm4gMVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICwgY2hlY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAgIHJldHVybiAhcmVsYXRlZFxuICAgICAgICAgICAgICAgID8gcmVsYXRlZCA9PSBudWxsXG4gICAgICAgICAgICAgICAgOiAocmVsYXRlZCAhPT0gdGhpcyAmJiByZWxhdGVkLnByZWZpeCAhPT0gJ3h1bCcgJiYgIS9kb2N1bWVudC8udGVzdCh0aGlzLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICYmICFpc0FuY2VzdG9yKHJlbGF0ZWQsIHRoaXMpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb3VzZWVudGVyOiB7IGJhc2U6ICdtb3VzZW92ZXInLCBjb25kaXRpb246IGNoZWNrIH1cbiAgICAgICAgICAsIG1vdXNlbGVhdmU6IHsgYmFzZTogJ21vdXNlb3V0JywgY29uZGl0aW9uOiBjaGVjayB9XG4gICAgICAgICAgLCBtb3VzZXdoZWVsOiB7IGJhc2U6IC9GaXJlZm94Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpID8gJ0RPTU1vdXNlU2Nyb2xsJyA6ICdtb3VzZXdoZWVsJyB9XG4gICAgICAgIH1cbiAgICAgIH0oKSlcblxuICAgICAgLy8gd2UgcHJvdmlkZSBhIGNvbnNpc3RlbnQgRXZlbnQgb2JqZWN0IGFjcm9zcyBicm93c2VycyBieSB0YWtpbmcgdGhlIGFjdHVhbCBET01cbiAgICAgIC8vIGV2ZW50IG9iamVjdCBhbmQgZ2VuZXJhdGluZyBhIG5ldyBvbmUgZnJvbSBpdHMgcHJvcGVydGllcy5cbiAgICAsIEV2ZW50ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGEgd2hpdGVsaXN0IG9mIHByb3BlcnRpZXMgKGZvciBkaWZmZXJlbnQgZXZlbnQgdHlwZXMpIHRlbGxzIHVzIHdoYXQgdG8gY2hlY2sgZm9yIGFuZCBjb3B5XG4gICAgICAgIHZhciBjb21tb25Qcm9wcyAgPSBzdHIyYXJyKCdhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0ICcgK1xuICAgICAgICAgICAgICAnZGV0YWlsIGV2ZW50UGhhc2UgZ2V0TW9kaWZpZXJTdGF0ZSBpc1RydXN0ZWQgbWV0YUtleSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5ICcgICtcbiAgICAgICAgICAgICAgJ3NyY0VsZW1lbnQgdGFyZ2V0IHRpbWVTdGFtcCB0eXBlIHZpZXcgd2hpY2ggcHJvcGVydHlOYW1lIHBhdGgnKVxuICAgICAgICAgICwgbW91c2VQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2J1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBkYXRhVHJhbnNmZXIgJyAgICAgICtcbiAgICAgICAgICAgICAgJ2Zyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50IG1vdmVtZW50WCBtb3ZlbWVudFkgcmVnaW9uJykpXG4gICAgICAgICAgLCBtb3VzZVdoZWVsUHJvcHMgPSBtb3VzZVByb3BzLmNvbmNhdChzdHIyYXJyKCd3aGVlbERlbHRhIHdoZWVsRGVsdGFYIHdoZWVsRGVsdGFZIHdoZWVsRGVsdGFaICcgK1xuICAgICAgICAgICAgICAnYXhpcycpKSAvLyAnYXhpcycgaXMgRkYgc3BlY2lmaWNcbiAgICAgICAgICAsIGtleVByb3BzICAgICA9IGNvbW1vblByb3BzLmNvbmNhdChzdHIyYXJyKCdjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIGtleUlkZW50aWZpZXIgJyAgICAgICAgICArXG4gICAgICAgICAgICAgICdrZXlMb2NhdGlvbiBsb2NhdGlvbiBpc0NvbXBvc2luZyBjb2RlJykpXG4gICAgICAgICAgLCB0ZXh0UHJvcHMgICAgPSBjb21tb25Qcm9wcy5jb25jYXQoc3RyMmFycignZGF0YScpKVxuICAgICAgICAgICwgdG91Y2hQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ3RvdWNoZXMgdGFyZ2V0VG91Y2hlcyBjaGFuZ2VkVG91Y2hlcyBzY2FsZSByb3RhdGlvbicpKVxuICAgICAgICAgICwgbWVzc2FnZVByb3BzID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ2RhdGEgb3JpZ2luIHNvdXJjZScpKVxuICAgICAgICAgICwgc3RhdGVQcm9wcyAgID0gY29tbW9uUHJvcHMuY29uY2F0KHN0cjJhcnIoJ3N0YXRlJykpXG4gICAgICAgICAgLCBvdmVyT3V0UmVnZXggPSAvb3ZlcnxvdXQvXG4gICAgICAgICAgICAvLyBzb21lIGV2ZW50IHR5cGVzIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBhbmQgc29tZSBuZWVkIHNwZWNpYWwgcHJvcGVydGllcywgZG8gdGhhdCBhbGwgaGVyZVxuICAgICAgICAgICwgdHlwZUZpeGVycyAgID0gW1xuICAgICAgICAgICAgICAgIHsgLy8ga2V5IGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9rZXkvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uIChldmVudCwgbmV3RXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5rZXlDb2RlID0gZXZlbnQua2V5Q29kZSB8fCBldmVudC53aGljaFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlQcm9wc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gbW91c2UgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL2NsaWNrfG1vdXNlKD8hKC4qd2hlZWx8c2Nyb2xsKSl8bWVudXxkcmFnfGRyb3AvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uIChldmVudCwgbmV3RXZlbnQsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5yaWdodENsaWNrID0gZXZlbnQud2hpY2ggPT09IDMgfHwgZXZlbnQuYnV0dG9uID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQucG9zID0geyB4OiAwLCB5OiAwIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQucGFnZVggfHwgZXZlbnQucGFnZVkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFggPSBldmVudC5wYWdlWFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WSA9IGV2ZW50LnBhZ2VZXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5jbGllbnRYIHx8IGV2ZW50LmNsaWVudFkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmNsaWVudFggPSBldmVudC5jbGllbnRYICsgZG9jLmJvZHkuc2Nyb2xsTGVmdCArIHJvb3Quc2Nyb2xsTGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuY2xpZW50WSA9IGV2ZW50LmNsaWVudFkgKyBkb2MuYm9keS5zY3JvbGxUb3AgKyByb290LnNjcm9sbFRvcFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpZiAob3Zlck91dFJlZ2V4LnRlc3QodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LnJlbGF0ZWRUYXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50Wyh0eXBlID09ICdtb3VzZW92ZXInID8gJ2Zyb20nIDogJ3RvJykgKyAnRWxlbWVudCddXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3VzZVByb3BzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBtb3VzZSB3aGVlbCBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvbW91c2UuKih3aGVlbHxzY3JvbGwpL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtb3VzZVdoZWVsUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIFRleHRFdmVudFxuICAgICAgICAgICAgICAgICAgICByZWc6IC9edGV4dC9pXG4gICAgICAgICAgICAgICAgICAsIGZpeDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGV4dFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyB0b3VjaCBhbmQgZ2VzdHVyZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgcmVnOiAvXnRvdWNofF5nZXN0dXJlL2lcbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0b3VjaFByb3BzIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICwgeyAvLyBtZXNzYWdlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICByZWc6IC9ebWVzc2FnZSQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VQcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAsIHsgLy8gcG9wc3RhdGUgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJlZzogL15wb3BzdGF0ZSQvaVxuICAgICAgICAgICAgICAgICAgLCBmaXg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0YXRlUHJvcHMgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCB7IC8vIGV2ZXJ5dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZWc6IC8uKi9cbiAgICAgICAgICAgICAgICAgICwgZml4OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb21tb25Qcm9wcyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgICwgdHlwZUZpeGVyTWFwID0ge30gLy8gdXNlZCB0byBtYXAgZXZlbnQgdHlwZXMgdG8gZml4ZXIgZnVuY3Rpb25zIChhYm92ZSksIGEgYmFzaWMgY2FjaGUgbWVjaGFuaXNtXG5cbiAgICAgICAgICAsIEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCBlbGVtZW50LCBpc05hdGl2ZSkge1xuICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVyblxuICAgICAgICAgICAgICBldmVudCA9IGV2ZW50IHx8ICgoZWxlbWVudC5vd25lckRvY3VtZW50IHx8IGVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCkucGFyZW50V2luZG93IHx8IHdpbikuZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy5vcmlnaW5hbEV2ZW50ID0gZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy5pc05hdGl2ZSAgICAgICA9IGlzTmF0aXZlXG4gICAgICAgICAgICAgIHRoaXMuaXNCZWFuICAgICAgICAgPSB0cnVlXG5cbiAgICAgICAgICAgICAgaWYgKCFldmVudCkgcmV0dXJuXG5cbiAgICAgICAgICAgICAgdmFyIHR5cGUgICA9IGV2ZW50LnR5cGVcbiAgICAgICAgICAgICAgICAsIHRhcmdldCA9IGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50XG4gICAgICAgICAgICAgICAgLCBpLCBsLCBwLCBwcm9wcywgZml4ZXJcblxuICAgICAgICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT09IDMgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldFxuXG4gICAgICAgICAgICAgIGlmIChpc05hdGl2ZSkgeyAvLyB3ZSBvbmx5IG5lZWQgYmFzaWMgYXVnbWVudGF0aW9uIG9uIGN1c3RvbSBldmVudHMsIHRoZSByZXN0IGV4cGVuc2l2ZSAmIHBvaW50bGVzc1xuICAgICAgICAgICAgICAgIGZpeGVyID0gdHlwZUZpeGVyTWFwW3R5cGVdXG4gICAgICAgICAgICAgICAgaWYgKCFmaXhlcikgeyAvLyBoYXZlbid0IGVuY291bnRlcmVkIHRoaXMgZXZlbnQgdHlwZSBiZWZvcmUsIG1hcCBhIGZpeGVyIGZ1bmN0aW9uIGZvciBpdFxuICAgICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IHR5cGVGaXhlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlRml4ZXJzW2ldLnJlZy50ZXN0KHR5cGUpKSB7IC8vIGd1YXJhbnRlZWQgdG8gbWF0Y2ggYXQgbGVhc3Qgb25lLCBsYXN0IGlzIC4qXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZUZpeGVyTWFwW3R5cGVdID0gZml4ZXIgPSB0eXBlRml4ZXJzW2ldLmZpeFxuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwcm9wcyA9IGZpeGVyKGV2ZW50LCB0aGlzLCB0eXBlKVxuICAgICAgICAgICAgICAgIGZvciAoaSA9IHByb3BzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgICAgaWYgKCEoKHAgPSBwcm9wc1tpXSkgaW4gdGhpcykgJiYgcCBpbiBldmVudCkgdGhpc1twXSA9IGV2ZW50W3BdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gcHJldmVudERlZmF1bHQoKSBhbmQgc3RvcFByb3BhZ2F0aW9uKCkgYXJlIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgdG8gdGhvc2UgZnVuY3Rpb25zXG4gICAgICAgIC8vIG9uIHRoZSBET00sIHN0b3AoKSBpcyBhbiBhbGlhcyBmb3IgYm90aCBvZiB0aGVtIHRvZ2V0aGVyXG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KSB0aGlzLm9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgIGVsc2UgdGhpcy5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICBFdmVudC5wcm90b3R5cGUuc3RvcFByb3BhZ2F0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKSB0aGlzLm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICBlbHNlIHRoaXMub3JpZ2luYWxFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgdGhpcy5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIHRoaXMuc3RvcHBlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICAvLyBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBoYXMgdG8gYmUgaGFuZGxlZCBpbnRlcm5hbGx5IGJlY2F1c2Ugd2UgbWFuYWdlIHRoZSBldmVudCBsaXN0IGZvclxuICAgICAgICAvLyBlYWNoIGVsZW1lbnRcbiAgICAgICAgLy8gbm90ZSB0aGF0IG9yaWdpbmFsRWxlbWVudCBtYXkgYmUgYSBCZWFuI0V2ZW50IG9iamVjdCBpbiBzb21lIHNpdHVhdGlvbnNcbiAgICAgICAgRXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbikgdGhpcy5vcmlnaW5hbEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG4gICAgICAgICAgdGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWUgfVxuICAgICAgICB9XG4gICAgICAgIEV2ZW50LnByb3RvdHlwZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkICYmIHRoaXMub3JpZ2luYWxFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpXG4gICAgICAgIH1cbiAgICAgICAgRXZlbnQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICAvL1RPRE86IHRoaXMgaXMgcmlwZSBmb3Igb3B0aW1pc2F0aW9uLCBuZXcgZXZlbnRzIGFyZSAqZXhwZW5zaXZlKlxuICAgICAgICAgIC8vIGltcHJvdmluZyB0aGlzIHdpbGwgc3BlZWQgdXAgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgICAgIHZhciBuZSA9IG5ldyBFdmVudCh0aGlzLCB0aGlzLmVsZW1lbnQsIHRoaXMuaXNOYXRpdmUpXG4gICAgICAgICAgbmUuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXRcbiAgICAgICAgICByZXR1cm4gbmVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBFdmVudFxuICAgICAgfSgpKVxuXG4gICAgICAvLyBpZiB3ZSdyZSBpbiBvbGQgSUUgd2UgY2FuJ3QgZG8gb25wcm9wZXJ0eWNoYW5nZSBvbiBkb2Mgb3Igd2luIHNvIHdlIHVzZSBkb2MuZG9jdW1lbnRFbGVtZW50IGZvciBib3RoXG4gICAgLCB0YXJnZXRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGlzTmF0aXZlKSB7XG4gICAgICAgIHJldHVybiAhVzNDX01PREVMICYmICFpc05hdGl2ZSAmJiAoZWxlbWVudCA9PT0gZG9jIHx8IGVsZW1lbnQgPT09IHdpbikgPyByb290IDogZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBCZWFuIG1haW50YWlucyBhbiBpbnRlcm5hbCByZWdpc3RyeSBmb3IgZXZlbnQgbGlzdGVuZXJzLiBXZSBkb24ndCB0b3VjaCBlbGVtZW50cywgb2JqZWN0c1xuICAgICAgICAqIG9yIGZ1bmN0aW9ucyB0byBpZGVudGlmeSB0aGVtLCBpbnN0ZWFkIHdlIHN0b3JlIGV2ZXJ5dGhpbmcgaW4gdGhlIHJlZ2lzdHJ5LlxuICAgICAgICAqIEVhY2ggZXZlbnQgbGlzdGVuZXIgaGFzIGEgUmVnRW50cnkgb2JqZWN0LCB3ZSBoYXZlIG9uZSAncmVnaXN0cnknIGZvciB0aGUgd2hvbGUgaW5zdGFuY2UuXG4gICAgICAgICovXG4gICAgLCBSZWdFbnRyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIGVhY2ggaGFuZGxlciBpcyB3cmFwcGVkIHNvIHdlIGNhbiBoYW5kbGUgZGVsZWdhdGlvbiBhbmQgY3VzdG9tIGV2ZW50c1xuICAgICAgICB2YXIgd3JhcHBlZEhhbmRsZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgZm4sIGNvbmRpdGlvbiwgYXJncykge1xuICAgICAgICAgICAgdmFyIGNhbGwgPSBmdW5jdGlvbiAoZXZlbnQsIGVhcmdzKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgYXJncyA/IHNsaWNlLmNhbGwoZWFyZ3MsIGV2ZW50ID8gMCA6IDEpLmNvbmNhdChhcmdzKSA6IGVhcmdzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCBmaW5kVGFyZ2V0ID0gZnVuY3Rpb24gKGV2ZW50LCBldmVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmbi5fX2JlYW5EZWwgPyBmbi5fX2JlYW5EZWwuZnQoZXZlbnQudGFyZ2V0LCBlbGVtZW50KSA6IGV2ZW50RWxlbWVudFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLCBoYW5kbGVyID0gY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBmaW5kVGFyZ2V0KGV2ZW50LCB0aGlzKSAvLyBkZWxlYXRlZCBldmVudFxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQpIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWxsKGV2ZW50LCBhcmd1bWVudHMpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChmbi5fX2JlYW5EZWwpIGV2ZW50ID0gZXZlbnQuY2xvbmUoZmluZFRhcmdldChldmVudCkpIC8vIGRlbGVnYXRlZCBldmVudCwgZml4IHRoZSBmaXhcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FsbChldmVudCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVyLl9fYmVhbkRlbCA9IGZuLl9fYmVhbkRlbFxuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICAgICAgICB9XG5cbiAgICAgICAgLCBSZWdFbnRyeSA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcmlnaW5hbCwgbmFtZXNwYWNlcywgYXJncywgcm9vdCkge1xuICAgICAgICAgICAgdmFyIGN1c3RvbVR5cGUgICAgID0gY3VzdG9tRXZlbnRzW3R5cGVdXG4gICAgICAgICAgICAgICwgaXNOYXRpdmVcblxuICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ3VubG9hZCcpIHtcbiAgICAgICAgICAgICAgLy8gc2VsZiBjbGVhbi11cFxuICAgICAgICAgICAgICBoYW5kbGVyID0gb25jZShyZW1vdmVMaXN0ZW5lciwgZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3JpZ2luYWwpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXN0b21UeXBlKSB7XG4gICAgICAgICAgICAgIGlmIChjdXN0b21UeXBlLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIgPSB3cmFwcGVkSGFuZGxlcihlbGVtZW50LCBoYW5kbGVyLCBjdXN0b21UeXBlLmNvbmRpdGlvbiwgYXJncylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0eXBlID0gY3VzdG9tVHlwZS5iYXNlIHx8IHR5cGVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pc05hdGl2ZSAgICAgID0gaXNOYXRpdmUgPSBuYXRpdmVFdmVudHNbdHlwZV0gJiYgISFlbGVtZW50W2V2ZW50U3VwcG9ydF1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9tVHlwZSAgICA9ICFXM0NfTU9ERUwgJiYgIWlzTmF0aXZlICYmIHR5cGVcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCAgICAgICA9IGVsZW1lbnRcbiAgICAgICAgICAgIHRoaXMudHlwZSAgICAgICAgICA9IHR5cGVcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWwgICAgICA9IG9yaWdpbmFsXG4gICAgICAgICAgICB0aGlzLm5hbWVzcGFjZXMgICAgPSBuYW1lc3BhY2VzXG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSAgICAgPSBXM0NfTU9ERUwgfHwgaXNOYXRpdmUgPyB0eXBlIDogJ3Byb3BlcnR5Y2hhbmdlJ1xuICAgICAgICAgICAgdGhpcy50YXJnZXQgICAgICAgID0gdGFyZ2V0RWxlbWVudChlbGVtZW50LCBpc05hdGl2ZSlcbiAgICAgICAgICAgIHRoaXNbZXZlbnRTdXBwb3J0XSA9ICEhdGhpcy50YXJnZXRbZXZlbnRTdXBwb3J0XVxuICAgICAgICAgICAgdGhpcy5yb290ICAgICAgICAgID0gcm9vdFxuICAgICAgICAgICAgdGhpcy5oYW5kbGVyICAgICAgID0gd3JhcHBlZEhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgbnVsbCwgYXJncylcbiAgICAgICAgICB9XG5cbiAgICAgICAgLy8gZ2l2ZW4gYSBsaXN0IG9mIG5hbWVzcGFjZXMsIGlzIG91ciBlbnRyeSBpbiBhbnkgb2YgdGhlbT9cbiAgICAgICAgUmVnRW50cnkucHJvdG90eXBlLmluTmFtZXNwYWNlcyA9IGZ1bmN0aW9uIChjaGVja05hbWVzcGFjZXMpIHtcbiAgICAgICAgICB2YXIgaSwgaiwgYyA9IDBcbiAgICAgICAgICBpZiAoIWNoZWNrTmFtZXNwYWNlcykgcmV0dXJuIHRydWVcbiAgICAgICAgICBpZiAoIXRoaXMubmFtZXNwYWNlcykgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgZm9yIChpID0gY2hlY2tOYW1lc3BhY2VzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgZm9yIChqID0gdGhpcy5uYW1lc3BhY2VzLmxlbmd0aDsgai0tOykge1xuICAgICAgICAgICAgICBpZiAoY2hlY2tOYW1lc3BhY2VzW2ldID09IHRoaXMubmFtZXNwYWNlc1tqXSkgYysrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjaGVja05hbWVzcGFjZXMubGVuZ3RoID09PSBjXG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXRjaCBieSBlbGVtZW50LCBvcmlnaW5hbCBmbiAob3B0KSwgaGFuZGxlciBmbiAob3B0KVxuICAgICAgICBSZWdFbnRyeS5wcm90b3R5cGUubWF0Y2hlcyA9IGZ1bmN0aW9uIChjaGVja0VsZW1lbnQsIGNoZWNrT3JpZ2luYWwsIGNoZWNrSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQgPT09IGNoZWNrRWxlbWVudCAmJlxuICAgICAgICAgICAgKCFjaGVja09yaWdpbmFsIHx8IHRoaXMub3JpZ2luYWwgPT09IGNoZWNrT3JpZ2luYWwpICYmXG4gICAgICAgICAgICAoIWNoZWNrSGFuZGxlciB8fCB0aGlzLmhhbmRsZXIgPT09IGNoZWNrSGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZWdFbnRyeVxuICAgICAgfSgpKVxuXG4gICAgLCByZWdpc3RyeSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIG91ciBtYXAgc3RvcmVzIGFycmF5cyBieSBldmVudCB0eXBlLCBqdXN0IGJlY2F1c2UgaXQncyBiZXR0ZXIgdGhhbiBzdG9yaW5nXG4gICAgICAgIC8vIGV2ZXJ5dGhpbmcgaW4gYSBzaW5nbGUgYXJyYXkuXG4gICAgICAgIC8vIHVzZXMgJyQnIGFzIGEgcHJlZml4IGZvciB0aGUga2V5cyBmb3Igc2FmZXR5IGFuZCAncicgYXMgYSBzcGVjaWFsIHByZWZpeCBmb3JcbiAgICAgICAgLy8gcm9vdExpc3RlbmVycyBzbyB3ZSBjYW4gbG9vayB0aGVtIHVwIGZhc3RcbiAgICAgICAgdmFyIG1hcCA9IHt9XG5cbiAgICAgICAgICAvLyBnZW5lcmljIGZ1bmN0aW9uYWwgc2VhcmNoIG9mIG91ciByZWdpc3RyeSBmb3IgbWF0Y2hpbmcgbGlzdGVuZXJzLFxuICAgICAgICAgIC8vIGBmbmAgcmV0dXJucyBmYWxzZSB0byBicmVhayBvdXQgb2YgdGhlIGxvb3BcbiAgICAgICAgICAsIGZvckFsbCA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlLCBvcmlnaW5hbCwgaGFuZGxlciwgcm9vdCwgZm4pIHtcbiAgICAgICAgICAgICAgdmFyIHBmeCA9IHJvb3QgPyAncicgOiAnJCdcbiAgICAgICAgICAgICAgaWYgKCF0eXBlIHx8IHR5cGUgPT0gJyonKSB7XG4gICAgICAgICAgICAgICAgLy8gc2VhcmNoIHRoZSB3aG9sZSByZWdpc3RyeVxuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodC5jaGFyQXQoMCkgPT0gcGZ4KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvckFsbChlbGVtZW50LCB0LnN1YnN0cigxKSwgb3JpZ2luYWwsIGhhbmRsZXIsIHJvb3QsIGZuKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaSA9IDAsIGwsIGxpc3QgPSBtYXBbcGZ4ICsgdHlwZV0sIGFsbCA9IGVsZW1lbnQgPT0gJyonXG4gICAgICAgICAgICAgICAgaWYgKCFsaXN0KSByZXR1cm5cbiAgICAgICAgICAgICAgICBmb3IgKGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgaWYgKChhbGwgfHwgbGlzdFtpXS5tYXRjaGVzKGVsZW1lbnQsIG9yaWdpbmFsLCBoYW5kbGVyKSkgJiYgIWZuKGxpc3RbaV0sIGxpc3QsIGksIHR5cGUpKSByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICwgaGFzID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsLCByb290KSB7XG4gICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCB1c2luZyBmb3JBbGwgaGVyZSBzaW1wbHkgYmVjYXVzZSBpdCdzIGEgYml0IHNsb3dlciBhbmQgdGhpc1xuICAgICAgICAgICAgICAvLyBuZWVkcyB0byBiZSBmYXN0XG4gICAgICAgICAgICAgIHZhciBpLCBsaXN0ID0gbWFwWyhyb290ID8gJ3InIDogJyQnKSArIHR5cGVdXG4gICAgICAgICAgICAgIGlmIChsaXN0KSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gbGlzdC5sZW5ndGg7IGktLTspIHtcbiAgICAgICAgICAgICAgICAgIGlmICghbGlzdFtpXS5yb290ICYmIGxpc3RbaV0ubWF0Y2hlcyhlbGVtZW50LCBvcmlnaW5hbCwgbnVsbCkpIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBnZXQgPSBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIHJvb3QpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJpZXMgPSBbXVxuICAgICAgICAgICAgICBmb3JBbGwoZWxlbWVudCwgdHlwZSwgb3JpZ2luYWwsIG51bGwsIHJvb3QsIGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAsIHB1dCA9IGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgICB2YXIgaGFzID0gIWVudHJ5LnJvb3QgJiYgIXRoaXMuaGFzKGVudHJ5LmVsZW1lbnQsIGVudHJ5LnR5cGUsIG51bGwsIGZhbHNlKVxuICAgICAgICAgICAgICAgICwga2V5ID0gKGVudHJ5LnJvb3QgPyAncicgOiAnJCcpICsgZW50cnkudHlwZVxuICAgICAgICAgICAgICA7KG1hcFtrZXldIHx8IChtYXBba2V5XSA9IFtdKSkucHVzaChlbnRyeSlcbiAgICAgICAgICAgICAgcmV0dXJuIGhhc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgLCBkZWwgPSBmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgZm9yQWxsKGVudHJ5LmVsZW1lbnQsIGVudHJ5LnR5cGUsIG51bGwsIGVudHJ5LmhhbmRsZXIsIGVudHJ5LnJvb3QsIGZ1bmN0aW9uIChlbnRyeSwgbGlzdCwgaSkge1xuICAgICAgICAgICAgICAgIGxpc3Quc3BsaWNlKGksIDEpXG4gICAgICAgICAgICAgICAgZW50cnkucmVtb3ZlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIGRlbGV0ZSBtYXBbKGVudHJ5LnJvb3QgPyAncicgOiAnJCcpICsgZW50cnkudHlwZV1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZHVtcCBhbGwgZW50cmllcywgdXNlZCBmb3Igb251bmxvYWRcbiAgICAgICAgICAsIGVudHJpZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHZhciB0LCBlbnRyaWVzID0gW11cbiAgICAgICAgICAgICAgZm9yICh0IGluIG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0LmNoYXJBdCgwKSA9PSAnJCcpIGVudHJpZXMgPSBlbnRyaWVzLmNvbmNhdChtYXBbdF0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBoYXM6IGhhcywgZ2V0OiBnZXQsIHB1dDogcHV0LCBkZWw6IGRlbCwgZW50cmllczogZW50cmllcyB9XG4gICAgICB9KCkpXG5cbiAgICAgIC8vIHdlIG5lZWQgYSBzZWxlY3RvciBlbmdpbmUgZm9yIGRlbGVnYXRlZCBldmVudHMsIHVzZSBxdWVyeVNlbGVjdG9yQWxsIGlmIGl0IGV4aXN0c1xuICAgICAgLy8gYnV0IGZvciBvbGRlciBicm93c2VycyB3ZSBuZWVkIFF3ZXJ5LCBTaXp6bGUgb3Igc2ltaWxhclxuICAgICwgc2VsZWN0b3JFbmdpbmVcbiAgICAsIHNldFNlbGVjdG9yRW5naW5lID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgc2VsZWN0b3JFbmdpbmUgPSBkb2MucXVlcnlTZWxlY3RvckFsbFxuICAgICAgICAgICAgPyBmdW5jdGlvbiAocywgcikge1xuICAgICAgICAgICAgICAgIHJldHVybiByLnF1ZXJ5U2VsZWN0b3JBbGwocylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCZWFuOiBObyBzZWxlY3RvciBlbmdpbmUgaW5zdGFsbGVkJykgLy8gZWVla1xuICAgICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0b3JFbmdpbmUgPSBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gd2UgYXR0YWNoIHRoaXMgbGlzdGVuZXIgdG8gZWFjaCBET00gZXZlbnQgdGhhdCB3ZSBuZWVkIHRvIGxpc3RlbiB0bywgb25seSBvbmNlXG4gICAgICAvLyBwZXIgZXZlbnQgdHlwZSBwZXIgRE9NIGVsZW1lbnRcbiAgICAsIHJvb3RMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgdHlwZSkge1xuICAgICAgICBpZiAoIVczQ19NT0RFTCAmJiB0eXBlICYmIGV2ZW50ICYmIGV2ZW50LnByb3BlcnR5TmFtZSAhPSAnX29uJyArIHR5cGUpIHJldHVyblxuXG4gICAgICAgIHZhciBsaXN0ZW5lcnMgPSByZWdpc3RyeS5nZXQodGhpcywgdHlwZSB8fCBldmVudC50eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAsIGwgPSBsaXN0ZW5lcnMubGVuZ3RoXG4gICAgICAgICAgLCBpID0gMFxuXG4gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50LCB0aGlzLCB0cnVlKVxuICAgICAgICBpZiAodHlwZSkgZXZlbnQudHlwZSA9IHR5cGVcblxuICAgICAgICAvLyBpdGVyYXRlIHRocm91Z2ggYWxsIGhhbmRsZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgY2FsbGluZyB0aGVtIHVubGVzcyB0aGV5IGhhdmVcbiAgICAgICAgLy8gYmVlbiByZW1vdmVkIGJ5IGEgcHJldmlvdXMgaGFuZGxlciBvciBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBoYXMgYmVlbiBjYWxsZWRcbiAgICAgICAgZm9yICg7IGkgPCBsICYmICFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpc3RlbmVyc1tpXS5yZW1vdmVkKSBsaXN0ZW5lcnNbaV0uaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCBhbmQgcmVtb3ZlIGxpc3RlbmVycyB0byBET00gZWxlbWVudHNcbiAgICAsIGxpc3RlbmVyID0gVzNDX01PREVMXG4gICAgICAgID8gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFkZCwgY3VzdG9tLCB1c2VDYXB0dXJlKSB7XG4gICAgICAgICAgICAvLyBuZXcgYnJvd3NlcnNcbiAgICAgICAgICAgIGVsZW1lbnRbYWRkID8gYWRkRXZlbnQgOiByZW1vdmVFdmVudF0odHlwZSwgcm9vdExpc3RlbmVyLCB1c2VDYXB0dXJlKVxuICAgICAgICAgIH1cbiAgICAgICAgOiBmdW5jdGlvbiAoZWxlbWVudCwgdHlwZSwgYWRkLCBjdXN0b20gLyosIHVzZUNhcHR1cmUgKi8pIHtcbiAgICAgICAgICAgIC8vIElFOCBhbmQgYmVsb3csIHVzZSBhdHRhY2hFdmVudC9kZXRhY2hFdmVudCBhbmQgd2UgaGF2ZSB0byBwaWdneS1iYWNrIHByb3BlcnR5Y2hhbmdlIGV2ZW50c1xuICAgICAgICAgICAgLy8gdG8gc2ltdWxhdGUgZXZlbnQgYnViYmxpbmcgZXRjLlxuICAgICAgICAgICAgdmFyIGVudHJ5XG4gICAgICAgICAgICBpZiAoYWRkKSB7XG4gICAgICAgICAgICAgIHJlZ2lzdHJ5LnB1dChlbnRyeSA9IG5ldyBSZWdFbnRyeShcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAsIGN1c3RvbSB8fCB0eXBlXG4gICAgICAgICAgICAgICAgLCBmdW5jdGlvbiAoZXZlbnQpIHsgLy8gaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICByb290TGlzdGVuZXIuY2FsbChlbGVtZW50LCBldmVudCwgY3VzdG9tKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICwgcm9vdExpc3RlbmVyXG4gICAgICAgICAgICAgICAgLCBudWxsXG4gICAgICAgICAgICAgICAgLCBudWxsXG4gICAgICAgICAgICAgICAgLCB0cnVlIC8vIGlzIHJvb3RcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgaWYgKGN1c3RvbSAmJiBlbGVtZW50Wydfb24nICsgY3VzdG9tXSA9PSBudWxsKSBlbGVtZW50Wydfb24nICsgY3VzdG9tXSA9IDBcbiAgICAgICAgICAgICAgZW50cnkudGFyZ2V0LmF0dGFjaEV2ZW50KCdvbicgKyBlbnRyeS5ldmVudFR5cGUsIGVudHJ5LmhhbmRsZXIpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbnRyeSA9IHJlZ2lzdHJ5LmdldChlbGVtZW50LCBjdXN0b20gfHwgdHlwZSwgcm9vdExpc3RlbmVyLCB0cnVlKVswXVxuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBlbnRyeS50YXJnZXQuZGV0YWNoRXZlbnQoJ29uJyArIGVudHJ5LmV2ZW50VHlwZSwgZW50cnkuaGFuZGxlcilcbiAgICAgICAgICAgICAgICByZWdpc3RyeS5kZWwoZW50cnkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAsIG9uY2UgPSBmdW5jdGlvbiAocm0sIGVsZW1lbnQsIHR5cGUsIGZuLCBvcmlnaW5hbEZuKSB7XG4gICAgICAgIC8vIHdyYXAgdGhlIGhhbmRsZXIgaW4gYSBoYW5kbGVyIHRoYXQgZG9lcyBhIHJlbW92ZSBhcyB3ZWxsXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICAgICAgICAgIHJtKGVsZW1lbnQsIHR5cGUsIG9yaWdpbmFsRm4pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICwgcmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3JnVHlwZSwgaGFuZGxlciwgbmFtZXNwYWNlcywgdXNlQ2FwdHVyZSkge1xuICAgICAgICB2YXIgdHlwZSAgICAgPSBvcmdUeXBlICYmIG9yZ1R5cGUucmVwbGFjZShuYW1lUmVnZXgsICcnKVxuICAgICAgICAgICwgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZWxlbWVudCwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCByZW1vdmVkICA9IHt9XG4gICAgICAgICAgLCBpLCBsXG5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIGlmICgoIWhhbmRsZXIgfHwgaGFuZGxlcnNbaV0ub3JpZ2luYWwgPT09IGhhbmRsZXIpICYmIGhhbmRsZXJzW2ldLmluTmFtZXNwYWNlcyhuYW1lc3BhY2VzKSkge1xuICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBwcm9ibGVtYXRpYywgd2UgaGF2ZSBhIHJlZ2lzdHJ5LmdldCgpIGFuZCByZWdpc3RyeS5kZWwoKSB0aGF0XG4gICAgICAgICAgICAvLyBib3RoIGRvIHJlZ2lzdHJ5IHNlYXJjaGVzIHNvIHdlIHdhc3RlIGN5Y2xlcyBkb2luZyB0aGlzLiBOZWVkcyB0byBiZSByb2xsZWQgaW50b1xuICAgICAgICAgICAgLy8gYSBzaW5nbGUgcmVnaXN0cnkuZm9yQWxsKGZuKSB0aGF0IHJlbW92ZXMgd2hpbGUgZmluZGluZywgYnV0IHRoZSBjYXRjaCBpcyB0aGF0XG4gICAgICAgICAgICAvLyB3ZSdsbCBiZSBzcGxpY2luZyB0aGUgYXJyYXlzIHRoYXQgd2UncmUgaXRlcmF0aW5nIG92ZXIuIE5lZWRzIGV4dHJhIHRlc3RzIHRvXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgc2NyZXcgaXQgdXAuIEBydmFnZ1xuICAgICAgICAgICAgcmVnaXN0cnkuZGVsKGhhbmRsZXJzW2ldKVxuICAgICAgICAgICAgaWYgKCFyZW1vdmVkW2hhbmRsZXJzW2ldLmV2ZW50VHlwZV0gJiYgaGFuZGxlcnNbaV1bZXZlbnRTdXBwb3J0XSlcbiAgICAgICAgICAgICAgcmVtb3ZlZFtoYW5kbGVyc1tpXS5ldmVudFR5cGVdID0geyB0OiBoYW5kbGVyc1tpXS5ldmVudFR5cGUsIGM6IGhhbmRsZXJzW2ldLnR5cGUgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBlYWNoIHR5cGUvZWxlbWVudCBmb3IgcmVtb3ZlZCBsaXN0ZW5lcnMgYW5kIHJlbW92ZSB0aGUgcm9vdExpc3RlbmVyIHdoZXJlIGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZFxuICAgICAgICBmb3IgKGkgaW4gcmVtb3ZlZCkge1xuICAgICAgICAgIGlmICghcmVnaXN0cnkuaGFzKGVsZW1lbnQsIHJlbW92ZWRbaV0udCwgbnVsbCwgZmFsc2UpKSB7XG4gICAgICAgICAgICAvLyBsYXN0IGxpc3RlbmVyIG9mIHRoaXMgdHlwZSwgcmVtb3ZlIHRoZSByb290TGlzdGVuZXJcbiAgICAgICAgICAgIGxpc3RlbmVyKGVsZW1lbnQsIHJlbW92ZWRbaV0udCwgZmFsc2UsIHJlbW92ZWRbaV0uYywgdXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHVwIGEgZGVsZWdhdGUgaGVscGVyIHVzaW5nIHRoZSBnaXZlbiBzZWxlY3Rvciwgd3JhcCB0aGUgaGFuZGxlciBmdW5jdGlvblxuICAgICwgZGVsZWdhdGUgPSBmdW5jdGlvbiAoc2VsZWN0b3IsIGZuKSB7XG4gICAgICAgIC8vVE9ETzogZmluZFRhcmdldCAodGhlcmVmb3JlICQpIGlzIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgbWF0Y2ggYW5kIG9uY2UgZm9yXG4gICAgICAgIC8vIHNldHRpbmcgZS5jdXJyZW50VGFyZ2V0LCBmaXggdGhpcyBzbyBpdCdzIG9ubHkgbmVlZGVkIG9uY2VcbiAgICAgICAgdmFyIGZpbmRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCByb290KSB7XG4gICAgICAgICAgICAgIHZhciBpLCBhcnJheSA9IGlzU3RyaW5nKHNlbGVjdG9yKSA/IHNlbGVjdG9yRW5naW5lKHNlbGVjdG9yLCByb290KSA6IHNlbGVjdG9yXG4gICAgICAgICAgICAgIGZvciAoOyB0YXJnZXQgJiYgdGFyZ2V0ICE9PSByb290OyB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGFycmF5Lmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSB0YXJnZXQpIHJldHVybiB0YXJnZXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAsIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBmaW5kVGFyZ2V0KGUudGFyZ2V0LCB0aGlzKVxuICAgICAgICAgICAgICBpZiAobWF0Y2gpIGZuLmFwcGx5KG1hdGNoLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgLy8gX19iZWFuRGVsIGlzbid0IHBsZWFzYW50IGJ1dCBpdCdzIGEgcHJpdmF0ZSBmdW5jdGlvbiwgbm90IGV4cG9zZWQgb3V0c2lkZSBvZiBCZWFuXG4gICAgICAgIGhhbmRsZXIuX19iZWFuRGVsID0ge1xuICAgICAgICAgICAgZnQgICAgICAgOiBmaW5kVGFyZ2V0IC8vIGF0dGFjaCBpdCBoZXJlIGZvciBjdXN0b21FdmVudHMgdG8gdXNlIHRvb1xuICAgICAgICAgICwgc2VsZWN0b3IgOiBzZWxlY3RvclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgICB9XG5cbiAgICAsIGZpcmVMaXN0ZW5lciA9IFczQ19NT0RFTCA/IGZ1bmN0aW9uIChpc05hdGl2ZSwgdHlwZSwgZWxlbWVudCkge1xuICAgICAgICAvLyBtb2Rlcm4gYnJvd3NlcnMsIGRvIGEgcHJvcGVyIGRpc3BhdGNoRXZlbnQoKVxuICAgICAgICB2YXIgZXZ0ID0gZG9jLmNyZWF0ZUV2ZW50KGlzTmF0aXZlID8gJ0hUTUxFdmVudHMnIDogJ1VJRXZlbnRzJylcbiAgICAgICAgZXZ0W2lzTmF0aXZlID8gJ2luaXRFdmVudCcgOiAnaW5pdFVJRXZlbnQnXSh0eXBlLCB0cnVlLCB0cnVlLCB3aW4sIDEpXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpXG4gICAgICB9IDogZnVuY3Rpb24gKGlzTmF0aXZlLCB0eXBlLCBlbGVtZW50KSB7XG4gICAgICAgIC8vIG9sZCBicm93c2VyIHVzZSBvbnByb3BlcnR5Y2hhbmdlLCBqdXN0IGluY3JlbWVudCBhIGN1c3RvbSBwcm9wZXJ0eSB0byB0cmlnZ2VyIHRoZSBldmVudFxuICAgICAgICBlbGVtZW50ID0gdGFyZ2V0RWxlbWVudChlbGVtZW50LCBpc05hdGl2ZSlcbiAgICAgICAgaXNOYXRpdmUgPyBlbGVtZW50LmZpcmVFdmVudCgnb24nICsgdHlwZSwgZG9jLmNyZWF0ZUV2ZW50T2JqZWN0KCkpIDogZWxlbWVudFsnX29uJyArIHR5cGVdKytcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogUHVibGljIEFQSTogb2ZmKCksIG9uKCksIGFkZCgpLCAocmVtb3ZlKCkpLCBvbmUoKSwgZmlyZSgpLCBjbG9uZSgpXG4gICAgICAgICovXG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9mZihlbGVtZW50WywgZXZlbnRUeXBlKHMpWywgaGFuZGxlciBdLCBvcHRpb25zXSlcbiAgICAgICAgKi9cbiAgICAsIG9mZiA9IGZ1bmN0aW9uIChlbGVtZW50LCB0eXBlU3BlYywgZm4pIHtcbiAgICAgICAgdmFyIGlzVHlwZVN0ciA9IGlzU3RyaW5nKHR5cGVTcGVjKSxcbiAgICAgICAgICBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgICAgIHVzZUNhcHR1cmU6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgICwgb3B0cyA9IGJ1aWxkT3B0aW9ucyhkZWZhdWx0T3B0cywgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXSlcbiAgICAgICAgICAsIGssIHR5cGUsIG5hbWVzcGFjZXMsIGlcblxuICAgICAgICBpZiAoaXNUeXBlU3RyICYmIHR5cGVTcGVjLmluZGV4T2YoJyAnKSA+IDApIHtcbiAgICAgICAgICAvLyBvZmYoZWwsICd0MSB0MiB0MycsIGZuKSBvciBvZmYoZWwsICd0MSB0MiB0MycpXG4gICAgICAgICAgdHlwZVNwZWMgPSBzdHIyYXJyKHR5cGVTcGVjKVxuICAgICAgICAgIGZvciAoaSA9IHR5cGVTcGVjLmxlbmd0aDsgaS0tOylcbiAgICAgICAgICAgIG9mZihlbGVtZW50LCB0eXBlU3BlY1tpXSwgZm4pXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgPSBpc1R5cGVTdHIgJiYgdHlwZVNwZWMucmVwbGFjZShuYW1lUmVnZXgsICcnKVxuICAgICAgICBpZiAodHlwZSAmJiBjdXN0b21FdmVudHNbdHlwZV0pIHR5cGUgPSBjdXN0b21FdmVudHNbdHlwZV0uYmFzZVxuXG4gICAgICAgIGlmICghdHlwZVNwZWMgfHwgaXNUeXBlU3RyKSB7XG4gICAgICAgICAgLy8gb2ZmKGVsKSBvciBvZmYoZWwsIHQxLm5zKSBvciBvZmYoZWwsIC5ucykgb3Igb2ZmKGVsLCAubnMxLm5zMi5uczMpXG4gICAgICAgICAgaWYgKG5hbWVzcGFjZXMgPSBpc1R5cGVTdHIgJiYgdHlwZVNwZWMucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKSBuYW1lc3BhY2VzID0gc3RyMmFycihuYW1lc3BhY2VzLCAnLicpXG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgdHlwZSwgZm4sIG5hbWVzcGFjZXMsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHR5cGVTcGVjKSkge1xuICAgICAgICAgIC8vIG9mZihlbCwgZm4pXG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoZWxlbWVudCwgbnVsbCwgdHlwZVNwZWMsIG51bGwsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBvZmYoZWwsIHsgdDE6IGZuMSwgdDIsIGZuMiB9KVxuICAgICAgICAgIGZvciAoayBpbiB0eXBlU3BlYykge1xuICAgICAgICAgICAgaWYgKHR5cGVTcGVjLmhhc093blByb3BlcnR5KGspKSBvZmYoZWxlbWVudCwgaywgdHlwZVNwZWNba10pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogb24oZWxlbWVudCwgZXZlbnRUeXBlKHMpWywgc2VsZWN0b3JdLCBoYW5kbGVyWywgYXJncyBdLCBbb3B0aW9uc10pXG4gICAgICAgICovXG4gICAgLCBvbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50cywgc2VsZWN0b3IsIGZuKSB7XG4gICAgICAgIHZhciBkZWZhdWx0T3B0cyA9IHtcbiAgICAgICAgICAgIHVzZUNhcHR1cmU6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbEZuLCB0eXBlLCB0eXBlcywgaSwgYXJncywgZW50cnksIGZpcnN0LCBvcHRzXG5cbiAgICAgICAgLy9UT0RPOiB0aGUgdW5kZWZpbmVkIGNoZWNrIG1lYW5zIHlvdSBjYW4ndCBwYXNzIGFuICdhcmdzJyBhcmd1bWVudCwgZml4IHRoaXMgcGVyaGFwcz9cbiAgICAgICAgaWYgKHNlbGVjdG9yID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGV2ZW50cyA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIC8vVE9ETzogdGhpcyBjYW4ndCBoYW5kbGUgZGVsZWdhdGVkIGV2ZW50c1xuICAgICAgICAgIGZvciAodHlwZSBpbiBldmVudHMpIHtcbiAgICAgICAgICAgIGlmIChldmVudHMuaGFzT3duUHJvcGVydHkodHlwZSkpIHtcbiAgICAgICAgICAgICAgb24uY2FsbCh0aGlzLCBlbGVtZW50LCB0eXBlLCBldmVudHNbdHlwZV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Z1bmN0aW9uKHNlbGVjdG9yKSkge1xuICAgICAgICAgIC8vIGRlbGVnYXRlZCBldmVudFxuICAgICAgICAgIG9yaWdpbmFsRm4gPSBmblxuICAgICAgICAgIGFyZ3MgICAgICAgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgNClcbiAgICAgICAgICBmbiAgICAgICAgID0gZGVsZWdhdGUoc2VsZWN0b3IsIG9yaWdpbmFsRm4sIHNlbGVjdG9yRW5naW5lKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFyZ3MgICAgICAgPSBzbGljZS5jYWxsKGFyZ3VtZW50cywgMylcbiAgICAgICAgICBmbiAgICAgICAgID0gb3JpZ2luYWxGbiA9IHNlbGVjdG9yXG4gICAgICAgIH1cblxuICAgICAgICBvcHRzID0gYnVpbGRPcHRpb25zKGRlZmF1bHRPcHRzLCBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pXG4gICAgICAgIHR5cGVzID0gc3RyMmFycihldmVudHMpXG5cbiAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBvbmUoKSwgd3JhcCBpbiBhIHNlbGYtcmVtb3ZpbmcgaGFuZGxlclxuICAgICAgICBpZiAodGhpcyA9PT0gT05FKSB7XG4gICAgICAgICAgZm4gPSBvbmNlKG9mZiwgZWxlbWVudCwgZXZlbnRzLCBmbiwgb3JpZ2luYWxGbilcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IHR5cGVzLmxlbmd0aDsgaS0tOykge1xuICAgICAgICAgIC8vIGFkZCBuZXcgaGFuZGxlciB0byB0aGUgcmVnaXN0cnkgYW5kIGNoZWNrIGlmIGl0J3MgdGhlIGZpcnN0IGZvciB0aGlzIGVsZW1lbnQvdHlwZVxuICAgICAgICAgIGZpcnN0ID0gcmVnaXN0cnkucHV0KGVudHJ5ID0gbmV3IFJlZ0VudHJ5KFxuICAgICAgICAgICAgICBlbGVtZW50XG4gICAgICAgICAgICAsIHR5cGVzW2ldLnJlcGxhY2UobmFtZVJlZ2V4LCAnJykgLy8gZXZlbnQgdHlwZVxuICAgICAgICAgICAgLCBmblxuICAgICAgICAgICAgLCBvcmlnaW5hbEZuXG4gICAgICAgICAgICAsIHN0cjJhcnIodHlwZXNbaV0ucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpLCAnLicpIC8vIG5hbWVzcGFjZXNcbiAgICAgICAgICAgICwgYXJnc1xuICAgICAgICAgICAgLCBmYWxzZSAvLyBub3Qgcm9vdFxuICAgICAgICAgICkpXG4gICAgICAgICAgaWYgKGVudHJ5W2V2ZW50U3VwcG9ydF0gJiYgZmlyc3QpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IGV2ZW50IG9mIHRoaXMgdHlwZSBvbiB0aGlzIGVsZW1lbnQsIGFkZCByb290IGxpc3RlbmVyXG4gICAgICAgICAgICBsaXN0ZW5lcihlbGVtZW50LCBlbnRyeS5ldmVudFR5cGUsIHRydWUsIGVudHJ5LmN1c3RvbVR5cGUsIG9wdHMudXNlQ2FwdHVyZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBhZGQoZWxlbWVudFssIHNlbGVjdG9yXSwgZXZlbnRUeXBlKHMpLCBoYW5kbGVyWywgYXJncyBdKVxuICAgICAgICAqXG4gICAgICAgICogRGVwcmVjYXRlZDoga2VwdCAoZm9yIG5vdykgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHlcbiAgICAgICAgKi9cbiAgICAsIGFkZCA9IGZ1bmN0aW9uIChlbGVtZW50LCBldmVudHMsIGZuLCBkZWxmbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gb24uYXBwbHkoXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICAgLCAhaXNTdHJpbmcoZm4pXG4gICAgICAgICAgICAgID8gc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gICAgICAgICAgICAgIDogWyBlbGVtZW50LCBmbiwgZXZlbnRzLCBkZWxmbiBdLmNvbmNhdChhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCA0KSA6IFtdKVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICAqIG9uZShlbGVtZW50LCBldmVudFR5cGUocylbLCBzZWxlY3Rvcl0sIGhhbmRsZXJbLCBhcmdzIF0pXG4gICAgICAgICovXG4gICAgLCBvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvbi5hcHBseShPTkUsIGFyZ3VtZW50cylcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgICogZmlyZShlbGVtZW50LCBldmVudFR5cGUocylbLCBhcmdzIF0pXG4gICAgICAgICpcbiAgICAgICAgKiBUaGUgb3B0aW9uYWwgJ2FyZ3MnIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXksIGlmIG5vICdhcmdzJyBhcmd1bWVudCBpcyBwcm92aWRlZFxuICAgICAgICAqIHRoZW4gd2UgY2FuIHVzZSB0aGUgYnJvd3NlcidzIERPTSBldmVudCBzeXN0ZW0sIG90aGVyd2lzZSB3ZSB0cmlnZ2VyIGhhbmRsZXJzIG1hbnVhbGx5XG4gICAgICAgICovXG4gICAgLCBmaXJlID0gZnVuY3Rpb24gKGVsZW1lbnQsIHR5cGUsIGFyZ3MpIHtcbiAgICAgICAgdmFyIHR5cGVzID0gc3RyMmFycih0eXBlKVxuICAgICAgICAgICwgaSwgaiwgbCwgbmFtZXMsIGhhbmRsZXJzXG5cbiAgICAgICAgZm9yIChpID0gdHlwZXMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgdHlwZSA9IHR5cGVzW2ldLnJlcGxhY2UobmFtZVJlZ2V4LCAnJylcbiAgICAgICAgICBpZiAobmFtZXMgPSB0eXBlc1tpXS5yZXBsYWNlKG5hbWVzcGFjZVJlZ2V4LCAnJykpIG5hbWVzID0gc3RyMmFycihuYW1lcywgJy4nKVxuICAgICAgICAgIGlmICghbmFtZXMgJiYgIWFyZ3MgJiYgZWxlbWVudFtldmVudFN1cHBvcnRdKSB7XG4gICAgICAgICAgICBmaXJlTGlzdGVuZXIobmF0aXZlRXZlbnRzW3R5cGVdLCB0eXBlLCBlbGVtZW50KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBub24tbmF0aXZlIGV2ZW50LCBlaXRoZXIgYmVjYXVzZSBvZiBhIG5hbWVzcGFjZSwgYXJndW1lbnRzIG9yIGEgbm9uIERPTSBlbGVtZW50XG4gICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIGxpc3RlbmVycyBhbmQgbWFudWFsbHkgJ2ZpcmUnXG4gICAgICAgICAgICBoYW5kbGVycyA9IHJlZ2lzdHJ5LmdldChlbGVtZW50LCB0eXBlLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAgIGFyZ3MgPSBbZmFsc2VdLmNvbmNhdChhcmdzKVxuICAgICAgICAgICAgZm9yIChqID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aDsgaiA8IGw7IGorKykge1xuICAgICAgICAgICAgICBpZiAoaGFuZGxlcnNbal0uaW5OYW1lc3BhY2VzKG5hbWVzKSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzW2pdLmhhbmRsZXIuYXBwbHkoZWxlbWVudCwgYXJncylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudFxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAgKiBjbG9uZShkc3RFbGVtZW50LCBzcmNFbGVtZW50WywgZXZlbnRUeXBlIF0pXG4gICAgICAgICpcbiAgICAgICAgKiBUT0RPOiBwZXJoYXBzIGZvciBjb25zaXN0ZW5jeSB3ZSBzaG91bGQgYWxsb3cgdGhlIHNhbWUgZmxleGliaWxpdHkgaW4gdHlwZSBzcGVjaWZpZXJzP1xuICAgICAgICAqL1xuICAgICwgY2xvbmUgPSBmdW5jdGlvbiAoZWxlbWVudCwgZnJvbSwgdHlwZSkge1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSByZWdpc3RyeS5nZXQoZnJvbSwgdHlwZSwgbnVsbCwgZmFsc2UpXG4gICAgICAgICAgLCBsID0gaGFuZGxlcnMubGVuZ3RoXG4gICAgICAgICAgLCBpID0gMFxuICAgICAgICAgICwgYXJncywgYmVhbkRlbFxuXG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXJzW2ldLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICBhcmdzID0gWyBlbGVtZW50LCBoYW5kbGVyc1tpXS50eXBlIF1cbiAgICAgICAgICAgIGlmIChiZWFuRGVsID0gaGFuZGxlcnNbaV0uaGFuZGxlci5fX2JlYW5EZWwpIGFyZ3MucHVzaChiZWFuRGVsLnNlbGVjdG9yKVxuICAgICAgICAgICAgYXJncy5wdXNoKGhhbmRsZXJzW2ldLm9yaWdpbmFsKVxuICAgICAgICAgICAgb24uYXBwbHkobnVsbCwgYXJncylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcbiAgICAgIH1cblxuICAgICwgYmVhbiA9IHtcbiAgICAgICAgICAnb24nICAgICAgICAgICAgICAgIDogb25cbiAgICAgICAgLCAnYWRkJyAgICAgICAgICAgICAgIDogYWRkXG4gICAgICAgICwgJ29uZScgICAgICAgICAgICAgICA6IG9uZVxuICAgICAgICAsICdvZmYnICAgICAgICAgICAgICAgOiBvZmZcbiAgICAgICAgLCAncmVtb3ZlJyAgICAgICAgICAgIDogb2ZmXG4gICAgICAgICwgJ2Nsb25lJyAgICAgICAgICAgICA6IGNsb25lXG4gICAgICAgICwgJ2ZpcmUnICAgICAgICAgICAgICA6IGZpcmVcbiAgICAgICAgLCAnRXZlbnQnICAgICAgICAgICAgIDogRXZlbnRcbiAgICAgICAgLCAnc2V0U2VsZWN0b3JFbmdpbmUnIDogc2V0U2VsZWN0b3JFbmdpbmVcbiAgICAgICAgLCAnbm9Db25mbGljdCcgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29udGV4dFtuYW1lXSA9IG9sZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgLy8gZm9yIElFLCBjbGVhbiB1cCBvbiB1bmxvYWQgdG8gYXZvaWQgbGVha3NcbiAgaWYgKHdpbi5hdHRhY2hFdmVudCkge1xuICAgIHZhciBjbGVhbnVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGksIGVudHJpZXMgPSByZWdpc3RyeS5lbnRyaWVzKClcbiAgICAgIGZvciAoaSBpbiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyaWVzW2ldLnR5cGUgJiYgZW50cmllc1tpXS50eXBlICE9PSAndW5sb2FkJykgb2ZmKGVudHJpZXNbaV0uZWxlbWVudCwgZW50cmllc1tpXS50eXBlKVxuICAgICAgfVxuICAgICAgd2luLmRldGFjaEV2ZW50KCdvbnVubG9hZCcsIGNsZWFudXApXG4gICAgICB3aW4uQ29sbGVjdEdhcmJhZ2UgJiYgd2luLkNvbGxlY3RHYXJiYWdlKClcbiAgICB9XG4gICAgd2luLmF0dGFjaEV2ZW50KCdvbnVubG9hZCcsIGNsZWFudXApXG4gIH1cblxuICAvLyBpbml0aWFsaXplIHNlbGVjdG9yIGVuZ2luZSB0byBpbnRlcm5hbCBkZWZhdWx0IChxU0Egb3IgdGhyb3cgRXJyb3IpXG4gIHNldFNlbGVjdG9yRW5naW5lKClcblxuICByZXR1cm4gYmVhblxufSk7XG4iLCJyZXF1aXJlKCAnLi9saWIvc2hpbXMvY3VzdG9tLWV2ZW50JyApXG5cbnZhciBiZWFuID0gcmVxdWlyZSggJ2JlYW4nICksXG4gICAga2V5ICA9IHJlcXVpcmUoICdrZXltYXN0ZXInICksXG4gICAgYW5pbWF0aW9uRXZlbnQgICAgPSByZXF1aXJlKCAnLi9saWIvYW5pbWF0aW9uLWV2ZW50cycgKSxcbiAgICBhZnRlckFuaW1hdGlvbiAgICA9IHJlcXVpcmUoICcuL2xpYi9hZnRlci1hbmltYXRpb24nICksXG4gICAgcGFnZSAgICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvcGFnZScgKSxcbiAgICB0YXAgICAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi90YXAtZXZlbnRzJyApLFxuICAgIGRlYm91bmNlICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RlYm91bmNlJyApLFxuICAgIHRocm90dGxlICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3Rocm90dGxlJyApLFxuICAgIGRlbGF5ICAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL2RlbGF5JyApLFxuICAgIHJlcGVhdCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3JlcGVhdCcgKSxcbiAgICBidWJibGVGb3JtRXZlbnRzICA9IHJlcXVpcmUoICcuL2xpYi9idWJibGUtZm9ybS1ldmVudHMnICksXG4gICAgc3VibWl0ICAgICAgICAgICAgPSByZXF1aXJlKCAnLi9saWIvc3VibWl0JyApLFxuICAgIHNjcm9sbCAgICAgICAgICAgID0gcmVxdWlyZSggJy4vbGliL3Njcm9sbCcgKSxcbiAgICByZXNpemUgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9yZXNpemUnICksXG4gICAgY2FsbGJhY2tNYW5hZ2VyICAgPSByZXF1aXJlKCAnLi9saWIvY2FsbGJhY2stbWFuYWdlcicgKSxcbiAgICBtZWRpYSAgICAgICAgICAgICA9IHJlcXVpcmUoICcuL2xpYi9tZWRpYScgKSxcblxuICAgIHNsaWNlICAgICAgICAgICAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLFxuICAgIGZvcm1CdWJibGluZyAgICAgID0gZmFsc2UsXG4gICAgd2F0Y2hBbmltYXRpb24gICAgPSB0cnVlXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gIC8vIERPTSBldmVudHNcbiAgb246IG9uLFxuICBvZmY6IG9mZixcbiAgb25lOiBvbmUsXG4gIGZpcmU6IGZpcmUsXG4gIGNsb25lOiBiZWFuLmNsb25lLFxuICByZWFkeTogcGFnZS5yZWFkeSxcbiAgY2hhbmdlOiBwYWdlLmNoYW5nZSxcbiAgYWZ0ZXJBbmltYXRpb246IGFmdGVyQW5pbWF0aW9uLFxuICB3YXRjaEFuaW1hdGlvbjogd2F0Y2hBbmltYXRpb24sXG5cbiAgLy8gTWVkaWEgcXVlcnkgZXZlbnRzXG4gIG1lZGlhOiBtZWRpYSxcblxuICAvLyBLZXlib2FyZCBldmVudHNcbiAga2V5OiBrZXksXG4gIGtleU9uOiBrZXksXG4gIGtleU9mZjoga2V5LnVuYmluZCxcbiAga2V5T25lOiBrZXlPbmUsXG5cbiAgLy8gVGltaW5nIHV0aWxpdGllc1xuICBkZWJvdW5jZTogZGVib3VuY2UsXG4gIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgZGVsYXk6ICAgIGRlbGF5LFxuICByZXBlYXQ6ICAgcmVwZWF0LFxuXG4gIC8vIE9wdGltaXplZCBFdmVudCBNYW5hZ2Vyc1xuICBzY3JvbGw6ICAgICAgc2Nyb2xsLFxuICByZXNpemU6ICAgICAgcmVzaXplLFxuXG4gIGNhbGxiYWNrTWFuYWdlcjogY2FsbGJhY2tNYW5hZ2VyLFxuICBjYWxsYmFjazogY2FsbGJhY2tNYW5hZ2VyLmNhbGxiYWNrLFxuXG4gIC8vIEJ1YmJsaW5nIGZpeFxuICBidWJibGVGb3JtRXZlbnRzOiBidWJibGVGb3JtRXZlbnRzLFxuXG4gIHN1Ym1pdDogc3VibWl0XG59XG5cbnBhZ2UucmVhZHkoIGZ1bmN0aW9uKCkge1xuICBpZiAoIHdhdGNoQW5pbWF0aW9uICkgYWZ0ZXJBbmltYXRpb24ud2F0Y2goKVxufSlcblxuLy8gQmVhbiBkb2Vzbid0IGFjY291bnQgZm9yIGNyb3NzLWJyb3dzZXIgc3VwcG9ydCBvbiBhbmltYXRpb24gZXZlbnRzXG4vLyBTbyByYXRoZXIgdGhhbiBwYXNzIHRocm91Z2ggZXZlbnRzIHRvIGJlYW4sIHdlIHByb2Nlc3MgdGhlbSB0byBhZGRcbi8vIHZlbmRvciBwcmVmaXhlcyBvciByZW1vdmUgZXZlbnRzIGlmIGJyb3dzZXJzIGRvIG5vdCBzdXBwb3IgdGhlbVxuLy9cbmZ1bmN0aW9uIG9uICgpIHtcbiAgc2V0RXZlbnQoICdvbicsIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIClcbn1cblxuZnVuY3Rpb24gb2ZmICgpIHtcbiAgc2V0RXZlbnQoICdvZmYnLCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG59XG5cbmZ1bmN0aW9uIG9uZSAoKSB7XG4gIHNldEV2ZW50KCAnb25lJywgc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKVxufVxuXG5mdW5jdGlvbiBmaXJlICgpIHtcblxuICBhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzIClcbiAgdmFyIGVsID0gYXJnc1swXVxuICB2YXIgZXZlbnRzID0gW11cblxuICBhcmdzWzFdLnNwbGl0KCcgJykuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50ICkge1xuXG4gICAgdmFyIGV2ZW50ID0gYW5pbWF0aW9uRXZlbnQudHJhbnNmb3JtKCBldmVudCApXG4gICAgaWYgKCAhaXNFbXB0eSggZXZlbnQgKSApIGV2ZW50cy5wdXNoKCBldmVudCApXG5cbiAgfSlcblxuICBpZiAoICFpc0VtcHR5KCBldmVudHMgKSApIHtcblxuICAgIGFyZ3NbMV0gPSBldmVudHMuam9pbiggJyAnIClcbiAgICBiZWFuLmZpcmUuYXBwbHkoIHRoaXMsIGFyZ3MgKVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RXZlbnQoIHJlZ2lzdGVyVHlwZSwgYXJncyApIHtcbiAgdHJhbnNmb3JtQXJncyggYXJncyApLmZvckVhY2goIGZ1bmN0aW9uKCBhcmcgKSB7XG4gICAgYmVhblsgcmVnaXN0ZXJUeXBlIF0uYXBwbHkoIG51bGwsIGFyZyApXG4gIH0pXG5cbn1cblxuLy8gQWRkIHN1cHBvcnQgZm9yIHVuYmluZGluZyBhIGtleSBldmVudCBhZnRlciBpdCBpcyBjYWxsZWRcbi8vXG5mdW5jdGlvbiBrZXlPbmUgKCBrZXlzLCBzY29wZSwgZm4gKSB7XG5cbiAgaWYgKCB0eXBlb2Ygc2NvcGUgPT0gJ2Z1bmN0aW9uJyApIHtcbiAgICBmbiA9IHNjb3BlXG4gICAgc2NvcGUgPSAnYWxsJ1xuICB9XG5cbiAga2V5KCBrZXlzLCBzY29wZSwgZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIGtleS51bmJpbmQoIGtleXMsIHNjb3BlIClcbiAgICBmbiggZXZlbnQgKVxuICB9KVxufVxuXG4vLyBUcmFuc2Zvcm0gZXZlbnQgYXJndW1lbnRzIHRvIGhhbmRsZSB0YXAgZXZlbnQgYW5kIGNyb3NzLWJyb3dzZXIgYW5pbWF0aW9uIGV2ZW50c1xuLy8gUmV0dXJucyBhbiBhcnJheSBvZiBldmVudHMgdG8gYmUgcmVnaXN0ZXJlZCBpbmRpdmlkdWFsbHlcbi8vXG5mdW5jdGlvbiB0cmFuc2Zvcm1BcmdzKCBhcmdzICkge1xuXG4gIHZhciB0cmFuc2Zvcm1lZEFyZ3MgPSBbXVxuICB2YXIgbmV3RXZlbnRzID0ge31cbiAgdmFyIGVsZW1lbnQgPSBhcmdzLnNoaWZ0KCkgLy8gcmV0cmlldmUgZWxlbWVudFxuICB2YXIgZXZlbnRzID0gYXJncy5zaGlmdCgpXG5cbiAgLy8gZGV0ZWN0IGV2ZW50IGRlbGVnYXRlIHNlbGVjdG9yXG4gIGlmICggdHlwZW9mIGFyZ3NbMF0gIT0gJ2Z1bmN0aW9uJyApIHtcbiAgICB2YXIgZGVsZWdhdGUgPSBhcmdzLnNoaWZ0KClcbiAgfVxuXG4gIC8vIGNvbnZlcnQgZXZlbnQgc3RyaW5ncyB0byBvYmplY3QgYmFzZWQgZXZlbnRzIGZvciBjb2RlIHNpbXBsaWZpY2F0aW9uXG4gIC8vIGV4YW1wbGU6IGFyZ3VtZW50cyAoJ2hvdmVyIGZvY3VzJywgZnVuY3Rpb24pIHdvdWxkIGJlY29tZSAoeyAnaG92ZXIgZm9jdXMnOiBmdW5jdGlvbiB9KVxuICBpZiAoIHR5cGVvZiBldmVudHMgPT0gJ3N0cmluZycgKSB7XG4gICAgdmFyIG9iakV2ZW50cyA9IHt9XG4gICAgb2JqRXZlbnRzW2V2ZW50c10gPSBhcmdzLnNoaWZ0KClcbiAgICBldmVudHMgPSBvYmpFdmVudHNcbiAgfVxuXG4gIC8vIFdhbGsgdGhyb3VnaCBlYWNoIGtleSBpbiB0aGUgZXZlbnRzIG9iamVjdCBhbmQgYWRkIHZlbmRvciBwcmVmaXhlcyB0byAnYW5pbWF0aW9uJyBldmVudHNcbiAgLy8gYW5kIHdyYXAgY2FsbGJhY2sgaW4gdGhlIHRhcCBmdW5jdGlvbiBmb3IgYWxsICd0YXAnIGV2ZW50cy5cbiAgLy9cblxuICBPYmplY3Qua2V5cyggZXZlbnRzICkuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50ICkge1xuICAgIHZhciBjYWxsYmFjayA9IGV2ZW50c1tldmVudF1cblxuICAgIC8vIEV2ZW50cyBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBzcGFjZSBzZXBhcmF0ZWQgZ3JvdXBzIGxpa2UgXCJob3ZlciBmb2N1c1wiXG4gICAgLy8gVGhpcyBoYW5kbGVzIGVhY2ggZXZlbnQgaW5kZXBlbmRhbnRseVxuICAgIC8vXG4gICAgZXZlbnQuc3BsaXQoJyAnKS5mb3JFYWNoKCBmdW5jdGlvbiggZSApe1xuXG4gICAgICAvLyBJZiBpdCBpcyBhbiBhbmltYXRpb24gZXZlbnQsIHZlbmRvciBwcmVmaXggaXQsIG9yIGZpcmUgdGhlIGNhbGxiYWNrIGFjY29yZGluZyB0byBicm93c2VyIHN1cHBvcnRcbiAgICAgIGUgPSBhbmltYXRpb25FdmVudC50cmFuc2Zvcm0oIGUgKVxuXG4gICAgICBpZiAoIGlzRW1wdHkoIGUgKSApIHtcbiAgICAgICAgLy8gSWYgaXQncyBlbXB0eSwgaXQgaGFzIGJlZW4gcmVtb3ZlZCBzaW5jZSBhbmltYXRpb24gZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHRyaWdnZXIgdGhlIGV2ZW50IGltbWVkaWF0ZWx5XG4gICAgICAgIGNhbGxiYWNrKClcblxuICAgICAgfSBlbHNlIGlmICggZS5tYXRjaCggL3RhcC8gKSApIHtcblxuICAgICAgICAvLyBJZiBpdCdzIGEgdGFwIGV2ZW50LCB3cmFwIHRoZSBjYWxsYmFjayBhbmQgc2V0IHRoZSBldmVudCB0byAndG91Y2hzdGFydCdcbiAgICAgICAgLy8gVGFwIGlzbid0IGEgcmVhbCBuYXRpdmUgZXZlbnQsIGJ1dCB0aGlzIHdyYXBwZXIgbGV0cyB1cyBzaW11bGF0ZSB3aGF0IGFcbiAgICAgICAgLy8gbmF0aXZlIHRhcCBldmVudCB3b3VsZCBiZS5cbiAgICAgICAgLy9cbiAgICAgICAgbmV3RXZlbnRzLnRvdWNoc3RhcnQgPSB0YXAoIGNhbGxiYWNrIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0V2ZW50c1sgZSBdID0gY2FsbGJhY2tcbiAgICAgIH1cbiAgICB9KVxuICB9KVxuXG4gIE9iamVjdC5rZXlzKCBuZXdFdmVudHMgKS5mb3JFYWNoKCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgdmFyIGEgPSBbXVxuICAgIGEucHVzaCggZWxlbWVudCwgZXZlbnQgKVxuXG4gICAgaWYgKCBkZWxlZ2F0ZSApIGEucHVzaCggZGVsZWdhdGUgKVxuXG4gICAgYS5wdXNoKCBuZXdFdmVudHNbIGV2ZW50IF0gKVxuICAgIHRyYW5zZm9ybWVkQXJncy5wdXNoKCBhLmNvbmNhdCggYXJncyApIClcbiAgfSlcblxuICByZXR1cm4gdHJhbnNmb3JtZWRBcmdzXG59XG5cblxuZnVuY3Rpb24gaXNFbXB0eSggb2JqICkge1xuXG4gIHZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcblxuICBpZiAoIG9iaiA9PSBudWxsIHx8IG9iai5sZW5ndGggPT09IDAgKSByZXR1cm4gdHJ1ZVxuXG4gIGlmICggMCA8IG9iai5sZW5ndGggKSByZXR1cm4gZmFsc2VcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCBoYXNPd25Qcm9wZXJ0eS5jYWxsKCBvYmosIGtleSApICkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsInZhciBFdmVudCAgICAgPSByZXF1aXJlKCAnYmVhbicgKSxcbiAgICBkZWxheSAgICAgPSByZXF1aXJlKCAnLi9kZWxheScgKSxcbiAgICBzdXBwb3J0ZWQgPSByZXF1aXJlKCAnLi9hbmltYXRpb24tZXZlbnRzJyApLnN1cHBvcnRlZFxuXG5mdW5jdGlvbiBhbmltYXRpb25EdXJhdGlvbiggZWwgKSB7XG4gIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggZWwgKS5nZXRQcm9wZXJ0eVZhbHVlKCAnYW5pbWF0aW9uLWR1cmF0aW9uJyApXG59XG5cbi8vIFdhdGNoZXMgYWxsIGRvY3VtZW50IGFuaW1hdGlvbiBhZGQgYWRkIGRhdGEgYXR0cmlidXRlcyB0byBlbGVtZW50cyB3aGVuIHRoZXkgYmVnaW5cbi8vIFRoaXMgZW5hYmxlcyBhbmltYXRpb25FbmQgdG8gd2F0Y2ggYW5pbWF0aW9ucyB3aGljaCBoYXZlbid0IGJlZ3VuXG5mdW5jdGlvbiB3YXRjaEFuaW1hdGlvbigpIHtcbiAgRXZlbnQub24oIGRvY3VtZW50LCAnYW5pbWF0aW9uc3RhcnQnLCBmdW5jdGlvbiggZXZlbnQgKSB7XG4gICAgZXZlbnQudGFyZ2V0LmRhdGFzZXQuaXNBbmltYXRpbmcgPSB0cnVlXG4gIH0pXG4gIEV2ZW50Lm9uKCBkb2N1bWVudCwgJ2FuaW1hdGlvbmVuZCcsIGZ1bmN0aW9uKCBldmVudCApIHtcbiAgICBldmVudC50YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWlzLWFuaW1hdGluZycpXG4gIH0pXG59XG5cbi8vIFRoaXMgcmVxdWlyZXMgdHJhY2tFbGVtZW50QW5pbWF0aW9uIHRvIGJlIGVuYWJsZWRcbmZ1bmN0aW9uIGFmdGVyQW5pbWF0aW9uKCBlbCwgY2FsbGJhY2ssIHN0YXJ0VGltZW91dCApIHtcbiAgLy8gQW5pbWF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIGp1c3QgdHJpZ2dlciB0aGUgY2FsbGJhY2tcbiAgaWYgKCAhc3VwcG9ydGVkICkgcmV0dXJuIGNhbGxiYWNrKClcblxuICAvLyBBbmltYXRpb24gaGFzIGFscmVhZHkgYmVndW5cbiAgaWYgKCBlbC5kYXRhc2V0LmlzQW5pbWF0aW5nIHx8IGVsLnF1ZXJ5U2VsZWN0b3IoICdbZGF0YS1pcy1hbmltYXRpbmddJyApICkge1xuXG4gICAgLy8gV2F0Y2ggZm9yIGVuZFxuICAgIEV2ZW50Lm9uZSggZWwsICdhbmltYXRpb25lbmQnLCBjYWxsYmFjayApXG5cbiAgLy8gQW5pbWF0aW9uIGhhcyBub3QgeWV0IGJlZ3VuIHNv4oCmXG4gIH0gZWxzZSB7XG5cbiAgICAvLyBzdGFydFRpbWVvdXQgaXMgbWVhbnQgdG8gZW5zdXJlIHRoYXQgYSBjYWxsYmFjayBpcyBmaXJlZCBldmVuIGlmIFxuICAgIC8vIGFuIGFuaW1hdGlvbiBldmVudCwgb3IgaW4gdGhlIGNhc2UgdGhhdCBhbiBhbmltYXRpb24gZXZlbnQgaXMgbmV2ZXIgdHJpZ2dlcmVkXG4gICAgLy8gdGhpcyBtaWdodCBoYXBwZW4gaWYgYSB1c2VyIHdhbnRzIHRvIGZpcmUgYSBjYWxsYWNrIGFmdGVyIGFuIGVsZW1lbnQgYW5pbWF0ZXNcbiAgICAvLyBvciBmaXJlIHRoZSBjYWxsYmFjayBhbnl3YXkgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGFuaW1hdGlvbi5cbiAgICBpZiAoIHN0YXJ0VGltZW91dCApIHtcblxuICAgICAgLy8gU2V0IGEgZGVmYXVsdCB0aW1lb3V0IChhbGxvd2luZyBzdGFydFRpbWVvdXQgPT0gdHJ1ZSBvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsaXNlY29ucylcbiAgICAgIHZhciB0aW1lID0gKCh0eXBlb2Ygc3RhcnRUaW1lb3V0ID09IFwibnVtYmVyXCIpID8gc3RhcnRUaW1lb3V0IDogMzIpIC8vIDMybXM6IH4gdHdvIGZyYW1lcyBvZiBhbmltYXRpb24gZ3JhY2UgcGVyaW9kXG5cbiAgICAgIHZhciBkZWxheWVkRXZlbnQgPSBkZWxheSggZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFN0b3Agd2F0Y2hpbmcgZm9yIGFuaW1hdGlvbiB0byBzdGFydFxuICAgICAgICAvLyBXaHk/IC0gSWYgdGhlIGFuaW1hdGlvbiBzdGFydHMgbGF0ZXIsIHRoZSBjYWxsYmFjayB3aWxsIGZpcmUgdHdpY2VcbiAgICAgICAgRXZlbnQub2ZmKCBlbCwgJ2FuaW1hdGlvbnN0YXJ0Jywgd2F0Y2hFbmRFdmVudCApIFxuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9LCB0aW1lIClcbiAgICB9XG5cbiAgICAvLyBOZXh0OlxuICAgIC8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYXR0YWNoIGNhbGxiYWNrIHRvIGFuaW1hdGlvbkVuZCBldmVudFxuICAgIGZ1bmN0aW9uIHdhdGNoRW5kRXZlbnQgKCkge1xuICAgICAgaWYgKCBzdGFydFRpbWVvdXQgKSBkZWxheWVkRXZlbnQuc3RvcCgpICAgIC8vIGNhbmNlbCBkZWxheWVkIGZpcmVcbiAgICAgIEV2ZW50Lm9uZSggZWwsICdhbmltYXRpb25lbmQnLCBjYWxsYmFjayApIC8vIHdhdGNoIGZvciBhbmltYXRpb24gdG8gZmluaXNoXG4gICAgfVxuICAgIFxuICAgIC8vIEZpbmFsbHksIHdoZW4gdGhlIGFuaW1hdGlvbiBkb2VzIHN0YXJ0LCB3YXRjaCBmb3IgaXRzIGVuZFxuICAgIEV2ZW50Lm9uZSggZWwsICdhbmltYXRpb25zdGFydCcsIHdhdGNoRW5kRXZlbnQgKVxuICB9XG59XG5cbmFmdGVyQW5pbWF0aW9uLndhdGNoID0gd2F0Y2hBbmltYXRpb25cblxubW9kdWxlLmV4cG9ydHMgPSBhZnRlckFuaW1hdGlvblxuIiwidmFyIGNzc0FuaW1FdmVudFR5cGVzID0gZ2V0QW5pbWF0aW9uRXZlbnRUeXBlcygpXG52YXIgc3VwcG9ydGVkICAgICAgICAgPSBjc3NBbmltRXZlbnRUeXBlcy5hbmltYXRpb25zdGFydCAhPT0gdW5kZWZpbmVkXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB0cmFuc2Zvcm06IHRyYW5zZm9ybUFuaW1hdGlvbkV2ZW50cyxcbiAgc3VwcG9ydGVkOiBzdXBwb3J0ZWRcbn1cblxuZnVuY3Rpb24gY2FtZWxDYXNlRXZlbnRUeXBlcyhwcmVmaXgpIHtcbiAgcHJlZml4ID0gcHJlZml4IHx8ICcnO1xuXG4gIHJldHVybiB7XG4gICAgYW5pbWF0aW9uc3RhcnQ6IHByZWZpeCArICdBbmltYXRpb25TdGFydCcsXG4gICAgYW5pbWF0aW9uZW5kOiBwcmVmaXggKyAnQW5pbWF0aW9uRW5kJyxcbiAgICBhbmltYXRpb25pdGVyYXRpb246IHByZWZpeCArICdBbmltYXRpb25JdGVyYXRpb24nXG4gIH07XG59XG5cbmZ1bmN0aW9uIGxvd2VyQ2FzZUV2ZW50VHlwZXMocHJlZml4KSB7XG4gIHByZWZpeCA9IHByZWZpeCB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGFuaW1hdGlvbnN0YXJ0OiBwcmVmaXggKyAnYW5pbWF0aW9uc3RhcnQnLFxuICAgIGFuaW1hdGlvbmVuZDogcHJlZml4ICsgJ2FuaW1hdGlvbmVuZCcsXG4gICAgYW5pbWF0aW9uaXRlcmF0aW9uOiBwcmVmaXggKyAnYW5pbWF0aW9uaXRlcmF0aW9uJ1xuICB9O1xufVxuXG4vKipcbiAqIEByZXR1cm4ge09iamVjdH0gQW5pbWF0aW9uIGV2ZW50IHR5cGVzIHthbmltYXRpb25zdGFydCwgYW5pbWF0aW9uZW5kLCBhbmltYXRpb25pdGVyYXRpb259XG4gKi9cblxuZnVuY3Rpb24gZ2V0QW5pbWF0aW9uRXZlbnRUeXBlcygpIHtcbiAgaWYgKCAhZG9jdW1lbnQgKSByZXR1cm4ge31cblxuICB2YXIgcHJlZml4ZXMgPSBbJ3dlYmtpdCcsICdNb3onLCAnTycsICcnXTtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG4gIC8vIGJyb3dzZXIgY29tcGxpYW50XG4gIGlmICh1bmRlZmluZWQgIT09IHN0eWxlLmFuaW1hdGlvbk5hbWUpIHtcbiAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcygpO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHByZWZpeGVzLmxlbmd0aCwgcHJlZml4OyBpIDwgbGVuOyBpKyspIHtcbiAgICBwcmVmaXggPSBwcmVmaXhlc1tpXTtcblxuICAgIGlmICh1bmRlZmluZWQgIT09IHN0eWxlW3ByZWZpeCArICdBbmltYXRpb25OYW1lJ10pIHtcbiAgICAgIC8vIFdlYmtpdFxuICAgICAgaWYgKDAgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGNhbWVsQ2FzZUV2ZW50VHlwZXMocHJlZml4LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZWxzZSBpZiAoMSA9PT0gaSkge1xuICAgICAgICByZXR1cm4gbG93ZXJDYXNlRXZlbnRUeXBlcygpO1xuICAgICAgfVxuICAgICAgLy8gT3BlcmFcbiAgICAgIGVsc2UgaWYgKDIgPT09IGkpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyQ2FzZUV2ZW50VHlwZXMocHJlZml4LnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuXG4vLyBBZGRzIG5lY2Vzc2FyeSBhZGQgdmVuZG9yIHByZWZpeGVzIG9yIGNhbWVsQ2FzZWQgZXZlbnQgbmFtZXNcbi8vXG5mdW5jdGlvbiB0cmFuc2Zvcm1BbmltYXRpb25FdmVudHMgKGV2ZW50KSB7XG4gIGlmICghZXZlbnQubWF0Y2goL2FuaW1hdGlvbi9pKSkge1xuICAgIHJldHVybiBldmVudFxuICB9IGVsc2Uge1xuICAgIGlmIChjc3NBbmltRXZlbnRUeXBlc1tldmVudF0pIHtcbiAgICAgIHJldHVybiBjc3NBbmltRXZlbnRUeXBlc1tldmVudF1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYod2luZG93LmVudiAhPSAndGVzdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignXCInICsgZXZlbnQgKyAnXCIgaXMgbm90IGEgc3VwcG9ydGVkIGFuaW1hdGlvbiBldmVudCcpXG4gICAgICB9XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cbn1cbiIsInZhciBFdmVudCA9IHJlcXVpcmUoICdiZWFuJyApLFxuICAgIHBhZ2UgID0gcmVxdWlyZSggJy4vcGFnZScgKSxcbiAgICBmb3JtRWxzO1xuXG52YXIgZm9ybUJ1YmJsaW5nID0gZmFsc2VcblxudmFyIGZpcmVCdWJibGUgPSBmdW5jdGlvbiAoIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50LmRldGFpbCAmJiBldmVudC5kZXRhaWwudHJpZ2dlcmVkICkgeyByZXR1cm4gZmFsc2UgfVxuXG4gIHZhciBldiA9IG5ldyBDdXN0b21FdmVudCggZXZlbnQudHlwZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IHsgdHJpZ2dlcmVkOiB0cnVlIH0gfSApXG5cbiAgLy8gU3RvcCBvbmx5ICdzdWJtaXQnIGV2ZW50cy4gU3RvcHBpbmcgYmx1ciBvciBmb3VjcyBldmVudHMgc2VlbXMgdG8gYnJlYWsgRmlyZUZveCBpbnB1dCBpbnRlcmFjdGlvbnMuXG4gIGlmICggZXZlbnQudHlwZSA9PSAnc3VibWl0JyApIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cbiAgZXZlbnQudGFyZ2V0LmRpc3BhdGNoRXZlbnQoIGV2IClcblxuICAvLyBQcmV2ZW50IGRlZmF1bHQgb24gb3JpZ2luYWwgZXZlbnQgaWYgY3VzdG9tIGV2ZW50IGlzIHByZXZlbnRlZFxuICBpZiAoIGV2LmRlZmF1bHRQcmV2ZW50ZWQgKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpIFxufVxuXG4vLyBTaW1wbGlmeSBzZXR0aW5nIHRoZSBldmVudCB0eXBlIGJhc2VkIG9uIHRoZSBlbGVtZW50XG52YXIgZXZlbnRUeXBlID0gZnVuY3Rpb24gKCBlbCApIHtcbiAgcmV0dXJuICggZWwudGFnTmFtZSA9PSAnRk9STScgKSA/ICdzdWJtaXQnIDogJ2ZvY3VzIGJsdXInXG59XG5cbi8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbnZhciBidWJibGVPbiA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIEV2ZW50Lm9uKCBlbCwgZXZlbnRUeXBlKCBlbCApLCBmaXJlQnViYmxlIClcbn1cblxuLy8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xudmFyIGJ1YmJsZU9mZiA9IGZ1bmN0aW9uICggZWwgKSB7XG4gIEV2ZW50Lm9mZiggZWwsIGV2ZW50VHlwZSggZWwgKSwgZmlyZUJ1YmJsZSApXG59XG5cbi8vIEFkZC9SZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG52YXIgYnViYmxlRm9ybUV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCBmb3JtQnViYmxpbmcgKSB7IHJldHVybiB9IFxuICBwYWdlLmNoYW5nZSggZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBSZW1vdmUgbGlzdGVuZXJzIGZyb20gcHJldmlvdXMgcGFnZVxuICAgIGlmICggZm9ybUVscyApIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGZvcm1FbHMsIGJ1YmJsZU9mZiApXG5cbiAgICAvLyBBZGQgbmV3IGxpc3RlbmVycyB0byB0aGlzIHBhZ2VcbiAgICBmb3JtRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ2Zvcm0sIGlucHV0JyApXG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBmb3JtRWxzLCBidWJibGVPbiApXG4gIH0pXG5cbiAgdmFyIGZvcm1CdWJibGluZyA9IHRydWVcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBidWJibGVGb3JtRXZlbnRzXG4iLCJ2YXIgTWFuYWdlciA9IHtcbiAgbmV3OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbWFuYWdlciA9IHtcblxuICAgICAgY2FsbGJhY2tzOiBbXSxcblxuICAgICAgYWRkOiBmdW5jdGlvbiggZm4gKSB7XG5cbiAgICAgICAgdmFyIGNiID0gTWFuYWdlci5jYWxsYmFjay5uZXcoIGZuIClcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MucHVzaCggY2IgKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGNiXG5cbiAgICAgIH0sXG5cbiAgICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggY2IgKSB7IGNiLnN0b3AoKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi5zdGFydCgpIH0gKVxuICAgICAgfSxcblxuICAgICAgdG9nZ2xlOiBmdW5jdGlvbiggYm9vbCApIHtcbiAgICAgICAgbWFuYWdlci5jYWxsYmFja3MuZm9yRWFjaCggZnVuY3Rpb24oIGNiICkgeyBjYi50b2dnbGUoIGJvb2wgKSB9IClcbiAgICAgIH0sXG5cbiAgICAgIHJlbW92ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIG1hbmFnZXIuY2FsbGJhY2tzID0gW11cbiAgICAgIH0sXG5cbiAgICAgIGZpcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKVxuICAgICAgICBtYW5hZ2VyLmNhbGxiYWNrcy5mb3JFYWNoKCBmdW5jdGlvbiggZm4gKSB7IGZuLmFwcGx5KCB0aGlzLCBhcmdzICkgfSApXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hbmFnZXJcbiAgfSxcblxuICBjYWxsYmFjazoge1xuICAgIG5ldzogZnVuY3Rpb24oIGZuICkge1xuICAgICAgdmFyIGNiID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICggY2IuZW5hYmxlZCApIHsgZm4uYXBwbHkoIGZuLCBhcmd1bWVudHMgKSB9XG4gICAgICB9XG5cbiAgICAgIGNiLnN0b3AgICA9IGZ1bmN0aW9uKCkgeyBjYi5lbmFibGVkID0gZmFsc2UgfVxuICAgICAgY2Iuc3RhcnQgID0gZnVuY3Rpb24oKSB7IGNiLmVuYWJsZWQgPSB0cnVlIH1cbiAgICAgIGNiLnRvZ2dsZSA9IGZ1bmN0aW9uKCBib29sICkge1xuICAgICAgICBjYi5lbmFibGVkID0gKCAwIGluIGFyZ3VtZW50cyApID8gYm9vbCA6ICFjYi5lbmFibGVkXG4gICAgICB9XG4gICAgICBjYi5lbmFibGVkID0gdHJ1ZVxuXG4gICAgICByZXR1cm4gY2JcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNYW5hZ2VyXG4iLCJ2YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBEYXRlLm5vdygpXG59XG5cbnZhciBwaWNrRnVuY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGZvdW5kXG4gIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoIGFyZ3VtZW50cywgZnVuY3Rpb24oIGNhbmRpZGF0ZSApIHtcbiAgICBpZiAoIHR5cGVvZiggY2FuZGlkYXRlICkgPT0gJ2Z1bmN0aW9uJyAmJiAhZm91bmQgKSB7IGZvdW5kID0gY2FuZGlkYXRlIH1cbiAgfSlcblxuICByZXR1cm4gZm91bmRcbn1cblxudmFyIGRlYm91bmNlID0gZnVuY3Rpb24oIGZuLCB3YWl0LCBvcHRpb25zICkge1xuXG4gIC8vIEFsbG93IG9wdGlvbnMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudFxuICBpZiAoIHR5cGVvZiggZm4gKSA9PSAnb2JqZWN0JyApIHsgb3B0aW9ucyA9IGZuIH0gXG5cbiAgLy8gT3B0aW9ucyB3b24ndCBiZSBudWxsXG4gIGVsc2UgeyBvcHRpb25zID0gb3B0aW9ucyB8fCB7fSB9XG5cbiAgd2FpdCA9IG9wdGlvbnMud2FpdCB8fCB3YWl0IHx8IDBcblxuICB2YXIgbWF4ICAgICAgICAgICAgPSBvcHRpb25zLm1heCB8fCBmYWxzZSxcbiAgICAgIGxlYWRpbmcgICAgICAgID0gKCAoICdsZWFkaW5nJyAgaW4gb3B0aW9ucyApID8gb3B0aW9ucy5sZWFkaW5nICA6IGZhbHNlICksXG4gICAgICB0cmFpbGluZyAgICAgICA9ICggKCAndHJhaWxpbmcnIGluIG9wdGlvbnMgKSA/IG9wdGlvbnMudHJhaWxpbmcgOiB0cnVlICksXG4gICAgICBcbiAgICAgIC8vIEdyYWIgZnVuY3Rpb25zIGZyb20gb3B0aW9ucyBvciBkZWZhdWx0IHRvIGZpcnN0IGFyZ3VtZW50XG4gICAgICBsZWFkaW5nRm4gICAgICA9IHBpY2tGdW5jdGlvbiggb3B0aW9ucy5sZWFkaW5nLCBvcHRpb25zLnRyYWlsaW5nLCBvcHRpb25zLmNhbGxiYWNrLCBmbiApLFxuICAgICAgdHJhaWxpbmdGbiAgICAgPSBwaWNrRnVuY3Rpb24oIG9wdGlvbnMudHJhaWxpbmcsIG9wdGlvbnMubGVhZGluZywgb3B0aW9ucy5jYWxsYmFjaywgZm4gKSxcblxuICAgICAgLy8gU3RhdGUgdHJhY2tpbmcgdmFyc1xuICAgICAgYXJncywgICAgICAgICAgICAgICAgICAgIC8vIFRyYWNrIGFyZ3VtZW50cyBwYXNzZWQgdG8gZGVib3VuY2VkIGNhbGxiYWNrXG4gICAgICBxdWV1ZWQgICAgICAgICA9IGZhbHNlLCAgLy8gSGFzIGEgY2FsbGJhY2sgYmVlbiBhZGRlZCB0byB0aGUgYW5pbWF0aW9uIGxvb3A/XG4gICAgICBoYW5kbGUgICAgICAgICA9IHt9LCAgICAgLy8gT2JqZWN0IGZvciB0cmFja2luZyBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrc1xuICAgICAgbGFzdENhbGxlZCAgICAgPSAwLCAgICAgIC8vIEtlZXAgYSB0aW1lciBmb3IgZGVib3VuY2luZ1xuICAgICAgbGFzdEludm9rZWQgICAgPSAwLCAgICAgIC8vIEtlZXAgYSB0aW1lciBmb3IgbWF4XG4gICAgICBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlOyAgLy8gVHJhY2sgbGVhZGluZywgdGhyb3R0bGluZyBzdWJzZXF1ZW50IGxlYWRpbmcgY2FsbHNcblxuICAvLyBRdWV1ZSB0aGUgZnVuY3Rpb24gd2l0aCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgdmFyIGludm9rZSA9IGZ1bmN0aW9uKCBjYWxsVHlwZSApIHtcblxuICAgIGxhc3RDYWxsZWQgPSBub3coKVxuICAgIGxhc3RJbnZva2VkID0gbm93KClcbiAgICBxdWV1ZWQgPSBmYWxzZVxuICAgIGxlYWRpbmdCbG9ja2VkID0gdHJ1ZVxuXG4gICAgaWYgKCBjYWxsVHlwZSA9PT0gJ2xlYWRpbmcnICkge1xuICAgICAgbGVhZGluZ0ZuLmFwcGx5KCBsZWFkaW5nRm4sIGFyZ3MgKSB9XG4gICAgZWxzZSB7XG4gICAgICB0cmFpbGluZ0ZuLmFwcGx5KCB0cmFpbGluZ0ZuLCBhcmdzICkgfVxuXG4gIH1cblxuICAvLyBMb2FkIHRoZSBsb29wIGludG8gdGhlIGFuaW1hdGlvbiBxdWV1ZVxuICB2YXIgYWRkVG9RdWV1ZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICggIXF1ZXVlZCApIHtcbiAgICAgIHF1ZXVlZCA9IHRydWVcbiAgICAgIGhhbmRsZS52YWx1ZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSggbG9vcCApICAvLyBBZGQgdG8gYnJvd3NlcidzIGFuaW1hdGlvbiBxdWV1ZVxuICAgIH1cblxuICB9XG5cbiAgLy8gUmVtb3ZlIGZyb20gYW5pbWF0aW9uIHF1ZXVlIGFuZCByZXNldCBkZWJvdW5jZSBcbiAgdmFyIHJlbW92ZUZyb21RdWV1ZSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgaWYgKCBcInZhbHVlXCIgaW4gaGFuZGxlICkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoIGhhbmRsZS52YWx1ZSApXG4gICAgICBxdWV1ZWQgICAgICAgICA9IGZhbHNlXG4gICAgICBsYXN0Q2FsbGVkICAgICA9IDBcbiAgICAgIGxhc3RJbnZva2VkICAgID0gMFxuICAgICAgbGVhZGluZ0Jsb2NrZWQgPSBmYWxzZVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIC8vIHByZXZlbnQgaW5maW5pdGUgZGVib3VuY2luZyAoIGlmIG9wdGlvbnMubWF4IGlzIHNldCApXG4gIHZhciBtYXhQYXNzZWQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKCBtYXggJiYgbm93KCkgLSBsYXN0SW52b2tlZCA+PSBtYXggKVxuICB9XG5cbiAgdmFyIHdhaXRSZWFjaGVkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICggbm93KCkgLSBsYXN0Q2FsbGVkICkgPj0gd2FpdFxuICB9XG5cbiAgLy8gVGhpcyBnZXRzIGxvYWRlZCBpbnRvIHRoZSBhbmltYXRpb24gcXVldWUgYW5kIGRldGVybWluZXMgd2hldGhlciB0byBpdm9rZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCkge1xuICBcbiAgICAvLyBMb29wIHdhcyBleGVjdXRlZCBzbyBpdCdzIG5vIGxvbmdlciBpbiB0aGUgYW5pbWF0aW9uIHF1ZXVlXG4gICAgcXVldWVkID0gZmFsc2VcbiAgICBcbiAgICBpZiAoIGxlYWRpbmcgJiYgIWxlYWRpbmdCbG9ja2VkICkge1xuICAgICAgaW52b2tlKCAnbGVhZGluZycgKVxuICAgIH1cblxuICAgIC8vIElmIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCB0byBmcmVxdWVudGx5IHRvIGV4ZWN1dGVcbiAgICBlbHNlIGlmICggbWF4UGFzc2VkKCkgKSB7XG5cbiAgICAgIGlmICggbGVhZGluZyApIHsgaW52b2tlKCAnbGVhZGluZycgKSAgfVxuICAgICAgZWxzZSAgICAgICAgICAgeyBpbnZva2UoICd0cmFpbGluZycgKSB9XG5cbiAgICB9IFxuICAgIFxuICAgIC8vIElmIGZ1bmN0aW9uIGhhc24ndCBiZWVuIGNhbGxlZCBzaW5jZSBsYXN0IHdhaXRcbiAgICBlbHNlIGlmICggd2FpdFJlYWNoZWQoKSApIHtcblxuICAgICAgLy8gSWYgdHJhaWxpbmcgaXQncyBzYWZlIHRvIGludm9rZVxuICAgICAgaWYgKCB0cmFpbGluZyApIHsgaW52b2tlKCAndHJhaWxpbmcnICkgfVxuXG4gICAgICAvLyBJZiBsZWFkaW5nLCBpdCdzIHNhZmUgdG8gcmVtb3ZlIGJsb2NrXG4gICAgICBpZiAoIGxlYWRpbmcgKSAgeyBsZWFkaW5nQmxvY2tlZCA9IGZhbHNlIH1cbiAgICAgXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZFRvUXVldWUoKVxuICAgIH1cblxuICB9XG5cbiAgLy8gQSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBxdWV1ZWluZyB1cCBmdW5jdGlvbiBjYWxsc1xuICAvL1xuICB2YXIgZGVib3VuY2VkID0gZnVuY3Rpb24oKSB7XG4gICAgbGFzdENhbGxlZCA9IG5vdygpXG4gICAgYXJncyA9IGFyZ3VtZW50c1xuICAgIGFkZFRvUXVldWUoKVxuICB9XG5cbiAgZGVib3VuY2VkLnN0b3AgPSByZW1vdmVGcm9tUXVldWVcblxuICByZXR1cm4gZGVib3VuY2VkXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGVib3VuY2VcbiIsInZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIERhdGUubm93KClcbn1cblxudmFyIGRlbGF5ID0gZnVuY3Rpb24gKCBmbiwgd2FpdCApIHtcblxuICB2YXIgYXJnc1N0YXJ0ID0gKCB3YWl0ICE9IG51bGwgKSA/IDIgOiAxO1xuICB2YXIgaGFuZGxlID0ge31cblxuICBoYW5kbGUuYXJncyAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzLCBhcmdzU3RhcnQgKVxuICBoYW5kbGUud2FpdCAgPSB3YWl0IHx8IDBcbiAgaGFuZGxlLnN0YXJ0ID0gbm93KClcblxuICBoYW5kbGUuc3RvcCAgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCBcInZhbHVlXCIgaW4gaGFuZGxlICkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoIGhhbmRsZS52YWx1ZSApO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZS5sb29wICA9IGZ1bmN0aW9uICgpIHtcblxuICAgIC8vIElmIHdhaXQgbGltaXQgaGFzIGJlZW4gcmVhY2hlZFxuICAgIGlmICggbm93KCkgLSBoYW5kbGUuc3RhcnQgPj0gaGFuZGxlLndhaXQgKSB7XG4gICAgICBmbi5hcHBseSggZm4sIGhhbmRsZS5hcmdzIClcblxuICAgICAgLy8gSWYgcmVwZWF0IGlzIHNldCBhbmQgaXMgbm90IDBcbiAgICAgIGlmICggISFoYW5kbGUucmVwZWF0ICkge1xuICAgICAgICBoYW5kbGUucmVwZWF0ID0gaGFuZGxlLnJlcGVhdCAtIDFcbiAgICAgICAgaGFuZGxlLnN0YXJ0ID0gbm93KClcbiAgICAgICAgcXVldWVEZWxheSggaGFuZGxlIClcbiAgICAgIH0gZWxzZSBpZiAoIGhhbmRsZS5yZXBlYXQgPT09IDAgJiYgaGFuZGxlLmNvbXBsZXRlICkge1xuICAgICAgICBoYW5kbGUuY29tcGxldGUoKVxuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXVlRGVsYXkoIGhhbmRsZSApXG4gICAgfVxuXG4gIH1cblxuXG4gIHJldHVybiBxdWV1ZURlbGF5KCBoYW5kbGUgKVxufVxuXG52YXIgcXVldWVEZWxheSA9IGZ1bmN0aW9uICggaGFuZGxlICkge1xuICBoYW5kbGUudmFsdWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGhhbmRsZS5sb29wIClcbiAgcmV0dXJuIGhhbmRsZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlbGF5XG4iLCIvLyBUaGlzIHNpbXBsaWZpZXMgY29tbW9uIHVzZXMgZm9yIHdpbmRvdy5tYXRjaE1lZGlhIFxuLy8gbmFtZWx5LCBhZGRpbmcgbGlzdGVuZXJzIGZvciB3aWR0aCBhbmQgaGVpZ2h0IHF1ZXJpZXNcblxuZnVuY3Rpb24gcGFyc2VRdWVyeSggcXVlcnksIGRpbWVuc2lvbiApIHtcbiAgdmFyIHJlc3VsdCA9IHt9XG5cbiAgaWYgKCB0eXBlb2YoIHF1ZXJ5ICkgPT09ICdzdHJpbmcnICkgeyByZXR1cm4gcXVlcnkgfVxuXG4gIHJlc3VsdC5taW4gPSBzaXplKCBxdWVyeS5taW4sICdtaW4tJyArIGRpbWVuc2lvbiApXG4gIHJlc3VsdC5tYXggPSBzaXplKCBxdWVyeS5tYXgsICdtYXgtJyArIGRpbWVuc2lvbiApXG5cbiAgaWYgKCByZXN1bHQubWluICYmIHJlc3VsdC5tYXggKVxuICAgIHJlc3VsdC5xdWVyeSA9IHJlc3VsdC5taW4gKyAnIGFuZCAnICsgcmVzdWx0Lm1heFxuXG4gIHJldHVybiByZXN1bHQucXVlcnkgfHwgcmVzdWx0Lm1pbiB8fCByZXN1bHQubWF4XG59XG5cbmZ1bmN0aW9uIHNpemUoIG51bSwgbGltaXQgKSB7XG4gIHJldHVybiAoIG51bSApID8gJygnK2xpbWl0Kyc6ICcgKyB0b1B4KCBudW0gKSArICcpJyA6IG51bGxcbn1cblxuZnVuY3Rpb24gdG9QeCggd2lkdGggKSB7XG4gIGlmICggdHlwZW9mKCB3aWR0aCApID09PSAnbnVtYmVyJyApIHsgcmV0dXJuIHdpZHRoICsgJ3B4J31cbiAgcmV0dXJuIHdpZHRoXG59XG5cbnZhciBtZWRpYSA9IHtcblxuICB3aWR0aDogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICByZXR1cm4gbWVkaWEubGlzdGVuKCBwYXJzZVF1ZXJ5KCBxdWVyeSwgJ3dpZHRoJyApLCBmbiApXG4gIH0sXG5cbiAgbWluV2lkdGg6IGZ1bmN0aW9uKCBzaXplLCBmbiApIHsgcmV0dXJuIG1lZGlhLndpZHRoKCB7IG1pbjogc2l6ZSB9LCBmbiApIH0sXG4gIG1heFdpZHRoOiBmdW5jdGlvbiggc2l6ZSwgZm4gKSB7IHJldHVybiBtZWRpYS53aWR0aCggeyBtYXg6IHNpemUgfSwgZm4gKSB9LFxuXG4gIGhlaWdodDogZnVuY3Rpb24oIHF1ZXJ5LCBmbiApIHtcbiAgICByZXR1cm4gbWVkaWEubGlzdGVuKCBwYXJzZVF1ZXJ5KCBxdWVyeSwgJ2hlaWdodCcgKSwgZm4gKVxuICB9LFxuXG4gIG1pbkhlaWdodDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEuaGVpZ2h0KCB7IG1pbjogc2l6ZSB9LCBmbiApIH0sXG4gIG1heEhlaWdodDogZnVuY3Rpb24oIHNpemUsIGZuICkgeyByZXR1cm4gbWVkaWEuaGVpZ2h0KCB7IG1heDogc2l6ZSB9LCBmbiApIH0sXG5cbiAgbGlzdGVuOiBmdW5jdGlvbiggcXVlcnksIGZuICkge1xuICAgIHZhciBtYXRjaCA9IHdpbmRvdy5tYXRjaE1lZGlhKCBxdWVyeSApXG5cbiAgICBpZiAoIGZuICkge1xuICAgICAgZm4oIG1hdGNoIClcbiAgICAgIG1hdGNoLmFkZExpc3RlbmVyKCBmbiApXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoXG4gIH1cblxufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gbWVkaWFcbiIsInZhciBFdmVudCAgICAgICAgICAgPSByZXF1aXJlKCAnYmVhbicgKVxudmFyIGNhbGxiYWNrTWFuYWdlciA9IHJlcXVpcmUoICcuL2NhbGxiYWNrLW1hbmFnZXInIClcbnZhciB0aHJvdHRsZSAgICAgICAgPSByZXF1aXJlKCAnLi90aHJvdHRsZScgKVxudmFyIGRlYm91bmNlICAgICAgICA9IHJlcXVpcmUoICcuL2RlYm91bmNlJyApXG5cbnZhciBvcHRpbWl6ZWRFdmVudE1hbmFnZXIgPSB7XG4gIG5ldzogZnVuY3Rpb24oIG5hbWUgKSB7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY2FsbGJhY2sgbWFuYWdlclxuICAgIHZhciBtYW5hZ2VyID0ge1xuICAgICAgcnVuOiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gICAgICBzdGFydDogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICAgICAgc3RvcDogY2FsbGJhY2tNYW5hZ2VyLm5ldygpXG4gICAgfVxuXG4gICAgLy8gcnVuIGNhbGxiYWNrcyB3aGVuIGV2ZW50IGhhcHBlbnMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgcnVubmluZyA9IHRocm90dGxlKCBtYW5hZ2VyLnJ1bi5maXJlIClcblxuICAgIC8vIGZpcmUgY2FsbGJhY2tzIHdoZW4gZXZlbnQgc3RhcnRzIChhdCBwYWludC1yZWFkeSBmcmFtZXMpXG4gICAgdmFyIHN0YXJ0ZWQgPSBkZWJvdW5jZSh7XG4gICAgICBsZWFkaW5nOiBtYW5hZ2VyLnN0YXJ0LmZpcmUsXG4gICAgICB0cmFpbGluZzogZmFsc2UsXG4gICAgICB3YWl0OiAxNTBcbiAgICB9KVxuXG4gICAgLy8gZmlyZSBjYWxsYmFja3Mgd2hlbiBldmVudCBzdGFydHMgKGF0IHBhaW50LXJlYWR5IGZyYW1lcylcbiAgICB2YXIgc3RvcHBlZCA9IGRlYm91bmNlKCBtYW5hZ2VyLnN0b3AuZmlyZSwgMTUwIClcblxuICAgIEV2ZW50Lm9uKCB3aW5kb3csIG5hbWUsIGZ1bmN0aW9uKCkge1xuICAgICAgcnVubmluZygpXG4gICAgICBzdGFydGVkKClcbiAgICAgIHN0b3BwZWQoKVxuICAgIH0pXG5cbiAgICAvLyBQdWJsaWMgQVBJXG4gICAgdmFyIHJ1biAgID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIucnVuLmFkZCggZm4gKSB9XG4gICAgcnVuLnN0YXJ0ID0gZnVuY3Rpb24gKCBmbiApIHsgcmV0dXJuIG1hbmFnZXIuc3RhcnQuYWRkKCBmbiApIH1cbiAgICBydW4uc3RvcCAgPSBmdW5jdGlvbiAoIGZuICkgeyByZXR1cm4gbWFuYWdlci5zdG9wLmFkZCggZm4gKSB9XG5cbiAgICAvLyBBZGQgY3VzdG9tIGV2ZW50cyBmb3IgdG8gcnVuIG9wdGltaXplZCBsaXN0ZW5lcnMuICggbmFtZSAtPiBOYW1lIClcbiAgICBydW4oIGZ1bmN0aW9uKCkgeyBFdmVudC5maXJlKCB3aW5kb3csICdvcHRpbWl6ZWQnICsgIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpICkgfSApXG4gICAgcnVuLnN0YXJ0KCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCBuYW1lICsgJ1N0YXJ0JyApIH0gKVxuICAgIHJ1bi5zdG9wKCBmdW5jdGlvbigpIHsgRXZlbnQuZmlyZSggd2luZG93LCBuYW1lICsgJ1N0b3AnICkgfSApXG5cbiAgICByZXR1cm4gcnVuXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvcHRpbWl6ZWRFdmVudE1hbmFnZXJcbiIsInZhciBFdmVudCAgICAgICAgICAgPSByZXF1aXJlKCAnYmVhbicgKVxudmFyIGNhbGxiYWNrTWFuYWdlciA9IHJlcXVpcmUoICcuL2NhbGxiYWNrLW1hbmFnZXInIClcblxuLy8gQ3JlYXRlIGEgbmV3IHBhZ2UgZXZlbnQgbWFuYWdlclxudmFyIG1hbmFnZXIgPSB7XG4gIHJlYWR5OiBjYWxsYmFja01hbmFnZXIubmV3KCksXG4gIGNoYW5nZTogY2FsbGJhY2tNYW5hZ2VyLm5ldygpLFxuICByZWFkeUFscmVhZHk6IGZhbHNlLFxuICBjaGFuZ2VkOiBmYWxzZSxcbn1cblxubWFuYWdlci5yZWFkeS5hZGQoIGZ1bmN0aW9uKCl7XG4gIG1hbmFnZXIucmVhZHlBbHJlYWR5ID0gdHJ1ZSBcbn0pXG5cbm1hbmFnZXIucmVhZHkuYWRkKCBmdW5jdGlvbigpeyBcbiAgaWYgKCAhd2luZG93LlR1cmJvbGlua3MgJiYgIW1hbmFnZXIuY2hhbmdlZCApIHsgXG4gICAgbWFuYWdlci5jaGFuZ2VkID0gdHJ1ZSBcbiAgICBtYW5hZ2VyLmNoYW5nZS5maXJlKClcbiAgfVxufSlcblxudmFyIHJlYWR5ID0gZnVuY3Rpb24gKCBmbiApIHtcbiAgaWYgKCBtYW5hZ2VyLnJlYWR5QWxyZWFkeSApIHsgZm4oKSB9XG4gIHJldHVybiBtYW5hZ2VyLnJlYWR5LmFkZCggZm4gKSB9XG5cbnZhciBjaGFuZ2UgPSBmdW5jdGlvbiggZm4gKSB7XG4gIGlmICggbWFuYWdlci5jaGFuZ2VkICkgeyBmbigpIH1cbiAgcmV0dXJuIG1hbmFnZXIuY2hhbmdlLmFkZCggZm4gKSB9XG5cbi8vIE1ha2UgaXQgZWFzeSB0byB0cmlnZ2VyIHJlYWR5IGNhbGxiYWNrc1xucmVhZHkuZmlyZSA9IGZ1bmN0aW9uICgpIHtcbiAgbWFuYWdlci5yZWFkeS5maXJlKClcbiAgLy8gQmUgc3VyZSByZWFkeSBjYW4gb25seSBiZSBmaXJlZCBvbmNlXG4gIG1hbmFnZXIucmVhZHkuc3RvcCgpIH1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIHRyaWdnZXIgY2hhbmdlIGNhbGxiYWNrc1xuY2hhbmdlLmZpcmUgPSBmdW5jdGlvbiAoKSB7XG4gIG1hbmFnZXIuY2hhbmdlLmZpcmUoKSB9XG5cbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ0RPTUNvbnRlbnRMb2FkZWQnLCByZWFkeS5maXJlIClcbkV2ZW50Lm9uKCBkb2N1bWVudCwgJ3BhZ2U6Y2hhbmdlIHR1cmJvbGlua3M6bG9hZCcsIGNoYW5nZS5maXJlICkgLy8gU3VwcG9ydCBjdXN0b20gYW5kIHJhaWxzIHR1cmJvbGlua3MgcGFnZSBsb2FkIGV2ZW50c1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmVhZHk6IHJlYWR5LFxuICBjaGFuZ2U6IGNoYW5nZVxufVxuIiwidmFyIGRlbGF5ID0gcmVxdWlyZSggJy4vZGVsYXknIClcblxudmFyIHJlcGVhdCA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgbGltaXQgKSB7XG5cbiAgdmFyIGFyZ3NTdGFydCA9IDEsXG4gICAgICBoYW5kbGUgPSBkZWxheSAoIGZuLCB3YWl0ICk7XG5cbiAgaWYgICAgICAoIGxpbWl0ICE9IG51bGwgKSB7IGFyZ3NTdGFydCA9IDMgfVxuICBlbHNlIGlmICggd2FpdCAgIT0gbnVsbCApIHsgYXJnc1N0YXJ0ID0gMiB9XG5cbiAgLy8gRW5hYmxlIHJlcGVhdCAoIC0xIHdpbGwgcmVwZWF0IGZvcmV2ZXIgKVxuICBoYW5kbGUucmVwZWF0ID0gbGltaXQgfHwgLTFcbiAgaGFuZGxlLmFyZ3MgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIGFyZ3NTdGFydCApXG4gIGhhbmRsZS5zdG9wICAgPSBoYW5kbGUuY2FuY2VsXG5cbiAgcmV0dXJuIGhhbmRsZVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcGVhdFxuIiwidmFyIG1hbmFnZXIgPSByZXF1aXJlKCAnLi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlcicgKVxudmFyIHJlc2l6ZSAgPSBtYW5hZ2VyLm5ldyggJ3Jlc2l6ZScgKVxuXG4vLyBQYXVzZSBhbmltYXRpb25zIGR1cmluZyByZXNpemluZyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG5yZXNpemUuZGlzYWJsZUFuaW1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGUgPSAnPHN0eWxlIGlkPVwiZnVsbHN0b3BcIj4ubm8tYW5pbWF0aW9uICosIC5uby1hbmltYXRpb24gKjphZnRlciwgLm5vLWFuaW1hdGlvbiAqOmJlZm9yZSB7XFxcbiAgICB0cmFuc2l0aW9uOiBub25lICFpbXBvcnRhbnQ7IGFuaW1hdGlvbjogbm9uZSAhaW1wb3J0YW50XFxcbiAgfTwvc3R5bGU+J1xuXG4gIC8vIEluamVjdCBzdHlsZSBmb3IgZWFzeSBjbGFzc25hbWUgbWFuaXB1bGF0aW9uXG4gIGlmICggIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlI2Z1bGxzdG9wJykgKSB7IFxuICAgIGRvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBzdHlsZSlcbiAgfVxuXG4gIHJlc2l6ZS5zdGFydCggZnVuY3Rpb24oKSB7IGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCggJ25vLWFuaW1hdGlvbicgKSB9IClcbiAgcmVzaXplLnN0b3AoIGZ1bmN0aW9uKCkgeyAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCAnbm8tYW5pbWF0aW9uJyApIH0gKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlc2l6ZVxuIiwidmFyIG1hbmFnZXIgPSByZXF1aXJlKCAnLi9vcHRpbWl6ZWQtZXZlbnQtbWFuYWdlcicgKVxudmFyIHNjcm9sbCAgPSBtYW5hZ2VyLm5ldyggJ3Njcm9sbCcgKVxuXG5zY3JvbGwuZGlzYWJsZVBvaW50ZXIgPSBmdW5jdGlvbigpIHtcblxuICAvLyBEaXNhYmxlIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgc2Nyb2xsLnN0YXJ0KCBmdW5jdGlvbigpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICB9KVxuXG4gIC8vIEVuYWJsZSBwb2ludGVyIGludGVyYWN0aW9uXG4gIHNjcm9sbC5zdG9wKCBmdW5jdGlvbigpIHtcbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICcnXG4gIH0pXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsXG4iLCIvLyBDdXN0b20gRXZlbnQgUG9seWZpbGxcbihmdW5jdGlvbiAoKSB7XG5cbiAgaWYgKCB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSBcImZ1bmN0aW9uXCIgKSByZXR1cm4gZmFsc2U7XG5cbiAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKCBldmVudCwgcGFyYW1zICkge1xuICAgIHBhcmFtcyA9IHBhcmFtcyB8fCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWQgfTtcbiAgICB2YXIgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoICdDdXN0b21FdmVudCcgKTtcbiAgICBldnQuaW5pdEN1c3RvbUV2ZW50KCBldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsICk7XG4gICAgcmV0dXJuIGV2dDtcbiAgIH1cblxuICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuXG4gIHdpbmRvdy5DdXN0b21FdmVudCA9IEN1c3RvbUV2ZW50O1xufSkoKVxuIiwiLy8gTWFudWFsbHkgdHJpZ2dlciBhIGNhbmNlbGFibGUgZm9ybSBzdWJtaXQgZXZlbnQuXG5mdW5jdGlvbiBzdWJtaXQoIGZvcm0gKSB7XG4gIGlmICggIWZvcm0udGFnTmFtZSB8fCBmb3JtLnRhZ05hbWUgIT0gJ0ZPUk0nICkge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKCAnVHJpZ2dlciB0aGlzIGV2ZW50IG9uIGEgZm9ybSBlbGVtZW50JyApXG4gIH1cblxuICB2YXIgZXYgPSBuZXcgQ3VzdG9tRXZlbnQoICdzdWJtaXQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGRldGFpbDogeyB0cmlnZ2VyZWQ6IHRydWUgfSB9IClcbiAgZm9ybS5kaXNwYXRjaEV2ZW50KCBldiApXG5cbiAgLy8gU3VibWl0IGZvcm0gdW5sZXNzIGV2ZW50IGRlZmF1bHQgaXMgcHJldmVudGVkXG4gIGlmICggIWV2LmRlZmF1bHRQcmV2ZW50ZWQgKSBmb3JtLnN1Ym1pdCgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3VibWl0XG4iLCJ2YXIgZW5kRXZlbnRzID0gW1xuICAndG91Y2hlbmQnXG5dXG5cbm1vZHVsZS5leHBvcnRzID0gVGFwXG5cbi8vIGRlZmF1bHQgdGFwIHRpbWVvdXQgaW4gbXNcblRhcC50aW1lb3V0ID0gMjAwXG5cbmZ1bmN0aW9uIFRhcChjYWxsYmFjaywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAvLyBpZiB0aGUgdXNlciBob2xkcyBoaXMvaGVyIGZpbmdlciBkb3duIGZvciBtb3JlIHRoYW4gMjAwbXMsXG4gIC8vIHRoZW4gaXQncyBub3QgcmVhbGx5IGNvbnNpZGVyZWQgYSB0YXAuXG4gIC8vIGhvd2V2ZXIsIHlvdSBjYW4gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgdmFyIHRpbWVvdXQgPSBvcHRpb25zLnRpbWVvdXQgfHwgVGFwLnRpbWVvdXRcblxuICAvLyB0byBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBsaXN0ZW5lclxuICBsaXN0ZW5lci5oYW5kbGVyID0gY2FsbGJhY2tcblxuICByZXR1cm4gbGlzdGVuZXJcblxuICAvLyBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgbGlzdGVuZXIpXG4gIGZ1bmN0aW9uIGxpc3RlbmVyKGUxKSB7XG4gICAgLy8gdGFwIHNob3VsZCBvbmx5IGhhcHBlbiB3aXRoIGEgc2luZ2xlIGZpbmdlclxuICAgIGlmICghZTEudG91Y2hlcyB8fCBlMS50b3VjaGVzLmxlbmd0aCA+IDEpIHJldHVyblxuXG4gICAgdmFyIGVsID0gZTEudGFyZ2V0XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG5cbiAgICB2YXIgdGltZW91dF9pZCA9IHNldFRpbWVvdXQoY2xlYW51cCwgdGltZW91dClcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGNsZWFudXApXG5cbiAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGRvbmUpXG4gICAgfSlcblxuICAgIGZ1bmN0aW9uIGRvbmUoZTIpIHtcbiAgICAgIC8vIHNpbmNlIHRvdWNoc3RhcnQgaXMgYWRkZWQgb24gdGhlIHNhbWUgdGlja1xuICAgICAgLy8gYW5kIGJlY2F1c2Ugb2YgYnViYmxpbmcsXG4gICAgICAvLyBpdCdsbCBleGVjdXRlIHRoaXMgb24gdGhlIHNhbWUgdG91Y2hzdGFydC5cbiAgICAgIC8vIHRoaXMgZmlsdGVycyBvdXQgdGhlIHNhbWUgdG91Y2hzdGFydCBldmVudC5cbiAgICAgIGlmIChlMSA9PT0gZTIpIHJldHVyblxuXG4gICAgICBjbGVhbnVwKClcblxuICAgICAgLy8gYWxyZWFkeSBoYW5kbGVkXG4gICAgICBpZiAoZTIuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuXG5cbiAgICAgIC8vIG92ZXJ3cml0ZSB0aGVzZSBmdW5jdGlvbnMgc28gdGhhdCB0aGV5IGFsbCB0byBib3RoIHN0YXJ0IGFuZCBldmVudHMuXG4gICAgICB2YXIgcHJldmVudERlZmF1bHQgPSBlMS5wcmV2ZW50RGVmYXVsdFxuICAgICAgdmFyIHN0b3BQcm9wYWdhdGlvbiA9IGUxLnN0b3BQcm9wYWdhdGlvblxuXG4gICAgICBlMS5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbi5jYWxsKGUxKVxuICAgICAgICBzdG9wUHJvcGFnYXRpb24uY2FsbChlMilcbiAgICAgIH1cblxuICAgICAgZTEucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0LmNhbGwoZTEpXG4gICAgICAgIHByZXZlbnREZWZhdWx0LmNhbGwoZTIpXG4gICAgICB9XG5cbiAgICAgIC8vIGNhbGxzIHRoZSBoYW5kbGVyIHdpdGggdGhlIGBlbmRgIGV2ZW50LFxuICAgICAgLy8gYnV0IGkgZG9uJ3QgdGhpbmsgaXQgbWF0dGVycy5cbiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgfVxuXG4gICAgLy8gY2xlYW51cCBlbmQgZXZlbnRzXG4gICAgLy8gdG8gY2FuY2VsIHRoZSB0YXAsIGp1c3QgcnVuIHRoaXMgZWFybHlcbiAgICBmdW5jdGlvbiBjbGVhbnVwKGUyKSB7XG4gICAgICAvLyBpZiBpdCdzIHRoZSBzYW1lIGV2ZW50IGFzIHRoZSBvcmlnaW4sXG4gICAgICAvLyB0aGVuIGRvbid0IGFjdHVhbGx5IGNsZWFudXAuXG4gICAgICAvLyBoaXQgaXNzdWVzIHdpdGggdGhpcyAtIGRvbid0IHJlbWVtYmVyXG4gICAgICBpZiAoZTEgPT09IGUyKSByZXR1cm5cblxuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRfaWQpXG5cbiAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGNsZWFudXApXG5cbiAgICAgIGVuZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBkb25lKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsInZhciBkZWJvdW5jZSA9IHJlcXVpcmUoICcuL2RlYm91bmNlJyApXG5cbnZhciB0aHJvdHRsZSA9IGZ1bmN0aW9uKCBmbiwgd2FpdCwgb3B0aW9ucyApIHtcblxuICBpZiAoIHR5cGVvZiggZm4gKSA9PSAnb2JqZWN0JyApIHsgb3B0aW9ucyA9IGZuOyBmbiA9IHVuZGVmaW5lZCB9IFxuICBlbHNlIHsgb3B0aW9ucyA9IG9wdGlvbnMgfHwge30gfVxuXG4gIG9wdGlvbnMud2FpdCA9IG9wdGlvbnMud2FpdCB8fCB3YWl0IHx8IDBcbiAgb3B0aW9ucy5tYXggID0gb3B0aW9ucy5tYXggfHwgb3B0aW9ucy53YWl0XG4gIG9wdGlvbnMuY2FsbGJhY2sgPSBvcHRpb25zLmNhbGxiYWNrIHx8IGZuXG4gIG9wdGlvbnMubGVhZGluZyAgPSB0cnVlXG4gIG9wdGlvbnMudHJhaWxpbmcgPSB0cnVlXG5cbiAgcmV0dXJuIGRlYm91bmNlKG9wdGlvbnMpXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0aHJvdHRsZVxuIiwidmFyIEV2ZW50ID0gcmVxdWlyZSgnY29tcG9zZS1ldmVudCcpXG5cbnZhciBUb2dnbGVyID0ge1xuICBjaGVja2JveFNlbGVjdG9yOiBcIlt0eXBlPWNoZWNrYm94XVtkYXRhLXRvZ2dsZV0sIFt0eXBlPWNoZWNrYm94XVtkYXRhLXNob3ddLCBbdHlwZT1jaGVja2JveF1bZGF0YS1oaWRlXVwiLFxuICByYWRpb1NlbGVjdG9yOiBcImlucHV0W3R5cGU9cmFkaW9dW2RhdGEtc2hvd10sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtaGlkZV0sIGlucHV0W3R5cGU9cmFkaW9dW2RhdGEtYWRkLWNsYXNzXSwgaW5wdXRbdHlwZT1yYWRpb11bZGF0YS1yZW1vdmUtY2xhc3NdXCIsXG4gIHNlbGVjdFNlbGVjdG9yOiBcIm9wdGlvbltkYXRhLWhpZGVdLCBvcHRpb25bZGF0YS1zaG93XVwiLFxuXG4gIGxpc3RlbjogZnVuY3Rpb24oKXtcbiAgICBFdmVudC5vbihkb2N1bWVudCwgXCJjbGljayBjaGFuZ2VcIiwgXCJbZGF0YS10b2dnbGVdLCBbZGF0YS1zaG93XSwgW2RhdGEtaGlkZV0sIFtkYXRhLXRvZ2dsZS1jbGFzc10sIFtkYXRhLWFkZC1jbGFzc10sIFtkYXRhLXJlbW92ZS1jbGFzc11cIiwgVG9nZ2xlci50cmlnZ2VyKVxuICAgIEV2ZW50Lm9uKGRvY3VtZW50LCBcImNoYW5nZVwiLCBcIi5zZWxlY3QtdG9nZ2xlclwiLCBUb2dnbGVyLnRyaWdnZXIpXG4gICAgRXZlbnQub24od2luZG93LCAnaGFzaGNoYW5nZScsIFRvZ2dsZXIuaGFzaENoYW5nZSlcbiAgfSxcblxuICBoYXNoQ2hhbmdlOiBmdW5jdGlvbigpIHtcbiAgICBpZiAoIHdpbmRvdy5sb2NhdGlvbi5oYXNoICkge1xuXG4gICAgICB2YXIgYW5jaG9yID0gJ1tkYXRhLWFuY2hvcj1cIicrd2luZG93LmxvY2F0aW9uLmhhc2grJ1wiXSdcbiAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnaW5wdXQnK2FuY2hvcisgJywgb3B0aW9uJythbmNob3IgKVxuXG4gICAgICBpZiAoIHRhcmdldCApIHtcbiAgICAgICAgaWYgKCB0YXJnZXQudHlwZSA9PSAncmFkaW8nICkge1xuICAgICAgICAgIHRhcmdldC5jaGVja2VkID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzZWxlY3QgPSBUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24odGFyZ2V0KVxuICAgICAgICAgIHNlbGVjdC5zZWxlY3RlZEluZGV4ID0gdGFyZ2V0LmluZGV4XG4gICAgICAgICAgdGFyZ2V0ID0gc2VsZWN0XG4gICAgICAgIH1cbiAgICAgICAgVG9nZ2xlci50cmlnZ2VyVG9nZ2xpbmcoIHRhcmdldCApXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHJlZnJlc2g6IGZ1bmN0aW9uKCl7XG4gICAgVG9nZ2xlci50b2dnbGVDaGVja2JveGVzKClcbiAgICBUb2dnbGVyLnNldHVwU2VsZWN0cygpXG4gICAgVG9nZ2xlci5zZXR1cFJhZGlvcygpXG4gIH0sXG5cbiAgdHJpZ2dlcjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyBTdG9wIGV2ZW50IGFuZCBidWJibGluZyBpZiBsaW5rIGlzIG9ubHkgYmVpbmcgdXNlZCBhcyBhIHRvZ2dsZXJcbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PSBcIiNcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgZXZlbnQuc3RvcCgpXG4gICAgfSBcblxuICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsaW5nKGV2ZW50LmN1cnJlbnRUYXJnZXQsIGV2ZW50KVxuICB9LFxuXG4gIHRyaWdnZXJUb2dnbGluZzogZnVuY3Rpb24odGFyZ2V0LCBldmVudCkge1xuICAgIHZhciBhY3Rpb25zID0gWydoaWRlJywgJ3RvZ2dsZScsICdzaG93JywgJ3JlbW92ZUNsYXNzJywgJ3RvZ2dsZUNsYXNzJywgJ2FkZENsYXNzJ11cbiAgICB2YXIgc2VsZWN0XG5cbiAgICAvLyBTdG9yZSB0aGUgc2VsZWN0LCBhbmQgc2V0IHRoZSB0YXJnZXQgdG8gdGhlIGN1cnJlbnQgb3B0aW9uXG4gICAgLy8gRXZlbnRzIGZpcmUgb24gdGhlIHNlbGVjdCwgYnV0IHRoZSBvcHRpb25zIGhhdmUgdG9nZ2xpbmcgYXR0cmlidXRlc1xuICAgIGlmICh0YXJnZXQudGFnTmFtZS5tYXRjaCgvc2VsZWN0L2kpKSB7XG4gICAgICBzZWxlY3QgPSB0YXJnZXRcbiAgICAgIHRhcmdldCA9IHNlbGVjdC5zZWxlY3RlZE9wdGlvbnNbMF1cbiAgICB9XG5cbiAgICAvLyBSYWRpbyBpbnB1dHMgYW5kIHNlbGVjdHMgZG8gbm90IHN1cHBvcnQgdG9nZ2xpbmcsIHNvIHJlbW92ZSB0aGVtXG4gICAgYWN0aW9ucyA9IGFjdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGFjdGlvbikge1xuICAgICAgaWYgKHNlbGVjdCB8fCB0YXJnZXQudHlwZSA9PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiAhYWN0aW9uLm1hdGNoKC90b2dnbGUvKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldC5kYXRhc2V0W2FjdGlvbl0gIT0gbnVsbFxuICAgIH0pXG4gICAgXG4gICAgLy8gRGlzcGF0Y2ggYWxsIGFjdGlvbnNcbiAgICBhY3Rpb25zLmZvckVhY2goIGZ1bmN0aW9uKCBhY3Rpb24gKSB7XG4gICAgICBUb2dnbGVyLmRpc3BhdGNoKCB0YXJnZXQsIGFjdGlvbiApXG4gICAgfSlcbiAgfSxcblxuICBkaXNwYXRjaDogZnVuY3Rpb24oZWwsIHR5cGUpIHtcbiAgICB2YXIgYWN0aW9uID0gdHlwZVxuICAgIHZhciBkYXRhID0gZWwuZGF0YXNldFt0eXBlXVxuXG4gICAgLy8gQWJvcnQgaWYgZWxlbWVudCBkb2Vzbid0IGhhdmUgZGF0YSBmb3IgdGhlIGFjdGlvblxuICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YSA9PSAndW5kZWZpbmVkJyB8fCBkYXRhID09ICcnKSByZXR1cm5cblxuICAgIC8vIFRvZ2dsZSBhbmQgc2hvdyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBmb3IgY2hlY2tib3hlc1xuICAgIGlmIChlbC50eXBlID09ICdjaGVja2JveCcpXG4gICAgICBhY3Rpb24gPSAodHlwZS5tYXRjaCgvaGlkZXxyZW1vdmUvaSkgPyAhZWwuY2hlY2tlZCA6IGVsLmNoZWNrZWQpXG5cbiAgICBpZiAoZGF0YSl7XG4gICAgICBpZiAodHlwZS5tYXRjaCgvY2xhc3MvaSkpe1xuICAgICAgICBUb2dnbGVyLnNldENsYXNzKGRhdGEsIGFjdGlvbiwgZWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBUb2dnbGVyLnNldFN0YXRlKGRhdGEsIGFjdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gQWRkLCByZW1vdmUsIG9yIHRvZ2dsZSBjbGFzc25hbWVzLCB0cmlnZ2VyZWQgYnkgZWxlbWVudHMgd2l0aDpcbiAgLy8gIGRhdGEtaGlkZS1jbGFzcywgZGF0YS1zaG93LWNsYXNzLCBhbmQgZGF0YS10b2dnbGUtY2xhc3MgdmFsdWVzXG4gIC8vXG4gIC8vICBEYXRhIHZhbHVlIGV4YW1wbGVzOlxuICAvLyAgIC0gXCJjbGFzc25hbWVcIiAtIGFkZC9yZW1vdmUvdG9nZ2xlIGNsYXNzbmFtZSBvbiBjdXJyZW50IGVsZW1lbnRcbiAgLy8gICAtIFwiZm9vIGJhclwiICAgLSBtdWx0aXBsZSBjbGFzc25hbWVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzIChsaWtlIGh0bWwgY2xhc3MgcHJvcGVydHkpXG4gIC8vICAgLSBcImZvbyBiYXI7IHNlbGVjdG9yXCIgLSBjaGFuZ2UgY2xhc3NuYW1lcyBvbiBlbGVtZW50cyBtYXRjaGVkIGJ5IHNlbGVjdG9yXG4gIC8vICAgLSBcImZvbyBiYXI7IHNlbGVjdG9yLCBzZWxlY3RvclwiIC0gbWF0Y2ggbXVsdGlwbGUgc2VsZWN0b3JzXG4gIC8vXG4gIC8vICBZb3UgY2FuIHBlcmZvcm0gbXVsdGlwbGUgYWRkL3JlbW92ZSBjbGFzc2VzIGJ5IGpvaW5pbmcgdmFsdWVzIHdpdGggYW4gYCZgXG4gIC8vICBGb3IgZXhhbXBsZTogXCJjbGFzc25hbWUgJiBmb28gYmFyOyBzZWxlY3RvclwiXG4gIC8vICBUaGlzIHdvdWxkIHRvZ2dsZSBjbGFzc25hbWUgb24gY3VycmVudCBlbGVtZW50IGFuZCB0b2dnbGUgYGZvbyBiYXJgIGNsYXNzbmFtZXNcbiAgLy8gIG9uIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gIC8vXG5cbiAgc2V0Q2xhc3M6IGZ1bmN0aW9uIChzZWxlY3RvcnMsIGFjdGlvbiwgZWwpe1xuICAgIGlmKHR5cGVvZiBzZWxlY3RvcnMgPT0gJ3VuZGVmaW5lZCcgfHwgc2VsZWN0b3JzID09ICcnKSByZXR1cm5cblxuICAgIGlmICh0eXBlb2YoYWN0aW9uKSA9PSAnYm9vbGVhbicpIHtcbiAgICAgIGFjdGlvbiA9IChhY3Rpb24gPyAnYWRkJyA6ICdyZW1vdmUnKVxuICAgIH1cblxuICAgIGlmIChzZWxlY3RvcnMubWF0Y2goLyYvKSkge1xuICAgICAgc2VsZWN0b3JzLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbihzZWwpe1xuICAgICAgICBUb2dnbGVyLnNldENsYXNzKHNlbC50cmltKCksIGFjdGlvbiwgZWwpIFxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEdldCBzZWxlY3RvciBhbmQgY2xhc3NuYW1lcywgZm9ybWF0OiBcImNsYXNzbmFtZSBjbGFzc25hbWU7IHNlbGVjdG9yLHNlbGVjdG9yXCJcbiAgICB2YXIgc2V0dGluZ3MgPSBzZWxlY3RvcnMuc3BsaXQoJzsnKVxuICAgIHZhciBjbGFzc25hbWVzID0gc2V0dGluZ3NbMF0udHJpbSgpXG4gICAgdmFyIG1hdGNoZXMgPSBbXVxuICAgIHNlbGVjdG9ycyA9IHNldHRpbmdzWzFdXG5cbiAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcnMpXG5cbiAgICAvLyBJZiBubyBzbGVjdG9ycyBhcmUgcHJlc2VudCwgYW5kIGVsIGlzIGFuIE9QVElPTiwgdXNlIGl0cyBTRUxFQ1QgYXMgdGhlIG1hdGNoZWQgZWxlbWVudFxuICAgIH0gZWxzZSBpZiAoZWwgJiYgZWwudGFnTmFtZS5tYXRjaCgvb3B0aW9uL2kpKSB7XG4gICAgICBtYXRjaGVzID0gW1RvZ2dsZXIuZ2V0U2VsZWN0RnJvbU9wdGlvbihlbCldXG4gICAgICBcbiAgICAvLyBJZiBubyBzbGVjdG9ycyBhcmUgcHJlc2VudCwgdXNlIHRoZSBjdXJyZW50IGVsIGZvciBjbGFzc25hbWVzXG4gICAgfSBlbHNlIGlmIChlbCkge1xuICAgICAgbWF0Y2hlcyA9IFtlbF1cbiAgICB9XG5cbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG1hdGNoZXMsIGZ1bmN0aW9uKG1hdGNoKXtcbiAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2xhc3NuYW1lcy5zcGxpdCgnICcpLCBmdW5jdGlvbihjbGFzc25hbWUpIHtcbiAgICAgICAgdmFyIG1ldGhvZCA9IGFjdGlvbi5yZXBsYWNlKC9DbGFzcy8sJycpXG4gICAgICAgIG1hdGNoLmNsYXNzTGlzdFttZXRob2RdKGNsYXNzbmFtZSlcbiAgICAgIH0pXG5cbiAgICAgIFRvZ2dsZXIudHJpZ2dlclRvZ2dsZXJFdmVudHNPbkNoaWxkcmVuKG1hdGNoLCAnY2xhc3MnKVxuICAgIH0pXG4gIH0sXG5cbiAgc2V0U3RhdGU6IGZ1bmN0aW9uKHNlbGVjdG9ycywgc3RhdGUpIHtcbiAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3JzKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChtYXRjaGVzLCBmdW5jdGlvbihtYXRjaCl7XG4gICAgICB2YXIgYWN0aW9uID0gVG9nZ2xlci50b2dnbGVBY3Rpb24obWF0Y2gsIHN0YXRlKVxuXG4gICAgICBUb2dnbGVyW2FjdGlvbl0obWF0Y2gpXG4gICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGVyRXZlbnRzT25DaGlsZHJlbihtYXRjaCwgYWN0aW9uKVxuICAgIH0pXG4gIH0sXG5cbiAgdG9nZ2xlQWN0aW9uOiBmdW5jdGlvbiggZWwsIGFjdGlvbiApIHtcblxuICAgIGlmICggdHlwZW9mIGFjdGlvbiA9PSAnYm9vbGVhbicgKSB7XG4gICAgICBhY3Rpb24gPSAoIGFjdGlvbiA/ICdzaG93JyA6ICdoaWRlJyApXG4gICAgfVxuXG4gICAgaWYgKGFjdGlvbiA9PSAndG9nZ2xlJykge1xuICAgICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpIHx8IGVsLmNsYXNzTGlzdC5jb250YWlucygnaGlkaW5nJykgKSB7XG4gICAgICAgIGFjdGlvbiA9ICdzaG93J1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aW9uID0gJ2hpZGUnXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvblxuICB9LFxuXG4gIHNob3c6IGZ1bmN0aW9uKGVsKSB7XG4gICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICd2aXNpYmxlJyApIHx8IFxuICAgICAgICAgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCAnc2hvd2luZycgKSB8fFxuICAgICAgICAgZWwub2Zmc2V0UGFyZW50ICE9IG51bGwgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGRlbicsICdoaWRpbmcnIClcblxuICAgIHZhciBmdWxseVNob3cgPSBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFJlbW92ZSBoaWRkZW4gYmVjYXVzZSBpdCBtaWdodCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBmaXJlc1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Nob3dpbmcnLCAnaGlkZGVuJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAndmlzaWJsZScgKVxuXG4gICAgICAvLyBFbmFibGUgaW5wdXRzLCBmaWVsZHNldHMgb3IgZm9ybXMgd2hlbiBzaG93blxuICAgICAgaWYgKCB0eXBlb2YgZWwuZGlzYWJsZWQgIT0gJ3VuZGVmaW5lZCcgKXtcbiAgICAgICAgZWwuZGlzYWJsZWQgPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBGb2N1cyBvbiBrZXkgZWxlbWVudCBpZiBhbiBlbGVtZW50IGV4cGVjdHMgZm9jdXNcbiAgICAgIHZhciBmb2N1c0VsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtZm9jdXNdJylcbiAgICAgIGlmIChmb2N1c0VsKSB7IGZvY3VzRWwuZm9jdXMoKSB9XG5cbiAgICAgIC8vIFRyaWdnZXIgaW5wdXQgZXZlbnQgb24gcmFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGhpZGRlblxuICAgICAgdmFyIHJhbmdlcyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhbmdlXScpXG4gICAgfVxuXG4gICAgaWYgKCBlbC5kYXRhc2V0LmFuaW1hdGUgKSB7XG4gICAgICBFdmVudC5hZnRlckFuaW1hdGlvbiggZWwsIGZ1bGx5U2hvdywgdHJ1ZSlcbiAgICAgIGVsLmNsYXNzTGlzdC5hZGQoICdzaG93aW5nJyApXG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGx5U2hvdygpXG4gICAgfVxuICB9LFxuXG4gIGhpZGU6IGZ1bmN0aW9uKGVsKSB7XG4gICAgaWYgKCBlbC5jbGFzc0xpc3QuY29udGFpbnMoICdoaWRkZW4nICkgfHwgXG4gICAgICAgICBlbC5jbGFzc0xpc3QuY29udGFpbnMoICdoaWRpbmcnICkgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgc2hvd2luZyBiZWNhdXNlIGl0IG1pZ2h0IGJlIGFkZGVkIGJlZm9yZSB0aGlzIGZpcmVzXG4gICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ3Zpc2libGUnLCAnc2hvd2luZycgKVxuXG4gICAgdmFyIGZ1bGx5SGlkZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGluZycsICd2aXNpYmxlJyApXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnaGlkZGVuJyApXG5cbiAgICAgIC8vIERpc2FibGUgaW5wdXRzLCBmaWVsZHNldHMgb3IgZm9ybXMgd2hlbiBoaWRkZW5cbiAgICAgIGlmICggdHlwZW9mIGVsLmRpc2FibGVkICE9ICd1bmRlZmluZWQnICl7XG4gICAgICAgIGVsLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICggZWwuZGF0YXNldC5hbmltYXRlICkge1xuICAgICAgRXZlbnQuYWZ0ZXJBbmltYXRpb24oIGVsLCBmdWxseUhpZGUsIHRydWUpXG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKCAnaGlkaW5nJyApXG4gICAgfSBlbHNlIHtcbiAgICAgIGZ1bGx5SGlkZSgpXG4gICAgfVxuICB9LFxuXG4gIGdldExlYWZOb2RlczogZnVuY3Rpb24gKHBhcmVudCkge1xuICAgIC8vIGlzIHRoZSBwYXJlbnQgaXRzZWxmIGEgbGVhZiBub2RlP1xuICAgIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkgcmV0dXJuIFtwYXJlbnRdXG5cbiAgICB2YXIgbm9kZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLCAwKVxuXG4gICAgcmV0dXJuIG5vZGVzLmZpbHRlcihmdW5jdGlvbihlbGVtKSB7XG4gICAgICByZXR1cm4gZWxlbS5jaGlsZHJlbiAmJiBlbGVtLmNoaWxkcmVuLmxlbmd0aCA9PT0gMFxuICAgIH0pXG4gIH0sXG5cbiAgdHJpZ2dlclRvZ2dsZXJFdmVudHNPbkNoaWxkcmVuOiBmdW5jdGlvbihlbCwgZXZlbnROYW1lKXtcbiAgICAvLyB3ZSBjYXJlIGFib3V0IGxlYWYgbm9kZXMgc2luY2UgdGhlIGV2ZW50IHdpbGwgYnViYmxlIHRvXG4gICAgLy8gbm9uLWxlYWYgbm9kZXMgZnJvbSB0aGUgbGVhZiBub2Rlc1xuICAgIHZhciBsZWFmQ2hpbGROb2RlcyA9IFRvZ2dsZXIuZ2V0TGVhZk5vZGVzKGVsKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChsZWFmQ2hpbGROb2RlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgLy8gJ3RvZ2dsZXI6c2hvdycsICd0b2dnbGVyOmhpZGUnLCBldGNcbiAgICAgIEV2ZW50LmZpcmUobm9kZSwgXCJ0b2dnbGVyOlwiICsgZXZlbnROYW1lKVxuICAgIH0pXG4gIH0sXG5cbiAgdG9nZ2xlQ2hlY2tib3hlczogZnVuY3Rpb24oY2hlY2tib3hlcykge1xuICAgIGNoZWNrYm94ZXMgPSBjaGVja2JveGVzIHx8IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoVG9nZ2xlci5jaGVja2JveFNlbGVjdG9yKVxuXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjaGVja2JveGVzLCBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZylcbiAgfSxcblxuICBzZXR1cFJhZGlvczogZnVuY3Rpb24oKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFRvZ2dsZXIucmFkaW9TZWxlY3RvciksIGZ1bmN0aW9uKHJhZGlvLCBpbmRleCl7XG4gICAgICBpZiAoIXJhZGlvLmRhdGFzZXQudG9nZ2xlckFjdGl2ZSkge1xuXG4gICAgICAgIHZhciByYWRpb05hbWUgICAgICAgICA9IHJhZGlvLmdldEF0dHJpYnV0ZSgnbmFtZScpLFxuICAgICAgICAgICAgc2libGluZ3MgICAgICAgICAgPSBUb2dnbGVyLnBhcmVudEZvcm0ocmFkaW8pLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0eXBlPXJhZGlvXVtuYW1lPVwiJytyYWRpb05hbWUrJ1wiXScpLFxuICAgICAgICAgICAgc2hvd1NlbGVjdG9ycyAgICAgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKHNpYmxpbmdzLCAnc2hvdycpLFxuICAgICAgICAgICAgYWRkQ2xhc3NTZWxlY3RvcnMgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKHNpYmxpbmdzLCAnYWRkQ2xhc3MnKSxcbiAgICAgICAgICAgIGNoZWNrZWRcblxuICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHNpYmxpbmdzLCBmdW5jdGlvbihyKXtcblxuICAgICAgICAgIGlmIChyLmRhdGFzZXQuYW5jaG9yICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICgnIycrci5kYXRhc2V0LmFuY2hvci5yZXBsYWNlKCcjJywnJykpKSB7XG4gICAgICAgICAgICByLmNoZWNrZWQgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYWxsIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCBoYXZlIGEgZGVmYXVsdCBkYXRhLXNob3cgdmFsdWUgb2YgJydcbiAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdW5zZXQgZGF0YS1zaG93IHZhbHVlcyB3aWxsIHRvZ2dsZSBvZmYgZXZlcnl0aGluZ1xuICAgICAgICAgIC8vXG4gICAgICAgICAgci5kYXRhc2V0LnNob3cgPSByLmRhdGFzZXQuc2hvdyB8fCAnJ1xuICAgICAgICAgIHIuZGF0YXNldC5hZGRDbGFzcyA9IHIuZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gQXBwZW5kIGVsZW1lbnQncyBkYXRhLWhpZGUgdG8gc2hvd1NlbGVjdG9yc1xuICAgICAgICAgIGlmICggci5kYXRhc2V0LmhpZGUgJiYgci5kYXRhc2V0LmhpZGUubGVuZ3RoID4gMCApXG4gICAgICAgICAgICBzaG93U2VsZWN0b3JzID0gc2hvd1NlbGVjdG9ycy5jb25jYXQoIHIuZGF0YXNldC5oaWRlLnNwbGl0KCAnLCcgKSApXG5cbiAgICAgICAgICByLmRhdGFzZXQuaGlkZSA9IHNob3dTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiByLmRhdGFzZXQuc2hvdy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignLCcpXG5cbiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBhbGwgcmFkaW8gYnV0dG9ucyBpbiBhIGdyb3VwIGhhdmUgYSBkZWZhdWx0IGRhdGEtYWRkLWNsYXNzIHZhbHVlIG9mICcnXG4gICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHVuc2V0IGRhdGEtYWRkLWNsYXNzIHZhbHVlcyBhcmUgdG9nZ2xlIG9mZiBhbGwgY2xhc3Nlc1xuICAgICAgICAgIC8vXG4gICAgICAgICAgci5kYXRhc2V0LmFkZENsYXNzID0gci5kYXRhc2V0LmFkZENsYXNzIHx8ICcnXG5cbiAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBzZWxlY3RlZCByYWRpbyBidXR0b25zIHJlbW92ZSBjbGFzc2VzIGFjY29yZGluZ1xuICAgICAgICAgIC8vIHRvIHRoZSBkZXNlbGVjdGVkIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgICByLmRhdGFzZXQucmVtb3ZlQ2xhc3MgPSBhZGRDbGFzc1NlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3Ipe1xuICAgICAgICAgICAgcmV0dXJuIHIuZGF0YXNldC5hZGRDbGFzcy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignJicpXG5cblxuICAgICAgICAgIHIuZGF0YXNldC50b2dnbGVyQWN0aXZlID0gdHJ1ZVxuXG5cbiAgICAgICAgICBpZiggci5jaGVja2VkICkgY2hlY2tlZCA9IHJcblxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICggY2hlY2tlZCApIHtcbiAgICAgICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyggY2hlY2tlZCApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgVG9nZ2xlci5zZXRTdGF0ZSggc2hvd1NlbGVjdG9ycy5qb2luKCcsJyksICdoaWRlJyApXG4gICAgICAgICAgVG9nZ2xlci5zZXRDbGFzcyggYWRkQ2xhc3NTZWxlY3RvcnMuam9pbignICYgJyksICdyZW1vdmVDbGFzcycgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KVxuICB9LFxuXG4gIC8vIEFkZCBkYXRhLWhpZGUgdG8gZWFjaCA8b3B0aW9uPiBjb250YWluaW5nIHRoZSBzZWxlY3RvcnMgZnJvbSBvdGhlclxuICAvLyBvcHRpb24ncyBkYXRhLXNob3cuIFRoaXMgbWFrZXMgdGhlIHRvZ2dsaW5nIG9mIGVsZW1lbnRzIGV4Y2x1c2l2ZS5cbiAgLy9cbiAgc2V0dXBTZWxlY3RzOiBmdW5jdGlvbigpe1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChUb2dnbGVyLnNlbGVjdFNlbGVjdG9yKSwgZnVuY3Rpb24ob3B0aW9uKXtcbiAgICAgIC8vIFByZXZlbnQgYW4gb3B0aW9uIGZyb20gYmVpbmcgY29uc2lkZXJlZCB0d2ljZVxuICAgICAgaWYgKCFvcHRpb24uZGF0YXNldC50b2dnbGVyQWN0aXZlKSB7XG5cbiAgICAgICAgb3B0aW9uLmRhdGFzZXQuc2hvdyA9IG9wdGlvbi5kYXRhc2V0LnNob3cgfHwgJydcblxuICAgICAgICB2YXIgc2VsZWN0ID0gVG9nZ2xlci5nZXRTZWxlY3RGcm9tT3B0aW9uKG9wdGlvbilcbiAgICAgICAgc2VsZWN0LmNsYXNzTGlzdC5hZGQoJ3NlbGVjdC10b2dnbGVyJylcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBzZWxlY3QucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJylcblxuICAgICAgICB2YXIgc2hvd1NlbGVjdG9ycyAgICAgPSBUb2dnbGVyLmRhdGFBdHRyaWJ1dGVzKG9wdGlvbnMsICdzaG93JylcbiAgICAgICAgdmFyIGFkZENsYXNzU2VsZWN0b3JzID0gVG9nZ2xlci5kYXRhQXR0cmlidXRlcyhvcHRpb25zLCAnYWRkQ2xhc3MnKVxuXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwob3B0aW9ucywgZnVuY3Rpb24obywgaW5kZXgpIHtcblxuICAgICAgICAgIGlmIChvLmRhdGFzZXQuYW5jaG9yICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICgnIycrby5kYXRhc2V0LmFuY2hvci5yZXBsYWNlKCcjJywnJykpKSB7XG4gICAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGluZGV4XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgby5kYXRhc2V0LnNob3cgPSBvLmRhdGFzZXQuc2hvdyB8fCAnJ1xuICAgICAgICAgIG8uZGF0YXNldC5hZGRDbGFzcyA9IG8uZGF0YXNldC5hZGRDbGFzcyB8fCAnJ1xuXG4gICAgICAgICAgLy8gQXBwZW5kIGVsZW1lbnQncyBkYXRhLWhpZGUgdG8gc2hvd1NlbGVjdG9yc1xuICAgICAgICAgIGlmICggby5kYXRhc2V0LmhpZGUgJiYgby5kYXRhc2V0LmhpZGUubGVuZ3RoID4gMCApXG4gICAgICAgICAgICBzaG93U2VsZWN0b3JzID0gc2hvd1NlbGVjdG9ycy5jb25jYXQoIG8uZGF0YXNldC5oaWRlLnNwbGl0KCAnLCcgKSApXG5cbiAgICAgICAgICAvLyBJZiBzaG93IHNlbGVjdG9ycyBhcmUgbm90IHByZXNlbnQgaW4gZWxlbWVudCdzIGRhdGEtc2hvd1xuICAgICAgICAgIC8vIEFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIHNlbGVjdG9ycyB0byBiZSBoaWRkZW5cbiAgICAgICAgICBvLmRhdGFzZXQuaGlkZSA9IHNob3dTZWxlY3RvcnMuZmlsdGVyKGZ1bmN0aW9uKHNlbGVjdG9yKXtcbiAgICAgICAgICAgIHJldHVybiBvLmRhdGFzZXQuc2hvdy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignLCcpXG5cbiAgICAgICAgICBvLmRhdGFzZXQucmVtb3ZlQ2xhc3MgPSBhZGRDbGFzc1NlbGVjdG9ycy5maWx0ZXIoZnVuY3Rpb24oc2VsZWN0b3Ipe1xuICAgICAgICAgICAgcmV0dXJuIG8uZGF0YXNldC5hZGRDbGFzcy5pbmRleE9mKCBzZWxlY3RvciApXG4gICAgICAgICAgfSkuam9pbignICYgJylcblxuICAgICAgICAgIG8uZGF0YXNldC50b2dnbGVyQWN0aXZlID0gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24gaXMgdG9nZ2xlZCBwcm9wZXJseVxuICAgICAgICAvL1xuICAgICAgICBUb2dnbGVyLnRyaWdnZXJUb2dnbGluZyhzZWxlY3QpXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICAvLyBGaW5kIHBhcmVudCA8c2VsZWN0PiBmb3IgYW4gb3B0aW9uIChhY2NvdW50cyBmb3Igb3B0aW9uIGdyb3VwcylcbiAgLy9cbiAgZ2V0U2VsZWN0RnJvbU9wdGlvbjogZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgcCA9IGVsLnBhcmVudEVsZW1lbnRcblxuICAgIGlmIChwLnRhZ05hbWUgPT0gJ1NFTEVDVCcpIHtcbiAgICAgIHJldHVybiBwXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBUb2dnbGVyLmdldFNlbGVjdEZyb21PcHRpb24ocClcbiAgICB9XG4gIH0sXG5cblxuICAvLyBGaW5kIHBhcmVudCA8Zm9ybT4gb3IgZG9jdW1lbnQgaWYgdGhlcmUgaXMgbm8gZm9ybVxuICAvL1xuICBwYXJlbnRGb3JtOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgdmFyIGVsID0gZWxlbWVudFxuXG4gICAgd2hpbGUgKGVsICYmIGVsLnRhZ05hbWUgIT0gXCJGT1JNXCIpIHtcbiAgICAgIGVsID0gZWwucGFyZW50Tm9kZVxuICAgIH1cblxuICAgIHJldHVybiBlbCB8fCBkb2N1bWVudFxuICB9LFxuXG4gIC8vIFJldHVybiBhIHVuaXF1ZSBhcnJheSBvZiBhbGwgZGF0YSBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZWxlbWVudHNcbiAgLy9cbiAgZGF0YUF0dHJpYnV0ZXM6IGZ1bmN0aW9uKGVsZW1lbnRzLCBhdHRyKSB7XG4gICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlbGVtZW50cywgZnVuY3Rpb24oZWwpIHsgXG4gICAgICByZXR1cm4gZWwuZGF0YXNldFthdHRyXVxuICAgIH0pLmZpbHRlcihmdW5jdGlvbihzZWxlY3RvcnMsIGluZGV4LCBzZWxmKSB7XG4gICAgICByZXR1cm4gc2VsZWN0b3JzICE9IFwiXCIgJiYgdHlwZW9mIHNlbGVjdG9ycyAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLmluZGV4T2Yoc2VsZWN0b3JzKSA9PT0gaW5kZXhcbiAgICB9KVxuICB9XG59XG5cbkV2ZW50LnJlYWR5KFRvZ2dsZXIubGlzdGVuKVxuRXZlbnQuY2hhbmdlKFRvZ2dsZXIucmVmcmVzaClcblxubW9kdWxlLmV4cG9ydHMgPSBUb2dnbGVyXG4iLCIvLyBTaGltc1xucmVxdWlyZSggJy4vbGliL3NoaW1zL19jbGFzc2xpc3QnIClcbnZhciBtZXJnZSAgICA9IHJlcXVpcmUoICcuL2xpYi9zaGltcy9fb2JqZWN0LmFzc2lnbicgKSxcbiAgICBldmVudCAgICA9IHJlcXVpcmUoICdjb21wb3NlLWV2ZW50JyApLFxuICAgIGx1eG9uICAgID0gcmVxdWlyZSggJ2x1eG9uJyApLFxuICAgIHRpbWUgICAgID0gbWVyZ2UocmVxdWlyZSggJy4vbGliL3RpbWUnICksIGx1eG9uKSxcbiAgICBzY3JvbGxUbyA9IHJlcXVpcmUoICcuL2xpYi9zY3JvbGx0bycgKSxcbiAgICBmcm9tVG9wICA9IHJlcXVpcmUoICcuL2xpYi9mcm9tdG9wJyApLFxuICAgIGVhc2UgICAgID0gcmVxdWlyZSggJy4vbGliL2Vhc2UnIClcblxudmFyIHRvb2xib3ggPSB7XG5cbiAgZXZlbnQ6IGV2ZW50LFxuICBzY3JvbGxUbzogc2Nyb2xsVG8sXG4gIGZyb21Ub3A6IGZyb21Ub3AsXG4gIG1lcmdlOiBtZXJnZSxcbiAgZWFzZTogZWFzZSxcbiAgdGltZTogdGltZSxcblxuICAvLyBHZXQgY2xvc2VzdCBET00gZWxlbWVudCB1cCB0aGUgdHJlZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3RvclxuICBnZXRDbG9zZXN0OiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCB0b29sYm94Lm1hdGNoZXMoIGVsLCBzZWxlY3RvciApICkgcmV0dXJuIGVsXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9LFxuXG4gIGNoaWxkT2Y6IGZ1bmN0aW9uICggZWwsIHBhcmVudCApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbCA9PSBwYXJlbnQgKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0sXG5cbiAgLy8gR2V0IG5leHQgRE9NIGVsZW1lbnQgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gc2VsZWN0b3JcbiAgZ2V0TmV4dDogZnVuY3Rpb24oIGVsLCBzZWxlY3RvciApIHtcbiAgICBmb3IgKCA7IGVsICYmIGVsICE9PSBkb2N1bWVudDsgZWwgPSBlbC5wYXJlbnROb2RlICkge1xuICAgICAgaWYgKCBlbC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApICkgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3IoIHNlbGVjdG9yICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvLyBNYXRjaGVzIHNlbGVjdG9yIGZ1bmN0aW9uXG4gIC8vIEByZWZlcmVuY2UgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvbWF0Y2hlc1xuICBtYXRjaGVzOiBmdW5jdGlvbiAoIGVsLCBzZWxlY3RvciApIHtcbiAgICByZXR1cm4gKCBlbC5tYXRjaGVzIHx8IGVsLm1hdGNoZXNTZWxlY3RvciB8fCBlbC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsLm9NYXRjaGVzU2VsZWN0b3IgKS5jYWxsKCBlbCwgc2VsZWN0b3IgKTtcbiAgfSxcblxuICB3b3JkQ291bnQ6IGZ1bmN0aW9uKCBzdHIgKSB7XG4gICAgdmFyIG1hdGNoZXMgPSBzdHIubWF0Y2goIC9cXFMrL2cgKTtcbiAgICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXMubGVuZ3RoIDogMDtcbiAgfSxcblxuICAvLyBFYXN5IGFjY2VzcyB0byBzbGljZSBmb3IgY29udmVydGluZyBvYmplY3RzIGludG8gYXJyYXlzIG9mIHZhbHVlcy5cbiAgc2xpY2U6IGZ1bmN0aW9uKCBvYmosIGNvdW50ICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggb2JqLCBjb3VudCApXG4gIH0sXG5cbiAgZWFjaDogZnVuY3Rpb24oIGNvbGxlY3Rpb24sIGNhbGxiYWNrICkge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKCBjb2xsZWN0aW9uLCBjYWxsYmFjayApXG4gIH0sXG5cbiAgaXNFbGVtZW50OiBmdW5jdGlvbiAoIGl0ZW0gKSB7XG4gICAgcmV0dXJuIGl0ZW0uY29uc3RydWN0b3IudG9TdHJpbmcoKS5zZWFyY2goL0hUTUwuK0VsZW1lbnQvKSA+IC0xXG4gIH0sXG5cbiAgZm9ybURhdGE6IGZ1bmN0aW9uKCByb290RWwgKSB7XG4gICAgdmFyIGZvcm1EYXRhICA9IG5ldyBGb3JtRGF0YSgpLFxuICAgICAgICBmaWVsZHMgPSB0b29sYm94LnNsaWNlKHJvb3RFbC5xdWVyeVNlbGVjdG9yQWxsKCAnaW5wdXRbbmFtZV06bm90KFtkaXNhYmxlZF0pLCBzZWxlY3RbbmFtZV06bm90KFtkaXNhYmxlZF0pLCB0ZXh0YXJlYVtuYW1lXTpub3QoW2Rpc2FibGVkXSknICkpXG4gICAgdmFyIGZpZWxkRGF0YSA9IHt9XG5cbiAgICAvLyBSZW1vdmUgYW55IGZpZWxkIHdoaWNoIGhhcyBhIHBhcmVudCB3aGljaCBpcyBkaXNhYmxlZFxuICAgIGZpZWxkcyA9IGZpZWxkcy5maWx0ZXIoIGZ1bmN0aW9uKCBmICkgeyByZXR1cm4gIXRvb2xib3guZ2V0Q2xvc2VzdChmLCAnW2Rpc2FibGVkXScpIH0pXG5cbiAgICAvLyBMb29wIG92ZXIgZmllbGRzXG4gICAgLy8gcmV2ZXJzZSB0aGVtIGJlY2F1c2UgaWYgdGhlcmUgYXJlIHR3byBpbnB1dHMgd2l0aCB0aGUgc2FtZSBuYW1lXG4gICAgLy8gdGhlIGxhc3QgaW5wdXQgb3ZlcnJpZGVzIHRoZSBmaXJzdC5cbiAgICBmaWVsZHMucmV2ZXJzZSgpLmZvckVhY2goIGZ1bmN0aW9uKCBmaWVsZCApIHtcbiAgICAgIGlmICggdG9vbGJveC5tYXRjaGVzKCBmaWVsZCwgJ1t0eXBlPXJhZGlvXSwgW3R5cGU9Y2hlY2tib3hdJykgKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBjaGVja2JveCBvciByYWRpbyBpbnB1dCwgb3ZlcndyaXRlIHdpdGggY2hlY2tlZCB2YWx1ZXNcbiAgICAgICAgaWYgKCBmaWVsZC5jaGVja2VkICkgZmllbGREYXRhW2ZpZWxkLm5hbWVdID0gZmllbGRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE9ubHkgYWRkIG9uZSB2YWx1ZSBwZXIgZmllbGQgbmFtZVxuICAgICAgICBmaWVsZERhdGFbZmllbGQubmFtZV0gPSBmaWVsZERhdGFbZmllbGQubmFtZV0gfHwgZmllbGRcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgZm9yICggdmFyIG5hbWUgaW4gZmllbGREYXRhICkge1xuICAgICAgLy8gQXBwZW5kIGN1cnJlbnQgZmllbGTigJlzIG5hbWUvdmFsdWUgdG8gbmV3IGZvcm1EYXRhIG9iamVjdFxuICAgICAgZm9ybURhdGEuYXBwZW5kKCBuYW1lLCBmaWVsZERhdGFbbmFtZV0udmFsdWUgKTtcbiAgICB9XG5cbiAgICAvLyBUaGVuIHJldHVybiBzYWlkIGZvcm1EYXRhIG9iamVjdFxuICAgIHJldHVybiBmb3JtRGF0YTtcbiAgfVxuXG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSB0b29sYm94XG4iLCIvLyBlYXNpbmcgZnVuY3Rpb25zIGh0dHA6Ly9naXptYS5jb20vZWFzaW5nL1xudmFyIGVhc2UgPSB7XG5cbiAgaW5PdXRRdWFkOiBmdW5jdGlvbiAodCwgYiwgYywgZCkge1xuICAgIHQgLz0gZC8yXG4gICAgaWYgKHQgPCAxKSB7IHJldHVybiBjLzIqdCp0ICsgYiB9XG4gICAgdC0tXG4gICAgcmV0dXJuIC1jLzIgKiAodCoodC0yKSAtIDEpICsgYlxuICB9LFxuXG4gIGluT3V0Q3ViaWM6IGZ1bmN0aW9uICh0LCBiLCBjLCBkKSB7XG5cdHQgLz0gZC8yO1xuXHRpZiAodCA8IDEpIHJldHVybiBjLzIqdCp0KnQgKyBiO1xuXHR0IC09IDI7XG5cdHJldHVybiBjLzIqKHQqdCp0ICsgMikgKyBiO1xuICB9LFxuXG4gIGluT3V0UXVpbnQ6IGZ1bmN0aW9uKHQsIGIsIGMsIGQpIHtcbiAgICB2YXIgdHMgPSAodC89ZCkqdCxcbiAgICB0YyA9IHRzKnQ7XG4gICAgcmV0dXJuIGIrYyooNip0Yyp0cyArIC0xNSp0cyp0cyArIDEwKnRjKTtcbiAgfSxcblxuICBpbk91dENpcmM6IGZ1bmN0aW9uICh0LCBiLCBjLCBkKSB7XG4gICAgdCAvPSBkLzI7XG4gICAgaWYgKHQgPCAxKSByZXR1cm4gLWMvMiAqIChNYXRoLnNxcnQoMSAtIHQqdCkgLSAxKSArIGI7XG4gICAgdCAtPSAyO1xuICAgIHJldHVybiBjLzIgKiAoTWF0aC5zcXJ0KDEgLSB0KnQpICsgMSkgKyBiO1xuICB9XG5cbn1cblxuZWFzZS5kZWZhdWx0ID0gZWFzZS5pbk91dFF1YWRcblxubW9kdWxlLmV4cG9ydHMgPSBlYXNlXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCBlbCApIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoIGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldCApO1xufVxuIiwidmFyIGVhc2UgICAgPSByZXF1aXJlKCAnLi9lYXNlJyApXG52YXIgZnJvbVRvcCA9IHJlcXVpcmUoICcuL2Zyb210b3AnIClcblxuZnVuY3Rpb24gbW92ZShhbW91bnQpIHtcblxuICAvLyBTY3JvbGwgYWxsIGJlY2F1c2UgZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudCBpcyBzdGlsbCBleHBpcmVtZW50YWxcbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IGFtb3VudDtcbiAgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbFRvcCA9IGFtb3VudDtcbiAgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgPSBhbW91bnQ7XG5cbn1cblxuZnVuY3Rpb24gcG9zaXRpb24oKSB7XG4gIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XG59XG5cbmZ1bmN0aW9uIHNjcm9sbFRvKHRvLCBjYWxsYmFjaywgZHVyYXRpb24pIHtcblxuICAvLyBNYWtpbmcgYXJncyBmbGV4aWJsZVxuICAvL1xuICAvLyBBbGxvdyBmb3IgZWxlbWVudCBvciB5LWNvb3JkaW5hdGVzXG4gIGlmKCB0eXBlb2YoIHRvICkgPT09ICdvYmplY3QnICkgeyB0byA9IGZyb21Ub3AoIHRvICkgfVxuXG4gIC8vIEFjY2VwdCBkdXJhdGlvbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG4gIGlmKCB0eXBlb2YoIGNhbGxiYWNrICkgPT09ICdudW1iZXInICkgeyBkdXJhdGlvbiA9IGNhbGxiYWNrOyBjYWxsYmFjayA9IG51bGwgfVxuXG4gIC8vIERlZmF1bHQgZHVyYXRpb24gPSA1MDBcbiAgZHVyYXRpb24gPSAoIHR5cGVvZiggZHVyYXRpb24gKSA9PT0gJ3VuZGVmaW5lZCcgKSA/IDUwMCA6IGR1cmF0aW9uXG5cbiAgdmFyIHN0YXJ0ID0gcG9zaXRpb24oKSxcbiAgICBjaGFuZ2UgPSB0byAtIHN0YXJ0LFxuICAgIGN1cnJlbnRUaW1lID0gMCxcbiAgICBpbmNyZW1lbnQgPSAyMDtcblxuXG4gIHZhciBhbmltYXRlU2Nyb2xsID0gZnVuY3Rpb24oKSB7XG5cbiAgICAvLyBpbmNyZW1lbnQgdGhlIHRpbWVcbiAgICBjdXJyZW50VGltZSArPSBpbmNyZW1lbnRcblxuICAgIC8vIGZpbmQgdGhlIHZhbHVlIHdpdGggdGhlIHF1YWRyYXRpYyBpbi1vdXQgZWFzaW5nIGZ1bmN0aW9uXG4gICAgdmFyIHZhbCA9IGVhc2UuZGVmYXVsdChjdXJyZW50VGltZSwgc3RhcnQsIGNoYW5nZSwgZHVyYXRpb24pXG5cbiAgICAvLyBtb3ZlIHRoZSBkb2N1bWVudC5ib2R5XG4gICAgbW92ZSh2YWwpO1xuXG4gICAgLy8gZG8gdGhlIGFuaW1hdGlvbiB1bmxlc3MgaXRzIG92ZXJcbiAgICBpZiAoIGN1cnJlbnRUaW1lIDwgZHVyYXRpb24gKSB7XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGFuaW1hdGVTY3JvbGwgKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIGNhbGxiYWNrICYmIHR5cGVvZiggY2FsbGJhY2sgKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYW5pbWF0ZVNjcm9sbCgpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsVG9cbiIsIi8qKlxuICogQ2xhc3NMaXN0IHBvbHlmaWxsXG4gKiBDcm9zcy1icm93c2VyIGZ1bGwgZWxlbWVudC5jbGFzc0xpc3QgaW1wbGVtZW50YXRpb25cbiAqIEBzb3VyY2UgaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL2NsYXNzTGlzdC5qcy9ibG9iL21hc3Rlci9jbGFzc0xpc3QuanNcbiAqIEBhdXRob3IgRWxpIEdyZXkgLSBodHRwOi8vZWxpZ3JleS5jb21cbiAqIEBsaWNlbnNlIE1JVFxuICoqL1xuXG5pZiAoICdkb2N1bWVudCcgaW4gc2VsZiApIHtcblxuICAvLyBGdWxsIHBvbHlmaWxsIGZvciBicm93c2VycyB3aXRoIG5vIGNsYXNzTGlzdCBzdXBwb3J0XG4gIGlmICggISggJ2NsYXNzTGlzdCcgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ18nICkgKSApIHtcblxuICAgICggZnVuY3Rpb24oIHZpZXcgKSB7XG5cbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBpZiAoICEoICdFbGVtZW50JyBpbiB2aWV3ICkgKSByZXR1cm47XG5cbiAgICB2YXJcbiAgICAgIGNsYXNzTGlzdFByb3AgPSAnY2xhc3NMaXN0JyxcbiAgICAgIHByb3RvUHJvcCAgICAgPSAncHJvdG90eXBlJyxcbiAgICAgIGVsZW1DdHJQcm90byAgPSB2aWV3LkVsZW1lbnRbIHByb3RvUHJvcCBdLFxuICAgICAgb2JqQ3RyICAgICAgICA9IE9iamVjdCxcblxuICAgICAgc3RyVHJpbSA9IFN0cmluZ1sgcHJvdG9Qcm9wIF0udHJpbSB8fCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZSggL15cXHMrfFxccyskL2csICcnICk7XG4gICAgICB9LFxuXG4gICAgICBhcnJJbmRleE9mID0gQXJyYXlbIHByb3RvUHJvcCBdLmluZGV4T2YgfHwgZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgICAgaWYgKCBpIGluIHRoaXMgJiYgdGhpc1sgaSBdID09PSBpdGVtICkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0sXG5cbiAgICAgIERPTUV4ID0gZnVuY3Rpb24oIHR5cGUsIG1lc3NhZ2UgKSB7XG4gICAgICAgIHRoaXMubmFtZSAgICA9IHR5cGU7XG4gICAgICAgIHRoaXMuY29kZSAgICA9IERPTUV4Y2VwdGlvblsgdHlwZSBdO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfSxcblxuICAgICAgY2hlY2tUb2tlbkFuZEdldEluZGV4ID0gZnVuY3Rpb24oIGNsYXNzTGlzdCwgdG9rZW4gKSB7XG4gICAgICAgIGlmICggdG9rZW4gPT09ICcnICkge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeChcbiAgICAgICAgICAgICdTWU5UQVhfRVJSJyxcbiAgICAgICAgICAgICdBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIC9cXHMvLnRlc3QoIHRva2VuICkgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4KFxuICAgICAgICAgICAgJ0lOVkFMSURfQ0hBUkFDVEVSX0VSUicsXG4gICAgICAgICAgICAnU3RyaW5nIGNvbnRhaW5zIGFuIGludmFsaWQgY2hhcmFjdGVyJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyckluZGV4T2YuY2FsbCggY2xhc3NMaXN0LCB0b2tlbiApO1xuICAgICAgfSxcblxuICAgICAgQ2xhc3NMaXN0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgICAgIHZhciB0cmltbWVkQ2xhc3NlcyA9IHN0clRyaW0uY2FsbCggZWxlbS5nZXRBdHRyaWJ1dGUoICdjbGFzcycgKSB8fCAnJyApLFxuICAgICAgICAgICAgY2xhc3NlcyA9IHRyaW1tZWRDbGFzc2VzID8gdHJpbW1lZENsYXNzZXMuc3BsaXQoIC9cXHMrLyApIDogW107XG5cbiAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgY2xhc3Nlcy5sZW5ndGg7IGkrKyApIHtcbiAgICAgICAgICB0aGlzLnB1c2goIGNsYXNzZXNbIGkgXSApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoICdjbGFzcycsIHRoaXMudG9TdHJpbmcoKSApO1xuICAgICAgICB9O1xuICAgICAgfSxcblxuICAgICAgY2xhc3NMaXN0UHJvdG8gPSBDbGFzc0xpc3RbIHByb3RvUHJvcCBdID0gW10sXG5cbiAgICAgIGNsYXNzTGlzdEdldHRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENsYXNzTGlzdCggdGhpcyApO1xuICAgICAgfTtcblxuICAgIERPTUV4WyBwcm90b1Byb3AgXSA9IEVycm9yWyBwcm90b1Byb3AgXTtcblxuICAgIGNsYXNzTGlzdFByb3RvLml0ZW0gPSBmdW5jdGlvbiggaSApIHtcbiAgICAgIHJldHVybiB0aGlzWyBpIF0gfHwgbnVsbDtcbiAgICB9O1xuXG4gICAgY2xhc3NMaXN0UHJvdG8uY29udGFpbnMgPSBmdW5jdGlvbiggdG9rZW4gKSB7XG4gICAgICB0b2tlbiArPSAnJztcbiAgICAgIHJldHVybiBjaGVja1Rva2VuQW5kR2V0SW5kZXgoIHRoaXMsIHRva2VuICkgIT09IC0xO1xuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by5hZGQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhclxuICAgICAgICB0b2tlbnMgID0gYXJndW1lbnRzLFxuICAgICAgICBpdGVyICAgID0gMCxcbiAgICAgICAgbGVuICAgICA9IHRva2Vucy5sZW5ndGgsXG4gICAgICAgIHVwZGF0ZWQgPSBmYWxzZSxcbiAgICAgICAgdG9rZW47XG5cbiAgICAgIGRvIHtcbiAgICAgICAgdG9rZW4gPSB0b2tlbnNbIGl0ZXIgXSArICcnO1xuICAgICAgICBpZiAoIGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKSA9PT0gLTEgKSB7XG4gICAgICAgICAgdGhpcy5wdXNoKCB0b2tlbiApO1xuICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICggKytpdGVyIDwgbGVuICk7XG5cbiAgICAgIGlmICggdXBkYXRlZCApIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ2xhc3NOYW1lKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyXG4gICAgICAgIHRva2VucyAgPSBhcmd1bWVudHMsXG4gICAgICAgIGl0ZXIgICAgPSAwLFxuICAgICAgICBsZW4gICAgID0gdG9rZW5zLmxlbmd0aCxcbiAgICAgICAgdXBkYXRlZCA9IGZhbHNlLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgaW5kZXg7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgdG9rZW4gPSB0b2tlbnNbIGl0ZXIgXSArICcnO1xuICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKTtcblxuICAgICAgICB3aGlsZSAoIGluZGV4ICE9PSAtMSApIHtcbiAgICAgICAgICB0aGlzLnNwbGljZSggaW5kZXgsIDEgKTtcbiAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpbmRleCA9IGNoZWNrVG9rZW5BbmRHZXRJbmRleCggdGhpcywgdG9rZW4gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoICsraXRlciA8IGxlbiApO1xuXG4gICAgICBpZiAoIHVwZGF0ZWQgKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNsYXNzTmFtZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjbGFzc0xpc3RQcm90by50b2dnbGUgPSBmdW5jdGlvbiggdG9rZW4sIGZvcmNlICkge1xuICAgICAgdG9rZW4gKz0gJyc7XG5cbiAgICAgIHZhclxuICAgICAgICByZXN1bHQgPSB0aGlzLmNvbnRhaW5zKCB0b2tlbiApLFxuICAgICAgICBtZXRob2QgPSByZXN1bHQgPyBmb3JjZSAhPT0gdHJ1ZSAmJiAncmVtb3ZlJyA6IGZvcmNlICE9PSBmYWxzZSAmJiAnYWRkJztcblxuICAgICAgaWYgKCBtZXRob2QgKSB7XG4gICAgICAgIHRoaXNbIG1ldGhvZCBdKCB0b2tlbiApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIGZvcmNlID09PSB0cnVlIHx8IGZvcmNlID09PSBmYWxzZSApIHtcbiAgICAgICAgcmV0dXJuIGZvcmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNsYXNzTGlzdFByb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5qb2luKCAnICcgKTtcbiAgICB9O1xuXG4gICAgaWYgKCBvYmpDdHIuZGVmaW5lUHJvcGVydHkgKSB7XG4gICAgICB2YXIgY2xhc3NMaXN0UHJvcERlc2MgPSB7XG4gICAgICAgICAgZ2V0ICAgICAgICAgIDogY2xhc3NMaXN0R2V0dGVyLFxuICAgICAgICAgIGVudW1lcmFibGUgICA6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlIDogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KCBlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjICk7XG4gICAgICB9XG5cbiAgICAgIGNhdGNoICggZXggKSB7XG4gICAgICAgIGlmICggZXgubnVtYmVyID09PSAtMHg3RkY1RUM1NCApIHtcbiAgICAgICAgICBjbGFzc0xpc3RQcm9wRGVzYy5lbnVtZXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgb2JqQ3RyLmRlZmluZVByb3BlcnR5KCBlbGVtQ3RyUHJvdG8sIGNsYXNzTGlzdFByb3AsIGNsYXNzTGlzdFByb3BEZXNjICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoIG9iakN0clsgcHJvdG9Qcm9wIF0uX19kZWZpbmVHZXR0ZXJfXyApIHtcbiAgICAgIGVsZW1DdHJQcm90by5fX2RlZmluZUdldHRlcl9fKCBjbGFzc0xpc3RQcm9wLCBjbGFzc0xpc3RHZXR0ZXIgKTtcbiAgICB9XG5cbiAgICB9KCBzZWxmICkpO1xuXG4gIH0gZWxzZSB7XG5cbiAgICAoIGZ1bmN0aW9uKCkge1xuXG4gICAgICAndXNlIHN0cmljdCc7XG5cbiAgICAgIHZhciB0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdfJyApO1xuXG4gICAgICB0ZXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCAnYzEnLCAnYzInICk7XG5cbiAgICAgIGlmICggIXRlc3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyggJ2MyJyApICkge1xuICAgICAgICB2YXIgY3JlYXRlTWV0aG9kID0gZnVuY3Rpb24oIG1ldGhvZCApIHtcbiAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlWyBtZXRob2QgXTtcblxuICAgICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGVbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHRva2VuICkge1xuICAgICAgICAgICAgdmFyIGksIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG5cbiAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG4gICAgICAgICAgICAgIHRva2VuID0gYXJndW1lbnRzWyBpIF07XG4gICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwoIHRoaXMsIHRva2VuICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgY3JlYXRlTWV0aG9kKCAnYWRkJyApO1xuICAgICAgICBjcmVhdGVNZXRob2QoICdyZW1vdmUnICk7XG4gICAgICB9XG5cbiAgICAgIHRlc3RFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoICdjMycsIGZhbHNlICk7XG5cbiAgICAgIGlmICggdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCAnYzMnICkgKSB7XG4gICAgICAgIHZhciBfdG9nZ2xlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGU7XG5cbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiggdG9rZW4sIGZvcmNlICkge1xuICAgICAgICAgIGlmICggMSBpbiBhcmd1bWVudHMgJiYgIXRoaXMuY29udGFpbnMoIHRva2VuICkgPT09ICFmb3JjZSApIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JjZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIF90b2dnbGUuY2FsbCggdGhpcywgdG9rZW4gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgIH1cblxuICAgICAgdGVzdEVsZW1lbnQgPSBudWxsO1xuXG4gICAgfSgpKTtcblxuICB9XG59XG4iLCIvKipcbiAqIE9iamVjdC5hc3NpZ24gcG9seWZpbGxcbiAqIENyb3NzLWJyb3dzZXIgZnVsbCBPYmplY3QuYXNzaWduIGltcGxlbWVudGF0aW9uXG4gKiBAc291cmNlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ24jUG9seWZpbGxcbiAqIEBsaWNlbnNlIE1JVFxuICoqL1xuXG5pZiAoIHR5cGVvZiBPYmplY3QuYXNzaWduICE9ICdmdW5jdGlvbicgKSB7XG4gICggZnVuY3Rpb24oKSB7XG4gICAgT2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG4gICAgICAndXNlIHN0cmljdCc7XG4gICAgICBpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcgKTtcbiAgICAgIH1cblxuICAgICAgdmFyIG91dHB1dCA9IE9iamVjdCggdGFyZ2V0ICk7XG4gICAgICBmb3IgKCB2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KysgKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbIGluZGV4IF07XG4gICAgICAgIGlmICggc291cmNlICE9PSB1bmRlZmluZWQgJiYgc291cmNlICE9PSBudWxsICkge1xuICAgICAgICAgIGZvciAoIHZhciBuZXh0S2V5IGluIHNvdXJjZSApIHtcbiAgICAgICAgICAgIGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBzb3VyY2UsIG5leHRLZXkgKSApIHtcbiAgICAgICAgICAgICAgb3V0cHV0WyBuZXh0S2V5IF0gPSBzb3VyY2VbIG5leHRLZXkgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfTtcbiAgfSkoKTtcbn1cblxuLy8gTWFrZSBpdCBlYXN5IHRvIG1lcmdlIG9iamVjdHMgd2l0aG91dCBvdmVyd3JpdGluZyB0aGUgb3JpZ2luYWwgb2JqZWN0c1xudmFyIG1lcmdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhcmdzID0gW3t9XS5jb25jYXQoIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKSApXG4gIHJldHVybiBPYmplY3QuYXNzaWduLmFwcGx5KCB0aGlzLCBhcmdzIClcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZXJnZVxuIiwidmFyIERhdGVUaW1lID0gcmVxdWlyZSggJ2x1eG9uJyApLkRhdGVUaW1lXG5cbmZ1bmN0aW9uIGlzQmVmb3JlKCBkYXRlLCBlbmQgKSB7XG4gIGVuZCA9IHBhcnNlKCBlbmQgKVxuICBkYXRlID0gcGFyc2UoIGRhdGUgKVxuICByZXR1cm4gZGF0ZSA9PSBEYXRlVGltZS5taW4oIGVuZCwgZGF0ZSApXG59XG5cbmZ1bmN0aW9uIGlzQWZ0ZXIoIGRhdGUsIHN0YXJ0ICkge1xuICBzdGFydCA9IHBhcnNlKCBzdGFydCApXG4gIGRhdGUgPSBwYXJzZSggZGF0ZSApXG4gIHJldHVybiBkYXRlID09IERhdGVUaW1lLm1heCggc3RhcnQsIGRhdGUgKVxufVxuXG5mdW5jdGlvbiBpc0JldHdlZW4oIGRhdGUsIGRhdGUxLCBkYXRlMiApIHtcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlIClcbiAgZGF0ZTEgPSBwYXJzZSggZGF0ZTEgKVxuICBkYXRlMiA9IHBhcnNlKCBkYXRlMiApXG5cbiAgaWYgKCBkYXRlLmlzVmFsaWQgJiYgZGF0ZTEuaXNWYWxpZCAmJiBkYXRlMi5pc1ZhbGlkICkge1xuICAgIC8vIERldGVybWluZSBzdGFydCBhbmQgZW5kIGRhdGVzICh0byBhbGxvdyBhbnkgb3JkZXIgaW4gYXJncylcbiAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5taW4oIGRhdGUxLCBkYXRlMiApXG4gICAgdmFyIGVuZCA9IERhdGVUaW1lLm1heCggZGF0ZTEsIGRhdGUyIClcblxuICAgIHJldHVybiBEYXRlVGltZS5tYXgoIHN0YXJ0LCBkYXRlICkgPT0gRGF0ZVRpbWUubWluKCBkYXRlLCBlbmQgKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlKCBkYXRlLCBvcHRpb25zICkge1xuICB2YXIgZm9ybWF0cyA9IFsgXCJJU09cIiwgXCJTUUxcIiwgXCJIVFRQXCIsIFwiUkZDMjgyMlwiIF0sXG4gICAgICBwYXJzZWREYXRlXG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBpZiAoIG9wdGlvbnMubWlsbGlzICYmICFpc05hTiggZGF0ZSApICkge1xuICAgIGRhdGUgPSBOdW1iZXIoIGRhdGUgKVxuICAgIGZvcm1hdHMudW5zaGlmdCgnTWlsbGlzJylcbiAgfVxuXG4gIGlmICggdHlwZW9mIGRhdGUgPT0gJ29iamVjdCcgKSB7XG4gICAgXG4gICAgLy8gSXMgYWxyZWFkeSBhIERhdGVUaW1lIG9iamVjdFxuICAgIGlmICggZGF0ZS50b0lTTyApIHJldHVybiBkYXRlXG4gICAgZWxzZSBmb3JtYXRzLnVuc2hpZnQoICdPYmplY3QnIClcblxuICAvLyBQYXJzZSBzdHJpbmcgZm9ybWF0c1xuICB9XG5cbiAgZm9ybWF0cy5mb3JFYWNoKCBmdW5jdGlvbiggZm9ybWF0ICkge1xuICAgIGlmICgoICFwYXJzZWREYXRlIHx8ICFwYXJzZWREYXRlLmlzVmFsaWQgKSAmJiBEYXRlVGltZVsnZnJvbScrZm9ybWF0XSApIHtcbiAgICAgIHBhcnNlZERhdGUgPSBEYXRlVGltZVsnZnJvbScrZm9ybWF0XSggZGF0ZSwgb3B0aW9ucyApXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBwYXJzZWREYXRlLmlzVmFsaWQgPyBwYXJzZWREYXRlIDogZmFsc2Vcbn1cblxuLy8gUmVtb3ZlIGluc2lnbmlmaWNhbnQgZGlnaXRzXG5mdW5jdGlvbiBwcmV0dHlQcmludCggZGF0ZSwgb3B0aW9ucyApIHtcbiAgZGF0ZSA9IHBhcnNlKCBkYXRlLCBvcHRpb25zIClcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnpvbmUpIGRhdGUgPSBkYXRlLnNldFpvbmUob3B0aW9ucy56b25lKVxuXG4gIGlmICggZGF0ZSApIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTTygpLnJlcGxhY2UoJ1QnLCAnICcpLnJlcGxhY2UoJy4wMDAnLCcgJykucmVwbGFjZSgnOjAwICcsJyAnKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIlVucGFyc2VhYmxlIGRhdGUgc3RyaW5nXCIgXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQmVmb3JlOiBpc0JlZm9yZSxcbiAgaXNBZnRlcjogaXNBZnRlcixcbiAgaXNCZXR3ZWVuOiBpc0JldHdlZW4sXG4gIHBhcnNlOiBwYXJzZSxcbiAgcHJldHR5UHJpbnQ6IHByZXR0eVByaW50XG59XG4iLCIvLyBDb3B5cmlnaHQgKGMpIDIwMTUgRmxvcmlhbiBIYXJ0bWFubiwgaHR0cHM6Ly9naXRodWIuY29tL2Zsb3JpYW4gaHR0cHM6Ly9naXRodWIuY29tL2Zsb3JpYW4vY29va2llLmpzXG5cbiFmdW5jdGlvbiAoZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdHZhciBjb29raWUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGNvb2tpZS5nZXQuYXBwbHkoY29va2llLCBhcmd1bWVudHMpO1xuXHR9O1xuXG5cdHZhciB1dGlscyA9IGNvb2tpZS51dGlscyA9ICB7XG5cblx0XHQvLyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYW4gYXJyYXk/IFVzZSBFUzUgQXJyYXkuaXNBcnJheSBpZiBpdCdzIGF2YWlsYWJsZS5cblx0XHRpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG5cdFx0fSxcblxuXHRcdC8vIElzIHRoZSBnaXZlbiB2YWx1ZSBhIHBsYWluIG9iamVjdCAvIGFuIG9iamVjdCB3aG9zZSBjb25zdHJ1Y3RvciBpcyBgT2JqZWN0YD9cblx0XHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiAhIXZhbHVlICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xuXHRcdH0sXG5cblx0XHQvLyBDb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0IHRvIGFuIGFycmF5IOKAkyBmb3IgZXhhbXBsZSBgYXJndW1lbnRzYC5cblx0XHR0b0FycmF5OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh2YWx1ZSk7XG5cdFx0fSxcblxuXHRcdC8vIEdldCB0aGUga2V5cyBvZiBhbiBvYmplY3QuIFVzZSBFUzUgT2JqZWN0LmtleXMgaWYgaXQncyBhdmFpbGFibGUuXG5cdFx0Z2V0S2V5czogT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0dmFyIGtleXMgPSBbXSxcblx0XHRcdFx0IGtleSA9ICcnO1xuXHRcdFx0Zm9yIChrZXkgaW4gb2JqKSB7XG5cdFx0XHRcdGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkga2V5cy5wdXNoKGtleSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ga2V5cztcblx0XHR9LFxuXG5cdFx0Ly8gVW5saWtlIEphdmFTY3JpcHQncyBidWlsdC1pbiBlc2NhcGUgZnVuY3Rpb25zLCB0aGlzIG1ldGhvZFxuXHRcdC8vIG9ubHkgZXNjYXBlcyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIGNvb2tpZXMuXG5cdFx0ZW5jb2RlOiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1ssO1wiXFxcXD1cXHMlXS9nLCBmdW5jdGlvbiAoY2hhcmFjdGVyKSB7XG5cdFx0XHRcdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoY2hhcmFjdGVyKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRkZWNvZGU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cdFx0fSxcblxuXHRcdC8vIFJldHVybiBmYWxsYmFjayBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZmluZWQsIG90aGVyd2lzZSByZXR1cm4gdmFsdWUuXG5cdFx0cmV0cmlldmU6IGZ1bmN0aW9uICh2YWx1ZSwgZmFsbGJhY2spIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gZmFsbGJhY2sgOiB2YWx1ZTtcblx0XHR9XG5cblx0fTtcblxuXHRjb29raWUuZGVmYXVsdHMgPSB7fTtcblxuXHRjb29raWUuZXhwaXJlc011bHRpcGxpZXIgPSA2MCAqIDYwICogMjQ7XG5cblx0Y29va2llLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBvcHRpb25zKSB7XG5cdFx0aWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoa2V5KSkge1xuXHRcdFx0Ly8gYGtleWAgY29udGFpbnMgYW4gb2JqZWN0IHdpdGgga2V5cyBhbmQgdmFsdWVzIGZvciBjb29raWVzLCBgdmFsdWVgIGNvbnRhaW5zIHRoZSBvcHRpb25zIG9iamVjdC5cblxuXHRcdFx0Zm9yICh2YXIgayBpbiBrZXkpIHtcblx0XHRcdFx0aWYgKGtleS5oYXNPd25Qcm9wZXJ0eShrKSkgdGhpcy5zZXQoaywga2V5W2tdLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMgPSB1dGlscy5pc1BsYWluT2JqZWN0KG9wdGlvbnMpID8gb3B0aW9ucyA6IHsgZXhwaXJlczogb3B0aW9ucyB9O1xuXG5cdFx0XHQvLyBFbXB0eSBzdHJpbmcgZm9yIHNlc3Npb24gY29va2llcy5cblx0XHRcdHZhciBleHBpcmVzID0gb3B0aW9ucy5leHBpcmVzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmV4cGlyZXMgOiAodGhpcy5kZWZhdWx0cy5leHBpcmVzIHx8ICcnKSxcblx0XHRcdCAgICBleHBpcmVzVHlwZSA9IHR5cGVvZihleHBpcmVzKTtcblxuXHRcdFx0aWYgKGV4cGlyZXNUeXBlID09PSAnc3RyaW5nJyAmJiBleHBpcmVzICE9PSAnJykgZXhwaXJlcyA9IG5ldyBEYXRlKGV4cGlyZXMpO1xuXHRcdFx0ZWxzZSBpZiAoZXhwaXJlc1R5cGUgPT09ICdudW1iZXInKSBleHBpcmVzID0gbmV3IERhdGUoK25ldyBEYXRlICsgMTAwMCAqIHRoaXMuZXhwaXJlc011bHRpcGxpZXIgKiBleHBpcmVzKTsgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBJRSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgbWF4LWFnZWAgY29va2llIGF0dHJpYnV0ZS5cblxuXHRcdFx0aWYgKGV4cGlyZXMgIT09ICcnICYmICd0b0dNVFN0cmluZycgaW4gZXhwaXJlcykgZXhwaXJlcyA9ICc7ZXhwaXJlcz0nICsgZXhwaXJlcy50b0dNVFN0cmluZygpO1xuXG5cdFx0XHR2YXIgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCB0aGlzLmRlZmF1bHRzLnBhdGg7XG5cdFx0XHRwYXRoID0gcGF0aCA/ICc7cGF0aD0nICsgcGF0aCA6ICcnO1xuXG5cdFx0XHR2YXIgZG9tYWluID0gb3B0aW9ucy5kb21haW4gfHwgdGhpcy5kZWZhdWx0cy5kb21haW47XG5cdFx0XHRkb21haW4gPSBkb21haW4gPyAnO2RvbWFpbj0nICsgZG9tYWluIDogJyc7XG5cblx0XHRcdHZhciBzZWN1cmUgPSBvcHRpb25zLnNlY3VyZSB8fCB0aGlzLmRlZmF1bHRzLnNlY3VyZSA/ICc7c2VjdXJlJyA6ICcnO1xuXHRcdFx0aWYgKG9wdGlvbnMuc2VjdXJlID09PSBmYWxzZSkgc2VjdXJlID0gJyc7XG5cblx0XHRcdGRvY3VtZW50LmNvb2tpZSA9IHV0aWxzLmVuY29kZShrZXkpICsgJz0nICsgdXRpbHMuZW5jb2RlKHZhbHVlKSArIGV4cGlyZXMgKyBwYXRoICsgZG9tYWluICsgc2VjdXJlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIGBjb29raWVgIG9iamVjdCB0byBtYWtlIGNoYWluaW5nIHBvc3NpYmxlLlxuXHR9O1xuXG5cdGNvb2tpZS5zZXREZWZhdWx0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcblx0XHRpZiAodXRpbHMuaXNQbGFpbk9iamVjdChrZXkpKSB7XG5cdFx0XHRmb3IgKHZhciBrIGluIGtleSkge1xuXHRcdFx0XHRpZiAodGhpcy5nZXQoaykgPT09IHVuZGVmaW5lZCkgdGhpcy5zZXQoaywga2V5W2tdLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY29va2llO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGhpcy5nZXQoa2V5KSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5zZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHR9XG5cdH0sXG5cblx0Y29va2llLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXlzKSB7XG5cdFx0a2V5cyA9IHV0aWxzLmlzQXJyYXkoa2V5cykgPyBrZXlzIDogdXRpbHMudG9BcnJheShhcmd1bWVudHMpO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dGhpcy5zZXQoa2V5c1tpXSwgJycsIC0xKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpczsgLy8gUmV0dXJuIHRoZSBgY29va2llYCBvYmplY3QgdG8gbWFrZSBjaGFpbmluZyBwb3NzaWJsZS5cblx0fTtcblxuXHRjb29raWUucmVtb3ZlU3BlY2lmaWMgPSBmdW5jdGlvbiAoa2V5cywgb3B0aW9ucykge1xuXHRcdGlmICghb3B0aW9ucykgcmV0dXJuIHRoaXMucmVtb3ZlKGtleXMpO1xuXG5cdFx0a2V5cyA9IHV0aWxzLmlzQXJyYXkoa2V5cykgPyBrZXlzIDogW2tleXNdO1xuXHRcdG9wdGlvbnMuZXhwaXJlcyA9IC0xO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dGhpcy5zZXQoa2V5c1tpXSwgJycsIG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzOyAvLyBSZXR1cm4gdGhlIGBjb29raWVgIG9iamVjdCB0byBtYWtlIGNoYWluaW5nIHBvc3NpYmxlLlxuXHR9O1xuXG5cdGNvb2tpZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmUodXRpbHMuZ2V0S2V5cyh0aGlzLmFsbCgpKSk7XG5cdH07XG5cblx0Y29va2llLmdldCA9IGZ1bmN0aW9uIChrZXlzLCBmYWxsYmFjaykge1xuXHRcdHZhciBjb29raWVzID0gdGhpcy5hbGwoKTtcblxuXHRcdGlmICh1dGlscy5pc0FycmF5KGtleXMpKSB7XG5cdFx0XHR2YXIgcmVzdWx0ID0ge307XG5cblx0XHRcdGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHRcdFx0dmFyIHZhbHVlID0ga2V5c1tpXTtcblx0XHRcdFx0cmVzdWx0W3ZhbHVlXSA9IHV0aWxzLnJldHJpZXZlKGNvb2tpZXNbdmFsdWVdLCBmYWxsYmFjayk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHR9IGVsc2UgcmV0dXJuIHV0aWxzLnJldHJpZXZlKGNvb2tpZXNba2V5c10sIGZhbGxiYWNrKTtcblx0fTtcblxuXHRjb29raWUuYWxsID0gZnVuY3Rpb24gKCkge1xuXHRcdGlmIChkb2N1bWVudC5jb29raWUgPT09ICcnKSByZXR1cm4ge307XG5cblx0XHR2YXIgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSxcblx0XHQgICAgcmVzdWx0ID0ge307XG5cblx0XHRmb3IgKHZhciBpID0gMCwgbCA9IGNvb2tpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHR2YXIgaXRlbSA9IGNvb2tpZXNbaV0uc3BsaXQoJz0nKTtcblx0XHRcdHZhciBrZXkgPSB1dGlscy5kZWNvZGUoaXRlbS5zaGlmdCgpKTtcblx0XHRcdHZhciB2YWx1ZSA9IHV0aWxzLmRlY29kZShpdGVtLmpvaW4oJz0nKSk7XG5cdFx0XHRyZXN1bHRba2V5XSA9IHZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Y29va2llLmVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKG5hdmlnYXRvci5jb29raWVFbmFibGVkKSByZXR1cm4gdHJ1ZTtcblxuXHRcdHZhciByZXQgPSBjb29raWUuc2V0KCdfJywgJ18nKS5nZXQoJ18nKSA9PT0gJ18nO1xuXHRcdGNvb2tpZS5yZW1vdmUoJ18nKTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9O1xuXG5cdC8vIElmIGFuIEFNRCBsb2FkZXIgaXMgcHJlc2VudCB1c2UgQU1ELlxuXHQvLyBJZiBhIENvbW1vbkpTIGxvYWRlciBpcyBwcmVzZW50IHVzZSBDb21tb25KUy5cblx0Ly8gT3RoZXJ3aXNlIGFzc2lnbiB0aGUgYGNvb2tpZWAgb2JqZWN0IHRvIHRoZSBnbG9iYWwgc2NvcGUuXG5cblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4ge2Nvb2tpZTogY29va2llfTtcblx0XHR9KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRleHBvcnRzLmNvb2tpZSA9IGNvb2tpZTtcblx0fSBlbHNlIHdpbmRvdy5jb29raWUgPSBjb29raWU7XG5cbi8vIElmIHVzZWQgZS5nLiB3aXRoIEJyb3dzZXJpZnkgYW5kIENvbW1vbkpTLCBkb2N1bWVudCBpcyBub3QgZGVjbGFyZWQuXG59KHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogZG9jdW1lbnQpO1xuIiwiLy8gICAgIGtleW1hc3Rlci5qc1xuLy8gICAgIChjKSAyMDExLTIwMTMgVGhvbWFzIEZ1Y2hzXG4vLyAgICAga2V5bWFzdGVyLmpzIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuXG47KGZ1bmN0aW9uKGdsb2JhbCl7XG4gIHZhciBrLFxuICAgIF9oYW5kbGVycyA9IHt9LFxuICAgIF9tb2RzID0geyAxNjogZmFsc2UsIDE4OiBmYWxzZSwgMTc6IGZhbHNlLCA5MTogZmFsc2UgfSxcbiAgICBfc2NvcGUgPSAnYWxsJyxcbiAgICAvLyBtb2RpZmllciBrZXlzXG4gICAgX01PRElGSUVSUyA9IHtcbiAgICAgICfih6cnOiAxNiwgc2hpZnQ6IDE2LFxuICAgICAgJ+KMpSc6IDE4LCBhbHQ6IDE4LCBvcHRpb246IDE4LFxuICAgICAgJ+KMgyc6IDE3LCBjdHJsOiAxNywgY29udHJvbDogMTcsXG4gICAgICAn4oyYJzogOTEsIGNvbW1hbmQ6IDkxXG4gICAgfSxcbiAgICAvLyBzcGVjaWFsIGtleXNcbiAgICBfTUFQID0ge1xuICAgICAgYmFja3NwYWNlOiA4LCB0YWI6IDksIGNsZWFyOiAxMixcbiAgICAgIGVudGVyOiAxMywgJ3JldHVybic6IDEzLFxuICAgICAgZXNjOiAyNywgZXNjYXBlOiAyNywgc3BhY2U6IDMyLFxuICAgICAgbGVmdDogMzcsIHVwOiAzOCxcbiAgICAgIHJpZ2h0OiAzOSwgZG93bjogNDAsXG4gICAgICBkZWw6IDQ2LCAnZGVsZXRlJzogNDYsXG4gICAgICBob21lOiAzNiwgZW5kOiAzNSxcbiAgICAgIHBhZ2V1cDogMzMsIHBhZ2Vkb3duOiAzNCxcbiAgICAgICcsJzogMTg4LCAnLic6IDE5MCwgJy8nOiAxOTEsXG4gICAgICAnYCc6IDE5MiwgJy0nOiAxODksICc9JzogMTg3LFxuICAgICAgJzsnOiAxODYsICdcXCcnOiAyMjIsXG4gICAgICAnWyc6IDIxOSwgJ10nOiAyMjEsICdcXFxcJzogMjIwXG4gICAgfSxcbiAgICBjb2RlID0gZnVuY3Rpb24oeCl7XG4gICAgICByZXR1cm4gX01BUFt4XSB8fCB4LnRvVXBwZXJDYXNlKCkuY2hhckNvZGVBdCgwKTtcbiAgICB9LFxuICAgIF9kb3duS2V5cyA9IFtdO1xuXG4gIGZvcihrPTE7azwyMDtrKyspIF9NQVBbJ2YnK2tdID0gMTExK2s7XG5cbiAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IEFycmF5I2luZGV4T2YsIHNvIGhhdmUgYSBzaW1wbGUgcmVwbGFjZW1lbnRcbiAgZnVuY3Rpb24gaW5kZXgoYXJyYXksIGl0ZW0pe1xuICAgIHZhciBpID0gYXJyYXkubGVuZ3RoO1xuICAgIHdoaWxlKGktLSkgaWYoYXJyYXlbaV09PT1pdGVtKSByZXR1cm4gaTtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBmb3IgY29tcGFyaW5nIG1vZHMgYmVmb3JlIHVuYXNzaWdubWVudFxuICBmdW5jdGlvbiBjb21wYXJlQXJyYXkoYTEsIGEyKSB7XG4gICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhMVtpXSAhPT0gYTJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB2YXIgbW9kaWZpZXJNYXAgPSB7XG4gICAgICAxNjonc2hpZnRLZXknLFxuICAgICAgMTg6J2FsdEtleScsXG4gICAgICAxNzonY3RybEtleScsXG4gICAgICA5MTonbWV0YUtleSdcbiAgfTtcbiAgZnVuY3Rpb24gdXBkYXRlTW9kaWZpZXJLZXkoZXZlbnQpIHtcbiAgICAgIGZvcihrIGluIF9tb2RzKSBfbW9kc1trXSA9IGV2ZW50W21vZGlmaWVyTWFwW2tdXTtcbiAgfTtcblxuICAvLyBoYW5kbGUga2V5ZG93biBldmVudFxuICBmdW5jdGlvbiBkaXNwYXRjaChldmVudCkge1xuICAgIHZhciBrZXksIGhhbmRsZXIsIGssIGksIG1vZGlmaWVyc01hdGNoLCBzY29wZTtcbiAgICBrZXkgPSBldmVudC5rZXlDb2RlO1xuXG4gICAgaWYgKGluZGV4KF9kb3duS2V5cywga2V5KSA9PSAtMSkge1xuICAgICAgICBfZG93bktleXMucHVzaChrZXkpO1xuICAgIH1cblxuICAgIC8vIGlmIGEgbW9kaWZpZXIga2V5LCBzZXQgdGhlIGtleS48bW9kaWZpZXJrZXluYW1lPiBwcm9wZXJ0eSB0byB0cnVlIGFuZCByZXR1cm5cbiAgICBpZihrZXkgPT0gOTMgfHwga2V5ID09IDIyNCkga2V5ID0gOTE7IC8vIHJpZ2h0IGNvbW1hbmQgb24gd2Via2l0LCBjb21tYW5kIG9uIEdlY2tvXG4gICAgaWYoa2V5IGluIF9tb2RzKSB7XG4gICAgICBfbW9kc1trZXldID0gdHJ1ZTtcbiAgICAgIC8vICdhc3NpZ25LZXknIGZyb20gaW5zaWRlIHRoaXMgY2xvc3VyZSBpcyBleHBvcnRlZCB0byB3aW5kb3cua2V5XG4gICAgICBmb3IoayBpbiBfTU9ESUZJRVJTKSBpZihfTU9ESUZJRVJTW2tdID09IGtleSkgYXNzaWduS2V5W2tdID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXBkYXRlTW9kaWZpZXJLZXkoZXZlbnQpO1xuXG4gICAgLy8gc2VlIGlmIHdlIG5lZWQgdG8gaWdub3JlIHRoZSBrZXlwcmVzcyAoZmlsdGVyKCkgY2FuIGNhbiBiZSBvdmVycmlkZGVuKVxuICAgIC8vIGJ5IGRlZmF1bHQgaWdub3JlIGtleSBwcmVzc2VzIGlmIGEgc2VsZWN0LCB0ZXh0YXJlYSwgb3IgaW5wdXQgaXMgZm9jdXNlZFxuICAgIGlmKCFhc3NpZ25LZXkuZmlsdGVyLmNhbGwodGhpcywgZXZlbnQpKSByZXR1cm47XG5cbiAgICAvLyBhYm9ydCBpZiBubyBwb3RlbnRpYWxseSBtYXRjaGluZyBzaG9ydGN1dHMgZm91bmRcbiAgICBpZiAoIShrZXkgaW4gX2hhbmRsZXJzKSkgcmV0dXJuO1xuXG4gICAgc2NvcGUgPSBnZXRTY29wZSgpO1xuXG4gICAgLy8gZm9yIGVhY2ggcG90ZW50aWFsIHNob3J0Y3V0XG4gICAgZm9yIChpID0gMDsgaSA8IF9oYW5kbGVyc1trZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICBoYW5kbGVyID0gX2hhbmRsZXJzW2tleV1baV07XG5cbiAgICAgIC8vIHNlZSBpZiBpdCdzIGluIHRoZSBjdXJyZW50IHNjb3BlXG4gICAgICBpZihoYW5kbGVyLnNjb3BlID09IHNjb3BlIHx8IGhhbmRsZXIuc2NvcGUgPT0gJ2FsbCcpe1xuICAgICAgICAvLyBjaGVjayBpZiBtb2RpZmllcnMgbWF0Y2ggaWYgYW55XG4gICAgICAgIG1vZGlmaWVyc01hdGNoID0gaGFuZGxlci5tb2RzLmxlbmd0aCA+IDA7XG4gICAgICAgIGZvcihrIGluIF9tb2RzKVxuICAgICAgICAgIGlmKCghX21vZHNba10gJiYgaW5kZXgoaGFuZGxlci5tb2RzLCAraykgPiAtMSkgfHxcbiAgICAgICAgICAgIChfbW9kc1trXSAmJiBpbmRleChoYW5kbGVyLm1vZHMsICtrKSA9PSAtMSkpIG1vZGlmaWVyc01hdGNoID0gZmFsc2U7XG4gICAgICAgIC8vIGNhbGwgdGhlIGhhbmRsZXIgYW5kIHN0b3AgdGhlIGV2ZW50IGlmIG5lY2Nlc3NhcnlcbiAgICAgICAgaWYoKGhhbmRsZXIubW9kcy5sZW5ndGggPT0gMCAmJiAhX21vZHNbMTZdICYmICFfbW9kc1sxOF0gJiYgIV9tb2RzWzE3XSAmJiAhX21vZHNbOTFdKSB8fCBtb2RpZmllcnNNYXRjaCl7XG4gICAgICAgICAgaWYoaGFuZGxlci5tZXRob2QoZXZlbnQsIGhhbmRsZXIpPT09ZmFsc2Upe1xuICAgICAgICAgICAgaWYoZXZlbnQucHJldmVudERlZmF1bHQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgIGVsc2UgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBpZihldmVudC5jYW5jZWxCdWJibGUpIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIHVuc2V0IG1vZGlmaWVyIGtleXMgb24ga2V5dXBcbiAgZnVuY3Rpb24gY2xlYXJNb2RpZmllcihldmVudCl7XG4gICAgdmFyIGtleSA9IGV2ZW50LmtleUNvZGUsIGssXG4gICAgICAgIGkgPSBpbmRleChfZG93bktleXMsIGtleSk7XG5cbiAgICAvLyByZW1vdmUga2V5IGZyb20gX2Rvd25LZXlzXG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgICBfZG93bktleXMuc3BsaWNlKGksIDEpO1xuICAgIH1cblxuICAgIGlmKGtleSA9PSA5MyB8fCBrZXkgPT0gMjI0KSBrZXkgPSA5MTtcbiAgICBpZihrZXkgaW4gX21vZHMpIHtcbiAgICAgIF9tb2RzW2tleV0gPSBmYWxzZTtcbiAgICAgIGZvcihrIGluIF9NT0RJRklFUlMpIGlmKF9NT0RJRklFUlNba10gPT0ga2V5KSBhc3NpZ25LZXlba10gPSBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gcmVzZXRNb2RpZmllcnMoKSB7XG4gICAgZm9yKGsgaW4gX21vZHMpIF9tb2RzW2tdID0gZmFsc2U7XG4gICAgZm9yKGsgaW4gX01PRElGSUVSUykgYXNzaWduS2V5W2tdID0gZmFsc2U7XG4gIH07XG5cbiAgLy8gcGFyc2UgYW5kIGFzc2lnbiBzaG9ydGN1dFxuICBmdW5jdGlvbiBhc3NpZ25LZXkoa2V5LCBzY29wZSwgbWV0aG9kKXtcbiAgICB2YXIga2V5cywgbW9kcztcbiAgICBrZXlzID0gZ2V0S2V5cyhrZXkpO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWV0aG9kID0gc2NvcGU7XG4gICAgICBzY29wZSA9ICdhbGwnO1xuICAgIH1cblxuICAgIC8vIGZvciBlYWNoIHNob3J0Y3V0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBzZXQgbW9kaWZpZXIga2V5cyBpZiBhbnlcbiAgICAgIG1vZHMgPSBbXTtcbiAgICAgIGtleSA9IGtleXNbaV0uc3BsaXQoJysnKTtcbiAgICAgIGlmIChrZXkubGVuZ3RoID4gMSl7XG4gICAgICAgIG1vZHMgPSBnZXRNb2RzKGtleSk7XG4gICAgICAgIGtleSA9IFtrZXlba2V5Lmxlbmd0aC0xXV07XG4gICAgICB9XG4gICAgICAvLyBjb252ZXJ0IHRvIGtleWNvZGUgYW5kLi4uXG4gICAgICBrZXkgPSBrZXlbMF1cbiAgICAgIGtleSA9IGNvZGUoa2V5KTtcbiAgICAgIC8vIC4uLnN0b3JlIGhhbmRsZXJcbiAgICAgIGlmICghKGtleSBpbiBfaGFuZGxlcnMpKSBfaGFuZGxlcnNba2V5XSA9IFtdO1xuICAgICAgX2hhbmRsZXJzW2tleV0ucHVzaCh7IHNob3J0Y3V0OiBrZXlzW2ldLCBzY29wZTogc2NvcGUsIG1ldGhvZDogbWV0aG9kLCBrZXk6IGtleXNbaV0sIG1vZHM6IG1vZHMgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIHVuYmluZCBhbGwgaGFuZGxlcnMgZm9yIGdpdmVuIGtleSBpbiBjdXJyZW50IHNjb3BlXG4gIGZ1bmN0aW9uIHVuYmluZEtleShrZXksIHNjb3BlKSB7XG4gICAgdmFyIG11bHRpcGxlS2V5cywga2V5cyxcbiAgICAgIG1vZHMgPSBbXSxcbiAgICAgIGksIGosIG9iajtcblxuICAgIG11bHRpcGxlS2V5cyA9IGdldEtleXMoa2V5KTtcblxuICAgIGZvciAoaiA9IDA7IGogPCBtdWx0aXBsZUtleXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGtleXMgPSBtdWx0aXBsZUtleXNbal0uc3BsaXQoJysnKTtcblxuICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xuICAgICAgICBtb2RzID0gZ2V0TW9kcyhrZXlzKTtcbiAgICAgICAga2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSBjb2RlKGtleSk7XG5cbiAgICAgIGlmIChzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNjb3BlID0gZ2V0U2NvcGUoKTtcbiAgICAgIH1cbiAgICAgIGlmICghX2hhbmRsZXJzW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IF9oYW5kbGVyc1trZXldLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG9iaiA9IF9oYW5kbGVyc1trZXldW2ldO1xuICAgICAgICAvLyBvbmx5IGNsZWFyIGhhbmRsZXJzIGlmIGNvcnJlY3Qgc2NvcGUgYW5kIG1vZHMgbWF0Y2hcbiAgICAgICAgaWYgKG9iai5zY29wZSA9PT0gc2NvcGUgJiYgY29tcGFyZUFycmF5KG9iai5tb2RzLCBtb2RzKSkge1xuICAgICAgICAgIF9oYW5kbGVyc1trZXldW2ldID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgd2l0aCBjb2RlICdrZXlDb2RlJyBpcyBjdXJyZW50bHkgZG93blxuICAvLyBDb252ZXJ0cyBzdHJpbmdzIGludG8ga2V5IGNvZGVzLlxuICBmdW5jdGlvbiBpc1ByZXNzZWQoa2V5Q29kZSkge1xuICAgICAgaWYgKHR5cGVvZihrZXlDb2RlKT09J3N0cmluZycpIHtcbiAgICAgICAga2V5Q29kZSA9IGNvZGUoa2V5Q29kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZXgoX2Rvd25LZXlzLCBrZXlDb2RlKSAhPSAtMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByZXNzZWRLZXlDb2RlcygpIHtcbiAgICAgIHJldHVybiBfZG93bktleXMuc2xpY2UoMCk7XG4gIH1cblxuICBmdW5jdGlvbiBmaWx0ZXIoZXZlbnQpe1xuICAgIHZhciB0YWdOYW1lID0gKGV2ZW50LnRhcmdldCB8fCBldmVudC5zcmNFbGVtZW50KS50YWdOYW1lO1xuICAgIC8vIGlnbm9yZSBrZXlwcmVzc2VkIGluIGFueSBlbGVtZW50cyB0aGF0IHN1cHBvcnQga2V5Ym9hcmQgZGF0YSBpbnB1dFxuICAgIHJldHVybiAhKHRhZ05hbWUgPT0gJ0lOUFVUJyB8fCB0YWdOYW1lID09ICdTRUxFQ1QnIHx8IHRhZ05hbWUgPT0gJ1RFWFRBUkVBJyk7XG4gIH1cblxuICAvLyBpbml0aWFsaXplIGtleS48bW9kaWZpZXI+IHRvIGZhbHNlXG4gIGZvcihrIGluIF9NT0RJRklFUlMpIGFzc2lnbktleVtrXSA9IGZhbHNlO1xuXG4gIC8vIHNldCBjdXJyZW50IHNjb3BlIChkZWZhdWx0ICdhbGwnKVxuICBmdW5jdGlvbiBzZXRTY29wZShzY29wZSl7IF9zY29wZSA9IHNjb3BlIHx8ICdhbGwnIH07XG4gIGZ1bmN0aW9uIGdldFNjb3BlKCl7IHJldHVybiBfc2NvcGUgfHwgJ2FsbCcgfTtcblxuICAvLyBkZWxldGUgYWxsIGhhbmRsZXJzIGZvciBhIGdpdmVuIHNjb3BlXG4gIGZ1bmN0aW9uIGRlbGV0ZVNjb3BlKHNjb3BlKXtcbiAgICB2YXIga2V5LCBoYW5kbGVycywgaTtcblxuICAgIGZvciAoa2V5IGluIF9oYW5kbGVycykge1xuICAgICAgaGFuZGxlcnMgPSBfaGFuZGxlcnNba2V5XTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBoYW5kbGVycy5sZW5ndGg7ICkge1xuICAgICAgICBpZiAoaGFuZGxlcnNbaV0uc2NvcGUgPT09IHNjb3BlKSBoYW5kbGVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGVsc2UgaSsrO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBhYnN0cmFjdCBrZXkgbG9naWMgZm9yIGFzc2lnbiBhbmQgdW5hc3NpZ25cbiAgZnVuY3Rpb24gZ2V0S2V5cyhrZXkpIHtcbiAgICB2YXIga2V5cztcbiAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICBrZXlzID0ga2V5LnNwbGl0KCcsJyk7XG4gICAgaWYgKChrZXlzW2tleXMubGVuZ3RoIC0gMV0pID09ICcnKSB7XG4gICAgICBrZXlzW2tleXMubGVuZ3RoIC0gMl0gKz0gJywnO1xuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIC8vIGFic3RyYWN0IG1vZHMgbG9naWMgZm9yIGFzc2lnbiBhbmQgdW5hc3NpZ25cbiAgZnVuY3Rpb24gZ2V0TW9kcyhrZXkpIHtcbiAgICB2YXIgbW9kcyA9IGtleS5zbGljZSgwLCBrZXkubGVuZ3RoIC0gMSk7XG4gICAgZm9yICh2YXIgbWkgPSAwOyBtaSA8IG1vZHMubGVuZ3RoOyBtaSsrKVxuICAgIG1vZHNbbWldID0gX01PRElGSUVSU1ttb2RzW21pXV07XG4gICAgcmV0dXJuIG1vZHM7XG4gIH1cblxuICAvLyBjcm9zcy1icm93c2VyIGV2ZW50c1xuICBmdW5jdGlvbiBhZGRFdmVudChvYmplY3QsIGV2ZW50LCBtZXRob2QpIHtcbiAgICBpZiAob2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIpXG4gICAgICBvYmplY3QuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbWV0aG9kLCBmYWxzZSk7XG4gICAgZWxzZSBpZihvYmplY3QuYXR0YWNoRXZlbnQpXG4gICAgICBvYmplY3QuYXR0YWNoRXZlbnQoJ29uJytldmVudCwgZnVuY3Rpb24oKXsgbWV0aG9kKHdpbmRvdy5ldmVudCkgfSk7XG4gIH07XG5cbiAgLy8gc2V0IHRoZSBoYW5kbGVycyBnbG9iYWxseSBvbiBkb2N1bWVudFxuICBhZGRFdmVudChkb2N1bWVudCwgJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkgeyBkaXNwYXRjaChldmVudCkgfSk7IC8vIFBhc3NpbmcgX3Njb3BlIHRvIGEgY2FsbGJhY2sgdG8gZW5zdXJlIGl0IHJlbWFpbnMgdGhlIHNhbWUgYnkgZXhlY3V0aW9uLiBGaXhlcyAjNDhcbiAgYWRkRXZlbnQoZG9jdW1lbnQsICdrZXl1cCcsIGNsZWFyTW9kaWZpZXIpO1xuXG4gIC8vIHJlc2V0IG1vZGlmaWVycyB0byBmYWxzZSB3aGVuZXZlciB0aGUgd2luZG93IGlzIChyZSlmb2N1c2VkLlxuICBhZGRFdmVudCh3aW5kb3csICdmb2N1cycsIHJlc2V0TW9kaWZpZXJzKTtcblxuICAvLyBzdG9yZSBwcmV2aW91c2x5IGRlZmluZWQga2V5XG4gIHZhciBwcmV2aW91c0tleSA9IGdsb2JhbC5rZXk7XG5cbiAgLy8gcmVzdG9yZSBwcmV2aW91c2x5IGRlZmluZWQga2V5IGFuZCByZXR1cm4gcmVmZXJlbmNlIHRvIG91ciBrZXkgb2JqZWN0XG4gIGZ1bmN0aW9uIG5vQ29uZmxpY3QoKSB7XG4gICAgdmFyIGsgPSBnbG9iYWwua2V5O1xuICAgIGdsb2JhbC5rZXkgPSBwcmV2aW91c0tleTtcbiAgICByZXR1cm4gaztcbiAgfVxuXG4gIC8vIHNldCB3aW5kb3cua2V5IGFuZCB3aW5kb3cua2V5LnNldC9nZXQvZGVsZXRlU2NvcGUsIGFuZCB0aGUgZGVmYXVsdCBmaWx0ZXJcbiAgZ2xvYmFsLmtleSA9IGFzc2lnbktleTtcbiAgZ2xvYmFsLmtleS5zZXRTY29wZSA9IHNldFNjb3BlO1xuICBnbG9iYWwua2V5LmdldFNjb3BlID0gZ2V0U2NvcGU7XG4gIGdsb2JhbC5rZXkuZGVsZXRlU2NvcGUgPSBkZWxldGVTY29wZTtcbiAgZ2xvYmFsLmtleS5maWx0ZXIgPSBmaWx0ZXI7XG4gIGdsb2JhbC5rZXkuaXNQcmVzc2VkID0gaXNQcmVzc2VkO1xuICBnbG9iYWwua2V5LmdldFByZXNzZWRLZXlDb2RlcyA9IGdldFByZXNzZWRLZXlDb2RlcztcbiAgZ2xvYmFsLmtleS5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgZ2xvYmFsLmtleS51bmJpbmQgPSB1bmJpbmRLZXk7XG5cbiAgaWYodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIG1vZHVsZS5leHBvcnRzID0gYXNzaWduS2V5O1xuXG59KSh0aGlzKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX2lzTmF0aXZlRnVuY3Rpb24oZm4pIHtcbiAgcmV0dXJuIEZ1bmN0aW9uLnRvU3RyaW5nLmNhbGwoZm4pLmluZGV4T2YoXCJbbmF0aXZlIGNvZGVdXCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsIHx8ICFfaXNOYXRpdmVGdW5jdGlvbihDbGFzcykpIHJldHVybiBDbGFzcztcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG4vKlxyXG4gIFRoaXMgaXMganVzdCBhIGp1bmsgZHJhd2VyLCBjb250YWluaW5nIGFueXRoaW5nIHVzZWQgYWNyb3NzIG11bHRpcGxlIGNsYXNzZXMuXHJcbiAgQmVjYXVzZSBMdXhvbiBpcyBzbWFsbChpc2gpLCB0aGlzIHNob3VsZCBzdGF5IHNtYWxsIGFuZCB3ZSB3b24ndCB3b3JyeSBhYm91dCBzcGxpdHRpbmdcclxuICBpdCB1cCBpbnRvLCBzYXksIHBhcnNpbmdVdGlsLmpzIGFuZCBiYXNpY1V0aWwuanMgYW5kIHNvIG9uLiBCdXQgdGhleSBhcmUgZGl2aWRlZCB1cCBieSBmZWF0dXJlIGFyZWEuXHJcbiovXG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cbi8vIFRZUEVTXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvKSB7XG4gIHJldHVybiB0eXBlb2YgbyA9PT0gXCJ1bmRlZmluZWRcIjtcbn1cbmZ1bmN0aW9uIGlzTnVtYmVyKG8pIHtcbiAgcmV0dXJuIHR5cGVvZiBvID09PSBcIm51bWJlclwiO1xufVxuZnVuY3Rpb24gaXNTdHJpbmcobykge1xuICByZXR1cm4gdHlwZW9mIG8gPT09IFwic3RyaW5nXCI7XG59XG5mdW5jdGlvbiBpc0RhdGUobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSBcIltvYmplY3QgRGF0ZV1cIjtcbn0gLy8gQ0FQQUJJTElUSUVTXG5cbmZ1bmN0aW9uIGhhc0ludGwoKSB7XG4gIHJldHVybiB0eXBlb2YgSW50bCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0O1xufVxuZnVuY3Rpb24gaGFzRm9ybWF0VG9QYXJ0cygpIHtcbiAgcmV0dXJuICFpc1VuZGVmaW5lZChJbnRsLkRhdGVUaW1lRm9ybWF0LnByb3RvdHlwZS5mb3JtYXRUb1BhcnRzKTtcbn0gLy8gT0JKRUNUUyBBTkQgQVJSQVlTXG5cbmZ1bmN0aW9uIG1heWJlQXJyYXkodGhpbmcpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGhpbmcpID8gdGhpbmcgOiBbdGhpbmddO1xufVxuZnVuY3Rpb24gYmVzdEJ5KGFyciwgYnksIGNvbXBhcmUpIHtcbiAgaWYgKGFyci5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGFyci5yZWR1Y2UoZnVuY3Rpb24gKGJlc3QsIG5leHQpIHtcbiAgICB2YXIgcGFpciA9IFtieShuZXh0KSwgbmV4dF07XG5cbiAgICBpZiAoIWJlc3QpIHtcbiAgICAgIHJldHVybiBwYWlyO1xuICAgIH0gZWxzZSBpZiAoY29tcGFyZShiZXN0WzBdLCBwYWlyWzBdKSA9PT0gYmVzdFswXSkge1xuICAgICAgcmV0dXJuIGJlc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYWlyO1xuICAgIH1cbiAgfSwgbnVsbClbMV07XG59XG5mdW5jdGlvbiBwaWNrKG9iaiwga2V5cykge1xuICByZXR1cm4ga2V5cy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGspIHtcbiAgICBhW2tdID0gb2JqW2tdO1xuICAgIHJldHVybiBhO1xuICB9LCB7fSk7XG59IC8vIE5VTUJFUlMgQU5EIFNUUklOR1NcblxuZnVuY3Rpb24gbnVtYmVyQmV0d2Vlbih0aGluZywgYm90dG9tLCB0b3ApIHtcbiAgcmV0dXJuIGlzTnVtYmVyKHRoaW5nKSAmJiB0aGluZyA+PSBib3R0b20gJiYgdGhpbmcgPD0gdG9wO1xufSAvLyB4ICUgbiBidXQgdGFrZXMgdGhlIHNpZ24gb2YgbiBpbnN0ZWFkIG9mIHhcblxuZnVuY3Rpb24gZmxvb3JNb2QoeCwgbikge1xuICByZXR1cm4geCAtIG4gKiBNYXRoLmZsb29yKHggLyBuKTtcbn1cbmZ1bmN0aW9uIHBhZFN0YXJ0KGlucHV0LCBuKSB7XG4gIGlmIChuID09PSB2b2lkIDApIHtcbiAgICBuID0gMjtcbiAgfVxuXG4gIGlmIChpbnB1dC50b1N0cmluZygpLmxlbmd0aCA8IG4pIHtcbiAgICByZXR1cm4gKFwiMFwiLnJlcGVhdChuKSArIGlucHV0KS5zbGljZSgtbik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhcnNlTWlsbGlzKGZyYWN0aW9uKSB7XG4gIGlmIChpc1VuZGVmaW5lZChmcmFjdGlvbikpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9IGVsc2Uge1xuICAgIHZhciBmID0gcGFyc2VGbG9hdChcIjAuXCIgKyBmcmFjdGlvbikgKiAxMDAwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGYpO1xuICB9XG59XG5mdW5jdGlvbiByb3VuZFRvKG51bWJlciwgZGlnaXRzKSB7XG4gIHZhciBmYWN0b3IgPSBNYXRoLnBvdygxMCwgZGlnaXRzKTtcbiAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyICogZmFjdG9yKSAvIGZhY3Rvcjtcbn0gLy8gREFURSBCQVNJQ1NcblxuZnVuY3Rpb24gaXNMZWFwWWVhcih5ZWFyKSB7XG4gIHJldHVybiB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKTtcbn1cbmZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbn1cbmZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gIHZhciBtb2RNb250aCA9IGZsb29yTW9kKG1vbnRoIC0gMSwgMTIpICsgMSxcbiAgICAgIG1vZFllYXIgPSB5ZWFyICsgKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG5cbiAgaWYgKG1vZE1vbnRoID09PSAyKSB7XG4gICAgcmV0dXJuIGlzTGVhcFllYXIobW9kWWVhcikgPyAyOSA6IDI4O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbMzEsIG51bGwsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVttb2RNb250aCAtIDFdO1xuICB9XG59XG5mdW5jdGlvbiB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpIHtcbiAgdmFyIHAxID0gKHdlZWtZZWFyICsgTWF0aC5mbG9vcih3ZWVrWWVhciAvIDQpIC0gTWF0aC5mbG9vcih3ZWVrWWVhciAvIDEwMCkgKyBNYXRoLmZsb29yKHdlZWtZZWFyIC8gNDAwKSkgJSA3LFxuICAgICAgbGFzdCA9IHdlZWtZZWFyIC0gMSxcbiAgICAgIHAyID0gKGxhc3QgKyBNYXRoLmZsb29yKGxhc3QgLyA0KSAtIE1hdGguZmxvb3IobGFzdCAvIDEwMCkgKyBNYXRoLmZsb29yKGxhc3QgLyA0MDApKSAlIDc7XG4gIHJldHVybiBwMSA9PT0gNCB8fCBwMiA9PT0gMyA/IDUzIDogNTI7XG59XG5mdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyKSB7XG4gIGlmICh5ZWFyID4gOTkpIHtcbiAgICByZXR1cm4geWVhcjtcbiAgfSBlbHNlIHJldHVybiB5ZWFyID4gNjAgPyAxOTAwICsgeWVhciA6IDIwMDAgKyB5ZWFyO1xufSAvLyBQQVJTSU5HXG5cbmZ1bmN0aW9uIHBhcnNlWm9uZUluZm8odHMsIG9mZnNldEZvcm1hdCwgbG9jYWxlLCB0aW1lWm9uZSkge1xuICBpZiAodGltZVpvbmUgPT09IHZvaWQgMCkge1xuICAgIHRpbWVab25lID0gbnVsbDtcbiAgfVxuXG4gIHZhciBkYXRlID0gbmV3IERhdGUodHMpLFxuICAgICAgaW50bE9wdHMgPSB7XG4gICAgaG91cjEyOiBmYWxzZSxcbiAgICB5ZWFyOiBcIm51bWVyaWNcIixcbiAgICBtb250aDogXCIyLWRpZ2l0XCIsXG4gICAgZGF5OiBcIjItZGlnaXRcIixcbiAgICBob3VyOiBcIjItZGlnaXRcIixcbiAgICBtaW51dGU6IFwiMi1kaWdpdFwiXG4gIH07XG5cbiAgaWYgKHRpbWVab25lKSB7XG4gICAgaW50bE9wdHMudGltZVpvbmUgPSB0aW1lWm9uZTtcbiAgfVxuXG4gIHZhciBtb2RpZmllZCA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHRpbWVab25lTmFtZTogb2Zmc2V0Rm9ybWF0XG4gIH0sIGludGxPcHRzKSxcbiAgICAgIGludGwgPSBoYXNJbnRsKCk7XG5cbiAgaWYgKGludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgdmFyIHBhcnNlZCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgbW9kaWZpZWQpLmZvcm1hdFRvUGFydHMoZGF0ZSkuZmluZChmdW5jdGlvbiAobSkge1xuICAgICAgcmV0dXJuIG0udHlwZS50b0xvd2VyQ2FzZSgpID09PSBcInRpbWV6b25lbmFtZVwiO1xuICAgIH0pO1xuICAgIHJldHVybiBwYXJzZWQgPyBwYXJzZWQudmFsdWUgOiBudWxsO1xuICB9IGVsc2UgaWYgKGludGwpIHtcbiAgICAvLyB0aGlzIHByb2JhYmx5IGRvZXNuJ3Qgd29yayBmb3IgYWxsIGxvY2FsZXNcbiAgICB2YXIgd2l0aG91dCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgaW50bE9wdHMpLmZvcm1hdChkYXRlKSxcbiAgICAgICAgaW5jbHVkZWQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGUsIG1vZGlmaWVkKS5mb3JtYXQoZGF0ZSksXG4gICAgICAgIGRpZmZlZCA9IGluY2x1ZGVkLnN1YnN0cmluZyh3aXRob3V0Lmxlbmd0aCksXG4gICAgICAgIHRyaW1tZWQgPSBkaWZmZWQucmVwbGFjZSgvXlssIFxcdTIwMGVdKy8sIFwiXCIpO1xuICAgIHJldHVybiB0cmltbWVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59IC8vIHNpZ25lZE9mZnNldCgnLTUnLCAnMzAnKSAtPiAtMzMwXG5cbmZ1bmN0aW9uIHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpIHtcbiAgdmFyIG9mZkhvdXIgPSBwYXJzZUludChvZmZIb3VyU3RyLCAxMCkgfHwgMCxcbiAgICAgIG9mZk1pbiA9IHBhcnNlSW50KG9mZk1pbnV0ZVN0ciwgMTApIHx8IDAsXG4gICAgICBvZmZNaW5TaWduZWQgPSBvZmZIb3VyIDwgMCA/IC1vZmZNaW4gOiBvZmZNaW47XG4gIHJldHVybiBvZmZIb3VyICogNjAgKyBvZmZNaW5TaWduZWQ7XG59IC8vIENPRVJDSU9OXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdChvYmosIG5vcm1hbGl6ZXIsIGlnbm9yZVVua25vd24pIHtcbiAgaWYgKGlnbm9yZVVua25vd24gPT09IHZvaWQgMCkge1xuICAgIGlnbm9yZVVua25vd24gPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBub3JtYWxpemVkID0ge307XG5cbiAgZm9yICh2YXIgdSBpbiBvYmopIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHUpKSB7XG4gICAgICB2YXIgdiA9IG9ialt1XTtcblxuICAgICAgaWYgKHYgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHYpICYmICFOdW1iZXIuaXNOYU4odikpIHtcbiAgICAgICAgdmFyIG1hcHBlZCA9IG5vcm1hbGl6ZXIodSwgaWdub3JlVW5rbm93bik7XG5cbiAgICAgICAgaWYgKG1hcHBlZCkge1xuICAgICAgICAgIG5vcm1hbGl6ZWRbbWFwcGVkXSA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbmZ1bmN0aW9uIHRpbWVPYmplY3Qob2JqKSB7XG4gIHJldHVybiBwaWNrKG9iaiwgW1wiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcIm1pbGxpc2Vjb25kXCJdKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgbiA9IFwibnVtZXJpY1wiLFxuICAgIHMgPSBcInNob3J0XCIsXG4gICAgbCA9IFwibG9uZ1wiLFxuICAgIGQyID0gXCIyLWRpZ2l0XCI7XG52YXIgREFURV9TSE9SVCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogblxufTtcbnZhciBEQVRFX01FRCA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogblxufTtcbnZhciBEQVRFX0ZVTEwgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG5cbn07XG52YXIgREFURV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsXG59O1xudmFyIFRJTUVfU0lNUExFID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyXG59O1xudmFyIFRJTUVfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyXG59O1xudmFyIFRJTUVfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcbnZhciBUSU1FX1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcbnZhciBUSU1FXzI0X1NJTVBMRSA9IHtcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgaG91cjEyOiBmYWxzZVxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cblxudmFyIFRJTUVfMjRfV0lUSF9TRUNPTkRTID0ge1xuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICBzZWNvbmQ6IGQyLFxuICBob3VyMTI6IGZhbHNlXG59O1xuLyoqXG4gKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9OyBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRURUJywgYWx3YXlzIDI0LWhvdXIuXG4gKi9cblxudmFyIFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIGhvdXIxMjogZmFsc2UsXG4gIHRpbWVab25lTmFtZTogc1xufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScsIGFsd2F5cyAyNC1ob3VyLlxuICovXG5cbnZhciBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQgPSB7XG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIGhvdXIxMjogZmFsc2UsXG4gIHRpbWVab25lTmFtZTogbFxufTtcbi8qKlxuICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfTsgZm9ybWF0IGxpa2UgJzEwLzE0LzE5ODMsIDk6MzAgQU0nLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cbiAqL1xuXG52YXIgREFURVRJTUVfU0hPUlQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBuLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDJcbn07XG4vKipcbiAqIHtAbGluayB0b0xvY2FsZVN0cmluZ307IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXG4gKi9cblxudmFyIERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IG4sXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcbnZhciBEQVRFVElNRV9NRUQgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBzLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDJcbn07XG52YXIgREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyA9IHtcbiAgeWVhcjogbixcbiAgbW9udGg6IHMsXG4gIGRheTogbixcbiAgaG91cjogbixcbiAgbWludXRlOiBkMixcbiAgc2Vjb25kOiBkMlxufTtcbnZhciBEQVRFVElNRV9GVUxMID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICB0aW1lWm9uZU5hbWU6IHNcbn07XG52YXIgREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogc1xufTtcbnZhciBEQVRFVElNRV9IVUdFID0ge1xuICB5ZWFyOiBuLFxuICBtb250aDogbCxcbiAgZGF5OiBuLFxuICB3ZWVrZGF5OiBsLFxuICBob3VyOiBuLFxuICBtaW51dGU6IGQyLFxuICB0aW1lWm9uZU5hbWU6IGxcbn07XG52YXIgREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMgPSB7XG4gIHllYXI6IG4sXG4gIG1vbnRoOiBsLFxuICBkYXk6IG4sXG4gIHdlZWtkYXk6IGwsXG4gIGhvdXI6IG4sXG4gIG1pbnV0ZTogZDIsXG4gIHNlY29uZDogZDIsXG4gIHRpbWVab25lTmFtZTogbFxufTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCBPYmplY3Qua2V5cyhvYmopLnNvcnQoKSk7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cblxuXG52YXIgbW9udGhzTG9uZyA9IFtcIkphbnVhcnlcIiwgXCJGZWJydWFyeVwiLCBcIk1hcmNoXCIsIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLCBcIkF1Z3VzdFwiLCBcIlNlcHRlbWJlclwiLCBcIk9jdG9iZXJcIiwgXCJOb3ZlbWJlclwiLCBcIkRlY2VtYmVyXCJdO1xudmFyIG1vbnRoc1Nob3J0ID0gW1wiSmFuXCIsIFwiRmViXCIsIFwiTWFyXCIsIFwiQXByXCIsIFwiTWF5XCIsIFwiSnVuXCIsIFwiSnVsXCIsIFwiQXVnXCIsIFwiU2VwXCIsIFwiT2N0XCIsIFwiTm92XCIsIFwiRGVjXCJdO1xudmFyIG1vbnRoc05hcnJvdyA9IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXTtcbmZ1bmN0aW9uIG1vbnRocyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gbW9udGhzTmFycm93O1xuXG4gICAgY2FzZSBcInNob3J0XCI6XG4gICAgICByZXR1cm4gbW9udGhzU2hvcnQ7XG5cbiAgICBjYXNlIFwibG9uZ1wiOlxuICAgICAgcmV0dXJuIG1vbnRoc0xvbmc7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcIjEwXCIsIFwiMTFcIiwgXCIxMlwiXTtcblxuICAgIGNhc2UgXCIyLWRpZ2l0XCI6XG4gICAgICByZXR1cm4gW1wiMDFcIiwgXCIwMlwiLCBcIjAzXCIsIFwiMDRcIiwgXCIwNVwiLCBcIjA2XCIsIFwiMDdcIiwgXCIwOFwiLCBcIjA5XCIsIFwiMTBcIiwgXCIxMVwiLCBcIjEyXCJdO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG52YXIgd2Vla2RheXNMb25nID0gW1wiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLCBcIlRodXJzZGF5XCIsIFwiRnJpZGF5XCIsIFwiU2F0dXJkYXlcIiwgXCJTdW5kYXlcIl07XG52YXIgd2Vla2RheXNTaG9ydCA9IFtcIk1vblwiLCBcIlR1ZVwiLCBcIldlZFwiLCBcIlRodVwiLCBcIkZyaVwiLCBcIlNhdFwiLCBcIlN1blwiXTtcbnZhciB3ZWVrZGF5c05hcnJvdyA9IFtcIk1cIiwgXCJUXCIsIFwiV1wiLCBcIlRcIiwgXCJGXCIsIFwiU1wiLCBcIlNcIl07XG5mdW5jdGlvbiB3ZWVrZGF5cyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gd2Vla2RheXNOYXJyb3c7XG5cbiAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgIHJldHVybiB3ZWVrZGF5c1Nob3J0O1xuXG4gICAgY2FzZSBcImxvbmdcIjpcbiAgICAgIHJldHVybiB3ZWVrZGF5c0xvbmc7XG5cbiAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgcmV0dXJuIFtcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIl07XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbnZhciBtZXJpZGllbXMgPSBbXCJBTVwiLCBcIlBNXCJdO1xudmFyIGVyYXNMb25nID0gW1wiQmVmb3JlIENocmlzdFwiLCBcIkFubm8gRG9taW5pXCJdO1xudmFyIGVyYXNTaG9ydCA9IFtcIkJDXCIsIFwiQURcIl07XG52YXIgZXJhc05hcnJvdyA9IFtcIkJcIiwgXCJBXCJdO1xuZnVuY3Rpb24gZXJhcyhsZW5ndGgpIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIFwibmFycm93XCI6XG4gICAgICByZXR1cm4gZXJhc05hcnJvdztcblxuICAgIGNhc2UgXCJzaG9ydFwiOlxuICAgICAgcmV0dXJuIGVyYXNTaG9ydDtcblxuICAgIGNhc2UgXCJsb25nXCI6XG4gICAgICByZXR1cm4gZXJhc0xvbmc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIG1lcmlkaWVtRm9yRGF0ZVRpbWUoZHQpIHtcbiAgcmV0dXJuIG1lcmlkaWVtc1tkdC5ob3VyIDwgMTIgPyAwIDogMV07XG59XG5mdW5jdGlvbiB3ZWVrZGF5Rm9yRGF0ZVRpbWUoZHQsIGxlbmd0aCkge1xuICByZXR1cm4gd2Vla2RheXMobGVuZ3RoKVtkdC53ZWVrZGF5IC0gMV07XG59XG5mdW5jdGlvbiBtb250aEZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIG1vbnRocyhsZW5ndGgpW2R0Lm1vbnRoIC0gMV07XG59XG5mdW5jdGlvbiBlcmFGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSB7XG4gIHJldHVybiBlcmFzKGxlbmd0aClbZHQueWVhciA8IDAgPyAwIDogMV07XG59XG5mdW5jdGlvbiBmb3JtYXRTdHJpbmcoa25vd25Gb3JtYXQpIHtcbiAgLy8gdGhlc2UgYWxsIGhhdmUgdGhlIG9mZnNldHMgcmVtb3ZlZCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZW1cbiAgLy8gd2l0aG91dCBhbGwgdGhlIGludGwgc3R1ZmYgdGhpcyBpcyBiYWNrZmlsbGluZ1xuICB2YXIgZmlsdGVyZWQgPSBwaWNrKGtub3duRm9ybWF0LCBbXCJ3ZWVrZGF5XCIsIFwiZXJhXCIsIFwieWVhclwiLCBcIm1vbnRoXCIsIFwiZGF5XCIsIFwiaG91clwiLCBcIm1pbnV0ZVwiLCBcInNlY29uZFwiLCBcInRpbWVab25lTmFtZVwiLCBcImhvdXIxMlwiXSksXG4gICAgICBrZXkgPSBzdHJpbmdpZnkoZmlsdGVyZWQpLFxuICAgICAgZGF0ZVRpbWVIdWdlID0gXCJFRUVFLCBMTExMIGQsIHl5eXksIGg6bW0gYVwiO1xuXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9TSE9SVCk6XG4gICAgICByZXR1cm4gXCJNL2QveXl5eVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURV9NRUQpOlxuICAgICAgcmV0dXJuIFwiTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfRlVMTCk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVfSFVHRSk6XG4gICAgICByZXR1cm4gXCJFRUVFLCBMTExMIGQsIHl5eXlcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfU0lNUExFKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiaDptbTpzcyBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV9XSVRIX0xPTkdfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcImg6bW0gYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoVElNRV8yNF9TSU1QTEUpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KFRJTUVfMjRfV0lUSF9TRUNPTkRTKTpcbiAgICAgIHJldHVybiBcIkhIOm1tOnNzXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfU0hPUlRfT0ZGU0VUKTpcbiAgICAgIHJldHVybiBcIkhIOm1tXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQpOlxuICAgICAgcmV0dXJuIFwiSEg6bW1cIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX1NIT1JUKTpcbiAgICAgIHJldHVybiBcIk0vZC95eXl5LCBoOm1tIGFcIjtcblxuICAgIGNhc2Ugc3RyaW5naWZ5KERBVEVUSU1FX01FRCk6XG4gICAgICByZXR1cm4gXCJMTEwgZCwgeXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9GVUxMKTpcbiAgICAgIHJldHVybiBcIkxMTEwgZCwgeXl5eSwgaDptbSBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9IVUdFKTpcbiAgICAgIHJldHVybiBkYXRlVGltZUh1Z2U7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiTS9kL3l5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJMTEwgZCwgeXl5eSwgaDptbTpzcyBhXCI7XG5cbiAgICBjYXNlIHN0cmluZ2lmeShEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyk6XG4gICAgICByZXR1cm4gXCJMTExMIGQsIHl5eXksIGg6bW06c3MgYVwiO1xuXG4gICAgY2FzZSBzdHJpbmdpZnkoREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFMpOlxuICAgICAgcmV0dXJuIFwiRUVFRSwgTExMTCBkLCB5eXl5LCBoOm1tOnNzIGFcIjtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZGF0ZVRpbWVIdWdlO1xuICB9XG59XG5cbi8vIHRoZXNlIGFyZW4ndCByZWFsbHkgcHJpdmF0ZSwgYnV0IG5vciBhcmUgdGhleSByZWFsbHkgdXNlZnVsIHRvIGRvY3VtZW50XG5cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cbnZhciBMdXhvbkVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfRXJyb3IpIHtcbiAgX2luaGVyaXRzTG9vc2UoTHV4b25FcnJvciwgX0Vycm9yKTtcblxuICBmdW5jdGlvbiBMdXhvbkVycm9yKCkge1xuICAgIHJldHVybiBfRXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEx1eG9uRXJyb3I7XG59KF93cmFwTmF0aXZlU3VwZXIoRXJyb3IpKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG52YXIgSW52YWxpZERhdGVUaW1lRXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWREYXRlVGltZUVycm9yLCBfTHV4b25FcnJvcik7XG5cbiAgZnVuY3Rpb24gSW52YWxpZERhdGVUaW1lRXJyb3IocmVhc29uKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yLmNhbGwodGhpcywgXCJJbnZhbGlkIERhdGVUaW1lOiBcIiArIHJlYXNvbi50b01lc3NhZ2UoKSkgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkRGF0ZVRpbWVFcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBJbnZhbGlkSW50ZXJ2YWxFcnJvciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0x1eG9uRXJyb3IyKSB7XG4gIF9pbmhlcml0c0xvb3NlKEludmFsaWRJbnRlcnZhbEVycm9yLCBfTHV4b25FcnJvcjIpO1xuXG4gIGZ1bmN0aW9uIEludmFsaWRJbnRlcnZhbEVycm9yKHJlYXNvbikge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjIuY2FsbCh0aGlzLCBcIkludmFsaWQgSW50ZXJ2YWw6IFwiICsgcmVhc29uLnRvTWVzc2FnZSgpKSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRJbnRlcnZhbEVycm9yO1xufShMdXhvbkVycm9yKTtcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIEludmFsaWREdXJhdGlvbkVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjMpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZER1cmF0aW9uRXJyb3IsIF9MdXhvbkVycm9yMyk7XG5cbiAgZnVuY3Rpb24gSW52YWxpZER1cmF0aW9uRXJyb3IocmVhc29uKSB7XG4gICAgcmV0dXJuIF9MdXhvbkVycm9yMy5jYWxsKHRoaXMsIFwiSW52YWxpZCBEdXJhdGlvbjogXCIgKyByZWFzb24udG9NZXNzYWdlKCkpIHx8IHRoaXM7XG4gIH1cblxuICByZXR1cm4gSW52YWxpZER1cmF0aW9uRXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yNCkge1xuICBfaW5oZXJpdHNMb29zZShDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvciwgX0x1eG9uRXJyb3I0KTtcblxuICBmdW5jdGlvbiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcigpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBJbnZhbGlkVW5pdEVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjUpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZFVuaXRFcnJvciwgX0x1eG9uRXJyb3I1KTtcblxuICBmdW5jdGlvbiBJbnZhbGlkVW5pdEVycm9yKHVuaXQpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I1LmNhbGwodGhpcywgXCJJbnZhbGlkIHVuaXQgXCIgKyB1bml0KSB8fCB0aGlzO1xuICB9XG5cbiAgcmV0dXJuIEludmFsaWRVbml0RXJyb3I7XG59KEx1eG9uRXJyb3IpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgSW52YWxpZEFyZ3VtZW50RXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MdXhvbkVycm9yNikge1xuICBfaW5oZXJpdHNMb29zZShJbnZhbGlkQXJndW1lbnRFcnJvciwgX0x1eG9uRXJyb3I2KTtcblxuICBmdW5jdGlvbiBJbnZhbGlkQXJndW1lbnRFcnJvcigpIHtcbiAgICByZXR1cm4gX0x1eG9uRXJyb3I2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbn0oTHV4b25FcnJvcik7XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBab25lSXNBYnN0cmFjdEVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTHV4b25FcnJvcjcpIHtcbiAgX2luaGVyaXRzTG9vc2UoWm9uZUlzQWJzdHJhY3RFcnJvciwgX0x1eG9uRXJyb3I3KTtcblxuICBmdW5jdGlvbiBab25lSXNBYnN0cmFjdEVycm9yKCkge1xuICAgIHJldHVybiBfTHV4b25FcnJvcjcuY2FsbCh0aGlzLCBcIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3NcIikgfHwgdGhpcztcbiAgfVxuXG4gIHJldHVybiBab25lSXNBYnN0cmFjdEVycm9yO1xufShMdXhvbkVycm9yKTtcblxuLyoqXHJcbiAqIEBpbnRlcmZhY2VcclxuICovXG5cbnZhciBab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gWm9uZSgpIHt9XG5cbiAgdmFyIF9wcm90byA9IFpvbmUucHJvdG90eXBlO1xuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG9mZnNldCdzIGNvbW1vbiBuYW1lIChzdWNoIGFzIEVTVCkgYXQgdGhlIHNwZWNpZmllZCB0aW1lc3RhbXBcclxuICAgKiBAYWJzdHJhY3RcclxuICAgKiBAcGFyYW0ge251bWJlcn0gdHMgLSBFcG9jaCBtaWxsaXNlY29uZHMgZm9yIHdoaWNoIHRvIGdldCB0aGUgbmFtZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gT3B0aW9ucyB0byBhZmZlY3QgdGhlIGZvcm1hdFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLmZvcm1hdCAtIFdoYXQgc3R5bGUgb2Ygb2Zmc2V0IHRvIHJldHVybi4gQWNjZXB0cyAnbG9uZycgb3IgJ3Nob3J0Jy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5sb2NhbGUgLSBXaGF0IGxvY2FsZSB0byByZXR1cm4gdGhlIG9mZnNldCBuYW1lIGluLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBvcHRzKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBvZmZzZXQgaW4gbWludXRlcyBmb3IgdGhpcyB6b25lIGF0IHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wLlxyXG4gICAqIEBhYnN0cmFjdFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB0cyAtIEVwb2NoIG1pbGxpc2Vjb25kcyBmb3Igd2hpY2ggdG8gY29tcHV0ZSB0aGUgb2Zmc2V0XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCh0cykge1xuICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgWm9uZSBpcyBlcXVhbCB0byBhbm90aGVyIHpvbmVyXHJcbiAgICogQGFic3RyYWN0XHJcbiAgICogQHBhcmFtIHtab25lfSBvdGhlclpvbmUgLSB0aGUgem9uZSB0byBjb21wYXJlXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBab25lIGlzIHZhbGlkLlxyXG4gICAqIEBhYnN0cmFjdFxyXG4gICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcblxuICAgIC8qKlxyXG4gICAgICogVGhlIHR5cGUgb2Ygem9uZVxyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB0aHJvdyBuZXcgWm9uZUlzQWJzdHJhY3RFcnJvcigpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgem9uZS5cclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgdGhyb3cgbmV3IFpvbmVJc0Fic3RyYWN0RXJyb3IoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG9mZnNldCBpcyBrbm93biB0byBiZSBmaXhlZCBmb3IgdGhlIHdob2xlIHllYXIuXHJcbiAgICAgKiBAYWJzdHJhY3RcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1bml2ZXJzYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBab25lSXNBYnN0cmFjdEVycm9yKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFpvbmU7XG59KCk7XG5cbnZhciBzaW5nbGV0b24gPSBudWxsO1xuXG52YXIgTG9jYWxab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfWm9uZSkge1xuICBfaW5oZXJpdHNMb29zZShMb2NhbFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBMb2NhbFpvbmUoKSB7XG4gICAgcmV0dXJuIF9ab25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBMb2NhbFpvbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSh0cywgX3JlZikge1xuICAgIHZhciBmb3JtYXQgPSBfcmVmLmZvcm1hdCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGU7XG4gICAgcmV0dXJuIHBhcnNlWm9uZUluZm8odHMsIGZvcm1hdCwgbG9jYWxlKTtcbiAgfTtcblxuICBfcHJvdG8ub2Zmc2V0ID0gZnVuY3Rpb24gb2Zmc2V0KHRzKSB7XG4gICAgcmV0dXJuIC1uZXcgRGF0ZSh0cykuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgfTtcblxuICBfcHJvdG8uZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzKG90aGVyWm9uZSkge1xuICAgIHJldHVybiBvdGhlclpvbmUudHlwZSA9PT0gXCJsb2NhbFwiO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhMb2NhbFpvbmUsIFt7XG4gICAga2V5OiBcInR5cGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBcImxvY2FsXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmIChoYXNJbnRsKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmU7XG4gICAgICB9IGVsc2UgcmV0dXJuIFwibG9jYWxcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0sIFt7XG4gICAga2V5OiBcImluc3RhbmNlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uID09PSBudWxsKSB7XG4gICAgICAgIHNpbmdsZXRvbiA9IG5ldyBMb2NhbFpvbmUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTG9jYWxab25lO1xufShab25lKTtcblxudmFyIGR0ZkNhY2hlID0ge307XG5cbmZ1bmN0aW9uIG1ha2VEVEYoem9uZSkge1xuICBpZiAoIWR0ZkNhY2hlW3pvbmVdKSB7XG4gICAgZHRmQ2FjaGVbem9uZV0gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChcImVuLVVTXCIsIHtcbiAgICAgIGhvdXIxMjogZmFsc2UsXG4gICAgICB0aW1lWm9uZTogem9uZSxcbiAgICAgIHllYXI6IFwibnVtZXJpY1wiLFxuICAgICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgICAgZGF5OiBcIjItZGlnaXRcIixcbiAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgbWludXRlOiBcIjItZGlnaXRcIixcbiAgICAgIHNlY29uZDogXCIyLWRpZ2l0XCJcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBkdGZDYWNoZVt6b25lXTtcbn1cblxudmFyIHR5cGVUb1BvcyA9IHtcbiAgeWVhcjogMCxcbiAgbW9udGg6IDEsXG4gIGRheTogMixcbiAgaG91cjogMyxcbiAgbWludXRlOiA0LFxuICBzZWNvbmQ6IDVcbn07XG5cbmZ1bmN0aW9uIGhhY2t5T2Zmc2V0KGR0ZiwgZGF0ZSkge1xuICB2YXIgZm9ybWF0dGVkID0gZHRmLmZvcm1hdChkYXRlKS5yZXBsYWNlKC9cXHUyMDBFL2csIFwiXCIpLFxuICAgICAgcGFyc2VkID0gLyhcXGQrKVxcLyhcXGQrKVxcLyhcXGQrKSw/IChcXGQrKTooXFxkKyk6KFxcZCspLy5leGVjKGZvcm1hdHRlZCksXG4gICAgICBmTW9udGggPSBwYXJzZWRbMV0sXG4gICAgICBmRGF5ID0gcGFyc2VkWzJdLFxuICAgICAgZlllYXIgPSBwYXJzZWRbM10sXG4gICAgICBmSG91ciA9IHBhcnNlZFs0XSxcbiAgICAgIGZNaW51dGUgPSBwYXJzZWRbNV0sXG4gICAgICBmU2Vjb25kID0gcGFyc2VkWzZdO1xuICByZXR1cm4gW2ZZZWFyLCBmTW9udGgsIGZEYXksIGZIb3VyLCBmTWludXRlLCBmU2Vjb25kXTtcbn1cblxuZnVuY3Rpb24gcGFydHNPZmZzZXQoZHRmLCBkYXRlKSB7XG4gIHZhciBmb3JtYXR0ZWQgPSBkdGYuZm9ybWF0VG9QYXJ0cyhkYXRlKSxcbiAgICAgIGZpbGxlZCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWF0dGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9mb3JtYXR0ZWQkaSA9IGZvcm1hdHRlZFtpXSxcbiAgICAgICAgdHlwZSA9IF9mb3JtYXR0ZWQkaS50eXBlLFxuICAgICAgICB2YWx1ZSA9IF9mb3JtYXR0ZWQkaS52YWx1ZSxcbiAgICAgICAgcG9zID0gdHlwZVRvUG9zW3R5cGVdO1xuXG4gICAgaWYgKCFpc1VuZGVmaW5lZChwb3MpKSB7XG4gICAgICBmaWxsZWRbcG9zXSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGxlZDtcbn1cblxudmFyIElBTkFab25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfWm9uZSkge1xuICBfaW5oZXJpdHNMb29zZShJQU5BWm9uZSwgX1pvbmUpO1xuXG4gIElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIgPSBmdW5jdGlvbiBpc1ZhbGlkU3BlY2lmaWVyKHMpIHtcbiAgICByZXR1cm4gcyAmJiBzLm1hdGNoKC9eW2Etel8rLV17MSwyNTZ9KFxcL1thLXpfKy1dezEsMjU2fShcXC9bYS16XystXXsxLDI1Nn0pPyk/JC9pKTtcbiAgfTtcblxuICBJQU5BWm9uZS5pc1ZhbGlkWm9uZSA9IGZ1bmN0aW9uIGlzVmFsaWRab25lKHpvbmUpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlbi1VU1wiLCB7XG4gICAgICAgIHRpbWVab25lOiB6b25lXG4gICAgICB9KS5mb3JtYXQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07IC8vIEV0Yy9HTVQrOCAtPiAtNDgwXG5cblxuICBJQU5BWm9uZS5wYXJzZUdNVE9mZnNldCA9IGZ1bmN0aW9uIHBhcnNlR01UT2Zmc2V0KHNwZWNpZmllcikge1xuICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBtYXRjaCA9IHNwZWNpZmllci5tYXRjaCgvXkV0Y1xcL0dNVChbKy1dXFxkezEsMn0pJC9pKTtcblxuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiAtNjAgKiBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgZnVuY3Rpb24gSUFOQVpvbmUobmFtZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1pvbmUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLnpvbmVOYW1lID0gbmFtZTtcbiAgICBfdGhpcy52YWxpZCA9IElBTkFab25lLmlzVmFsaWRab25lKG5hbWUpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBJQU5BWm9uZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLm9mZnNldE5hbWUgPSBmdW5jdGlvbiBvZmZzZXROYW1lKHRzLCBfcmVmKSB7XG4gICAgdmFyIGZvcm1hdCA9IF9yZWYuZm9ybWF0LFxuICAgICAgICBsb2NhbGUgPSBfcmVmLmxvY2FsZTtcbiAgICByZXR1cm4gcGFyc2Vab25lSW5mbyh0cywgZm9ybWF0LCBsb2NhbGUsIHRoaXMuem9uZU5hbWUpO1xuICB9O1xuXG4gIF9wcm90by5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQodHMpIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHRzKSxcbiAgICAgICAgZHRmID0gbWFrZURURih0aGlzLnpvbmVOYW1lKSxcbiAgICAgICAgX3JlZjIgPSBkdGYuZm9ybWF0VG9QYXJ0cyA/IHBhcnRzT2Zmc2V0KGR0ZiwgZGF0ZSkgOiBoYWNreU9mZnNldChkdGYsIGRhdGUpLFxuICAgICAgICBmWWVhciA9IF9yZWYyWzBdLFxuICAgICAgICBmTW9udGggPSBfcmVmMlsxXSxcbiAgICAgICAgZkRheSA9IF9yZWYyWzJdLFxuICAgICAgICBmSG91ciA9IF9yZWYyWzNdLFxuICAgICAgICBmTWludXRlID0gX3JlZjJbNF0sXG4gICAgICAgIGZTZWNvbmQgPSBfcmVmMls1XSxcbiAgICAgICAgYXNVVEMgPSBEYXRlLlVUQyhmWWVhciwgZk1vbnRoIC0gMSwgZkRheSwgZkhvdXIsIGZNaW51dGUsIGZTZWNvbmQpO1xuXG4gICAgdmFyIGFzVFMgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICBhc1RTIC09IGFzVFMgJSAxMDAwO1xuICAgIHJldHVybiAoYXNVVEMgLSBhc1RTKSAvICg2MCAqIDEwMDApO1xuICB9O1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXJab25lKSB7XG4gICAgcmV0dXJuIG90aGVyWm9uZS50eXBlID09PSBcImlhbmFcIiAmJiBvdGhlclpvbmUuem9uZU5hbWUgPT09IHRoaXMuem9uZU5hbWU7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKElBTkFab25lLCBbe1xuICAgIGtleTogXCJ0eXBlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gXCJpYW5hXCI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5hbWVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnpvbmVOYW1lO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bml2ZXJzYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIElBTkFab25lO1xufShab25lKTtcblxudmFyIHNpbmdsZXRvbiQxID0gbnVsbDtcblxuZnVuY3Rpb24gaG91cnNNaW51dGVzT2Zmc2V0KHopIHtcbiAgdmFyIGhvdXJzID0gTWF0aC50cnVuYyh6LmZpeGVkIC8gNjApLFxuICAgICAgbWludXRlcyA9IE1hdGguYWJzKHouZml4ZWQgJSA2MCksXG4gICAgICBzaWduID0gaG91cnMgPiAwID8gXCIrXCIgOiBcIi1cIixcbiAgICAgIGJhc2UgPSBzaWduICsgTWF0aC5hYnMoaG91cnMpO1xuICByZXR1cm4gbWludXRlcyA+IDAgPyBiYXNlICsgXCI6XCIgKyBwYWRTdGFydChtaW51dGVzLCAyKSA6IGJhc2U7XG59XG5cbnZhciBGaXhlZE9mZnNldFpvbmUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9ab25lKSB7XG4gIF9pbmhlcml0c0xvb3NlKEZpeGVkT2Zmc2V0Wm9uZSwgX1pvbmUpO1xuXG4gIEZpeGVkT2Zmc2V0Wm9uZS5pbnN0YW5jZSA9IGZ1bmN0aW9uIGluc3RhbmNlKG9mZnNldCkge1xuICAgIHJldHVybiBvZmZzZXQgPT09IDAgPyBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2UgOiBuZXcgRml4ZWRPZmZzZXRab25lKG9mZnNldCk7XG4gIH07XG5cbiAgRml4ZWRPZmZzZXRab25lLnBhcnNlU3BlY2lmaWVyID0gZnVuY3Rpb24gcGFyc2VTcGVjaWZpZXIocykge1xuICAgIGlmIChzKSB7XG4gICAgICB2YXIgciA9IHMubWF0Y2goL151dGMoPzooWystXVxcZHsxLDJ9KSg/OjooXFxkezJ9KSk/KT8kL2kpO1xuXG4gICAgICBpZiAocikge1xuICAgICAgICByZXR1cm4gbmV3IEZpeGVkT2Zmc2V0Wm9uZShzaWduZWRPZmZzZXQoclsxXSwgclsyXSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhGaXhlZE9mZnNldFpvbmUsIG51bGwsIFt7XG4gICAga2V5OiBcInV0Y0luc3RhbmNlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoc2luZ2xldG9uJDEgPT09IG51bGwpIHtcbiAgICAgICAgc2luZ2xldG9uJDEgPSBuZXcgRml4ZWRPZmZzZXRab25lKDApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2luZ2xldG9uJDE7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gRml4ZWRPZmZzZXRab25lKG9mZnNldCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1pvbmUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLmZpeGVkID0gb2Zmc2V0O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBGaXhlZE9mZnNldFpvbmUucHJvdG90eXBlO1xuXG4gIF9wcm90by5vZmZzZXROYW1lID0gZnVuY3Rpb24gb2Zmc2V0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9O1xuXG4gIF9wcm90by5vZmZzZXQgPSBmdW5jdGlvbiBvZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZml4ZWQ7XG4gIH07XG5cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlclpvbmUpIHtcbiAgICByZXR1cm4gb3RoZXJab25lLnR5cGUgPT09IFwiZml4ZWRcIiAmJiBvdGhlclpvbmUuZml4ZWQgPT09IHRoaXMuZml4ZWQ7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKEZpeGVkT2Zmc2V0Wm9uZSwgW3tcbiAgICBrZXk6IFwidHlwZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiZml4ZWRcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmFtZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZml4ZWQgPT09IDAgPyBcIlVUQ1wiIDogXCJVVENcIiArIGhvdXJzTWludXRlc09mZnNldCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZTtcbn0oWm9uZSk7XG5cbnZhciBJbnZhbGlkWm9uZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1pvbmUpIHtcbiAgX2luaGVyaXRzTG9vc2UoSW52YWxpZFpvbmUsIF9ab25lKTtcblxuICBmdW5jdGlvbiBJbnZhbGlkWm9uZSh6b25lTmFtZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1pvbmUuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLnpvbmVOYW1lID0gem9uZU5hbWU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEludmFsaWRab25lLnByb3RvdHlwZTtcblxuICBfcHJvdG8ub2Zmc2V0TmFtZSA9IGZ1bmN0aW9uIG9mZnNldE5hbWUoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgX3Byb3RvLm9mZnNldCA9IGZ1bmN0aW9uIG9mZnNldCgpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9O1xuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhJbnZhbGlkWm9uZSwgW3tcbiAgICBrZXk6IFwidHlwZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFwiaW52YWxpZFwiO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJuYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy56b25lTmFtZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5pdmVyc2FsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW52YWxpZFpvbmU7XG59KFpvbmUpO1xuXG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5mdW5jdGlvbiBub3JtYWxpemVab25lKGlucHV0LCBkZWZhdWx0Wm9uZSkge1xuICB2YXIgb2Zmc2V0O1xuXG4gIGlmIChpc1VuZGVmaW5lZChpbnB1dCkgfHwgaW5wdXQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZGVmYXVsdFpvbmU7XG4gIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBab25lKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKGlucHV0KSkge1xuICAgIHZhciBsb3dlcmVkID0gaW5wdXQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJlZCA9PT0gXCJsb2NhbFwiKSByZXR1cm4gTG9jYWxab25lLmluc3RhbmNlO2Vsc2UgaWYgKGxvd2VyZWQgPT09IFwidXRjXCIgfHwgbG93ZXJlZCA9PT0gXCJnbXRcIikgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS51dGNJbnN0YW5jZTtlbHNlIGlmICgob2Zmc2V0ID0gSUFOQVpvbmUucGFyc2VHTVRPZmZzZXQoaW5wdXQpKSAhPSBudWxsKSB7XG4gICAgICAvLyBoYW5kbGUgRXRjL0dNVC00LCB3aGljaCBWOCBjaG9rZXMgb25cbiAgICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KTtcbiAgICB9IGVsc2UgaWYgKElBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIobG93ZXJlZCkpIHJldHVybiBuZXcgSUFOQVpvbmUoaW5wdXQpO2Vsc2UgcmV0dXJuIEZpeGVkT2Zmc2V0Wm9uZS5wYXJzZVNwZWNpZmllcihsb3dlcmVkKSB8fCBuZXcgSW52YWxpZFpvbmUoaW5wdXQpO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyKGlucHV0KSkge1xuICAgIHJldHVybiBGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2UoaW5wdXQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiBpbnB1dC5vZmZzZXQgJiYgdHlwZW9mIGlucHV0Lm9mZnNldCA9PT0gXCJudW1iZXJcIikge1xuICAgIC8vIFRoaXMgaXMgZHVtYiwgYnV0IHRoZSBpbnN0YW5jZW9mIGNoZWNrIGFib3ZlIGRvZXNuJ3Qgc2VlbSB0byByZWFsbHkgd29ya1xuICAgIC8vIHNvIHdlJ3JlIGR1Y2sgY2hlY2tpbmcgaXRcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBJbnZhbGlkWm9uZShpbnB1dCk7XG4gIH1cbn1cblxudmFyIG5vdyA9IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIERhdGUubm93KCk7XG59LFxuICAgIGRlZmF1bHRab25lID0gbnVsbCxcbiAgICAvLyBub3Qgc2V0dGluZyB0aGlzIGRpcmVjdGx5IHRvIExvY2FsWm9uZS5pbnN0YW5jZSBiYyBsb2FkaW5nIG9yZGVyIGlzc3Vlc1xuZGVmYXVsdExvY2FsZSA9IG51bGwsXG4gICAgZGVmYXVsdE51bWJlcmluZ1N5c3RlbSA9IG51bGwsXG4gICAgZGVmYXVsdE91dHB1dENhbGVuZGFyID0gbnVsbCxcbiAgICB0aHJvd09uSW52YWxpZCA9IGZhbHNlO1xuLyoqXHJcbiAqIFNldHRpbmdzIGNvbnRhaW5zIHN0YXRpYyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHRoYXQgY29udHJvbCBMdXhvbidzIG92ZXJhbGwgYmVoYXZpb3IuIEx1eG9uIGlzIGEgc2ltcGxlIGxpYnJhcnkgd2l0aCBmZXcgb3B0aW9ucywgYnV0IHRoZSBvbmVzIGl0IGRvZXMgaGF2ZSBsaXZlIGhlcmUuXHJcbiAqL1xuXG5cbnZhciBTZXR0aW5ncyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNldHRpbmdzKCkge31cblxuICAvKipcclxuICAgKiBSZXNldCBMdXhvbidzIGdsb2JhbCBjYWNoZXMuIFNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBpbiB0ZXN0aW5nIHNjZW5hcmlvcy5cclxuICAgKiBAcmV0dXJuIHt2b2lkfVxyXG4gICAqL1xuICBTZXR0aW5ncy5yZXNldENhY2hlcyA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGVzKCkge1xuICAgIExvY2FsZS5yZXNldENhY2hlKCk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKFNldHRpbmdzLCBudWxsLCBbe1xuICAgIGtleTogXCJub3dcIixcblxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBjYWxsYmFjayBmb3IgcmV0dXJuaW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcC5cclxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAqL1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIG5vdztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNhbGxiYWNrIGZvciByZXR1cm5pbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wLlxyXG4gICAgICogVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBudW1iZXIsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gRXBvY2ggbWlsbGlzZWNvbmQgY291bnRcclxuICAgICAqIEB0eXBlIHtmdW5jdGlvbn1cclxuICAgICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IERhdGUubm93KCkgKyAzMDAwIC8vIHByZXRlbmQgaXQgaXMgMyBzZWNvbmRzIGluIHRoZSBmdXR1cmVcclxuICAgICAqIEBleGFtcGxlIFNldHRpbmdzLm5vdyA9ICgpID0+IDAgLy8gYWx3YXlzIHByZXRlbmQgaXQncyBKYW4gMSwgMTk3MCBhdCBtaWRuaWdodCBpbiBVVEMgdGltZVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KG4pIHtcbiAgICAgIG5vdyA9IG47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSB0byBjcmVhdGUgRGF0ZVRpbWVzIGluLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdFpvbmVOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gKGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZSkubmFtZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgdGltZSB6b25lIHRvIGNyZWF0ZSBEYXRlVGltZXMgaW4uIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHopIHtcbiAgICAgIGlmICgheikge1xuICAgICAgICBkZWZhdWx0Wm9uZSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0Wm9uZSA9IG5vcm1hbGl6ZVpvbmUoeik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IHRpbWUgem9uZSBvYmplY3QgdG8gY3JlYXRlIERhdGVUaW1lcyBpbi4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtab25lfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0Wm9uZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRab25lIHx8IExvY2FsWm9uZS5pbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRlZmF1bHQgbG9jYWxlIHRvIGNyZWF0ZSBEYXRlVGltZXMgd2l0aC4gRG9lcyBub3QgYWZmZWN0IGV4aXN0aW5nIGluc3RhbmNlcy5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmF1bHRMb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0TG9jYWxlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBsb2NhbGUgdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChsb2NhbGUpIHtcbiAgICAgIGRlZmF1bHRMb2NhbGUgPSBsb2NhbGU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmYXVsdE51bWJlcmluZ1N5c3RlbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IG51bWJlcmluZyBzeXN0ZW0gdG8gY3JlYXRlIERhdGVUaW1lcyB3aXRoLiBEb2VzIG5vdCBhZmZlY3QgZXhpc3RpbmcgaW5zdGFuY2VzLlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChudW1iZXJpbmdTeXN0ZW0pIHtcbiAgICAgIGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0gPSBudW1iZXJpbmdTeXN0ZW07XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZhdWx0T3V0cHV0Q2FsZW5kYXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0T3V0cHV0Q2FsZW5kYXI7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBkZWZhdWx0IG91dHB1dCBjYWxlbmRhciB0byBjcmVhdGUgRGF0ZVRpbWVzIHdpdGguIERvZXMgbm90IGFmZmVjdCBleGlzdGluZyBpbnN0YW5jZXMuXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KG91dHB1dENhbGVuZGFyKSB7XG4gICAgICBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIgPSBvdXRwdXRDYWxlbmRhcjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgd2hldGhlciBMdXhvbiB3aWxsIHRocm93IHdoZW4gaXQgZW5jb3VudGVycyBpbnZhbGlkIERhdGVUaW1lcywgRHVyYXRpb25zLCBvciBJbnRlcnZhbHNcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ0aHJvd09uSW52YWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRocm93T25JbnZhbGlkO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldCB3aGV0aGVyIEx1eG9uIHdpbGwgdGhyb3cgd2hlbiBpdCBlbmNvdW50ZXJzIGludmFsaWQgRGF0ZVRpbWVzLCBEdXJhdGlvbnMsIG9yIEludGVydmFsc1xyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodCkge1xuICAgICAgdGhyb3dPbkludmFsaWQgPSB0O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTZXR0aW5ncztcbn0oKTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5VG9rZW5zKHNwbGl0cywgdG9rZW5Ub1N0cmluZykge1xuICB2YXIgcyA9IFwiXCI7XG5cbiAgZm9yICh2YXIgX2l0ZXJhdG9yID0gc3BsaXRzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgIHZhciBfcmVmO1xuXG4gICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICBfcmVmID0gX2l0ZXJhdG9yW19pKytdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICBfcmVmID0gX2kudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIHRva2VuID0gX3JlZjtcblxuICAgIGlmICh0b2tlbi5saXRlcmFsKSB7XG4gICAgICBzICs9IHRva2VuLnZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcyArPSB0b2tlblRvU3RyaW5nKHRva2VuLnZhbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHM7XG59XG5cbnZhciB0b2tlblRvT2JqZWN0ID0ge1xuICBEOiBEQVRFX1NIT1JULFxuICBERDogREFURV9NRUQsXG4gIERERDogREFURV9GVUxMLFxuICBEREREOiBEQVRFX0hVR0UsXG4gIHQ6IFRJTUVfU0lNUExFLFxuICB0dDogVElNRV9XSVRIX1NFQ09ORFMsXG4gIHR0dDogVElNRV9XSVRIX1NIT1JUX09GRlNFVCxcbiAgdHR0dDogVElNRV9XSVRIX0xPTkdfT0ZGU0VULFxuICBUOiBUSU1FXzI0X1NJTVBMRSxcbiAgVFQ6IFRJTUVfMjRfV0lUSF9TRUNPTkRTLFxuICBUVFQ6IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQsXG4gIFRUVFQ6IFRJTUVfMjRfV0lUSF9MT05HX09GRlNFVCxcbiAgZjogREFURVRJTUVfU0hPUlQsXG4gIGZmOiBEQVRFVElNRV9NRUQsXG4gIGZmZjogREFURVRJTUVfRlVMTCxcbiAgZmZmZjogREFURVRJTUVfSFVHRSxcbiAgRjogREFURVRJTUVfU0hPUlRfV0lUSF9TRUNPTkRTLFxuICBGRjogREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUyxcbiAgRkZGOiBEQVRFVElNRV9GVUxMX1dJVEhfU0VDT05EUyxcbiAgRkZGRjogREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFNcbn07XG4vKipcclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBGb3JtYXR0ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBGb3JtYXR0ZXIuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGxvY2FsZSwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZvcm1hdHRlcihsb2NhbGUsIG9wdHMpO1xuICB9O1xuXG4gIEZvcm1hdHRlci5wYXJzZUZvcm1hdCA9IGZ1bmN0aW9uIHBhcnNlRm9ybWF0KGZtdCkge1xuICAgIHZhciBjdXJyZW50ID0gbnVsbCxcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiLFxuICAgICAgICBicmFja2V0ZWQgPSBmYWxzZTtcbiAgICB2YXIgc3BsaXRzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZtdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBmbXQuY2hhckF0KGkpO1xuXG4gICAgICBpZiAoYyA9PT0gXCInXCIpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7XG4gICAgICAgICAgICBsaXRlcmFsOiBicmFja2V0ZWQsXG4gICAgICAgICAgICB2YWw6IGN1cnJlbnRGdWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgY3VycmVudEZ1bGwgPSBcIlwiO1xuICAgICAgICBicmFja2V0ZWQgPSAhYnJhY2tldGVkO1xuICAgICAgfSBlbHNlIGlmIChicmFja2V0ZWQpIHtcbiAgICAgICAgY3VycmVudEZ1bGwgKz0gYztcbiAgICAgIH0gZWxzZSBpZiAoYyA9PT0gY3VycmVudCkge1xuICAgICAgICBjdXJyZW50RnVsbCArPSBjO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBzcGxpdHMucHVzaCh7XG4gICAgICAgICAgICBsaXRlcmFsOiBmYWxzZSxcbiAgICAgICAgICAgIHZhbDogY3VycmVudEZ1bGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRGdWxsID0gYztcbiAgICAgICAgY3VycmVudCA9IGM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRGdWxsLmxlbmd0aCA+IDApIHtcbiAgICAgIHNwbGl0cy5wdXNoKHtcbiAgICAgICAgbGl0ZXJhbDogYnJhY2tldGVkLFxuICAgICAgICB2YWw6IGN1cnJlbnRGdWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BsaXRzO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEZvcm1hdHRlcihsb2NhbGUsIGZvcm1hdE9wdHMpIHtcbiAgICB0aGlzLm9wdHMgPSBmb3JtYXRPcHRzO1xuICAgIHRoaXMubG9jID0gbG9jYWxlO1xuICAgIHRoaXMuc3lzdGVtTG9jID0gbnVsbDtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBGb3JtYXR0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdCA9IGZ1bmN0aW9uIGZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBvcHRzKSB7XG4gICAgaWYgKHRoaXMuc3lzdGVtTG9jID09PSBudWxsKSB7XG4gICAgICB0aGlzLnN5c3RlbUxvYyA9IHRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCk7XG4gICAgfVxuXG4gICAgdmFyIGRmID0gdGhpcy5zeXN0ZW1Mb2MuZHRGb3JtYXR0ZXIoZHQsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cywgb3B0cykpO1xuICAgIHJldHVybiBkZi5mb3JtYXQoKTtcbiAgfTtcblxuICBfcHJvdG8uZm9ybWF0RGF0ZVRpbWUgPSBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShkdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdCgpO1xuICB9O1xuXG4gIF9wcm90by5mb3JtYXREYXRlVGltZVBhcnRzID0gZnVuY3Rpb24gZm9ybWF0RGF0ZVRpbWVQYXJ0cyhkdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgZGYgPSB0aGlzLmxvYy5kdEZvcm1hdHRlcihkdCwgT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzLCBvcHRzKSk7XG4gICAgcmV0dXJuIGRmLmZvcm1hdFRvUGFydHMoKTtcbiAgfTtcblxuICBfcHJvdG8ucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKGR0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBkZiA9IHRoaXMubG9jLmR0Rm9ybWF0dGVyKGR0LCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdHMsIG9wdHMpKTtcbiAgICByZXR1cm4gZGYucmVzb2x2ZWRPcHRpb25zKCk7XG4gIH07XG5cbiAgX3Byb3RvLm51bSA9IGZ1bmN0aW9uIG51bShuLCBwKSB7XG4gICAgaWYgKHAgPT09IHZvaWQgMCkge1xuICAgICAgcCA9IDA7XG4gICAgfVxuXG4gICAgLy8gd2UgZ2V0IHNvbWUgcGVyZiBvdXQgb2YgZG9pbmcgdGhpcyBoZXJlLCBhbm5veWluZ2x5XG4gICAgaWYgKHRoaXMub3B0cy5mb3JjZVNpbXBsZSkge1xuICAgICAgcmV0dXJuIHBhZFN0YXJ0KG4sIHApO1xuICAgIH1cblxuICAgIHZhciBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRzKTtcblxuICAgIGlmIChwID4gMCkge1xuICAgICAgb3B0cy5wYWRUbyA9IHA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihvcHRzKS5mb3JtYXQobik7XG4gIH07XG5cbiAgX3Byb3RvLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyhkdCwgZm10KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBrbm93bkVuZ2xpc2ggPSB0aGlzLmxvYy5saXN0aW5nTW9kZSgpID09PSBcImVuXCI7XG5cbiAgICB2YXIgc3RyaW5nID0gZnVuY3Rpb24gc3RyaW5nKG9wdHMsIGV4dHJhY3QpIHtcbiAgICAgIHJldHVybiBfdGhpcy5sb2MuZXh0cmFjdChkdCwgb3B0cywgZXh0cmFjdCk7XG4gICAgfSxcbiAgICAgICAgZm9ybWF0T2Zmc2V0ID0gZnVuY3Rpb24gZm9ybWF0T2Zmc2V0KG9wdHMpIHtcbiAgICAgIGlmIChkdC5pc09mZnNldEZpeGVkICYmIGR0Lm9mZnNldCA9PT0gMCAmJiBvcHRzLmFsbG93Wikge1xuICAgICAgICByZXR1cm4gXCJaXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBob3VycyA9IE1hdGgudHJ1bmMoZHQub2Zmc2V0IC8gNjApLFxuICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmFicyhkdC5vZmZzZXQgJSA2MCksXG4gICAgICAgICAgc2lnbiA9IGhvdXJzID49IDAgPyBcIitcIiA6IFwiLVwiLFxuICAgICAgICAgIGJhc2UgPSBcIlwiICsgc2lnbiArIE1hdGguYWJzKGhvdXJzKTtcblxuICAgICAgc3dpdGNoIChvcHRzLmZvcm1hdCkge1xuICAgICAgICBjYXNlIFwic2hvcnRcIjpcbiAgICAgICAgICByZXR1cm4gXCJcIiArIHNpZ24gKyBfdGhpcy5udW0oTWF0aC5hYnMoaG91cnMpLCAyKSArIFwiOlwiICsgX3RoaXMubnVtKG1pbnV0ZXMsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJuYXJyb3dcIjpcbiAgICAgICAgICByZXR1cm4gbWludXRlcyA+IDAgPyBiYXNlICsgXCI6XCIgKyBtaW51dGVzIDogYmFzZTtcblxuICAgICAgICBjYXNlIFwidGVjaGllXCI6XG4gICAgICAgICAgcmV0dXJuIFwiXCIgKyBzaWduICsgX3RoaXMubnVtKE1hdGguYWJzKGhvdXJzKSwgMikgKyBfdGhpcy5udW0obWludXRlcywgMik7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIlZhbHVlIGZvcm1hdCBcIiArIG9wdHMuZm9ybWF0ICsgXCIgaXMgb3V0IG9mIHJhbmdlIGZvciBwcm9wZXJ0eSBmb3JtYXRcIik7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgbWVyaWRpZW0gPSBmdW5jdGlvbiBtZXJpZGllbSgpIHtcbiAgICAgIHJldHVybiBrbm93bkVuZ2xpc2ggPyBtZXJpZGllbUZvckRhdGVUaW1lKGR0KSA6IHN0cmluZyh7XG4gICAgICAgIGhvdXI6IFwibnVtZXJpY1wiLFxuICAgICAgICBob3VyMTI6IHRydWVcbiAgICAgIH0sIFwiZGF5cGVyaW9kXCIpO1xuICAgIH0sXG4gICAgICAgIG1vbnRoID0gZnVuY3Rpb24gbW9udGgobGVuZ3RoLCBzdGFuZGFsb25lKSB7XG4gICAgICByZXR1cm4ga25vd25FbmdsaXNoID8gbW9udGhGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8ge1xuICAgICAgICBtb250aDogbGVuZ3RoXG4gICAgICB9IDoge1xuICAgICAgICBtb250aDogbGVuZ3RoLFxuICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICB9LCBcIm1vbnRoXCIpO1xuICAgIH0sXG4gICAgICAgIHdlZWtkYXkgPSBmdW5jdGlvbiB3ZWVrZGF5KGxlbmd0aCwgc3RhbmRhbG9uZSkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IHdlZWtkYXlGb3JEYXRlVGltZShkdCwgbGVuZ3RoKSA6IHN0cmluZyhzdGFuZGFsb25lID8ge1xuICAgICAgICB3ZWVrZGF5OiBsZW5ndGhcbiAgICAgIH0gOiB7XG4gICAgICAgIHdlZWtkYXk6IGxlbmd0aCxcbiAgICAgICAgbW9udGg6IFwibG9uZ1wiLFxuICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICB9LCBcIndlZWtkYXlcIik7XG4gICAgfSxcbiAgICAgICAgbWF5YmVNYWNybyA9IGZ1bmN0aW9uIG1heWJlTWFjcm8odG9rZW4pIHtcbiAgICAgIHZhciBtYWNybyA9IHRva2VuVG9PYmplY3RbdG9rZW5dO1xuXG4gICAgICBpZiAobWFjcm8pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGR0LCBtYWNybyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgZXJhID0gZnVuY3Rpb24gZXJhKGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGtub3duRW5nbGlzaCA/IGVyYUZvckRhdGVUaW1lKGR0LCBsZW5ndGgpIDogc3RyaW5nKHtcbiAgICAgICAgZXJhOiBsZW5ndGhcbiAgICAgIH0sIFwiZXJhXCIpO1xuICAgIH0sXG4gICAgICAgIHRva2VuVG9TdHJpbmcgPSBmdW5jdGlvbiB0b2tlblRvU3RyaW5nKHRva2VuKSB7XG4gICAgICB2YXIgb3V0cHV0Q2FsID0gX3RoaXMubG9jLm91dHB1dENhbGVuZGFyOyAvLyBXaGVyZSBwb3NzaWJsZTogaHR0cDovL2NsZHIudW5pY29kZS5vcmcvdHJhbnNsYXRpb24vZGF0ZS10aW1lI1RPQy1TdGFuZC1BbG9uZS12cy4tRm9ybWF0LVN0eWxlc1xuXG4gICAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAgIC8vIG1zXG4gICAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taWxsaXNlY29uZCk7XG5cbiAgICAgICAgY2FzZSBcInVcIjogLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICAgIGNhc2UgXCJTU1NcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0Lm1pbGxpc2Vjb25kLCAzKTtcbiAgICAgICAgLy8gc2Vjb25kc1xuXG4gICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5zZWNvbmQpO1xuXG4gICAgICAgIGNhc2UgXCJzc1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuc2Vjb25kLCAyKTtcbiAgICAgICAgLy8gbWludXRlc1xuXG4gICAgICAgIGNhc2UgXCJtXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5taW51dGUpO1xuXG4gICAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQubWludXRlLCAyKTtcbiAgICAgICAgLy8gaG91cnNcblxuICAgICAgICBjYXNlIFwiaFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIpO1xuXG4gICAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQuaG91ciAlIDEyID09PSAwID8gMTIgOiBkdC5ob3VyICUgMTIsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5ob3VyKTtcblxuICAgICAgICBjYXNlIFwiSEhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LmhvdXIsIDIpO1xuICAgICAgICAvLyBvZmZzZXRcblxuICAgICAgICBjYXNlIFwiWlwiOlxuICAgICAgICAgIC8vIGxpa2UgKzZcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJuYXJyb3dcIixcbiAgICAgICAgICAgIGFsbG93WjogX3RoaXMub3B0cy5hbGxvd1pcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgICAvLyBsaWtlICswNjowMFxuICAgICAgICAgIHJldHVybiBmb3JtYXRPZmZzZXQoe1xuICAgICAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgICAgICBhbGxvd1o6IF90aGlzLm9wdHMuYWxsb3daXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY2FzZSBcIlpaWlwiOlxuICAgICAgICAgIC8vIGxpa2UgKzA2MDBcbiAgICAgICAgICByZXR1cm4gZm9ybWF0T2Zmc2V0KHtcbiAgICAgICAgICAgIGZvcm1hdDogXCJ0ZWNoaWVcIixcbiAgICAgICAgICAgIGFsbG93WjogZmFsc2VcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjYXNlIFwiWlpaWlwiOlxuICAgICAgICAgIC8vIGxpa2UgRVNUXG4gICAgICAgICAgcmV0dXJuIGR0Lm9mZnNldE5hbWVTaG9ydDtcblxuICAgICAgICBjYXNlIFwiWlpaWlpcIjpcbiAgICAgICAgICAvLyBsaWtlIEVhc3Rlcm4gU3RhbmRhcmQgVGltZVxuICAgICAgICAgIHJldHVybiBkdC5vZmZzZXROYW1lTG9uZztcbiAgICAgICAgLy8gem9uZVxuXG4gICAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICAgICAgLy8gbGlrZSBBbWVyaWNhL05ld19Zb3JrXG4gICAgICAgICAgcmV0dXJuIGR0LnpvbmVOYW1lO1xuICAgICAgICAvLyBtZXJpZGllbXNcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICAgIHJldHVybiBtZXJpZGllbSgpO1xuICAgICAgICAvLyBkYXRlc1xuXG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBkYXk6IFwibnVtZXJpY1wiXG4gICAgICAgICAgfSwgXCJkYXlcIikgOiBfdGhpcy5udW0oZHQuZGF5KTtcblxuICAgICAgICBjYXNlIFwiZGRcIjpcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHtcbiAgICAgICAgICAgIGRheTogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcImRheVwiKSA6IF90aGlzLm51bShkdC5kYXksIDIpO1xuICAgICAgICAvLyB3ZWVrZGF5cyAtIHN0YW5kYWxvbmVcblxuICAgICAgICBjYXNlIFwiY1wiOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla2RheSk7XG5cbiAgICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXMnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJzaG9ydFwiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiY2NjY1wiOlxuICAgICAgICAgIC8vIGxpa2UgJ1R1ZXNkYXknXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJsb25nXCIsIHRydWUpO1xuXG4gICAgICAgIGNhc2UgXCJjY2NjY1wiOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgdHJ1ZSk7XG4gICAgICAgIC8vIHdlZWtkYXlzIC0gZm9ybWF0XG5cbiAgICAgICAgY2FzZSBcIkVcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtkYXkpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgICAvLyBsaWtlICdUdWVzJ1xuICAgICAgICAgIHJldHVybiB3ZWVrZGF5KFwic2hvcnRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVFXCI6XG4gICAgICAgICAgLy8gbGlrZSAnVHVlc2RheSdcbiAgICAgICAgICByZXR1cm4gd2Vla2RheShcImxvbmdcIiwgZmFsc2UpO1xuXG4gICAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICAgIC8vIGxpa2UgJ1QnXG4gICAgICAgICAgcmV0dXJuIHdlZWtkYXkoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAvLyBtb250aHMgLSBzdGFuZGFsb25lXG5cbiAgICAgICAgY2FzZSBcIkxcIjpcbiAgICAgICAgICAvLyBsaWtlIDFcbiAgICAgICAgICByZXR1cm4gb3V0cHV0Q2FsID8gc3RyaW5nKHtcbiAgICAgICAgICAgIG1vbnRoOiBcIm51bWVyaWNcIixcbiAgICAgICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcblxuICAgICAgICBjYXNlIFwiTExcIjpcbiAgICAgICAgICAvLyBsaWtlIDAxLCBkb2Vzbid0IHNlZW0gdG8gd29ya1xuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgbW9udGg6IFwiMi1kaWdpdFwiLFxuICAgICAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwibW9udGhcIikgOiBfdGhpcy5udW0oZHQubW9udGgsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgICAvLyBsaWtlIEphblxuICAgICAgICAgIHJldHVybiBtb250aChcInNob3J0XCIsIHRydWUpO1xuXG4gICAgICAgIGNhc2UgXCJMTExMXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW51YXJ5XG4gICAgICAgICAgcmV0dXJuIG1vbnRoKFwibG9uZ1wiLCB0cnVlKTtcblxuICAgICAgICBjYXNlIFwiTExMTExcIjpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJuYXJyb3dcIiwgdHJ1ZSk7XG4gICAgICAgIC8vIG1vbnRocyAtIGZvcm1hdFxuXG4gICAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgICAgLy8gbGlrZSAxXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBtb250aDogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoKTtcblxuICAgICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIDAxXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICBtb250aDogXCIyLWRpZ2l0XCJcbiAgICAgICAgICB9LCBcIm1vbnRoXCIpIDogX3RoaXMubnVtKGR0Lm1vbnRoLCAyKTtcblxuICAgICAgICBjYXNlIFwiTU1NXCI6XG4gICAgICAgICAgLy8gbGlrZSBKYW5cbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJzaG9ydFwiLCBmYWxzZSk7XG5cbiAgICAgICAgY2FzZSBcIk1NTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIEphbnVhcnlcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJsb25nXCIsIGZhbHNlKTtcblxuICAgICAgICBjYXNlIFwiTU1NTU1cIjpcbiAgICAgICAgICAvLyBsaWtlIEpcbiAgICAgICAgICByZXR1cm4gbW9udGgoXCJuYXJyb3dcIiwgZmFsc2UpO1xuICAgICAgICAvLyB5ZWFyc1xuXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgLy8gbGlrZSAyMDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IF90aGlzLm51bShkdC55ZWFyKTtcblxuICAgICAgICBjYXNlIFwieXlcIjpcbiAgICAgICAgICAvLyBsaWtlIDE0XG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIjItZGlnaXRcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IF90aGlzLm51bShkdC55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcblxuICAgICAgICBjYXNlIFwieXl5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDAxMlxuICAgICAgICAgIHJldHVybiBvdXRwdXRDYWwgPyBzdHJpbmcoe1xuICAgICAgICAgICAgeWVhcjogXCJudW1lcmljXCJcbiAgICAgICAgICB9LCBcInllYXJcIikgOiBfdGhpcy5udW0oZHQueWVhciwgNCk7XG5cbiAgICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICAgIC8vIGxpa2UgMDAwMDEyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dENhbCA/IHN0cmluZyh7XG4gICAgICAgICAgICB5ZWFyOiBcIm51bWVyaWNcIlxuICAgICAgICAgIH0sIFwieWVhclwiKSA6IF90aGlzLm51bShkdC55ZWFyLCA2KTtcbiAgICAgICAgLy8gZXJhc1xuXG4gICAgICAgIGNhc2UgXCJHXCI6XG4gICAgICAgICAgLy8gbGlrZSBBRFxuICAgICAgICAgIHJldHVybiBlcmEoXCJzaG9ydFwiKTtcblxuICAgICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgICAvLyBsaWtlIEFubm8gRG9taW5pXG4gICAgICAgICAgcmV0dXJuIGVyYShcImxvbmdcIik7XG5cbiAgICAgICAgY2FzZSBcIkdHR0dHXCI6XG4gICAgICAgICAgcmV0dXJuIGVyYShcIm5hcnJvd1wiKTtcblxuICAgICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtZZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLCAyKTtcblxuICAgICAgICBjYXNlIFwia2tra1wiOlxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQud2Vla1llYXIsIDQpO1xuXG4gICAgICAgIGNhc2UgXCJXXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC53ZWVrTnVtYmVyKTtcblxuICAgICAgICBjYXNlIFwiV1dcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LndlZWtOdW1iZXIsIDIpO1xuXG4gICAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5vcmRpbmFsKTtcblxuICAgICAgICBjYXNlIFwib29vXCI6XG4gICAgICAgICAgcmV0dXJuIF90aGlzLm51bShkdC5vcmRpbmFsLCAzKTtcblxuICAgICAgICBjYXNlIFwicVwiOlxuICAgICAgICAgIC8vIGxpa2UgMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlcik7XG5cbiAgICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgICAgLy8gbGlrZSAwMVxuICAgICAgICAgIHJldHVybiBfdGhpcy5udW0oZHQucXVhcnRlciwgMik7XG5cbiAgICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKE1hdGguZmxvb3IoZHQudHMgLyAxMDAwKSk7XG5cbiAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICByZXR1cm4gX3RoaXMubnVtKGR0LnRzKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBtYXliZU1hY3JvKHRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHN0cmluZ2lmeVRva2VucyhGb3JtYXR0ZXIucGFyc2VGb3JtYXQoZm10KSwgdG9rZW5Ub1N0cmluZyk7XG4gIH07XG5cbiAgX3Byb3RvLmZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyA9IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uRnJvbVN0cmluZyhkdXIsIGZtdCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHRva2VuVG9GaWVsZCA9IGZ1bmN0aW9uIHRva2VuVG9GaWVsZCh0b2tlbikge1xuICAgICAgc3dpdGNoICh0b2tlblswXSkge1xuICAgICAgICBjYXNlIFwiU1wiOlxuICAgICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG5cbiAgICAgICAgY2FzZSBcInNcIjpcbiAgICAgICAgICByZXR1cm4gXCJzZWNvbmRcIjtcblxuICAgICAgICBjYXNlIFwibVwiOlxuICAgICAgICAgIHJldHVybiBcIm1pbnV0ZVwiO1xuXG4gICAgICAgIGNhc2UgXCJoXCI6XG4gICAgICAgICAgcmV0dXJuIFwiaG91clwiO1xuXG4gICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG5cbiAgICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgICByZXR1cm4gXCJtb250aFwiO1xuXG4gICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgcmV0dXJuIFwieWVhclwiO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICAgICAgdG9rZW5Ub1N0cmluZyA9IGZ1bmN0aW9uIHRva2VuVG9TdHJpbmcobGlsZHVyKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHRva2VuKSB7XG4gICAgICAgIHZhciBtYXBwZWQgPSB0b2tlblRvRmllbGQodG9rZW4pO1xuXG4gICAgICAgIGlmIChtYXBwZWQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLm51bShsaWxkdXIuZ2V0KG1hcHBlZCksIHRva2VuLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gICAgICAgIHRva2VucyA9IEZvcm1hdHRlci5wYXJzZUZvcm1hdChmbXQpLFxuICAgICAgICByZWFsVG9rZW5zID0gdG9rZW5zLnJlZHVjZShmdW5jdGlvbiAoZm91bmQsIF9yZWYyKSB7XG4gICAgICB2YXIgbGl0ZXJhbCA9IF9yZWYyLmxpdGVyYWwsXG4gICAgICAgICAgdmFsID0gX3JlZjIudmFsO1xuICAgICAgcmV0dXJuIGxpdGVyYWwgPyBmb3VuZCA6IGZvdW5kLmNvbmNhdCh2YWwpO1xuICAgIH0sIFtdKSxcbiAgICAgICAgY29sbGFwc2VkID0gZHVyLnNoaWZ0VG8uYXBwbHkoZHVyLCByZWFsVG9rZW5zLm1hcCh0b2tlblRvRmllbGQpLmZpbHRlcihmdW5jdGlvbiAodCkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHN0cmluZ2lmeVRva2Vucyh0b2tlbnMsIHRva2VuVG9TdHJpbmcoY29sbGFwc2VkKSk7XG4gIH07XG5cbiAgcmV0dXJuIEZvcm1hdHRlcjtcbn0oKTtcblxudmFyIGludGxEVENhY2hlID0ge307XG5cbmZ1bmN0aW9uIGdldENhY2hlZERURihsb2NTdHJpbmcsIG9wdHMpIHtcbiAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgIG9wdHMgPSB7fTtcbiAgfVxuXG4gIHZhciBrZXkgPSBKU09OLnN0cmluZ2lmeShbbG9jU3RyaW5nLCBvcHRzXSk7XG4gIHZhciBkdGYgPSBpbnRsRFRDYWNoZVtrZXldO1xuXG4gIGlmICghZHRmKSB7XG4gICAgZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jU3RyaW5nLCBvcHRzKTtcbiAgICBpbnRsRFRDYWNoZVtrZXldID0gZHRmO1xuICB9XG5cbiAgcmV0dXJuIGR0Zjtcbn1cblxudmFyIGludGxOdW1DYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDYWNoZW5kSU5GKGxvY1N0cmluZywgb3B0cykge1xuICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0cyA9IHt9O1xuICB9XG5cbiAgdmFyIGtleSA9IEpTT04uc3RyaW5naWZ5KFtsb2NTdHJpbmcsIG9wdHNdKTtcbiAgdmFyIGluZiA9IGludGxOdW1DYWNoZVtrZXldO1xuXG4gIGlmICghaW5mKSB7XG4gICAgaW5mID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY1N0cmluZywgb3B0cyk7XG4gICAgaW50bE51bUNhY2hlW2tleV0gPSBpbmY7XG4gIH1cblxuICByZXR1cm4gaW5mO1xufVxuXG52YXIgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuXG5mdW5jdGlvbiBzeXN0ZW1Mb2NhbGUoKSB7XG4gIGlmIChzeXNMb2NhbGVDYWNoZSkge1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIGlmIChoYXNJbnRsKCkpIHtcbiAgICB2YXIgY29tcHV0ZWRTeXMgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLmxvY2FsZTsgLy8gbm9kZSBzb21ldGltZXMgZGVmYXVsdHMgdG8gXCJ1bmRcIi4gT3ZlcnJpZGUgdGhhdCBiZWNhdXNlIHRoYXQgaXMgZHVtYlxuXG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBjb21wdXRlZFN5cyA9PT0gXCJ1bmRcIiA/IFwiZW4tVVNcIiA6IGNvbXB1dGVkU3lzO1xuICAgIHJldHVybiBzeXNMb2NhbGVDYWNoZTtcbiAgfSBlbHNlIHtcbiAgICBzeXNMb2NhbGVDYWNoZSA9IFwiZW4tVVNcIjtcbiAgICByZXR1cm4gc3lzTG9jYWxlQ2FjaGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VMb2NhbGVTdHJpbmcobG9jYWxlU3RyKSB7XG4gIC8vIEkgcmVhbGx5IHdhbnQgdG8gYXZvaWQgd3JpdGluZyBhIEJDUCA0NyBwYXJzZXJcbiAgLy8gc2VlLCBlLmcuIGh0dHBzOi8vZ2l0aHViLmNvbS93b29vcm0vYmNwLTQ3XG4gIC8vIEludGVhZCwgd2UnbGwgZG8gdGhpczpcbiAgLy8gYSkgaWYgdGhlIHN0cmluZyBoYXMgbm8gLXUgZXh0ZW5zaW9ucywganVzdCBsZWF2ZSBpdCBhbG9uZVxuICAvLyBiKSBpZiBpdCBkb2VzLCB1c2UgSW50bCB0byByZXNvbHZlIGV2ZXJ5dGhpbmdcbiAgLy8gYykgaWYgSW50bCBmYWlscywgdHJ5IGFnYWluIHdpdGhvdXQgdGhlIC11XG4gIHZhciB1SW5kZXggPSBsb2NhbGVTdHIuaW5kZXhPZihcIi11LVwiKTtcblxuICBpZiAodUluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBbbG9jYWxlU3RyXTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgb3B0aW9ucztcbiAgICB2YXIgc21hbGxlciA9IGxvY2FsZVN0ci5zdWJzdHJpbmcoMCwgdUluZGV4KTtcblxuICAgIHRyeSB7XG4gICAgICBvcHRpb25zID0gZ2V0Q2FjaGVkRFRGKGxvY2FsZVN0cikucmVzb2x2ZWRPcHRpb25zKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb3B0aW9ucyA9IGdldENhY2hlZERURihzbWFsbGVyKS5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIGNhbGVuZGFyID0gX29wdGlvbnMuY2FsZW5kYXI7IC8vIHJldHVybiB0aGUgc21hbGxlciBvbmUgc28gdGhhdCB3ZSBjYW4gYXBwZW5kIHRoZSBjYWxlbmRhciBhbmQgbnVtYmVyaW5nIG92ZXJyaWRlcyB0byBpdFxuXG4gICAgcmV0dXJuIFtzbWFsbGVyLCBudW1iZXJpbmdTeXN0ZW0sIGNhbGVuZGFyXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnRsQ29uZmlnU3RyaW5nKGxvY2FsZVN0ciwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhcikge1xuICBpZiAoaGFzSW50bCgpKSB7XG4gICAgaWYgKG91dHB1dENhbGVuZGFyIHx8IG51bWJlcmluZ1N5c3RlbSkge1xuICAgICAgbG9jYWxlU3RyICs9IFwiLXVcIjtcblxuICAgICAgaWYgKG91dHB1dENhbGVuZGFyKSB7XG4gICAgICAgIGxvY2FsZVN0ciArPSBcIi1jYS1cIiArIG91dHB1dENhbGVuZGFyO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVtYmVyaW5nU3lzdGVtKSB7XG4gICAgICAgIGxvY2FsZVN0ciArPSBcIi1udS1cIiArIG51bWJlcmluZ1N5c3RlbTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvY2FsZVN0cjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvY2FsZVN0cjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcE1vbnRocyhmKSB7XG4gIHZhciBtcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICB2YXIgZHQgPSBEYXRlVGltZS51dGMoMjAxNiwgaSwgMSk7XG4gICAgbXMucHVzaChmKGR0KSk7XG4gIH1cblxuICByZXR1cm4gbXM7XG59XG5cbmZ1bmN0aW9uIG1hcFdlZWtkYXlzKGYpIHtcbiAgdmFyIG1zID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gNzsgaSsrKSB7XG4gICAgdmFyIGR0ID0gRGF0ZVRpbWUudXRjKDIwMTYsIDExLCAxMyArIGkpO1xuICAgIG1zLnB1c2goZihkdCkpO1xuICB9XG5cbiAgcmV0dXJuIG1zO1xufVxuXG5mdW5jdGlvbiBsaXN0U3R1ZmYobG9jLCBsZW5ndGgsIGRlZmF1bHRPSywgZW5nbGlzaEZuLCBpbnRsRm4pIHtcbiAgdmFyIG1vZGUgPSBsb2MubGlzdGluZ01vZGUoZGVmYXVsdE9LKTtcblxuICBpZiAobW9kZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gXCJlblwiKSB7XG4gICAgcmV0dXJuIGVuZ2xpc2hGbihsZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpbnRsRm4obGVuZ3RoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0Zhc3ROdW1iZXJzKGxvYykge1xuICBpZiAobG9jLm51bWJlcmluZ1N5c3RlbSAmJiBsb2MubnVtYmVyaW5nU3lzdGVtICE9PSBcImxhdG5cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbG9jLm51bWJlcmluZ1N5c3RlbSA9PT0gXCJsYXRuXCIgfHwgIWxvYy5sb2NhbGUgfHwgbG9jLmxvY2FsZS5zdGFydHNXaXRoKFwiZW5cIikgfHwgaGFzSW50bCgpICYmIEludGwuRGF0ZVRpbWVGb3JtYXQobG9jLmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbSA9PT0gXCJsYXRuXCI7XG4gIH1cbn1cbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxuXG52YXIgU2ltcGxlTnVtYmVyRm9ybWF0dGVyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2ltcGxlTnVtYmVyRm9ybWF0dGVyKG9wdHMpIHtcbiAgICB0aGlzLnBhZFRvID0gb3B0cy5wYWRUbyB8fCAwO1xuICAgIHRoaXMuZmxvb3IgPSBvcHRzLmZsb29yIHx8IGZhbHNlO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNpbXBsZU51bWJlckZvcm1hdHRlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgLy8gdG8gbWF0Y2ggdGhlIGJyb3dzZXIncyBudW1iZXJmb3JtYXR0ZXIgZGVmYXVsdHNcbiAgICB2YXIgZml4ZWQgPSB0aGlzLmZsb29yID8gTWF0aC5mbG9vcihpKSA6IHJvdW5kVG8oaSwgMyk7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KGZpeGVkLCB0aGlzLnBhZFRvKTtcbiAgfTtcblxuICByZXR1cm4gU2ltcGxlTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuXG52YXIgSW50bE51bWJlckZvcm1hdHRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEludGxOdW1iZXJGb3JtYXR0ZXIoaW50bCwgb3B0cykge1xuICAgIHZhciBpbnRsT3B0cyA9IHtcbiAgICAgIHVzZUdyb3VwaW5nOiBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAob3B0cy5wYWRUbyA+IDApIHtcbiAgICAgIGludGxPcHRzLm1pbmltdW1JbnRlZ2VyRGlnaXRzID0gb3B0cy5wYWRUbztcbiAgICB9XG5cbiAgICB0aGlzLmZsb29yID0gb3B0cy5mbG9vcjtcbiAgICB0aGlzLmluZiA9IGdldENhY2hlbmRJTkYoaW50bCwgaW50bE9wdHMpO1xuICB9XG5cbiAgdmFyIF9wcm90bzIgPSBJbnRsTnVtYmVyRm9ybWF0dGVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8yLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChpKSB7XG4gICAgdmFyIGZpeGVkID0gdGhpcy5mbG9vciA/IE1hdGguZmxvb3IoaSkgOiBpO1xuICAgIHJldHVybiB0aGlzLmluZi5mb3JtYXQoZml4ZWQpO1xuICB9O1xuXG4gIHJldHVybiBJbnRsTnVtYmVyRm9ybWF0dGVyO1xufSgpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbnZhciBQb2x5RGF0ZUZvcm1hdHRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvbHlEYXRlRm9ybWF0dGVyKGR0LCBpbnRsLCBvcHRzKSB7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmhhc0ludGwgPSBoYXNJbnRsKCk7XG4gICAgdmFyIHo7XG5cbiAgICBpZiAoZHQuem9uZS51bml2ZXJzYWwgJiYgdGhpcy5oYXNJbnRsKSB7XG4gICAgICAvLyBDaHJvbWl1bSBkb2Vzbid0IHN1cHBvcnQgZml4ZWQtb2Zmc2V0IHpvbmVzIGxpa2UgRXRjL0dNVCs4IGluIGl0cyBmb3JtYXR0ZXIsXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzY0Mzc0LlxuICAgICAgLy8gU28gd2UgaGF2ZSB0byBtYWtlIGRvLiBUd28gY2FzZXM6XG4gICAgICAvLyAxLiBUaGUgZm9ybWF0IG9wdGlvbnMgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBXZSBjYW4ndCBkbyB0aGF0LCBzbyB0aGUgYmVzdFxuICAgICAgLy8gd2UgY2FuIGRvIGlzIGZvcm1hdCB0aGUgZGF0ZSBpbiBVVEMuXG4gICAgICAvLyAyLiBUaGUgZm9ybWF0IG9wdGlvbnMgZG9uJ3QgdGVsbCB1cyB0byBzaG93IHRoZSB6b25lLiBUaGVuIHdlIGNhbiBhZGp1c3QgdGhlbVxuICAgICAgLy8gdGhlIHRpbWUgYW5kIHRlbGwgdGhlIGZvcm1hdHRlciB0byBzaG93IGl0IHRvIHVzIGluIFVUQywgc28gdGhhdCB0aGUgdGltZSBpcyByaWdodFxuICAgICAgLy8gYW5kIHRoZSBiYWQgem9uZSBkb2Vzbid0IHNob3cgdXAuXG4gICAgICAvLyBXZSBjYW4gY2xlYW4gYWxsIHRoaXMgdXAgd2hlbiBDaHJvbWUgZml4ZXMgdGhpcy5cbiAgICAgIHogPSBcIlVUQ1wiO1xuXG4gICAgICBpZiAob3B0cy50aW1lWm9uZU5hbWUpIHtcbiAgICAgICAgdGhpcy5kdCA9IGR0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kdCA9IGR0Lm9mZnNldCA9PT0gMCA/IGR0IDogRGF0ZVRpbWUuZnJvbU1pbGxpcyhkdC50cyArIGR0Lm9mZnNldCAqIDYwICogMTAwMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkdC56b25lLnR5cGUgPT09IFwibG9jYWxcIikge1xuICAgICAgdGhpcy5kdCA9IGR0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmR0ID0gZHQ7XG4gICAgICB6ID0gZHQuem9uZS5uYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHZhciBpbnRsT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0cyk7XG5cbiAgICAgIGlmICh6KSB7XG4gICAgICAgIGludGxPcHRzLnRpbWVab25lID0gejtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kdGYgPSBnZXRDYWNoZWREVEYoaW50bCwgaW50bE9wdHMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8zID0gUG9seURhdGVGb3JtYXR0ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90bzMuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRva2VuRm9ybWF0ID0gZm9ybWF0U3RyaW5nKHRoaXMub3B0cyksXG4gICAgICAgICAgbG9jID0gTG9jYWxlLmNyZWF0ZShcImVuLVVTXCIpO1xuICAgICAgcmV0dXJuIEZvcm1hdHRlci5jcmVhdGUobG9jKS5mb3JtYXREYXRlVGltZUZyb21TdHJpbmcodGhpcy5kdCwgdG9rZW5Gb3JtYXQpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8zLmZvcm1hdFRvUGFydHMgPSBmdW5jdGlvbiBmb3JtYXRUb1BhcnRzKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwgJiYgaGFzRm9ybWF0VG9QYXJ0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kdGYuZm9ybWF0VG9QYXJ0cyh0aGlzLmR0LnRvSlNEYXRlKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGtpbmQgb2YgYSBjb3Agb3V0LiBXZSBhY3R1YWxseSBjb3VsZCBkbyB0aGlzIGZvciBFbmdsaXNoLiBIb3dldmVyLCB3ZSBjb3VsZG4ndCBkbyBpdCBmb3IgaW50bCBzdHJpbmdzXG4gICAgICAvLyBhbmQgSU1PIGl0J3MgdG9vIHdlaXJkIHRvIGhhdmUgYW4gdW5jYW5ueSB2YWxsZXkgbGlrZSB0aGF0XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzMucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gcmVzb2x2ZWRPcHRpb25zKCkge1xuICAgIGlmICh0aGlzLmhhc0ludGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiBcImVuLVVTXCIsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbTogXCJsYXRuXCIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyOiBcImdyZWdvcnlcIlxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFBvbHlEYXRlRm9ybWF0dGVyO1xufSgpO1xuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbnZhciBMb2NhbGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBMb2NhbGUuZnJvbU9wdHMgPSBmdW5jdGlvbiBmcm9tT3B0cyhvcHRzKSB7XG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUob3B0cy5sb2NhbGUsIG9wdHMubnVtYmVyaW5nU3lzdGVtLCBvcHRzLm91dHB1dENhbGVuZGFyLCBvcHRzLmRlZmF1bHRUb0VOKTtcbiAgfTtcblxuICBMb2NhbGUuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvdXRwdXRDYWxlbmRhciwgZGVmYXVsdFRvRU4pIHtcbiAgICBpZiAoZGVmYXVsdFRvRU4gPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdFRvRU4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgc3BlY2lmaWVkTG9jYWxlID0gbG9jYWxlIHx8IFNldHRpbmdzLmRlZmF1bHRMb2NhbGUsXG4gICAgICAgIC8vIHRoZSBzeXN0ZW0gbG9jYWxlIGlzIHVzZWZ1bCBmb3IgaHVtYW4gcmVhZGFibGUgc3RyaW5ncyBidXQgYW5ub3lpbmcgZm9yIHBhcnNpbmcvZm9ybWF0dGluZyBrbm93biBmb3JtYXRzXG4gICAgbG9jYWxlUiA9IHNwZWNpZmllZExvY2FsZSB8fCAoZGVmYXVsdFRvRU4gPyBcImVuLVVTXCIgOiBzeXN0ZW1Mb2NhbGUoKSksXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbVIgPSBudW1iZXJpbmdTeXN0ZW0gfHwgU2V0dGluZ3MuZGVmYXVsdE51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXJSID0gb3V0cHV0Q2FsZW5kYXIgfHwgU2V0dGluZ3MuZGVmYXVsdE91dHB1dENhbGVuZGFyO1xuICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVIsIG51bWJlcmluZ1N5c3RlbVIsIG91dHB1dENhbGVuZGFyUiwgc3BlY2lmaWVkTG9jYWxlKTtcbiAgfTtcblxuICBMb2NhbGUucmVzZXRDYWNoZSA9IGZ1bmN0aW9uIHJlc2V0Q2FjaGUoKSB7XG4gICAgc3lzTG9jYWxlQ2FjaGUgPSBudWxsO1xuICAgIGludGxEVENhY2hlID0ge307XG4gICAgaW50bE51bUNhY2hlID0ge307XG4gIH07XG5cbiAgTG9jYWxlLmZyb21PYmplY3QgPSBmdW5jdGlvbiBmcm9tT2JqZWN0KF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXI7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIExvY2FsZShsb2NhbGUsIG51bWJlcmluZywgb3V0cHV0Q2FsZW5kYXIsIHNwZWNpZmllZExvY2FsZSkge1xuICAgIHZhciBfcGFyc2VMb2NhbGVTdHJpbmcgPSBwYXJzZUxvY2FsZVN0cmluZyhsb2NhbGUpLFxuICAgICAgICBwYXJzZWRMb2NhbGUgPSBfcGFyc2VMb2NhbGVTdHJpbmdbMF0sXG4gICAgICAgIHBhcnNlZE51bWJlcmluZ1N5c3RlbSA9IF9wYXJzZUxvY2FsZVN0cmluZ1sxXSxcbiAgICAgICAgcGFyc2VkT3V0cHV0Q2FsZW5kYXIgPSBfcGFyc2VMb2NhbGVTdHJpbmdbMl07XG5cbiAgICB0aGlzLmxvY2FsZSA9IHBhcnNlZExvY2FsZTtcbiAgICB0aGlzLm51bWJlcmluZ1N5c3RlbSA9IG51bWJlcmluZyB8fCBwYXJzZWROdW1iZXJpbmdTeXN0ZW0gfHwgbnVsbDtcbiAgICB0aGlzLm91dHB1dENhbGVuZGFyID0gb3V0cHV0Q2FsZW5kYXIgfHwgcGFyc2VkT3V0cHV0Q2FsZW5kYXIgfHwgbnVsbDtcbiAgICB0aGlzLmludGwgPSBpbnRsQ29uZmlnU3RyaW5nKHRoaXMubG9jYWxlLCB0aGlzLm51bWJlcmluZ1N5c3RlbSwgdGhpcy5vdXRwdXRDYWxlbmRhcik7XG4gICAgdGhpcy53ZWVrZGF5c0NhY2hlID0ge1xuICAgICAgZm9ybWF0OiB7fSxcbiAgICAgIHN0YW5kYWxvbmU6IHt9XG4gICAgfTtcbiAgICB0aGlzLm1vbnRoc0NhY2hlID0ge1xuICAgICAgZm9ybWF0OiB7fSxcbiAgICAgIHN0YW5kYWxvbmU6IHt9XG4gICAgfTtcbiAgICB0aGlzLm1lcmlkaWVtQ2FjaGUgPSBudWxsO1xuICAgIHRoaXMuZXJhQ2FjaGUgPSB7fTtcbiAgICB0aGlzLnNwZWNpZmllZExvY2FsZSA9IHNwZWNpZmllZExvY2FsZTtcbiAgICB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID0gbnVsbDtcbiAgfVxuXG4gIHZhciBfcHJvdG80ID0gTG9jYWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG80Lmxpc3RpbmdNb2RlID0gZnVuY3Rpb24gbGlzdGluZ01vZGUoZGVmYXVsdE9LKSB7XG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBpbnRsID0gaGFzSW50bCgpLFxuICAgICAgICBoYXNGVFAgPSBpbnRsICYmIGhhc0Zvcm1hdFRvUGFydHMoKSxcbiAgICAgICAgaXNBY3R1YWxseUVuID0gdGhpcy5sb2NhbGUgPT09IFwiZW5cIiB8fCB0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSBcImVuLXVzXCIgfHwgaW50bCAmJiBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMuaW50bCkucmVzb2x2ZWRPcHRpb25zKCkubG9jYWxlLnN0YXJ0c1dpdGgoXCJlbi11c1wiKSxcbiAgICAgICAgaGFzTm9XZWlyZG5lc3MgPSAodGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IG51bGwgfHwgdGhpcy5udW1iZXJpbmdTeXN0ZW0gPT09IFwibGF0blwiKSAmJiAodGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gbnVsbCB8fCB0aGlzLm91dHB1dENhbGVuZGFyID09PSBcImdyZWdvcnlcIik7XG5cbiAgICBpZiAoIWhhc0ZUUCAmJiAhKGlzQWN0dWFsbHlFbiAmJiBoYXNOb1dlaXJkbmVzcykgJiYgIWRlZmF1bHRPSykge1xuICAgICAgcmV0dXJuIFwiZXJyb3JcIjtcbiAgICB9IGVsc2UgaWYgKCFoYXNGVFAgfHwgaXNBY3R1YWxseUVuICYmIGhhc05vV2VpcmRuZXNzKSB7XG4gICAgICByZXR1cm4gXCJlblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJpbnRsXCI7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzQuY2xvbmUgPSBmdW5jdGlvbiBjbG9uZShhbHRzKSB7XG4gICAgaWYgKCFhbHRzIHx8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFsdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGFsdHMubG9jYWxlIHx8IHRoaXMuc3BlY2lmaWVkTG9jYWxlLCBhbHRzLm51bWJlcmluZ1N5c3RlbSB8fCB0aGlzLm51bWJlcmluZ1N5c3RlbSwgYWx0cy5vdXRwdXRDYWxlbmRhciB8fCB0aGlzLm91dHB1dENhbGVuZGFyLCBhbHRzLmRlZmF1bHRUb0VOIHx8IGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvNC5yZWRlZmF1bHRUb0VOID0gZnVuY3Rpb24gcmVkZWZhdWx0VG9FTihhbHRzKSB7XG4gICAgaWYgKGFsdHMgPT09IHZvaWQgMCkge1xuICAgICAgYWx0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHtcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSkpO1xuICB9O1xuXG4gIF9wcm90bzQucmVkZWZhdWx0VG9TeXN0ZW0gPSBmdW5jdGlvbiByZWRlZmF1bHRUb1N5c3RlbShhbHRzKSB7XG4gICAgaWYgKGFsdHMgPT09IHZvaWQgMCkge1xuICAgICAgYWx0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNsb25lKE9iamVjdC5hc3NpZ24oe30sIGFsdHMsIHtcbiAgICAgIGRlZmF1bHRUb0VOOiBmYWxzZVxuICAgIH0pKTtcbiAgfTtcblxuICBfcHJvdG80Lm1vbnRocyA9IGZ1bmN0aW9uIG1vbnRocyQkMShsZW5ndGgsIGZvcm1hdCwgZGVmYXVsdE9LKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmIChmb3JtYXQgPT09IHZvaWQgMCkge1xuICAgICAgZm9ybWF0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgbGVuZ3RoLCBkZWZhdWx0T0ssIG1vbnRocywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSBmb3JtYXQgPyB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGgsXG4gICAgICAgIGRheTogXCJudW1lcmljXCJcbiAgICAgIH0gOiB7XG4gICAgICAgIG1vbnRoOiBsZW5ndGhcbiAgICAgIH0sXG4gICAgICAgICAgZm9ybWF0U3RyID0gZm9ybWF0ID8gXCJmb3JtYXRcIiA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgICBpZiAoIV90aGlzLm1vbnRoc0NhY2hlW2Zvcm1hdFN0cl1bbGVuZ3RoXSkge1xuICAgICAgICBfdGhpcy5tb250aHNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0gPSBtYXBNb250aHMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmV4dHJhY3QoZHQsIGludGwsIFwibW9udGhcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXMubW9udGhzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQud2Vla2RheXMgPSBmdW5jdGlvbiB3ZWVrZGF5cyQkMShsZW5ndGgsIGZvcm1hdCwgZGVmYXVsdE9LKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBpZiAoZm9ybWF0ID09PSB2b2lkIDApIHtcbiAgICAgIGZvcm1hdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCB3ZWVrZGF5cywgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGludGwgPSBmb3JtYXQgPyB7XG4gICAgICAgIHdlZWtkYXk6IGxlbmd0aCxcbiAgICAgICAgeWVhcjogXCJudW1lcmljXCIsXG4gICAgICAgIG1vbnRoOiBcImxvbmdcIixcbiAgICAgICAgZGF5OiBcIm51bWVyaWNcIlxuICAgICAgfSA6IHtcbiAgICAgICAgd2Vla2RheTogbGVuZ3RoXG4gICAgICB9LFxuICAgICAgICAgIGZvcm1hdFN0ciA9IGZvcm1hdCA/IFwiZm9ybWF0XCIgOiBcInN0YW5kYWxvbmVcIjtcblxuICAgICAgaWYgKCFfdGhpczIud2Vla2RheXNDYWNoZVtmb3JtYXRTdHJdW2xlbmd0aF0pIHtcbiAgICAgICAgX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdID0gbWFwV2Vla2RheXMoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5leHRyYWN0KGR0LCBpbnRsLCBcIndlZWtkYXlcIik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3RoaXMyLndlZWtkYXlzQ2FjaGVbZm9ybWF0U3RyXVtsZW5ndGhdO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQubWVyaWRpZW1zID0gZnVuY3Rpb24gbWVyaWRpZW1zJCQxKGRlZmF1bHRPSykge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgaWYgKGRlZmF1bHRPSyA9PT0gdm9pZCAwKSB7XG4gICAgICBkZWZhdWx0T0sgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0U3R1ZmYodGhpcywgdW5kZWZpbmVkLCBkZWZhdWx0T0ssIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBtZXJpZGllbXM7XG4gICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gSW4gdGhlb3J5IHRoZXJlIGNvdWxkIGJlIGFyaWJpdHJhcnkgZGF5IHBlcmlvZHMuIFdlJ3JlIGdvbm5hIGFzc3VtZSB0aGVyZSBhcmUgZXhhY3RseSB0d29cbiAgICAgIC8vIGZvciBBTSBhbmQgUE0uIFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIG1ha2VzIHBhcnNpbmcgd2F5IGVhc2llci5cbiAgICAgIGlmICghX3RoaXMzLm1lcmlkaWVtQ2FjaGUpIHtcbiAgICAgICAgdmFyIGludGwgPSB7XG4gICAgICAgICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgICAgICAgaG91cjEyOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIF90aGlzMy5tZXJpZGllbUNhY2hlID0gW0RhdGVUaW1lLnV0YygyMDE2LCAxMSwgMTMsIDkpLCBEYXRlVGltZS51dGMoMjAxNiwgMTEsIDEzLCAxOSldLm1hcChmdW5jdGlvbiAoZHQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLmV4dHJhY3QoZHQsIGludGwsIFwiZGF5cGVyaW9kXCIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzMy5tZXJpZGllbUNhY2hlO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90bzQuZXJhcyA9IGZ1bmN0aW9uIGVyYXMkJDEobGVuZ3RoLCBkZWZhdWx0T0spIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGlmIChkZWZhdWx0T0sgPT09IHZvaWQgMCkge1xuICAgICAgZGVmYXVsdE9LID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdFN0dWZmKHRoaXMsIGxlbmd0aCwgZGVmYXVsdE9LLCBlcmFzLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW50bCA9IHtcbiAgICAgICAgZXJhOiBsZW5ndGhcbiAgICAgIH07IC8vIFRoaXMgaXMgdXR0ZXIgYnVsbHNoaXQuIERpZmZlcmVudCBjYWxlbmRhcnMgYXJlIGdvaW5nIHRvIGRlZmluZSBlcmFzIHRvdGFsbHkgZGlmZmVyZW50bHkuIFdoYXQgSSBuZWVkIGlzIHRoZSBtaW5pbXVtIHNldCBvZiBkYXRlc1xuICAgICAgLy8gdG8gZGVmaW5pdGVseSBlbnVtZXJhdGUgdGhlbS5cblxuICAgICAgaWYgKCFfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSkge1xuICAgICAgICBfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXSA9IFtEYXRlVGltZS51dGMoLTQwLCAxLCAxKSwgRGF0ZVRpbWUudXRjKDIwMTcsIDEsIDEpXS5tYXAoZnVuY3Rpb24gKGR0KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNC5leHRyYWN0KGR0LCBpbnRsLCBcImVyYVwiKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfdGhpczQuZXJhQ2FjaGVbbGVuZ3RoXTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG80LmV4dHJhY3QgPSBmdW5jdGlvbiBleHRyYWN0KGR0LCBpbnRsT3B0cywgZmllbGQpIHtcbiAgICB2YXIgZGYgPSB0aGlzLmR0Rm9ybWF0dGVyKGR0LCBpbnRsT3B0cyksXG4gICAgICAgIHJlc3VsdHMgPSBkZi5mb3JtYXRUb1BhcnRzKCksXG4gICAgICAgIG1hdGNoaW5nID0gcmVzdWx0cy5maW5kKGZ1bmN0aW9uIChtKSB7XG4gICAgICByZXR1cm4gbS50eXBlLnRvTG93ZXJDYXNlKCkgPT09IGZpZWxkO1xuICAgIH0pO1xuICAgIHJldHVybiBtYXRjaGluZyA/IG1hdGNoaW5nLnZhbHVlIDogbnVsbDtcbiAgfTtcblxuICBfcHJvdG80Lm51bWJlckZvcm1hdHRlciA9IGZ1bmN0aW9uIG51bWJlckZvcm1hdHRlcihvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIC8vIHRoaXMgZm9yY2VzaW1wbGUgb3B0aW9uIGlzIG5ldmVyIHVzZWQgKHRoZSBvbmx5IGNhbGxlciBzaG9ydC1jaXJjdWl0cyBvbiBpdCwgYnV0IGl0IHNlZW1zIHNhZmVyIHRvIGxlYXZlKVxuICAgIC8vIChpbiBjb250cmFzdCwgdGhlIHJlc3Qgb2YgdGhlIGNvbmRpdGlvbiBpcyB1c2VkIGhlYXZpbHkpXG4gICAgaWYgKG9wdHMuZm9yY2VTaW1wbGUgfHwgdGhpcy5mYXN0TnVtYmVycyB8fCAhaGFzSW50bCgpKSB7XG4gICAgICByZXR1cm4gbmV3IFNpbXBsZU51bWJlckZvcm1hdHRlcihvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBJbnRsTnVtYmVyRm9ybWF0dGVyKHRoaXMuaW50bCwgb3B0cyk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90bzQuZHRGb3JtYXR0ZXIgPSBmdW5jdGlvbiBkdEZvcm1hdHRlcihkdCwgaW50bE9wdHMpIHtcbiAgICBpZiAoaW50bE9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgaW50bE9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBvbHlEYXRlRm9ybWF0dGVyKGR0LCB0aGlzLmludGwsIGludGxPcHRzKTtcbiAgfTtcblxuICBfcHJvdG80LmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmxvY2FsZSA9PT0gb3RoZXIubG9jYWxlICYmIHRoaXMubnVtYmVyaW5nU3lzdGVtID09PSBvdGhlci5udW1iZXJpbmdTeXN0ZW0gJiYgdGhpcy5vdXRwdXRDYWxlbmRhciA9PT0gb3RoZXIub3V0cHV0Q2FsZW5kYXI7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKExvY2FsZSwgW3tcbiAgICBrZXk6IFwiZmFzdE51bWJlcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5mYXN0TnVtYmVyc0NhY2hlZCA9IHN1cHBvcnRzRmFzdE51bWJlcnModGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBMb2NhbGU7XG59KCk7XG5cbi8qXHJcbiAqIFRoaXMgZmlsZSBoYW5kbGVzIHBhcnNpbmcgZm9yIHdlbGwtc3BlY2lmaWVkIGZvcm1hdHMuIEhlcmUncyBob3cgaXQgd29ya3M6XHJcbiAqIFR3byB0aGluZ3MgZ28gaW50byBwYXJzaW5nOiBhIHJlZ2V4IHRvIG1hdGNoIHdpdGggYW5kIGFuIGV4dHJhY3RvciB0byB0YWtlIGFwYXJ0IHRoZSBncm91cHMgaW4gdGhlIG1hdGNoLlxyXG4gKiBBbiBleHRyYWN0b3IgaXMganVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSByZWdleCBtYXRjaCBhcnJheSBhbmQgcmV0dXJucyBhIHsgeWVhcjogLi4uLCBtb250aDogLi4uIH0gb2JqZWN0XHJcbiAqIHBhcnNlKCkgZG9lcyB0aGUgd29yayBvZiBleGVjdXRpbmcgdGhlIHJlZ2V4IGFuZCBhcHBseWluZyB0aGUgZXh0cmFjdG9yLiBJdCB0YWtlcyBtdWx0aXBsZSByZWdleC9leHRyYWN0b3IgcGFpcnMgdG8gdHJ5IGluIHNlcXVlbmNlLlxyXG4gKiBFeHRyYWN0b3JzIGNhbiB0YWtlIGEgXCJjdXJzb3JcIiByZXByZXNlbnRpbmcgdGhlIG9mZnNldCBpbiB0aGUgbWF0Y2ggdG8gbG9vayBhdC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGNvbWJpbmUgZXh0cmFjdG9ycy5cclxuICogY29tYmluZUV4dHJhY3RvcnMoKSBkb2VzIHRoZSB3b3JrIG9mIGNvbWJpbmluZyB0aGVtLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjdXJzb3IgdGhyb3VnaCBtdWx0aXBsZSBleHRyYWN0aW9ucy5cclxuICogU29tZSBleHRyYWN0aW9ucyBhcmUgc3VwZXIgZHVtYiBhbmQgc2ltcGxlUGFyc2UgYW5kIGZyb21TdHJpbmdzIGhlbHAgRFJZIHRoZW0uXHJcbiAqL1xuXG5mdW5jdGlvbiBjb21iaW5lUmVnZXhlcygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlZ2V4ZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcmVnZXhlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHZhciBmdWxsID0gcmVnZXhlcy5yZWR1Y2UoZnVuY3Rpb24gKGYsIHIpIHtcbiAgICByZXR1cm4gZiArIHIuc291cmNlO1xuICB9LCBcIlwiKTtcbiAgcmV0dXJuIFJlZ0V4cChcIl5cIiArIGZ1bGwgKyBcIiRcIik7XG59XG5cbmZ1bmN0aW9uIGNvbWJpbmVFeHRyYWN0b3JzKCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGV4dHJhY3RvcnMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBleHRyYWN0b3JzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG0pIHtcbiAgICByZXR1cm4gZXh0cmFjdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYsIGV4KSB7XG4gICAgICB2YXIgbWVyZ2VkVmFscyA9IF9yZWZbMF0sXG4gICAgICAgICAgbWVyZ2VkWm9uZSA9IF9yZWZbMV0sXG4gICAgICAgICAgY3Vyc29yID0gX3JlZlsyXTtcblxuICAgICAgdmFyIF9leCA9IGV4KG0sIGN1cnNvciksXG4gICAgICAgICAgdmFsID0gX2V4WzBdLFxuICAgICAgICAgIHpvbmUgPSBfZXhbMV0sXG4gICAgICAgICAgbmV4dCA9IF9leFsyXTtcblxuICAgICAgcmV0dXJuIFtPYmplY3QuYXNzaWduKG1lcmdlZFZhbHMsIHZhbCksIG1lcmdlZFpvbmUgfHwgem9uZSwgbmV4dF07XG4gICAgfSwgW3t9LCBudWxsLCAxXSkuc2xpY2UoMCwgMik7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlKHMpIHtcbiAgaWYgKHMgPT0gbnVsbCkge1xuICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gIH1cblxuICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIHBhdHRlcm5zID0gbmV3IEFycmF5KF9sZW4zID4gMSA/IF9sZW4zIC0gMSA6IDApLCBfa2V5MyA9IDE7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICBwYXR0ZXJuc1tfa2V5MyAtIDFdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgfVxuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBwYXR0ZXJucy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgX3BhdHRlcm5zJF9pID0gcGF0dGVybnNbX2ldLFxuICAgICAgICByZWdleCA9IF9wYXR0ZXJucyRfaVswXSxcbiAgICAgICAgZXh0cmFjdG9yID0gX3BhdHRlcm5zJF9pWzFdO1xuICAgIHZhciBtID0gcmVnZXguZXhlYyhzKTtcblxuICAgIGlmIChtKSB7XG4gICAgICByZXR1cm4gZXh0cmFjdG9yKG0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbbnVsbCwgbnVsbF07XG59XG5cbmZ1bmN0aW9uIHNpbXBsZVBhcnNlKCkge1xuICBmb3IgKHZhciBfbGVuNCA9IGFyZ3VtZW50cy5sZW5ndGgsIGtleXMgPSBuZXcgQXJyYXkoX2xlbjQpLCBfa2V5NCA9IDA7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICBrZXlzW19rZXk0XSA9IGFyZ3VtZW50c1tfa2V5NF07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG1hdGNoLCBjdXJzb3IpIHtcbiAgICB2YXIgcmV0ID0ge307XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgcmV0W2tleXNbaV1dID0gcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgaV0pO1xuICAgIH1cblxuICAgIHJldHVybiBbcmV0LCBudWxsLCBjdXJzb3IgKyBpXTtcbiAgfTtcbn0gLy8gSVNPIGFuZCBTUUwgcGFyc2luZ1xuXG5cbnZhciBvZmZzZXRSZWdleCA9IC8oPzooWil8KFsrLV1cXGRcXGQpKD86Oj8oXFxkXFxkKSk/KS8sXG4gICAgaXNvVGltZUJhc2VSZWdleCA9IC8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Wy4sXShcXGR7MSw5fSkpPyk/KT8vLFxuICAgIGlzb1RpbWVSZWdleCA9IFJlZ0V4cChcIlwiICsgaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyBcIj9cIiksXG4gICAgaXNvVGltZUV4dGVuc2lvblJlZ2V4ID0gUmVnRXhwKFwiKD86VFwiICsgaXNvVGltZVJlZ2V4LnNvdXJjZSArIFwiKT9cIiksXG4gICAgaXNvWW1kUmVnZXggPSAvKFsrLV1cXGR7Nn18XFxkezR9KSg/Oi0/KFxcZFxcZCkoPzotPyhcXGRcXGQpKT8pPy8sXG4gICAgaXNvV2Vla1JlZ2V4ID0gLyhcXGR7NH0pLT9XKFxcZFxcZCkoPzotPyhcXGQpKT8vLFxuICAgIGlzb09yZGluYWxSZWdleCA9IC8oXFxkezR9KS0/KFxcZHszfSkvLFxuICAgIGV4dHJhY3RJU09XZWVrRGF0YSA9IHNpbXBsZVBhcnNlKFwid2Vla1llYXJcIiwgXCJ3ZWVrTnVtYmVyXCIsIFwid2Vla0RheVwiKSxcbiAgICBleHRyYWN0SVNPT3JkaW5hbERhdGEgPSBzaW1wbGVQYXJzZShcInllYXJcIiwgXCJvcmRpbmFsXCIpLFxuICAgIHNxbFltZFJlZ2V4ID0gLyhcXGR7NH0pLShcXGRcXGQpLShcXGRcXGQpLyxcbiAgICAvLyBkdW1iZWQtZG93biB2ZXJzaW9uIG9mIHRoZSBJU08gb25lXG5zcWxUaW1lUmVnZXggPSBSZWdFeHAoaXNvVGltZUJhc2VSZWdleC5zb3VyY2UgKyBcIiA/KD86XCIgKyBvZmZzZXRSZWdleC5zb3VyY2UgKyBcInwoW2EtekEtWl9dezEsMjU2fS9bYS16QS1aX117MSwyNTZ9KSk/XCIpLFxuICAgIHNxbFRpbWVFeHRlbnNpb25SZWdleCA9IFJlZ0V4cChcIig/OiBcIiArIHNxbFRpbWVSZWdleC5zb3VyY2UgKyBcIik/XCIpO1xuXG5mdW5jdGlvbiBleHRyYWN0SVNPWW1kKG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIGl0ZW0gPSB7XG4gICAgeWVhcjogcGFyc2VJbnQobWF0Y2hbY3Vyc29yXSksXG4gICAgbW9udGg6IHBhcnNlSW50KG1hdGNoW2N1cnNvciArIDFdKSB8fCAxLFxuICAgIGRheTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMl0pIHx8IDFcbiAgfTtcbiAgcmV0dXJuIFtpdGVtLCBudWxsLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElTT1RpbWUobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgaXRlbSA9IHtcbiAgICBob3VyOiBwYXJzZUludChtYXRjaFtjdXJzb3JdKSB8fCAwLFxuICAgIG1pbnV0ZTogcGFyc2VJbnQobWF0Y2hbY3Vyc29yICsgMV0pIHx8IDAsXG4gICAgc2Vjb25kOiBwYXJzZUludChtYXRjaFtjdXJzb3IgKyAyXSkgfHwgMCxcbiAgICBtaWxsaXNlY29uZDogcGFyc2VNaWxsaXMobWF0Y2hbY3Vyc29yICsgM10pXG4gIH07XG4gIHJldHVybiBbaXRlbSwgbnVsbCwgY3Vyc29yICsgNF07XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJU09PZmZzZXQobWF0Y2gsIGN1cnNvcikge1xuICB2YXIgbG9jYWwgPSAhbWF0Y2hbY3Vyc29yXSAmJiAhbWF0Y2hbY3Vyc29yICsgMV0sXG4gICAgICBmdWxsT2Zmc2V0ID0gc2lnbmVkT2Zmc2V0KG1hdGNoW2N1cnNvciArIDFdLCBtYXRjaFtjdXJzb3IgKyAyXSksXG4gICAgICB6b25lID0gbG9jYWwgPyBudWxsIDogRml4ZWRPZmZzZXRab25lLmluc3RhbmNlKGZ1bGxPZmZzZXQpO1xuICByZXR1cm4gW3t9LCB6b25lLCBjdXJzb3IgKyAzXTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdElBTkFab25lKG1hdGNoLCBjdXJzb3IpIHtcbiAgdmFyIHpvbmUgPSBtYXRjaFtjdXJzb3JdID8gbmV3IElBTkFab25lKG1hdGNoW2N1cnNvcl0pIDogbnVsbDtcbiAgcmV0dXJuIFt7fSwgem9uZSwgY3Vyc29yICsgMV07XG59IC8vIElTTyBkdXJhdGlvbiBwYXJzaW5nXG5cblxudmFyIGlzb0R1cmF0aW9uID0gL15QKD86KD86KC0/XFxkezEsOX0pWSk/KD86KC0/XFxkezEsOX0pTSk/KD86KC0/XFxkezEsOX0pRCk/KD86VCg/OigtP1xcZHsxLDl9KUgpPyg/OigtP1xcZHsxLDl9KU0pPyg/OigtP1xcZHsxLDl9KSg/OlsuLF0oLT9cXGR7MSw5fSkpP1MpPyk/fCgtP1xcZHsxLDl9KVcpJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RJU09EdXJhdGlvbihtYXRjaCkge1xuICB2YXIgeWVhclN0ciA9IG1hdGNoWzFdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFsyXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzNdLFxuICAgICAgaG91clN0ciA9IG1hdGNoWzRdLFxuICAgICAgbWludXRlU3RyID0gbWF0Y2hbNV0sXG4gICAgICBzZWNvbmRTdHIgPSBtYXRjaFs2XSxcbiAgICAgIG1pbGxpc2Vjb25kc1N0ciA9IG1hdGNoWzddLFxuICAgICAgd2Vla1N0ciA9IG1hdGNoWzhdO1xuICByZXR1cm4gW3tcbiAgICB5ZWFyczogcGFyc2VJbnQoeWVhclN0ciksXG4gICAgbW9udGhzOiBwYXJzZUludChtb250aFN0ciksXG4gICAgd2Vla3M6IHBhcnNlSW50KHdlZWtTdHIpLFxuICAgIGRheXM6IHBhcnNlSW50KGRheVN0ciksXG4gICAgaG91cnM6IHBhcnNlSW50KGhvdXJTdHIpLFxuICAgIG1pbnV0ZXM6IHBhcnNlSW50KG1pbnV0ZVN0ciksXG4gICAgc2Vjb25kczogcGFyc2VJbnQoc2Vjb25kU3RyKSxcbiAgICBtaWxsaXNlY29uZHM6IHBhcnNlTWlsbGlzKG1pbGxpc2Vjb25kc1N0cilcbiAgfV07XG59IC8vIFRoZXNlIGFyZSBhIGxpdHRsZSBicmFpbmRlYWQuIEVEVCAqc2hvdWxkKiB0ZWxsIHVzIHRoYXQgd2UncmUgaW4sIHNheSwgQW1lcmljYS9OZXdfWW9ya1xuLy8gYW5kIG5vdCBqdXN0IHRoYXQgd2UncmUgaW4gLTI0MCAqcmlnaHQgbm93Ki4gQnV0IHNpbmNlIEkgZG9uJ3QgdGhpbmsgdGhlc2UgYXJlIHVzZWQgdGhhdCBvZnRlblxuLy8gSSdtIGp1c3QgZ29pbmcgdG8gaWdub3JlIHRoYXRcblxuXG52YXIgb2JzT2Zmc2V0cyA9IHtcbiAgR01UOiAwLFxuICBFRFQ6IC00ICogNjAsXG4gIEVTVDogLTUgKiA2MCxcbiAgQ0RUOiAtNSAqIDYwLFxuICBDU1Q6IC02ICogNjAsXG4gIE1EVDogLTYgKiA2MCxcbiAgTVNUOiAtNyAqIDYwLFxuICBQRFQ6IC03ICogNjAsXG4gIFBTVDogLTggKiA2MFxufTtcblxuZnVuY3Rpb24gZnJvbVN0cmluZ3Mod2Vla2RheVN0ciwgeWVhclN0ciwgbW9udGhTdHIsIGRheVN0ciwgaG91clN0ciwgbWludXRlU3RyLCBzZWNvbmRTdHIpIHtcbiAgdmFyIHJlc3VsdCA9IHtcbiAgICB5ZWFyOiB5ZWFyU3RyLmxlbmd0aCA9PT0gMiA/IHVudHJ1bmNhdGVZZWFyKHBhcnNlSW50KHllYXJTdHIpKSA6IHBhcnNlSW50KHllYXJTdHIpLFxuICAgIG1vbnRoOiBtb250aFN0ci5sZW5ndGggPT09IDIgPyBwYXJzZUludChtb250aFN0ciwgMTApIDogbW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0cikgKyAxLFxuICAgIGRheTogcGFyc2VJbnQoZGF5U3RyKSxcbiAgICBob3VyOiBwYXJzZUludChob3VyU3RyKSxcbiAgICBtaW51dGU6IHBhcnNlSW50KG1pbnV0ZVN0cilcbiAgfTtcbiAgaWYgKHNlY29uZFN0cikgcmVzdWx0LnNlY29uZCA9IHBhcnNlSW50KHNlY29uZFN0cik7XG5cbiAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICByZXN1bHQud2Vla2RheSA9IHdlZWtkYXlTdHIubGVuZ3RoID4gMyA/IHdlZWtkYXlzTG9uZy5pbmRleE9mKHdlZWtkYXlTdHIpICsgMSA6IHdlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSArIDE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufSAvLyBSRkMgMjgyMi81MzIyXG5cblxudmFyIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLFxccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoPzooWystXVxcZFxcZCkoXFxkXFxkKSkpJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMyODIyKG1hdGNoKSB7XG4gIHZhciB3ZWVrZGF5U3RyID0gbWF0Y2hbMV0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFsyXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbM10sXG4gICAgICB5ZWFyU3RyID0gbWF0Y2hbNF0sXG4gICAgICBob3VyU3RyID0gbWF0Y2hbNV0sXG4gICAgICBtaW51dGVTdHIgPSBtYXRjaFs2XSxcbiAgICAgIHNlY29uZFN0ciA9IG1hdGNoWzddLFxuICAgICAgb2JzT2Zmc2V0ID0gbWF0Y2hbOF0sXG4gICAgICBtaWxPZmZzZXQgPSBtYXRjaFs5XSxcbiAgICAgIG9mZkhvdXJTdHIgPSBtYXRjaFsxMF0sXG4gICAgICBvZmZNaW51dGVTdHIgPSBtYXRjaFsxMV0sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHZhciBvZmZzZXQ7XG5cbiAgaWYgKG9ic09mZnNldCkge1xuICAgIG9mZnNldCA9IG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgfSBlbHNlIGlmIChtaWxPZmZzZXQpIHtcbiAgICBvZmZzZXQgPSAwO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHNpZ25lZE9mZnNldChvZmZIb3VyU3RyLCBvZmZNaW51dGVTdHIpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIG5ldyBGaXhlZE9mZnNldFpvbmUob2Zmc2V0KV07XG59XG5cbmZ1bmN0aW9uIHByZXByb2Nlc3NSRkMyODIyKHMpIHtcbiAgLy8gUmVtb3ZlIGNvbW1lbnRzIGFuZCBmb2xkaW5nIHdoaXRlc3BhY2UgYW5kIHJlcGxhY2UgbXVsdGlwbGUtc3BhY2VzIHdpdGggYSBzaW5nbGUgc3BhY2VcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZywgXCIgXCIpLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCBcIiBcIikudHJpbSgpO1xufSAvLyBodHRwIGRhdGVcblxuXG52YXIgcmZjMTEyMyA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcXGRcXGQpIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgKFxcZHs0fSkgKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCkgR01UJC8sXG4gICAgcmZjODUwID0gL14oTW9uZGF5fFR1ZXNkYXl8V2Vkc2RheXxUaHVyc2RheXxGcmlkYXl8U2F0dXJkYXl8U3VuZGF5KSwgKFxcZFxcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXFxkXFxkKSAoXFxkXFxkKTooXFxkXFxkKTooXFxkXFxkKSBHTVQkLyxcbiAgICBhc2NpaSA9IC9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1bikgKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKSAoIFxcZHxcXGRcXGQpIChcXGRcXGQpOihcXGRcXGQpOihcXGRcXGQpIChcXGR7NH0pJC87XG5cbmZ1bmN0aW9uIGV4dHJhY3RSRkMxMTIzT3I4NTAobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIGRheVN0ciA9IG1hdGNoWzJdLFxuICAgICAgbW9udGhTdHIgPSBtYXRjaFszXSxcbiAgICAgIHllYXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs1XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzZdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbN10sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0QVNDSUkobWF0Y2gpIHtcbiAgdmFyIHdlZWtkYXlTdHIgPSBtYXRjaFsxXSxcbiAgICAgIG1vbnRoU3RyID0gbWF0Y2hbMl0sXG4gICAgICBkYXlTdHIgPSBtYXRjaFszXSxcbiAgICAgIGhvdXJTdHIgPSBtYXRjaFs0XSxcbiAgICAgIG1pbnV0ZVN0ciA9IG1hdGNoWzVdLFxuICAgICAgc2Vjb25kU3RyID0gbWF0Y2hbNl0sXG4gICAgICB5ZWFyU3RyID0gbWF0Y2hbN10sXG4gICAgICByZXN1bHQgPSBmcm9tU3RyaW5ncyh3ZWVrZGF5U3RyLCB5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cik7XG4gIHJldHVybiBbcmVzdWx0LCBGaXhlZE9mZnNldFpvbmUudXRjSW5zdGFuY2VdO1xufVxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbmZ1bmN0aW9uIHBhcnNlSVNPRGF0ZShzKSB7XG4gIHJldHVybiBwYXJzZShzLCBbY29tYmluZVJlZ2V4ZXMoaXNvWW1kUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09ZbWQsIGV4dHJhY3RJU09UaW1lLCBleHRyYWN0SVNPT2Zmc2V0KV0sIFtjb21iaW5lUmVnZXhlcyhpc29XZWVrUmVnZXgsIGlzb1RpbWVFeHRlbnNpb25SZWdleCksIGNvbWJpbmVFeHRyYWN0b3JzKGV4dHJhY3RJU09XZWVrRGF0YSwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSwgW2NvbWJpbmVSZWdleGVzKGlzb09yZGluYWxSZWdleCwgaXNvVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT09yZGluYWxEYXRhLCBleHRyYWN0SVNPVGltZSldLCBbY29tYmluZVJlZ2V4ZXMoaXNvVGltZVJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQpXSk7XG59XG5mdW5jdGlvbiBwYXJzZVJGQzI4MjJEYXRlKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHByZXByb2Nlc3NSRkMyODIyKHMpLCBbcmZjMjgyMiwgZXh0cmFjdFJGQzI4MjJdKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSFRUUERhdGUocykge1xuICByZXR1cm4gcGFyc2UocywgW3JmYzExMjMsIGV4dHJhY3RSRkMxMTIzT3I4NTBdLCBbcmZjODUwLCBleHRyYWN0UkZDMTEyM09yODUwXSwgW2FzY2lpLCBleHRyYWN0QVNDSUldKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSVNPRHVyYXRpb24ocykge1xuICByZXR1cm4gcGFyc2UocywgW2lzb0R1cmF0aW9uLCBleHRyYWN0SVNPRHVyYXRpb25dKTtcbn1cbmZ1bmN0aW9uIHBhcnNlU1FMKHMpIHtcbiAgcmV0dXJuIHBhcnNlKHMsIFtjb21iaW5lUmVnZXhlcyhzcWxZbWRSZWdleCwgc3FsVGltZUV4dGVuc2lvblJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1ltZCwgZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQsIGV4dHJhY3RJQU5BWm9uZSldLCBbY29tYmluZVJlZ2V4ZXMoc3FsVGltZVJlZ2V4KSwgY29tYmluZUV4dHJhY3RvcnMoZXh0cmFjdElTT1RpbWUsIGV4dHJhY3RJU09PZmZzZXQsIGV4dHJhY3RJQU5BWm9uZSldKTtcbn1cblxudmFyIEludmFsaWQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pIHtcbiAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgICB0aGlzLmV4cGxhbmF0aW9uID0gZXhwbGFuYXRpb247XG4gIH1cblxuICB2YXIgX3Byb3RvID0gSW52YWxpZC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnRvTWVzc2FnZSA9IGZ1bmN0aW9uIHRvTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5leHBsYW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uICsgXCI6IFwiICsgdGhpcy5leHBsYW5hdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVhc29uO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gSW52YWxpZDtcbn0oKTtcblxudmFyIElOVkFMSUQgPSBcIkludmFsaWQgRHVyYXRpb25cIjsgLy8gdW5pdCBjb252ZXJzaW9uIGNvbnN0YW50c1xuXG52YXIgbG93T3JkZXJNYXRyaXggPSB7XG4gIHdlZWtzOiB7XG4gICAgZGF5czogNyxcbiAgICBob3VyczogNyAqIDI0LFxuICAgIG1pbnV0ZXM6IDcgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDcgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBkYXlzOiB7XG4gICAgaG91cnM6IDI0LFxuICAgIG1pbnV0ZXM6IDI0ICogNjAsXG4gICAgc2Vjb25kczogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBob3Vyczoge1xuICAgIG1pbnV0ZXM6IDYwLFxuICAgIHNlY29uZHM6IDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBtaW51dGVzOiB7XG4gICAgc2Vjb25kczogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA2MCAqIDEwMDBcbiAgfSxcbiAgc2Vjb25kczoge1xuICAgIG1pbGxpc2Vjb25kczogMTAwMFxuICB9XG59LFxuICAgIGNhc3VhbE1hdHJpeCA9IE9iamVjdC5hc3NpZ24oe1xuICB5ZWFyczoge1xuICAgIG1vbnRoczogMTIsXG4gICAgd2Vla3M6IDUyLFxuICAgIGRheXM6IDM2NSxcbiAgICBob3VyczogMzY1ICogMjQsXG4gICAgbWludXRlczogMzY1ICogMjQgKiA2MCxcbiAgICBzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0sXG4gIHF1YXJ0ZXJzOiB7XG4gICAgbW9udGhzOiAzLFxuICAgIHdlZWtzOiAxMyxcbiAgICBkYXlzOiA5MSxcbiAgICBob3VyczogOTEgKiAyNCxcbiAgICBtaW51dGVzOiA5MSAqIDI0ICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiA5MSAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfSxcbiAgbW9udGhzOiB7XG4gICAgd2Vla3M6IDQsXG4gICAgZGF5czogMzAsXG4gICAgaG91cnM6IDMwICogMjQsXG4gICAgbWludXRlczogMzAgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IDMwICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH1cbn0sIGxvd09yZGVyTWF0cml4KSxcbiAgICBkYXlzSW5ZZWFyQWNjdXJhdGUgPSAxNDYwOTcuMCAvIDQwMCxcbiAgICBkYXlzSW5Nb250aEFjY3VyYXRlID0gMTQ2MDk3LjAgLyA0ODAwLFxuICAgIGFjY3VyYXRlTWF0cml4ID0gT2JqZWN0LmFzc2lnbih7XG4gIHllYXJzOiB7XG4gICAgbW9udGhzOiAxMixcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gNyxcbiAgICBkYXlzOiBkYXlzSW5ZZWFyQWNjdXJhdGUsXG4gICAgaG91cnM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAsXG4gICAgc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwLFxuICAgIG1pbGxpc2Vjb25kczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9LFxuICBxdWFydGVyczoge1xuICAgIG1vbnRoczogMyxcbiAgICB3ZWVrczogZGF5c0luWWVhckFjY3VyYXRlIC8gMjgsXG4gICAgZGF5czogZGF5c0luWWVhckFjY3VyYXRlIC8gNCxcbiAgICBob3VyczogZGF5c0luWWVhckFjY3VyYXRlICogMjQgLyA0LFxuICAgIG1pbnV0ZXM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgLyA0LFxuICAgIHNlY29uZHM6IGRheXNJblllYXJBY2N1cmF0ZSAqIDI0ICogNjAgKiA2MCAvIDQsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5ZZWFyQWNjdXJhdGUgKiAyNCAqIDYwICogNjAgKiAxMDAwIC8gNFxuICB9LFxuICBtb250aHM6IHtcbiAgICB3ZWVrczogZGF5c0luTW9udGhBY2N1cmF0ZSAvIDcsXG4gICAgZGF5czogZGF5c0luTW9udGhBY2N1cmF0ZSxcbiAgICBob3VyczogZGF5c0luTW9udGhBY2N1cmF0ZSAqIDI0LFxuICAgIG1pbnV0ZXM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwLFxuICAgIHNlY29uZHM6IGRheXNJbk1vbnRoQWNjdXJhdGUgKiAyNCAqIDYwICogNjAsXG4gICAgbWlsbGlzZWNvbmRzOiBkYXlzSW5Nb250aEFjY3VyYXRlICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG59LCBsb3dPcmRlck1hdHJpeCk7IC8vIHVuaXRzIG9yZGVyZWQgYnkgc2l6ZVxuXG52YXIgb3JkZXJlZFVuaXRzID0gW1wieWVhcnNcIiwgXCJxdWFydGVyc1wiLCBcIm1vbnRoc1wiLCBcIndlZWtzXCIsIFwiZGF5c1wiLCBcImhvdXJzXCIsIFwibWludXRlc1wiLCBcInNlY29uZHNcIiwgXCJtaWxsaXNlY29uZHNcIl07XG52YXIgcmV2ZXJzZVVuaXRzID0gb3JkZXJlZFVuaXRzLnNsaWNlKDApLnJldmVyc2UoKTsgLy8gY2xvbmUgcmVhbGx5IG1lYW5zIFwiY3JlYXRlIGFub3RoZXIgaW5zdGFuY2UganVzdCBsaWtlIHRoaXMgb25lLCBidXQgd2l0aCB0aGVzZSBjaGFuZ2VzXCJcblxuZnVuY3Rpb24gY2xvbmUoZHVyLCBhbHRzLCBjbGVhcikge1xuICBpZiAoY2xlYXIgPT09IHZvaWQgMCkge1xuICAgIGNsZWFyID0gZmFsc2U7XG4gIH1cblxuICAvLyBkZWVwIG1lcmdlIGZvciB2YWxzXG4gIHZhciBjb25mID0ge1xuICAgIHZhbHVlczogY2xlYXIgPyBhbHRzLnZhbHVlcyA6IE9iamVjdC5hc3NpZ24oe30sIGR1ci52YWx1ZXMsIGFsdHMudmFsdWVzIHx8IHt9KSxcbiAgICBsb2M6IGR1ci5sb2MuY2xvbmUoYWx0cy5sb2MpLFxuICAgIGNvbnZlcnNpb25BY2N1cmFjeTogYWx0cy5jb252ZXJzaW9uQWNjdXJhY3kgfHwgZHVyLmNvbnZlcnNpb25BY2N1cmFjeVxuICB9O1xuICByZXR1cm4gbmV3IER1cmF0aW9uKGNvbmYpO1xufVxuXG5mdW5jdGlvbiBhbnRpVHJ1bmMobikge1xuICByZXR1cm4gbiA8IDAgPyBNYXRoLmZsb29yKG4pIDogTWF0aC5jZWlsKG4pO1xufSAvLyBOQjogbXV0YXRlcyBwYXJhbWV0ZXJzXG5cblxuZnVuY3Rpb24gY29udmVydChtYXRyaXgsIGZyb21NYXAsIGZyb21Vbml0LCB0b01hcCwgdG9Vbml0KSB7XG4gIHZhciBjb252ID0gbWF0cml4W3RvVW5pdF1bZnJvbVVuaXRdLFxuICAgICAgcmF3ID0gZnJvbU1hcFtmcm9tVW5pdF0gLyBjb252LFxuICAgICAgc2FtZVNpZ24gPSBNYXRoLnNpZ24ocmF3KSA9PT0gTWF0aC5zaWduKHRvTWFwW3RvVW5pdF0pLFxuICAgICAgLy8gb2ssIHNvIHRoaXMgaXMgd2lsZCwgYnV0IHNlZSB0aGUgbWF0cml4IGluIHRoZSB0ZXN0c1xuICBhZGRlZCA9ICFzYW1lU2lnbiAmJiB0b01hcFt0b1VuaXRdICE9PSAwICYmIE1hdGguYWJzKHJhdykgPD0gMSA/IGFudGlUcnVuYyhyYXcpIDogTWF0aC50cnVuYyhyYXcpO1xuICB0b01hcFt0b1VuaXRdICs9IGFkZGVkO1xuICBmcm9tTWFwW2Zyb21Vbml0XSAtPSBhZGRlZCAqIGNvbnY7XG59IC8vIE5COiBtdXRhdGVzIHBhcmFtZXRlcnNcblxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZXMobWF0cml4LCB2YWxzKSB7XG4gIHJldmVyc2VVbml0cy5yZWR1Y2UoZnVuY3Rpb24gKHByZXZpb3VzLCBjdXJyZW50KSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh2YWxzW2N1cnJlbnRdKSkge1xuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIGNvbnZlcnQobWF0cml4LCB2YWxzLCBwcmV2aW91cywgdmFscywgY3VycmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgfVxuICB9LCBudWxsKTtcbn1cbi8qKlxyXG4gKiBBIER1cmF0aW9uIG9iamVjdCByZXByZXNlbnRzIGEgcGVyaW9kIG9mIHRpbWUsIGxpa2UgXCIyIG1vbnRoc1wiIG9yIFwiMSBkYXksIDEgaG91clwiLiBDb25jZXB0dWFsbHksIGl0J3MganVzdCBhIG1hcCBvZiB1bml0cyB0byB0aGVpciBxdWFudGl0aWVzLCBhY2NvbXBhbmllZCBieSBzb21lIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBhbmQgbWV0aG9kcyBmb3IgY3JlYXRpbmcsIHBhcnNpbmcsIGludGVycm9nYXRpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS4gVGhleSBjYW4gYmUgdXNlZCBvbiB0aGVpciBvd24gb3IgaW4gY29uanVuY3Rpb24gd2l0aCBvdGhlciBMdXhvbiB0eXBlczsgZm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHtAbGluayBEYXRlVGltZS5wbHVzfSB0byBhZGQgYSBEdXJhdGlvbiBvYmplY3QgdG8gYSBEYXRlVGltZSwgcHJvZHVjaW5nIGFub3RoZXIgRGF0ZVRpbWUuXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiBjb21tb25seSB1c2VkIG1ldGhvZHMgYW5kIGdldHRlcnMgaW4gRHVyYXRpb246XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqIFRvIGNyZWF0ZSBhIER1cmF0aW9uLCB1c2Uge0BsaW5rIER1cmF0aW9uLmZyb21NaWxsaXN9LCB7QGxpbmsgRHVyYXRpb24uZnJvbU9iamVjdH0sIG9yIHtAbGluayBEdXJhdGlvbi5mcm9tSVNPfS5cclxuICogKiAqKlVuaXQgdmFsdWVzKiogU2VlIHRoZSB7QGxpbmsgRHVyYXRpb24ueWVhcnN9LCB7QGxpbmsgRHVyYXRpb24ubW9udGhzfSwge0BsaW5rIER1cmF0aW9uLndlZWtzfSwge0BsaW5rIER1cmF0aW9uLmRheXN9LCB7QGxpbmsgRHVyYXRpb24uaG91cnN9LCB7QGxpbmsgRHVyYXRpb24ubWludXRlc30sIHtAbGluayBEdXJhdGlvbi5zZWNvbmRzfSwge0BsaW5rIER1cmF0aW9uLm1pbGxpc2Vjb25kc30gYWNjZXNzb3JzLlxyXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSAge0BsaW5rIER1cmF0aW9uLmxvY2FsZX0gYW5kIHtAbGluayBEdXJhdGlvbi5udW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG5ldyBEdXJhdGlvbnMgb3V0IG9mIG9sZCBvbmVzIHVzZSB7QGxpbmsgRHVyYXRpb24ucGx1c30sIHtAbGluayBEdXJhdGlvbi5taW51c30sIHtAbGluayBEdXJhdGlvbi5ub3JtYWxpemV9LCB7QGxpbmsgRHVyYXRpb24uc2V0fSwge0BsaW5rIER1cmF0aW9uLnJlY29uZmlndXJlfSwge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99LCBhbmQge0BsaW5rIER1cmF0aW9uLm5lZ2F0ZX0uXHJcbiAqICogKipPdXRwdXQqKiBUbyBjb252ZXJ0IHRoZSBEdXJhdGlvbiBpbnRvIG90aGVyIHJlcHJlc2VudGF0aW9ucywgc2VlIHtAbGluayBEdXJhdGlvbi5hc30sIHtAbGluayBEdXJhdGlvbi50b0lTT30sIHtAbGluayBEdXJhdGlvbi50b0Zvcm1hdH0sIGFuZCB7QGxpbmsgRHVyYXRpb24udG9KU09OfVxyXG4gKlxyXG4gKiBUaGVyZSdzIGFyZSBtb3JlIG1ldGhvZHMgZG9jdW1lbnRlZCBiZWxvdy4gSW4gYWRkaXRpb24sIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN1YnRsZXIgdG9waWNzIGxpa2UgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIHZhbGlkaXR5LCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXHJcbiAqL1xuXG5cbnZhciBEdXJhdGlvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXG4gIGZ1bmN0aW9uIER1cmF0aW9uKGNvbmZpZykge1xuICAgIHZhciBhY2N1cmF0ZSA9IGNvbmZpZy5jb252ZXJzaW9uQWNjdXJhY3kgPT09IFwibG9uZ3Rlcm1cIiB8fCBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLnZhbHVlcyA9IGNvbmZpZy52YWx1ZXM7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5sb2MgPSBjb25maWcubG9jIHx8IExvY2FsZS5jcmVhdGUoKTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGFjY3VyYXRlID8gXCJsb25ndGVybVwiIDogXCJjYXN1YWxcIjtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmludmFsaWQgPSBjb25maWcuaW52YWxpZCB8fCBudWxsO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubWF0cml4ID0gYWNjdXJhdGUgPyBhY2N1cmF0ZU1hdHJpeCA6IGNhc3VhbE1hdHJpeDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmlzTHV4b25EdXJhdGlvbiA9IHRydWU7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIER1cmF0aW9uIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBvZiBtaWxsaXNlY29uZHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgZm9yIHBhcnNpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21NaWxsaXMgPSBmdW5jdGlvbiBmcm9tTWlsbGlzKGNvdW50LCBvcHRzKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoT2JqZWN0LmFzc2lnbih7XG4gICAgICBtaWxsaXNlY29uZHM6IGNvdW50XG4gICAgfSwgb3B0cykpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEdXJhdGlvbiBmcm9tIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXJzJyBhbmQgJ2hvdXJzLlxyXG4gICAqIElmIHRoaXMgb2JqZWN0IGlzIGVtcHR5IHRoZW4gemVybyAgbWlsbGlzZWNvbmRzIGR1cmF0aW9uIGlzIHJldHVybmVkLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoueWVhcnNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLnF1YXJ0ZXJzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aHNcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5kYXlzXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5ob3Vyc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouc2Vjb25kc1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmRzXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvYmoubG9jYWxlPSdlbi1VUyddIC0gdGhlIGxvY2FsZSB0byB1c2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb2JqLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gZnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiRHVyYXRpb24uZnJvbU9iamVjdDogYXJndW1lbnQgZXhwZWN0ZWQgdG8gYmUgYW4gb2JqZWN0LCBnb3QgXCIgKyB0eXBlb2Ygb2JqKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IER1cmF0aW9uKHtcbiAgICAgIHZhbHVlczogbm9ybWFsaXplT2JqZWN0KG9iaiwgRHVyYXRpb24ubm9ybWFsaXplVW5pdCwgdHJ1ZSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9iaiksXG4gICAgICBjb252ZXJzaW9uQWNjdXJhY3k6IG9iai5jb252ZXJzaW9uQWNjdXJhY3lcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRHVyYXRpb24gZnJvbSBhbiBJU08gODYwMSBkdXJhdGlvbiBzdHJpbmcuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0ZXh0IHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIGZvciBwYXJzaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIHRoZSBsb2NhbGUgdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSNEdXJhdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQM1k2TTREVDEySDMwTTVTJykudG9PYmplY3QoKSAvLz0+IHsgeWVhcnM6IDMsIG1vbnRoczogNiwgZGF5OiA0LCBob3VyczogMTIsIG1pbnV0ZXM6IDMwLCBzZWNvbmRzOiA1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tSVNPKCdQVDIzSCcpLnRvT2JqZWN0KCkgLy89PiB7IGhvdXJzOiAyMyB9XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbUlTTygnUDVZM00nKS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogNSwgbW9udGhzOiAzIH1cclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIER1cmF0aW9uLmZyb21JU08gPSBmdW5jdGlvbiBmcm9tSVNPKHRleHQsIG9wdHMpIHtcbiAgICB2YXIgX3BhcnNlSVNPRHVyYXRpb24gPSBwYXJzZUlTT0R1cmF0aW9uKHRleHQpLFxuICAgICAgICBwYXJzZWQgPSBfcGFyc2VJU09EdXJhdGlvblswXTtcblxuICAgIGlmIChwYXJzZWQpIHtcbiAgICAgIHZhciBvYmogPSBPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cyk7XG4gICAgICByZXR1cm4gRHVyYXRpb24uZnJvbU9iamVjdChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gRHVyYXRpb24uaW52YWxpZChcInVucGFyc2FibGVcIiwgXCJ0aGUgaW5wdXQgXFxcIlwiICsgdGV4dCArIFwiXFxcIiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFcIik7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBkYXRldGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24uaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIGlmIChleHBsYW5hdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICBleHBsYW5hdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREdXJhdGlvbkVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHtcbiAgICAgICAgaW52YWxpZDogaW52YWxpZFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuXG5cbiAgRHVyYXRpb24ubm9ybWFsaXplVW5pdCA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXQodW5pdCwgaWdub3JlVW5rbm93bikge1xuICAgIGlmIChpZ25vcmVVbmtub3duID09PSB2b2lkIDApIHtcbiAgICAgIGlnbm9yZVVua25vd24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZCA9IHtcbiAgICAgIHllYXI6IFwieWVhcnNcIixcbiAgICAgIHllYXJzOiBcInllYXJzXCIsXG4gICAgICBxdWFydGVyOiBcInF1YXJ0ZXJzXCIsXG4gICAgICBxdWFydGVyczogXCJxdWFydGVyc1wiLFxuICAgICAgbW9udGg6IFwibW9udGhzXCIsXG4gICAgICBtb250aHM6IFwibW9udGhzXCIsXG4gICAgICB3ZWVrOiBcIndlZWtzXCIsXG4gICAgICB3ZWVrczogXCJ3ZWVrc1wiLFxuICAgICAgZGF5OiBcImRheXNcIixcbiAgICAgIGRheXM6IFwiZGF5c1wiLFxuICAgICAgaG91cjogXCJob3Vyc1wiLFxuICAgICAgaG91cnM6IFwiaG91cnNcIixcbiAgICAgIG1pbnV0ZTogXCJtaW51dGVzXCIsXG4gICAgICBtaW51dGVzOiBcIm1pbnV0ZXNcIixcbiAgICAgIHNlY29uZDogXCJzZWNvbmRzXCIsXG4gICAgICBzZWNvbmRzOiBcInNlY29uZHNcIixcbiAgICAgIG1pbGxpc2Vjb25kOiBcIm1pbGxpc2Vjb25kc1wiLFxuICAgICAgbWlsbGlzZWNvbmRzOiBcIm1pbGxpc2Vjb25kc1wiXG4gICAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG4gICAgaWYgKCFpZ25vcmVVbmtub3duICYmICFub3JtYWxpemVkKSB0aHJvdyBuZXcgSW52YWxpZFVuaXRFcnJvcih1bml0KTtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYW4gb2JqZWN0IGlzIGEgRHVyYXRpb24uIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb1xyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBEdXJhdGlvbi5pc0R1cmF0aW9uID0gZnVuY3Rpb24gaXNEdXJhdGlvbihvKSB7XG4gICAgcmV0dXJuIG8uaXNMdXhvbkR1cmF0aW9uO1xuICB9O1xuICAvKipcclxuICAgKiBHZXQgIHRoZSBsb2NhbGUgb2YgYSBEdXJhdGlvbiwgc3VjaCAnZW4tR0InXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLiBZb3UgbWF5IHVzZSB0aGVzZSB0b2tlbnM6XHJcbiAgICogKiBgU2AgZm9yIG1pbGxpc2Vjb25kc1xyXG4gICAqICogYHNgIGZvciBzZWNvbmRzXHJcbiAgICogKiBgbWAgZm9yIG1pbnV0ZXNcclxuICAgKiAqIGBoYCBmb3IgaG91cnNcclxuICAgKiAqIGBkYCBmb3IgZGF5c1xyXG4gICAqICogYE1gIGZvciBtb250aHNcclxuICAgKiAqIGB5YCBmb3IgeWVhcnNcclxuICAgKiBOb3RlczpcclxuICAgKiAqIEFkZCBwYWRkaW5nIGJ5IHJlcGVhdGluZyB0aGUgdG9rZW4sIGUuZy4gXCJ5eVwiIHBhZHMgdGhlIHllYXJzIHRvIHR3byBkaWdpdHMsIFwiaGhoaFwiIHBhZHMgdGhlIGhvdXJzIG91dCB0byBmb3VyIGRpZ2l0c1xyXG4gICAqICogVGhlIGR1cmF0aW9uIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBzZXQgb2YgdW5pdHMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdXNpbmcge0BsaW5rIER1cmF0aW9uLnNoaWZ0VG99IGFuZCB0aGUgRHVyYXRpb25zJ3MgY29udmVyc2lvbiBhY2N1cmFjeSBzZXR0aW5nLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuZmxvb3I9dHJ1ZV0gLSBmbG9vciBudW1lcmljYWwgdmFsdWVzXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwieSBkIHNcIikgLy89PiBcIjEgNiAyXCJcclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgeWVhcnM6IDEsIGRheXM6IDYsIHNlY29uZHM6IDIgfSkudG9Gb3JtYXQoXCJ5eSBkZCBzc3NcIikgLy89PiBcIjAxIDA2IDAwMlwiXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAxLCBkYXlzOiA2LCBzZWNvbmRzOiAyIH0pLnRvRm9ybWF0KFwiTSBTXCIpIC8vPT4gXCIxMiA1MTg0MDIwMDBcIlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cbiAgX3Byb3RvLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIC8vIHJldmVyc2UtY29tcGF0IHNpbmNlIDEuMjsgd2UgYWx3YXlzIHJvdW5kIGRvd24gbm93LCBuZXZlciB1cCwgYW5kIHdlIGRvIGl0IGJ5IGRlZmF1bHRcbiAgICB2YXIgZm10T3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdHMsIHtcbiAgICAgIGZsb29yOiBvcHRzLnJvdW5kICE9PSBmYWxzZSAmJiBvcHRzLmZsb29yICE9PSBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLCBmbXRPcHRzKS5mb3JtYXREdXJhdGlvbkZyb21TdHJpbmcodGhpcywgZm10KSA6IElOVkFMSUQ7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBKYXZhc2NyaXB0IG9iamVjdCB3aXRoIHRoaXMgRHVyYXRpb24ncyB2YWx1ZXMuXHJcbiAgICogQHBhcmFtIG9wdHMgLSBvcHRpb25zIGZvciBnZW5lcmF0aW5nIHRoZSBvYmplY3RcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVDb25maWc9ZmFsc2VdIC0gaW5jbHVkZSBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgaW4gdGhlIG91dHB1dFxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9KS50b09iamVjdCgpIC8vPT4geyB5ZWFyczogMSwgZGF5czogNiwgc2Vjb25kczogMiB9XHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvT2JqZWN0ID0gZnVuY3Rpb24gdG9PYmplY3Qob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuICAgIHZhciBiYXNlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy52YWx1ZXMpO1xuXG4gICAgaWYgKG9wdHMuaW5jbHVkZUNvbmZpZykge1xuICAgICAgYmFzZS5jb252ZXJzaW9uQWNjdXJhY3kgPSB0aGlzLmNvbnZlcnNpb25BY2N1cmFjeTtcbiAgICAgIGJhc2UubnVtYmVyaW5nU3lzdGVtID0gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtO1xuICAgICAgYmFzZS5sb2NhbGUgPSB0aGlzLmxvYy5sb2NhbGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIER1cmF0aW9uLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjRHVyYXRpb25zXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAzLCBzZWNvbmRzOiA0NSB9KS50b0lTTygpIC8vPT4gJ1AzWVQ0NVMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1vbnRoczogNCwgc2Vjb25kczogNDUgfSkudG9JU08oKSAvLz0+ICdQNE1UNDVTJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtb250aHM6IDUgfSkudG9JU08oKSAvLz0+ICdQNU0nXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IG1pbnV0ZXM6IDUgfSkudG9JU08oKSAvLz0+ICdQVDVNJ1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBtaWxsaXNlY29uZHM6IDYgfSkudG9JU08oKSAvLz0+ICdQVDAuMDA2UydcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9JU08gPSBmdW5jdGlvbiB0b0lTTygpIHtcbiAgICAvLyB3ZSBjb3VsZCB1c2UgdGhlIGZvcm1hdHRlciwgYnV0IHRoaXMgaXMgYW4gZWFzaWVyIHdheSB0byBnZXQgdGhlIG1pbmltdW0gc3RyaW5nXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBudWxsO1xuICAgIHZhciBzID0gXCJQXCI7XG4gICAgaWYgKHRoaXMueWVhcnMgIT09IDApIHMgKz0gdGhpcy55ZWFycyArIFwiWVwiO1xuICAgIGlmICh0aGlzLm1vbnRocyAhPT0gMCB8fCB0aGlzLnF1YXJ0ZXJzICE9PSAwKSBzICs9IHRoaXMubW9udGhzICsgdGhpcy5xdWFydGVycyAqIDMgKyBcIk1cIjtcbiAgICBpZiAodGhpcy5kYXlzICE9PSAwIHx8IHRoaXMud2Vla3MgIT09IDApIHMgKz0gdGhpcy5kYXlzICsgdGhpcy53ZWVrcyAqIDcgKyBcIkRcIjtcbiAgICBpZiAodGhpcy5ob3VycyAhPT0gMCB8fCB0aGlzLm1pbnV0ZXMgIT09IDAgfHwgdGhpcy5zZWNvbmRzICE9PSAwIHx8IHRoaXMubWlsbGlzZWNvbmRzICE9PSAwKSBzICs9IFwiVFwiO1xuICAgIGlmICh0aGlzLmhvdXJzICE9PSAwKSBzICs9IHRoaXMuaG91cnMgKyBcIkhcIjtcbiAgICBpZiAodGhpcy5taW51dGVzICE9PSAwKSBzICs9IHRoaXMubWludXRlcyArIFwiTVwiO1xuICAgIGlmICh0aGlzLnNlY29uZHMgIT09IDAgfHwgdGhpcy5taWxsaXNlY29uZHMgIT09IDApIHMgKz0gdGhpcy5zZWNvbmRzICsgdGhpcy5taWxsaXNlY29uZHMgLyAxMDAwICsgXCJTXCI7XG4gICAgcmV0dXJuIHM7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEdXJhdGlvbiBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIEpTT04uXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0lTTygpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRHVyYXRpb24gYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBkZWJ1Z2dpbmcuXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBtaWxsaXNlY29uZHMgdmFsdWUgb2YgdGhpcyBEdXJhdGlvbi5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8udmFsdWVPZiA9IGZ1bmN0aW9uIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXMoXCJtaWxsaXNlY29uZHNcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIE1ha2UgdGhpcyBEdXJhdGlvbiBsb25nZXIgYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuIFJldHVybiBhIG5ld2x5LWNvbnN0cnVjdGVkIER1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb258T2JqZWN0fG51bWJlcn0gZHVyYXRpb24gLSBUaGUgYW1vdW50IHRvIGFkZC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5wbHVzID0gZnVuY3Rpb24gcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIHJlc3VsdCA9IHt9O1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IG9yZGVyZWRVbml0cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBrID0gb3JkZXJlZFVuaXRzW19pXTtcblxuICAgICAgaWYgKGR1ci52YWx1ZXMuaGFzT3duUHJvcGVydHkoaykgfHwgdGhpcy52YWx1ZXMuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgcmVzdWx0W2tdID0gZHVyLmdldChrKSArIHRoaXMuZ2V0KGspO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9uZSh0aGlzLCB7XG4gICAgICB2YWx1ZXM6IHJlc3VsdFxuICAgIH0sIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBNYWtlIHRoaXMgRHVyYXRpb24gc2hvcnRlciBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4gUmV0dXJuIGEgbmV3bHktY29uc3RydWN0ZWQgRHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gc3VidHJhY3QuIEVpdGhlciBhIEx1eG9uIER1cmF0aW9uLCBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIHRoZSBvYmplY3QgYXJndW1lbnQgdG8gRHVyYXRpb24uZnJvbU9iamVjdCgpXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8ubWludXMgPSBmdW5jdGlvbiBtaW51cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXMucGx1cyhkdXIubmVnYXRlKCkpO1xuICB9O1xuICAvKipcclxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlJyBvciAnZGF5J1xyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe3llYXJzOiAyLCBkYXlzOiAzfSkueWVhcnMgLy89PiAyXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5tb250aHMgLy89PiAwXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDIsIGRheXM6IDN9KS5kYXlzIC8vPT4gM1xyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQodW5pdCkge1xuICAgIHJldHVybiB0aGlzW0R1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCldO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm4gYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWVzIC0gYSBtYXBwaW5nIG9mIHVuaXRzIHRvIG51bWJlcnNcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgeWVhcnM6IDIwMTcgfSlcclxuICAgKiBAZXhhbXBsZSBkdXIuc2V0KHsgaG91cnM6IDgsIG1pbnV0ZXM6IDMwIH0pXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KHZhbHVlcykge1xuICAgIHZhciBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy52YWx1ZXMsIG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpKTtcbiAgICByZXR1cm4gY2xvbmUodGhpcywge1xuICAgICAgdmFsdWVzOiBtaXhlZFxuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBsb2NhbGUgYW5kL29yIG51bWJlcmluZ1N5c3RlbS4gIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEdXJhdGlvbi5cclxuICAgKiBAZXhhbXBsZSBkdXIucmVjb25maWd1cmUoeyBsb2NhbGU6ICdlbi1HQicgfSlcclxuICAgKiBAcmV0dXJuIHtEdXJhdGlvbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5yZWNvbmZpZ3VyZSA9IGZ1bmN0aW9uIHJlY29uZmlndXJlKF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgbG9jYWxlID0gX3JlZi5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBjb252ZXJzaW9uQWNjdXJhY3kgPSBfcmVmLmNvbnZlcnNpb25BY2N1cmFjeTtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtXG4gICAgfSksXG4gICAgICAgIG9wdHMgPSB7XG4gICAgICBsb2M6IGxvY1xuICAgIH07XG5cbiAgICBpZiAoY29udmVyc2lvbkFjY3VyYWN5KSB7XG4gICAgICBvcHRzLmNvbnZlcnNpb25BY2N1cmFjeSA9IGNvbnZlcnNpb25BY2N1cmFjeTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUodGhpcywgb3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBkdXJhdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlcycgb3IgJ2RheXMnXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnZGF5cycpIC8vPT4gMzY1XHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7eWVhcnM6IDF9KS5hcygnbW9udGhzJykgLy89PiAxMlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3Qoe2hvdXJzOiA2MH0pLmFzKCdkYXlzJykgLy89PiAyLjVcclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8uYXMgPSBmdW5jdGlvbiBhcyh1bml0KSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuc2hpZnRUbyh1bml0KS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG4gIC8qKlxyXG4gICAqIFJlZHVjZSB0aGlzIER1cmF0aW9uIHRvIGl0cyBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gaW4gaXRzIGN1cnJlbnQgdW5pdHMuXHJcbiAgICogQGV4YW1wbGUgRHVyYXRpb24uZnJvbU9iamVjdCh7IHllYXJzOiAyLCBkYXlzOiA1MDAwIH0pLm5vcm1hbGl6ZSgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXJzOiAxNSwgZGF5czogMjU1IH1cclxuICAgKiBAZXhhbXBsZSBEdXJhdGlvbi5mcm9tT2JqZWN0KHsgaG91cnM6IDEyLCBtaW51dGVzOiAtNDUgfSkubm9ybWFsaXplKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDExLCBtaW51dGVzOiAxNSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8ubm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgdmFscyA9IHRoaXMudG9PYmplY3QoKTtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuICAgIHJldHVybiBEdXJhdGlvbi5mcm9tT2JqZWN0KHZhbHMpO1xuICB9O1xuICAvKipcclxuICAgKiBDb252ZXJ0IHRoaXMgRHVyYXRpb24gaW50byBpdHMgcmVwcmVzZW50YXRpb24gaW4gYSBkaWZmZXJlbnQgc2V0IG9mIHVuaXRzLlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkuc2hpZnRUbygnbWludXRlcycsICdtaWxsaXNlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBtaW51dGVzOiA2MCwgbWlsbGlzZWNvbmRzOiAzMDAwMCB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2hpZnRUbyA9IGZ1bmN0aW9uIHNoaWZ0VG8oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHVuaXRzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgdW5pdHNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKHVuaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdW5pdHMgPSB1bml0cy5tYXAoZnVuY3Rpb24gKHUpIHtcbiAgICAgIHJldHVybiBEdXJhdGlvbi5ub3JtYWxpemVVbml0KHUpO1xuICAgIH0pO1xuICAgIHZhciBidWlsdCA9IHt9LFxuICAgICAgICBhY2N1bXVsYXRlZCA9IHt9LFxuICAgICAgICB2YWxzID0gdGhpcy50b09iamVjdCgpO1xuICAgIHZhciBsYXN0VW5pdDtcbiAgICBub3JtYWxpemVWYWx1ZXModGhpcy5tYXRyaXgsIHZhbHMpO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3JkZXJlZFVuaXRzLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgIHZhciBrID0gb3JkZXJlZFVuaXRzW19pMl07XG5cbiAgICAgIGlmICh1bml0cy5pbmRleE9mKGspID49IDApIHtcbiAgICAgICAgbGFzdFVuaXQgPSBrO1xuICAgICAgICB2YXIgb3duID0gMDsgLy8gYW55dGhpbmcgd2UgaGF2ZW4ndCBib2lsZWQgZG93biB5ZXQgc2hvdWxkIGdldCBib2lsZWQgdG8gdGhpcyB1bml0XG5cbiAgICAgICAgZm9yICh2YXIgYWsgaW4gYWNjdW11bGF0ZWQpIHtcbiAgICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoYWspKSB7XG4gICAgICAgICAgICBvd24gKz0gdGhpcy5tYXRyaXhbYWtdW2tdICogYWNjdW11bGF0ZWRbYWtdO1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRbYWtdID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gcGx1cyBhbnl0aGluZyB0aGF0J3MgYWxyZWFkeSBpbiB0aGlzIHVuaXRcblxuXG4gICAgICAgIGlmIChpc051bWJlcih2YWxzW2tdKSkge1xuICAgICAgICAgIG93biArPSB2YWxzW2tdO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGkgPSBNYXRoLnRydW5jKG93bik7XG4gICAgICAgIGJ1aWx0W2tdID0gaTtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSBvd24gLSBpOyAvLyB3ZSdkIGxpa2UgdG8gYWJzb3JiIHRoZXNlIGZyYWN0aW9ucyBpbiBhbm90aGVyIHVuaXRcbiAgICAgICAgLy8gcGx1cyBhbnl0aGluZyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIHRoYXQgc2hvdWxkIGJlIHJvbGxlZCB1cCBpbiB0byB0aGlzXG5cbiAgICAgICAgZm9yICh2YXIgZG93biBpbiB2YWxzKSB7XG4gICAgICAgICAgaWYgKG9yZGVyZWRVbml0cy5pbmRleE9mKGRvd24pID4gb3JkZXJlZFVuaXRzLmluZGV4T2YoaykpIHtcbiAgICAgICAgICAgIGNvbnZlcnQodGhpcy5tYXRyaXgsIHZhbHMsIGRvd24sIGJ1aWx0LCBrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gb3RoZXJ3aXNlLCBrZWVwIGl0IGluIHRoZSB3aW5ncyB0byBib2lsIGl0IGxhdGVyXG5cbiAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIodmFsc1trXSkpIHtcbiAgICAgICAgYWNjdW11bGF0ZWRba10gPSB2YWxzW2tdO1xuICAgICAgfVxuICAgIH0gLy8gYW55dGhpbmcgbGVmdG92ZXIgYmVjb21lcyB0aGUgZGVjaW1hbCBmb3IgdGhlIGxhc3QgdW5pdFxuXG5cbiAgICBpZiAobGFzdFVuaXQpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhY2N1bXVsYXRlZCkge1xuICAgICAgICBpZiAoYWNjdW11bGF0ZWQuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmIChhY2N1bXVsYXRlZFtrZXldICE9PSAwKSB7XG4gICAgICAgICAgICBidWlsdFtsYXN0VW5pdF0gKz0ga2V5ID09PSBsYXN0VW5pdCA/IGFjY3VtdWxhdGVkW2tleV0gOiBhY2N1bXVsYXRlZFtrZXldIC8gdGhpcy5tYXRyaXhbbGFzdFVuaXRdW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogYnVpbHRcbiAgICB9LCB0cnVlKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBuZWdhdGl2ZSBvZiB0aGlzIER1cmF0aW9uLlxyXG4gICAqIEBleGFtcGxlIER1cmF0aW9uLmZyb21PYmplY3QoeyBob3VyczogMSwgc2Vjb25kczogMzAgfSkubmVnYXRlKCkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IC0xLCBzZWNvbmRzOiAtMzAgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLm5lZ2F0ZSA9IGZ1bmN0aW9uIG5lZ2F0ZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHRoaXM7XG4gICAgdmFyIG5lZ2F0ZWQgPSB7fTtcblxuICAgIHZhciBfYXJyID0gT2JqZWN0LmtleXModGhpcy52YWx1ZXMpO1xuXG4gICAgZm9yICh2YXIgX2kzID0gMDsgX2kzIDwgX2Fyci5sZW5ndGg7IF9pMysrKSB7XG4gICAgICB2YXIgayA9IF9hcnJbX2kzXTtcbiAgICAgIG5lZ2F0ZWRba10gPSAtdGhpcy52YWx1ZXNba107XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIHtcbiAgICAgIHZhbHVlczogbmVnYXRlZFxuICAgIH0sIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBHZXQgdGhlIHllYXJzLlxyXG4gICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICAvKipcclxuICAgKiBFcXVhbGl0eSBjaGVja1xyXG4gICAqIFR3byBEdXJhdGlvbnMgYXJlIGVxdWFsIGlmZiB0aGV5IGhhdmUgdGhlIHNhbWUgdW5pdHMgYW5kIHRoZSBzYW1lIHZhbHVlcyBmb3IgZWFjaCB1bml0LlxyXG4gICAqIEBwYXJhbSB7RHVyYXRpb259IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFvdGhlci5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmxvYy5lcXVhbHMob3RoZXIubG9jKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pNCA9IDA7IF9pNCA8IG9yZGVyZWRVbml0cy5sZW5ndGg7IF9pNCsrKSB7XG4gICAgICB2YXIgdSA9IG9yZGVyZWRVbml0c1tfaTRdO1xuXG4gICAgICBpZiAodGhpcy52YWx1ZXNbdV0gIT09IG90aGVyLnZhbHVlc1t1XSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKER1cmF0aW9uLCBbe1xuICAgIGtleTogXCJsb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIER1cmF0aW9uLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIER1cmF0aW9uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibnVtYmVyaW5nU3lzdGVtXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwieWVhcnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy55ZWFycyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgcXVhcnRlcnMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJxdWFydGVyc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLnF1YXJ0ZXJzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtb250aHMuXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5tb250aHMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHdlZWtzXHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLndlZWtzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBkYXlzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGF5c1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudmFsdWVzLmRheXMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGhvdXJzLlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaG91cnNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5ob3VycyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWludXRlcy5cclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbnV0ZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taW51dGVzIHx8IDAgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZWNvbmRzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy52YWx1ZXMuc2Vjb25kcyB8fCAwIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWlsbGlzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtaWxsaXNlY29uZHNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnZhbHVlcy5taWxsaXNlY29uZHMgfHwgMCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIER1cmF0aW9uIGlzIGludmFsaWQuIEludmFsaWQgZHVyYXRpb25zIGFyZSByZXR1cm5lZCBieSBkaWZmIG9wZXJhdGlvbnNcclxuICAgICAqIG9uIGludmFsaWQgRGF0ZVRpbWVzIG9yIEludGVydmFscy5cclxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgRHVyYXRpb24gYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIER1cmF0aW9uIGlzIHZhbGlkXHJcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRSZWFzb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIER1cmF0aW9uIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEdXJhdGlvbiBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZEV4cGxhbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRHVyYXRpb247XG59KCk7XG5mdW5jdGlvbiBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uaXNoKSB7XG4gIGlmIChpc051bWJlcihkdXJhdGlvbmlzaCkpIHtcbiAgICByZXR1cm4gRHVyYXRpb24uZnJvbU1pbGxpcyhkdXJhdGlvbmlzaCk7XG4gIH0gZWxzZSBpZiAoRHVyYXRpb24uaXNEdXJhdGlvbihkdXJhdGlvbmlzaCkpIHtcbiAgICByZXR1cm4gZHVyYXRpb25pc2g7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGR1cmF0aW9uaXNoID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIER1cmF0aW9uLmZyb21PYmplY3QoZHVyYXRpb25pc2gpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIlVua25vd24gZHVyYXRpb24gYXJndW1lbnQgXCIgKyBkdXJhdGlvbmlzaCArIFwiIG9mIHR5cGUgXCIgKyB0eXBlb2YgZHVyYXRpb25pc2gpO1xuICB9XG59XG5cbnZhciBJTlZBTElEJDEgPSBcIkludmFsaWQgSW50ZXJ2YWxcIjsgLy8gY2hlY2tzIGlmIHRoZSBzdGFydCBpcyBlcXVhbCB0byBvciBiZWZvcmUgdGhlIGVuZFxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN0YXJ0RW5kKHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCB8fCAhc3RhcnQuaXNWYWxpZCkge1xuICAgIHJldHVybiBuZXcgSW52YWxpZChcIm1pc3Npbmcgb3IgaW52YWxpZCBzdGFydFwiKTtcbiAgfSBlbHNlIGlmICghZW5kIHx8ICFlbmQuaXNWYWxpZCkge1xuICAgIHJldHVybiBuZXcgSW52YWxpZChcIm1pc3Npbmcgb3IgaW52YWxpZCBlbmRcIik7XG4gIH0gZWxzZSBpZiAoZW5kIDwgc3RhcnQpIHtcbiAgICByZXR1cm4gbmV3IEludmFsaWQoXCJlbmQgYmVmb3JlIHN0YXJ0XCIsIFwiVGhlIGVuZCBvZiBhbiBpbnRlcnZhbCBtdXN0IGJlIGFmdGVyIGl0cyBzdGFydCwgYnV0IHlvdSBoYWQgc3RhcnQ9XCIgKyBzdGFydC50b0lTTygpICsgXCIgYW5kIGVuZD1cIiArIGVuZC50b0lTTygpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuLyoqXHJcbiAqIEFuIEludGVydmFsIG9iamVjdCByZXByZXNlbnRzIGEgaGFsZi1vcGVuIGludGVydmFsIG9mIHRpbWUsIHdoZXJlIGVhY2ggZW5kcG9pbnQgaXMgYSB7QGxpbmsgRGF0ZVRpbWV9LiBDb25jZXB0dWFsbHksIGl0J3MgYSBjb250YWluZXIgZm9yIHRob3NlIHR3byBlbmRwb2ludHMsIGFjY29tcGFuaWVkIGJ5IG1ldGhvZHMgZm9yIGNyZWF0aW5nLCBwYXJzaW5nLCBpbnRlcnJvZ2F0aW5nLCBjb21wYXJpbmcsIHRyYW5zZm9ybWluZywgYW5kIGZvcm1hdHRpbmcgdGhlbS5cclxuICpcclxuICogSGVyZSBpcyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBhbmQgZ2V0dGVycyBpbiBJbnRlcnZhbDpcclxuICpcclxuICogKiAqKkNyZWF0aW9uKiogVG8gY3JlYXRlIGFuIEludGVydmFsLCB1c2Uge0BsaW5rIGZyb21EYXRlVGltZXN9LCB7QGxpbmsgYWZ0ZXJ9LCB7QGxpbmsgYmVmb3JlfSwgb3Ige0BsaW5rIGZyb21JU099LlxyXG4gKiAqICoqQWNjZXNzb3JzKiogVXNlIHtAbGluayBzdGFydH0gYW5kIHtAbGluayBlbmR9IHRvIGdldCB0aGUgc3RhcnQgYW5kIGVuZC5cclxuICogKiAqKkludGVycm9nYXRpb24qKiBUbyBhbmFseXplIHRoZSBJbnRlcnZhbCwgdXNlIHtAbGluayBjb3VudH0sIHtAbGluayBsZW5ndGh9LCB7QGxpbmsgaGFzU2FtZX0sIHtAbGluayBjb250YWluc30sIHtAbGluayBpc0FmdGVyfSwgb3Ige0BsaW5rIGlzQmVmb3JlfS5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKiogVG8gY3JlYXRlIG90aGVyIEludGVydmFscyBvdXQgb2YgdGhpcyBvbmUsIHVzZSB7QGxpbmsgc2V0fSwge0BsaW5rIHNwbGl0QXR9LCB7QGxpbmsgc3BsaXRCeX0sIHtAbGluayBkaXZpZGVFcXVhbGx5fSwge0BsaW5rIG1lcmdlfSwge0BsaW5rIHhvcn0sIHtAbGluayB1bmlvbn0sIHtAbGluayBpbnRlcnNlY3Rpb259LCBvciB7QGxpbmsgZGlmZmVyZW5jZX0uXHJcbiAqICogKipDb21wYXJpc29uKiogVG8gY29tcGFyZSB0aGlzIEludGVydmFsIHRvIGFub3RoZXIgb25lLCB1c2Uge0BsaW5rIGVxdWFsc30sIHtAbGluayBvdmVybGFwc30sIHtAbGluayBhYnV0c1N0YXJ0fSwge0BsaW5rIGFidXRzRW5kfSwge0BsaW5rIGVuZ3VsZnN9XHJcbiAqICogKipPdXRwdXQqKiogVG8gY29udmVydCB0aGUgSW50ZXJ2YWwgaW50byBvdGhlciByZXByZXNlbnRhdGlvbnMsIHNlZSB7QGxpbmsgdG9TdHJpbmd9LCB7QGxpbmsgdG9JU099LCB7QGxpbmsgdG9Gb3JtYXR9LCBhbmQge0BsaW5rIHRvRHVyYXRpb259LlxyXG4gKi9cblxuXG52YXIgSW50ZXJ2YWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBJbnRlcnZhbChjb25maWcpIHtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG4gICAgdGhpcy5zID0gY29uZmlnLnN0YXJ0O1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMuZSA9IGNvbmZpZy5lbmQ7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmlzTHV4b25JbnRlcnZhbCA9IHRydWU7XG4gIH1cbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGludmFsaWQgSW50ZXJ2YWwuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlYXNvbiAtIHNpbXBsZSBzdHJpbmcgb2Ygd2h5IHRoaXMgSW50ZXJ2YWwgaXMgaW52YWxpZC4gU2hvdWxkIG5vdCBjb250YWluIHBhcmFtZXRlcnMgb3IgYW55dGhpbmcgZWxzZSBkYXRhLWRlcGVuZGVudFxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXhwbGFuYXRpb249bnVsbF0gLSBsb25nZXIgZXhwbGFuYXRpb24sIG1heSBpbmNsdWRlIHBhcmFtZXRlcnMgYW5kIG90aGVyIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cclxuICAgKiBAcmV0dXJuIHtJbnRlcnZhbH1cclxuICAgKi9cblxuXG4gIEludGVydmFsLmludmFsaWQgPSBmdW5jdGlvbiBpbnZhbGlkKHJlYXNvbiwgZXhwbGFuYXRpb24pIHtcbiAgICBpZiAoZXhwbGFuYXRpb24gPT09IHZvaWQgMCkge1xuICAgICAgZXhwbGFuYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIGlmICghcmVhc29uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJuZWVkIHRvIHNwZWNpZnkgYSByZWFzb24gdGhlIEludGVydmFsIGlzIGludmFsaWRcIik7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWQgPSByZWFzb24gaW5zdGFuY2VvZiBJbnZhbGlkID8gcmVhc29uIDogbmV3IEludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbik7XG5cbiAgICBpZiAoU2V0dGluZ3MudGhyb3dPbkludmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkSW50ZXJ2YWxFcnJvcihpbnZhbGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcnZhbCh7XG4gICAgICAgIGludmFsaWQ6IGludmFsaWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYW4gZW5kIERhdGVUaW1lLiBJbmNsdXNpdmUgb2YgdGhlIHN0YXJ0IGJ1dCBub3QgdGhlIGVuZC5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfERhdGV8T2JqZWN0fSBzdGFydFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV8RGF0ZXxPYmplY3R9IGVuZFxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyA9IGZ1bmN0aW9uIGZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCkge1xuICAgIHZhciBidWlsdFN0YXJ0ID0gZnJpZW5kbHlEYXRlVGltZShzdGFydCksXG4gICAgICAgIGJ1aWx0RW5kID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuICAgIHJldHVybiBuZXcgSW50ZXJ2YWwoe1xuICAgICAgc3RhcnQ6IGJ1aWx0U3RhcnQsXG4gICAgICBlbmQ6IGJ1aWx0RW5kLFxuICAgICAgaW52YWxpZDogdmFsaWRhdGVTdGFydEVuZChidWlsdFN0YXJ0LCBidWlsdEVuZClcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYSBzdGFydCBEYXRlVGltZSBhbmQgYSBEdXJhdGlvbiB0byBleHRlbmQgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gc3RhcnRcclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gdGhlIGxlbmd0aCBvZiB0aGUgSW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5hZnRlciA9IGZ1bmN0aW9uIGFmdGVyKHN0YXJ0LCBkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKSxcbiAgICAgICAgZHQgPSBmcmllbmRseURhdGVUaW1lKHN0YXJ0KTtcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdCwgZHQucGx1cyhkdXIpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gZW5kIERhdGVUaW1lIGFuZCBhIER1cmF0aW9uIHRvIGV4dGVuZCBiYWNrd2FyZHMgdG8uXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZXxEYXRlfE9iamVjdH0gZW5kXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsLlxyXG4gICAqIEByZXR1cm4ge0ludGVydmFsfVxyXG4gICAqL1xuXG5cbiAgSW50ZXJ2YWwuYmVmb3JlID0gZnVuY3Rpb24gYmVmb3JlKGVuZCwgZHVyYXRpb24pIHtcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbiksXG4gICAgICAgIGR0ID0gZnJpZW5kbHlEYXRlVGltZShlbmQpO1xuICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0Lm1pbnVzKGR1ciksIGR0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIEludGVydmFsIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nLlxyXG4gICAqIEFjY2VwdHMgYDxzdGFydD4vPGVuZD5gLCBgPHN0YXJ0Pi88ZHVyYXRpb24+YCwgYW5kIGA8ZHVyYXRpb24+LzxlbmQ+YCBmb3JtYXRzLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIElTTyBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gb3B0aW9ucyB0byBwYXNzIHtAbGluayBEYXRlVGltZS5mcm9tSVNPfSBhbmQgb3B0aW9uYWxseSB7QGxpbmsgRHVyYXRpb24uZnJvbUlTT31cclxuICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxI1RpbWVfaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5mcm9tSVNPID0gZnVuY3Rpb24gZnJvbUlTTyh0ZXh0LCBvcHRzKSB7XG4gICAgdmFyIF9zcGxpdCA9ICh0ZXh0IHx8IFwiXCIpLnNwbGl0KFwiL1wiLCAyKSxcbiAgICAgICAgcyA9IF9zcGxpdFswXSxcbiAgICAgICAgZSA9IF9zcGxpdFsxXTtcblxuICAgIGlmIChzICYmIGUpIHtcbiAgICAgIHZhciBzdGFydCA9IERhdGVUaW1lLmZyb21JU08ocywgb3B0cyksXG4gICAgICAgICAgZW5kID0gRGF0ZVRpbWUuZnJvbUlTTyhlLCBvcHRzKTtcblxuICAgICAgaWYgKHN0YXJ0LmlzVmFsaWQgJiYgZW5kLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGVuZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydC5pc1ZhbGlkKSB7XG4gICAgICAgIHZhciBkdXIgPSBEdXJhdGlvbi5mcm9tSVNPKGUsIG9wdHMpO1xuXG4gICAgICAgIGlmIChkdXIuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBJbnRlcnZhbC5hZnRlcihzdGFydCwgZHVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbmQuaXNWYWxpZCkge1xuICAgICAgICB2YXIgX2R1ciA9IER1cmF0aW9uLmZyb21JU08ocywgb3B0cyk7XG5cbiAgICAgICAgaWYgKF9kdXIuaXNWYWxpZCkge1xuICAgICAgICAgIHJldHVybiBJbnRlcnZhbC5iZWZvcmUoZW5kLCBfZHVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5pbnZhbGlkKFwidW5wYXJzYWJsZVwiLCBcInRoZSBpbnB1dCBcXFwiXCIgKyB0ZXh0ICsgXCJcXFwiIGNhbid0IGJlIHBhcnNlZCBhc0lTTyA4NjAxXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYW4gSW50ZXJ2YWwuIFdvcmtzIGFjcm9zcyBjb250ZXh0IGJvdW5kYXJpZXNcclxuICAgKiBAcGFyYW0ge29iamVjdH0gb1xyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5pc0ludGVydmFsID0gZnVuY3Rpb24gaXNJbnRlcnZhbChvKSB7XG4gICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBJbnRlcnZhbCB8fCBvLmlzTHV4b25JbnRlcnZhbDtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgc3RhcnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHR5cGUge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IEludGVydmFsLnByb3RvdHlwZTtcblxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIEludGVydmFsIGluIHRoZSBzcGVjaWZpZWQgdW5pdC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byByZXR1cm4gdGhlIGxlbmd0aCBpbi5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG4gIF9wcm90by5sZW5ndGggPSBmdW5jdGlvbiBsZW5ndGgodW5pdCkge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLnRvRHVyYXRpb24uYXBwbHkodGhpcywgW3VuaXRdKS5nZXQodW5pdCkgOiBOYU47XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGNvdW50IG9mIG1pbnV0ZXMsIGhvdXJzLCBkYXlzLCBtb250aHMsIG9yIHllYXJzIGluY2x1ZGVkIGluIHRoZSBJbnRlcnZhbCwgZXZlbiBpbiBwYXJ0LlxyXG4gICAqIFVubGlrZSB7QGxpbmsgbGVuZ3RofSB0aGlzIGNvdW50cyBzZWN0aW9ucyBvZiB0aGUgY2FsZW5kYXIsIG5vdCBwZXJpb2RzIG9mIHRpbWUsIGUuZy4gc3BlY2lmeWluZyAnZGF5J1xyXG4gICAqIGFza3MgJ3doYXQgZGF0ZXMgYXJlIGluY2x1ZGVkIGluIHRoaXMgaW50ZXJ2YWw/Jywgbm90ICdob3cgbWFueSBkYXlzIGxvbmcgaXMgdGhpcyBpbnRlcnZhbD8nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt1bml0PSdtaWxsaXNlY29uZHMnXSAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmNvdW50ID0gZnVuY3Rpb24gY291bnQodW5pdCkge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gTmFOO1xuICAgIHZhciBzdGFydCA9IHRoaXMuc3RhcnQuc3RhcnRPZih1bml0KSxcbiAgICAgICAgZW5kID0gdGhpcy5lbmQuc3RhcnRPZih1bml0KTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihlbmQuZGlmZihzdGFydCwgdW5pdCkuZ2V0KHVuaXQpKSArIDE7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgYW5kIGVuZCBhcmUgYm90aCBpbiB0aGUgc2FtZSB1bml0IG9mIHRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY2hlY2sgc2FtZW5lc3Mgb25cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmhhc1NhbWUgPSBmdW5jdGlvbiBoYXNTYW1lKHVuaXQpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5lLm1pbnVzKDEpLmhhc1NhbWUodGhpcy5zLCB1bml0KSA6IGZhbHNlO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGhhcyB0aGUgc2FtZSBzdGFydCBhbmQgZW5kIERhdGVUaW1lcy5cclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmlzRW1wdHkgPSBmdW5jdGlvbiBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnMudmFsdWVPZigpID09PSB0aGlzLmUudmFsdWVPZigpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uaXNBZnRlciA9IGZ1bmN0aW9uIGlzQWZ0ZXIoZGF0ZVRpbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPiBkYXRlVGltZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCdzIGVuZCBpcyBiZWZvcmUgdGhlIHNwZWNpZmllZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBkYXRlVGltZVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uaXNCZWZvcmUgPSBmdW5jdGlvbiBpc0JlZm9yZShkYXRlVGltZSkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuZSA8PSBkYXRlVGltZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBjb250YWlucyB0aGUgc3BlY2lmaWVkIERhdGVUaW1lLlxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IGRhdGVUaW1lXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5jb250YWlucyA9IGZ1bmN0aW9uIGNvbnRhaW5zKGRhdGVUaW1lKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5zIDw9IGRhdGVUaW1lICYmIHRoaXMuZSA+IGRhdGVUaW1lO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldHNcIiB0aGUgc3RhcnQgYW5kL29yIGVuZCBkYXRlcy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIHRvIHNldFxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5zdGFydCAtIHRoZSBzdGFydGluZyBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7RGF0ZVRpbWV9IHZhbHVlcy5lbmQgLSB0aGUgZW5kaW5nIERhdGVUaW1lXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KF90ZW1wKSB7XG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgc3RhcnQgPSBfcmVmLnN0YXJ0LFxuICAgICAgICBlbmQgPSBfcmVmLmVuZDtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICByZXR1cm4gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydCB8fCB0aGlzLnMsIGVuZCB8fCB0aGlzLmUpO1xuICB9O1xuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGF0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBEYXRlVGltZXNcclxuICAgKiBAcGFyYW0gey4uLltEYXRlVGltZV19IGRhdGVUaW1lcyAtIHRoZSB1bml0IG9mIHRpbWUgdG8gY291bnQuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zcGxpdEF0ID0gZnVuY3Rpb24gc3BsaXRBdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIFtdO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgc29ydGVkID0gZGF0ZVRpbWVzLm1hcChmcmllbmRseURhdGVUaW1lKS5zb3J0KCksXG4gICAgICAgIHJlc3VsdHMgPSBbXTtcbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgICAgaSA9IDA7XG5cbiAgICB3aGlsZSAocyA8IHRoaXMuZSkge1xuICAgICAgdmFyIGFkZGVkID0gc29ydGVkW2ldIHx8IHRoaXMuZSxcbiAgICAgICAgICBuZXh0ID0gK2FkZGVkID4gK3RoaXMuZSA/IHRoaXMuZSA6IGFkZGVkO1xuICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMocywgbmV4dCkpO1xuICAgICAgcyA9IG5leHQ7XG4gICAgICBpICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH07XG4gIC8qKlxyXG4gICAqIFNwbGl0IHRoaXMgSW50ZXJ2YWwgaW50byBzbWFsbGVyIEludGVydmFscywgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cclxuICAgKiBMZWZ0IG92ZXIgdGltZSBpcyBncm91cGVkIGludG8gYSBzbWFsbGVyIGludGVydmFsXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBsZW5ndGggb2YgZWFjaCByZXN1bHRpbmcgaW50ZXJ2YWwuXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zcGxpdEJ5ID0gZnVuY3Rpb24gc3BsaXRCeShkdXJhdGlvbikge1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKTtcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8ICFkdXIuaXNWYWxpZCB8fCBkdXIuYXMoXCJtaWxsaXNlY29uZHNcIikgPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgcyA9IHRoaXMucyxcbiAgICAgICAgYWRkZWQsXG4gICAgICAgIG5leHQ7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcblxuICAgIHdoaWxlIChzIDwgdGhpcy5lKSB7XG4gICAgICBhZGRlZCA9IHMucGx1cyhkdXIpO1xuICAgICAgbmV4dCA9ICthZGRlZCA+ICt0aGlzLmUgPyB0aGlzLmUgOiBhZGRlZDtcbiAgICAgIHJlc3VsdHMucHVzaChJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIG5leHQpKTtcbiAgICAgIHMgPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9O1xuICAvKipcclxuICAgKiBTcGxpdCB0aGlzIEludGVydmFsIGludG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc21hbGxlciBpbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlck9mUGFydHMgLSBUaGUgbnVtYmVyIG9mIEludGVydmFscyB0byBkaXZpZGUgdGhlIEludGVydmFsIGludG8uXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5kaXZpZGVFcXVhbGx5ID0gZnVuY3Rpb24gZGl2aWRlRXF1YWxseShudW1iZXJPZlBhcnRzKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5zcGxpdEJ5KHRoaXMubGVuZ3RoKCkgLyBudW1iZXJPZlBhcnRzKS5zbGljZSgwLCBudW1iZXJPZlBhcnRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBvdmVybGFwcyB3aXRoIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxcclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8ub3ZlcmxhcHMgPSBmdW5jdGlvbiBvdmVybGFwcyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmUgPiBvdGhlci5zICYmIHRoaXMucyA8IG90aGVyLmU7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIHN0YXJ0LlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5hYnV0c1N0YXJ0ID0gZnVuY3Rpb24gYWJ1dHNTdGFydChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICt0aGlzLmUgPT09ICtvdGhlci5zO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsJ3Mgc3RhcnQgaXMgYWRqYWNlbnQgdG8gdGhlIHNwZWNpZmllZCBJbnRlcnZhbCdzIGVuZC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uYWJ1dHNFbmQgPSBmdW5jdGlvbiBhYnV0c0VuZChvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICtvdGhlci5lID09PSArdGhpcy5zO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIEludGVydmFsIGVuZ3VsZnMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge0ludGVydmFsfSBvdGhlclxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uZW5ndWxmcyA9IGZ1bmN0aW9uIGVuZ3VsZnMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnMgPD0gb3RoZXIucyAmJiB0aGlzLmUgPj0gb3RoZXIuZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHdoZXRoZXIgdGhpcyBJbnRlcnZhbCBoYXMgdGhlIHNhbWUgc3RhcnQgYW5kIGVuZCBhcyB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIF9wcm90by5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXIuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnMuZXF1YWxzKG90aGVyLnMpICYmIHRoaXMuZS5lcXVhbHMob3RoZXIuZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBJbnRlcnZhbCByZXByZXNlbnRpbmcgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIEludGVydmFsIGFuZCB0aGUgc3BlY2lmaWVkIEludGVydmFsLlxyXG4gICAqIFNwZWNpZmljYWxseSwgdGhlIHJlc3VsdGluZyBJbnRlcnZhbCBoYXMgdGhlIG1heGltdW0gc3RhcnQgdGltZSBhbmQgdGhlIG1pbmltdW0gZW5kIHRpbWUgb2YgdGhlIHR3byBJbnRlcnZhbHMuXHJcbiAgICogUmV0dXJucyBudWxsIGlmIHRoZSBpbnRlcnNlY3Rpb24gaXMgZW1wdHksIGkuZS4sIHRoZSBpbnRlcnZhbHMgZG9uJ3QgaW50ZXJzZWN0LlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8uaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gaW50ZXJzZWN0aW9uKG90aGVyKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBzID0gdGhpcy5zID4gb3RoZXIucyA/IHRoaXMucyA6IG90aGVyLnMsXG4gICAgICAgIGUgPSB0aGlzLmUgPCBvdGhlci5lID8gdGhpcy5lIDogb3RoZXIuZTtcblxuICAgIGlmIChzID4gZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKHMsIGUpO1xuICAgIH1cbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHNwZWNpZmllZCBJbnRlcnZhbC5cclxuICAgKiBTcGVjaWZpY2FsbHksIHRoZSByZXN1bHRpbmcgSW50ZXJ2YWwgaGFzIHRoZSBtaW5pbXVtIHN0YXJ0IHRpbWUgYW5kIHRoZSBtYXhpbXVtIGVuZCB0aW1lIG9mIHRoZSB0d28gSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7SW50ZXJ2YWx9IG90aGVyXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8udW5pb24gPSBmdW5jdGlvbiB1bmlvbihvdGhlcikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgcyA9IHRoaXMucyA8IG90aGVyLnMgPyB0aGlzLnMgOiBvdGhlci5zLFxuICAgICAgICBlID0gdGhpcy5lID4gb3RoZXIuZSA/IHRoaXMuZSA6IG90aGVyLmU7XG4gICAgcmV0dXJuIEludGVydmFsLmZyb21EYXRlVGltZXMocywgZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIE1lcmdlIGFuIGFycmF5IG9mIEludGVydmFscyBpbnRvIGEgZXF1aXZhbGVudCBtaW5pbWFsIHNldCBvZiBJbnRlcnZhbHMuXHJcbiAgICogQ29tYmluZXMgb3ZlcmxhcHBpbmcgYW5kIGFkamFjZW50IEludGVydmFscy5cclxuICAgKiBAcGFyYW0ge1tJbnRlcnZhbF19IGludGVydmFsc1xyXG4gICAqIEByZXR1cm4ge1tJbnRlcnZhbF19XHJcbiAgICovXG5cblxuICBJbnRlcnZhbC5tZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKGludGVydmFscykge1xuICAgIHZhciBfaW50ZXJ2YWxzJHNvcnQkcmVkdWMgPSBpbnRlcnZhbHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEucyAtIGIucztcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKF9yZWYyLCBpdGVtKSB7XG4gICAgICB2YXIgc29mYXIgPSBfcmVmMlswXSxcbiAgICAgICAgICBjdXJyZW50ID0gX3JlZjJbMV07XG5cbiAgICAgIGlmICghY3VycmVudCkge1xuICAgICAgICByZXR1cm4gW3NvZmFyLCBpdGVtXTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5vdmVybGFwcyhpdGVtKSB8fCBjdXJyZW50LmFidXRzU3RhcnQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIFtzb2ZhciwgY3VycmVudC51bmlvbihpdGVtKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW3NvZmFyLmNvbmNhdChbY3VycmVudF0pLCBpdGVtXTtcbiAgICAgIH1cbiAgICB9LCBbW10sIG51bGxdKSxcbiAgICAgICAgZm91bmQgPSBfaW50ZXJ2YWxzJHNvcnQkcmVkdWNbMF0sXG4gICAgICAgIGZpbmFsID0gX2ludGVydmFscyRzb3J0JHJlZHVjWzFdO1xuXG4gICAgaWYgKGZpbmFsKSB7XG4gICAgICBmb3VuZC5wdXNoKGZpbmFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBJbnRlcnZhbHMgcmVwcmVzZW50aW5nIHRoZSBzcGFucyBvZiB0aW1lIHRoYXQgb25seSBhcHBlYXIgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgSW50ZXJ2YWxzLlxyXG4gICAqIEBwYXJhbSB7W0ludGVydmFsXX0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIEludGVydmFsLnhvciA9IGZ1bmN0aW9uIHhvcihpbnRlcnZhbHMpIHtcbiAgICB2YXIgX0FycmF5JHByb3RvdHlwZTtcblxuICAgIHZhciBzdGFydCA9IG51bGwsXG4gICAgICAgIGN1cnJlbnRDb3VudCA9IDA7XG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdLFxuICAgICAgICBlbmRzID0gaW50ZXJ2YWxzLm1hcChmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIHRpbWU6IGkucyxcbiAgICAgICAgdHlwZTogXCJzXCJcbiAgICAgIH0sIHtcbiAgICAgICAgdGltZTogaS5lLFxuICAgICAgICB0eXBlOiBcImVcIlxuICAgICAgfV07XG4gICAgfSksXG4gICAgICAgIGZsYXR0ZW5lZCA9IChfQXJyYXkkcHJvdG90eXBlID0gQXJyYXkucHJvdG90eXBlKS5jb25jYXQuYXBwbHkoX0FycmF5JHByb3RvdHlwZSwgZW5kcyksXG4gICAgICAgIGFyciA9IGZsYXR0ZW5lZC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYS50aW1lIC0gYi50aW1lO1xuICAgIH0pO1xuXG4gICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gYXJyLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgdmFyIF9yZWYzO1xuXG4gICAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmMyA9IF9pLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaSA9IF9yZWYzO1xuICAgICAgY3VycmVudENvdW50ICs9IGkudHlwZSA9PT0gXCJzXCIgPyAxIDogLTE7XG5cbiAgICAgIGlmIChjdXJyZW50Q291bnQgPT09IDEpIHtcbiAgICAgICAgc3RhcnQgPSBpLnRpbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc3RhcnQgJiYgK3N0YXJ0ICE9PSAraS50aW1lKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKEludGVydmFsLmZyb21EYXRlVGltZXMoc3RhcnQsIGkudGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC5tZXJnZShyZXN1bHRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIEludGVydmFsIHJlcHJlc2VudGluZyB0aGUgc3BhbiBvZiB0aW1lIGluIHRoaXMgSW50ZXJ2YWwgdGhhdCBkb2Vzbid0IG92ZXJsYXAgd2l0aCBhbnkgb2YgdGhlIHNwZWNpZmllZCBJbnRlcnZhbHMuXHJcbiAgICogQHBhcmFtIHsuLi5JbnRlcnZhbH0gaW50ZXJ2YWxzXHJcbiAgICogQHJldHVybiB7W0ludGVydmFsXX1cclxuICAgKi9cblxuXG4gIF9wcm90by5kaWZmZXJlbmNlID0gZnVuY3Rpb24gZGlmZmVyZW5jZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBpbnRlcnZhbHMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGludGVydmFsc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBJbnRlcnZhbC54b3IoW3RoaXNdLmNvbmNhdChpbnRlcnZhbHMpKS5tYXAoZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBfdGhpcy5pbnRlcnNlY3Rpb24oaSk7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gaSAmJiAhaS5pc0VtcHR5KCk7XG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBhcHByb3ByaWF0ZSBmb3IgZGVidWdnaW5nLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gSU5WQUxJRCQxO1xuICAgIHJldHVybiBcIltcIiArIHRoaXMucy50b0lTTygpICsgXCIgXFx1MjAxMyBcIiArIHRoaXMuZS50b0lTTygpICsgXCIpXCI7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIEludGVydmFsLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEjVGltZV9pbnRlcnZhbHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBzYW1lIG9wdGlvbnMgYXMge0BsaW5rIERhdGVUaW1lLnRvSVNPfVxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0lTTyA9IGZ1bmN0aW9uIHRvSVNPKG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gdGhpcy5zLnRvSVNPKG9wdHMpICsgXCIvXCIgKyB0aGlzLmUudG9JU08ob3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBJbnRlcnZhbCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0ZUZvcm1hdCAtIHRoZSBmb3JtYXQgc3RyaW5nLiBUaGlzIHN0cmluZyBmb3JtYXRzIHRoZSBzdGFydCBhbmQgZW5kIHRpbWUuIFNlZSB7QGxpbmsgRGF0ZVRpbWUudG9Gb3JtYXR9IGZvciBkZXRhaWxzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5zZXBhcmF0b3IgPSAgJyDigJMgJ10gLSBhIHNlcGFyYXRvciB0byBwbGFjZSBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHJlcHJlc2VudGF0aW9uc1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0Zvcm1hdCA9IGZ1bmN0aW9uIHRvRm9ybWF0KGRhdGVGb3JtYXQsIF90ZW1wMikge1xuICAgIHZhciBfcmVmNCA9IF90ZW1wMiA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDIsXG4gICAgICAgIF9yZWY0JHNlcGFyYXRvciA9IF9yZWY0LnNlcGFyYXRvcixcbiAgICAgICAgc2VwYXJhdG9yID0gX3JlZjQkc2VwYXJhdG9yID09PSB2b2lkIDAgPyBcIiDigJMgXCIgOiBfcmVmNCRzZXBhcmF0b3I7XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIElOVkFMSUQkMTtcbiAgICByZXR1cm4gXCJcIiArIHRoaXMucy50b0Zvcm1hdChkYXRlRm9ybWF0KSArIHNlcGFyYXRvciArIHRoaXMuZS50b0Zvcm1hdChkYXRlRm9ybWF0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGEgRHVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSB0aW1lIHNwYW5uZWQgYnkgdGhpcyBpbnRlcnZhbC5cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3VuaXQ9WydtaWxsaXNlY29uZHMnXV0gLSB0aGUgdW5pdCBvciB1bml0cyAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gaW5jbHVkZSBpbiB0aGUgZHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAZXhhbXBsZSBJbnRlcnZhbC5mcm9tRGF0ZVRpbWVzKGR0MSwgZHQyKS50b0R1cmF0aW9uKCkudG9PYmplY3QoKSAvLz0+IHsgbWlsbGlzZWNvbmRzOiA4ODQ4OTI1NyB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbignZGF5cycpLnRvT2JqZWN0KCkgLy89PiB7IGRheXM6IDEuMDI0MTgxMjE1Mjc3Nzc3OCB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbihbJ2hvdXJzJywgJ21pbnV0ZXMnXSkudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDI0LCBtaW51dGVzOiAzNC44MjA5NSB9XHJcbiAgICogQGV4YW1wbGUgSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhkdDEsIGR0MikudG9EdXJhdGlvbihbJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcyddKS50b09iamVjdCgpIC8vPT4geyBob3VyczogMjQsIG1pbnV0ZXM6IDM0LCBzZWNvbmRzOiA0OS4yNTcgfVxyXG4gICAqIEBleGFtcGxlIEludGVydmFsLmZyb21EYXRlVGltZXMoZHQxLCBkdDIpLnRvRHVyYXRpb24oJ3NlY29uZHMnKS50b09iamVjdCgpIC8vPT4geyBzZWNvbmRzOiA4ODQ4OS4yNTcgfVxyXG4gICAqIEByZXR1cm4ge0R1cmF0aW9ufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvRHVyYXRpb24gPSBmdW5jdGlvbiB0b0R1cmF0aW9uKHVuaXQsIG9wdHMpIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkge1xuICAgICAgcmV0dXJuIER1cmF0aW9uLmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lLmRpZmYodGhpcy5zLCB1bml0LCBvcHRzKTtcbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoSW50ZXJ2YWwsIFt7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBlbmQgb2YgdGhlIEludGVydmFsXHJcbiAgICAgKiBAdHlwZSB7RGF0ZVRpbWV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImVuZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuZSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgSW50ZXJ2YWwncyBlbmQgaXMgYXQgbGVhc3QgaXRzIHN0YXJ0LCBpLmUuIHRoYXQgdGhlIEludGVydmFsIGlzbid0ICdiYWNrd2FyZHMnLlxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzVmFsaWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWRSZWFzb24gPT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIHRoaXMgSW50ZXJ2YWwgaXMgaW52YWxpZCwgb3IgbnVsbCBpZiB0aGUgSW50ZXJ2YWwgaXMgdmFsaWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludmFsaWRSZWFzb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQucmVhc29uIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIEludGVydmFsIGJlY2FtZSBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBJbnRlcnZhbCBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZEV4cGxhbmF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnZhbGlkID8gdGhpcy5pbnZhbGlkLmV4cGxhbmF0aW9uIDogbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gSW50ZXJ2YWw7XG59KCk7XG5cbi8qKlxyXG4gKiBUaGUgSW5mbyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBnZW5lcmFsIHRpbWUgYW5kIGRhdGUgcmVsYXRlZCBkYXRhLiBGb3IgZXhhbXBsZSwgaXQgaGFzIG1ldGhvZHMgZm9yIGZpbmRpbmcgb3V0IGlmIGEgdGltZSB6b25lIGhhcyBhIERTVCwgZm9yIGxpc3RpbmcgdGhlIG1vbnRocyBpbiBhbnkgc3VwcG9ydGVkIGxvY2FsZSwgYW5kIGZvciBkaXNjb3ZlcmluZyB3aGljaCBvZiBMdXhvbiBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxyXG4gKi9cblxudmFyIEluZm8gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBJbmZvKCkge31cblxuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHpvbmUgY29udGFpbnMgYSBEU1QuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBab25lIHRvIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgZW52aXJvbm1lbnQncyBsb2NhbCB6b25lLlxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG4gIEluZm8uaGFzRFNUID0gZnVuY3Rpb24gaGFzRFNUKHpvbmUpIHtcbiAgICBpZiAoem9uZSA9PT0gdm9pZCAwKSB7XG4gICAgICB6b25lID0gU2V0dGluZ3MuZGVmYXVsdFpvbmU7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvID0gRGF0ZVRpbWUubG9jYWwoKS5zZXRab25lKHpvbmUpLnNldCh7XG4gICAgICBtb250aDogMTJcbiAgICB9KTtcbiAgICByZXR1cm4gIXpvbmUudW5pdmVyc2FsICYmIHByb3RvLm9mZnNldCAhPT0gcHJvdG8uc2V0KHtcbiAgICAgIG1vbnRoOiA2XG4gICAgfSkub2Zmc2V0O1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHpvbmUgaXMgYSB2YWxpZCBJQU5BIHNwZWNpZmllci5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gem9uZSAtIFpvbmUgdG8gY2hlY2tcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgSW5mby5pc1ZhbGlkSUFOQVpvbmUgPSBmdW5jdGlvbiBpc1ZhbGlkSUFOQVpvbmUoem9uZSkge1xuICAgIHJldHVybiAhIUlBTkFab25lLmlzVmFsaWRTcGVjaWZpZXIoem9uZSkgJiYgSUFOQVpvbmUuaXNWYWxpZFpvbmUoem9uZSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBzdGFuZGFsb25lIG1vbnRoIG5hbWVzLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJudW1lcmljXCIsIFwiMi1kaWdpdFwiLCBcIm5hcnJvd1wiLCBcInNob3J0XCIsIFwibG9uZ1wiXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZV0gLSB0aGUgbG9jYWxlIGNvZGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubnVtYmVyaW5nU3lzdGVtPW51bGxdIC0gdGhlIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMub3V0cHV0Q2FsZW5kYXI9J2dyZWdvcnknXSAtIHRoZSBjYWxlbmRhclxyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKClbMF0gLy89PiAnSmFudWFyeSdcclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnc2hvcnQnKVswXSAvLz0+ICdKYW4nXHJcbiAgICogQGV4YW1wbGUgSW5mby5tb250aHMoJ251bWVyaWMnKVswXSAvLz0+ICcxJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdzaG9ydCcsIHsgbG9jYWxlOiAnZnItQ0EnIH0gKVswXSAvLz0+ICdqYW52LidcclxuICAgKiBAZXhhbXBsZSBJbmZvLm1vbnRocygnbnVtZXJpYycsIHsgbG9jYWxlOiAnYXInIH0pWzBdIC8vPT4gJ9mhJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ubW9udGhzKCdsb25nJywgeyBvdXRwdXRDYWxlbmRhcjogJ2lzbGFtaWMnIH0pWzBdIC8vPT4gJ1JhYmnKuyBJJ1xyXG4gICAqIEByZXR1cm4ge1tzdHJpbmddfVxyXG4gICAqL1xuXG5cbiAgSW5mby5tb250aHMgPSBmdW5jdGlvbiBtb250aHMobGVuZ3RoLCBfdGVtcCkge1xuICAgIGlmIChsZW5ndGggPT09IHZvaWQgMCkge1xuICAgICAgbGVuZ3RoID0gXCJsb25nXCI7XG4gICAgfVxuXG4gICAgdmFyIF9yZWYgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgX3JlZiRsb2NhbGUgPSBfcmVmLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZiRsb2NhbGUgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJGxvY2FsZSxcbiAgICAgICAgX3JlZiRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmLm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbnVtYmVyaW5nU3lzdGVtID0gX3JlZiRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgX3JlZiRvdXRwdXRDYWxlbmRhciA9IF9yZWYub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZiRvdXRwdXRDYWxlbmRhciA9PT0gdm9pZCAwID8gXCJncmVnb3J5XCIgOiBfcmVmJG91dHB1dENhbGVuZGFyO1xuXG4gICAgcmV0dXJuIExvY2FsZS5jcmVhdGUobG9jYWxlLCBudW1iZXJpbmdTeXN0ZW0sIG91dHB1dENhbGVuZGFyKS5tb250aHMobGVuZ3RoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIGFuIGFycmF5IG9mIGZvcm1hdCBtb250aCBuYW1lcy5cclxuICAgKiBGb3JtYXQgbW9udGhzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgbW9udGhzIGluIHRoYXQgdGhleSdyZSBtZWFudCB0byBhcHBlYXIgbmV4dCB0byB0aGUgZGF5IG9mIHRoZSBtb250aC4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcclxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXHJcbiAgICogU2VlIHtAbGluayBtb250aHN9XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsZW5ndGg9J2xvbmcnXSAtIHRoZSBsZW5ndGggb2YgdGhlIG1vbnRoIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwibnVtZXJpY1wiLCBcIjItZGlnaXRcIiwgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm91dHB1dENhbGVuZGFyPSdncmVnb3J5J10gLSB0aGUgY2FsZW5kYXJcclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cclxuICAgKi9cblxuXG4gIEluZm8ubW9udGhzRm9ybWF0ID0gZnVuY3Rpb24gbW9udGhzRm9ybWF0KGxlbmd0aCwgX3RlbXAyKSB7XG4gICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7XG4gICAgICBsZW5ndGggPSBcImxvbmdcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjIgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBfcmVmMiRsb2NhbGUgPSBfcmVmMi5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWYyJGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYyJGxvY2FsZSxcbiAgICAgICAgX3JlZjIkbnVtYmVyaW5nU3lzdGVtID0gX3JlZjIubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMiRudW1iZXJpbmdTeXN0ZW0gPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMiRudW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIF9yZWYyJG91dHB1dENhbGVuZGFyID0gX3JlZjIub3V0cHV0Q2FsZW5kYXIsXG4gICAgICAgIG91dHB1dENhbGVuZGFyID0gX3JlZjIkb3V0cHV0Q2FsZW5kYXIgPT09IHZvaWQgMCA/IFwiZ3JlZ29yeVwiIDogX3JlZjIkb3V0cHV0Q2FsZW5kYXI7XG5cbiAgICByZXR1cm4gTG9jYWxlLmNyZWF0ZShsb2NhbGUsIG51bWJlcmluZ1N5c3RlbSwgb3V0cHV0Q2FsZW5kYXIpLm1vbnRocyhsZW5ndGgsIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygc3RhbmRhbG9uZSB3ZWVrIG5hbWVzLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXRcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5udW1iZXJpbmdTeXN0ZW09bnVsbF0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbVxyXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoKVswXSAvLz0+ICdNb25kYXknXHJcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnKVswXSAvLz0+ICdNb24nXHJcbiAgICogQGV4YW1wbGUgSW5mby53ZWVrZGF5cygnc2hvcnQnLCB7IGxvY2FsZTogJ2ZyLUNBJyB9KVswXSAvLz0+ICdsdW4uJ1xyXG4gICAqIEBleGFtcGxlIEluZm8ud2Vla2RheXMoJ3Nob3J0JywgeyBsb2NhbGU6ICdhcicgfSlbMF0gLy89PiAn2KfZhNin2KvZhtmK2YYnXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzID0gZnVuY3Rpb24gd2Vla2RheXMobGVuZ3RoLCBfdGVtcDMpIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwibG9uZ1wiO1xuICAgIH1cblxuICAgIHZhciBfcmVmMyA9IF90ZW1wMyA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDMsXG4gICAgICAgIF9yZWYzJGxvY2FsZSA9IF9yZWYzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjMkbG9jYWxlLFxuICAgICAgICBfcmVmMyRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmMy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWYzJG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYzJG51bWJlcmluZ1N5c3RlbTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBudWxsKS53ZWVrZGF5cyhsZW5ndGgpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZm9ybWF0IHdlZWsgbmFtZXMuXHJcbiAgICogRm9ybWF0IHdlZWtkYXlzIGRpZmZlciBmcm9tIHN0YW5kYWxvbmUgd2Vla2RheXMgaW4gdGhhdCB0aGV5J3JlIG1lYW50IHRvIGFwcGVhciBuZXh0IHRvIG1vcmUgZGF0ZSBpbmZvcm1hdGlvbi4gSW4gc29tZSBsYW5ndWFnZXMsIHRoYXRcclxuICAgKiBjaGFuZ2VzIHRoZSBzdHJpbmcuXHJcbiAgICogU2VlIHtAbGluayB3ZWVrZGF5c31cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xlbmd0aD0nbG9uZyddIC0gdGhlIGxlbmd0aCBvZiB0aGUgbW9udGggcmVwcmVzZW50YXRpb24sIHN1Y2ggYXMgXCJuYXJyb3dcIiwgXCJzaG9ydFwiLCBcImxvbmdcIi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPW51bGxdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLm51bWJlcmluZ1N5c3RlbT1udWxsXSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLndlZWtkYXlzRm9ybWF0ID0gZnVuY3Rpb24gd2Vla2RheXNGb3JtYXQobGVuZ3RoLCBfdGVtcDQpIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwibG9uZ1wiO1xuICAgIH1cblxuICAgIHZhciBfcmVmNCA9IF90ZW1wNCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcDQsXG4gICAgICAgIF9yZWY0JGxvY2FsZSA9IF9yZWY0LmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX3JlZjQkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjQkbG9jYWxlLFxuICAgICAgICBfcmVmNCRudW1iZXJpbmdTeXN0ZW0gPSBfcmVmNC5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0JG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY0JG51bWJlcmluZ1N5c3RlbTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBudWxsKS53ZWVrZGF5cyhsZW5ndGgsIHRydWUpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgbWVyaWRpZW1zLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGVdIC0gdGhlIGxvY2FsZSBjb2RlXHJcbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoKSAvLz0+IFsgJ0FNJywgJ1BNJyBdXHJcbiAgICogQGV4YW1wbGUgSW5mby5tZXJpZGllbXMoeyBsb2NhbGU6ICdteScgfSkgLy89PiBbICfhgJThgLbhgJThgIDhgLonLCAn4YCK4YCU4YCxJyBdXHJcbiAgICogQHJldHVybiB7W3N0cmluZ119XHJcbiAgICovXG5cblxuICBJbmZvLm1lcmlkaWVtcyA9IGZ1bmN0aW9uIG1lcmlkaWVtcyhfdGVtcDUpIHtcbiAgICB2YXIgX3JlZjUgPSBfdGVtcDUgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA1LFxuICAgICAgICBfcmVmNSRsb2NhbGUgPSBfcmVmNS5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY1JGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY1JGxvY2FsZTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSkubWVyaWRpZW1zKCk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiBlcmFzLCBzdWNoIGFzIFsnQkMnLCAnQUQnXS4gVGhlIGxvY2FsZSBjYW4gYmUgc3BlY2lmaWVkLCBidXQgdGhlIGNhbGVuZGFyIHN5c3RlbSBpcyBhbHdheXMgR3JlZ29yaWFuLlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbGVuZ3RoPSdzaG9ydCddIC0gdGhlIGxlbmd0aCBvZiB0aGUgZXJhIHJlcHJlc2VudGF0aW9uLCBzdWNoIGFzIFwic2hvcnRcIiBvciBcImxvbmdcIi5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnNcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlXSAtIHRoZSBsb2NhbGUgY29kZVxyXG4gICAqIEBleGFtcGxlIEluZm8uZXJhcygpIC8vPT4gWyAnQkMnLCAnQUQnIF1cclxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnKSAvLz0+IFsgJ0JlZm9yZSBDaHJpc3QnLCAnQW5ubyBEb21pbmknIF1cclxuICAgKiBAZXhhbXBsZSBJbmZvLmVyYXMoJ2xvbmcnLCB7IGxvY2FsZTogJ2ZyJyB9KSAvLz0+IFsgJ2F2YW50IErDqXN1cy1DaHJpc3QnLCAnYXByw6hzIErDqXN1cy1DaHJpc3QnIF1cclxuICAgKiBAcmV0dXJuIHtbc3RyaW5nXX1cclxuICAgKi9cblxuXG4gIEluZm8uZXJhcyA9IGZ1bmN0aW9uIGVyYXMobGVuZ3RoLCBfdGVtcDYpIHtcbiAgICBpZiAobGVuZ3RoID09PSB2b2lkIDApIHtcbiAgICAgIGxlbmd0aCA9IFwic2hvcnRcIjtcbiAgICB9XG5cbiAgICB2YXIgX3JlZjYgPSBfdGVtcDYgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA2LFxuICAgICAgICBfcmVmNiRsb2NhbGUgPSBfcmVmNi5sb2NhbGUsXG4gICAgICAgIGxvY2FsZSA9IF9yZWY2JGxvY2FsZSA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWY2JGxvY2FsZTtcblxuICAgIHJldHVybiBMb2NhbGUuY3JlYXRlKGxvY2FsZSwgbnVsbCwgXCJncmVnb3J5XCIpLmVyYXMobGVuZ3RoKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJuIHRoZSBzZXQgb2YgYXZhaWxhYmxlIGZlYXR1cmVzIGluIHRoaXMgZW52aXJvbm1lbnQuXHJcbiAgICogU29tZSBmZWF0dXJlcyBvZiBMdXhvbiBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbGwgZW52aXJvbm1lbnRzLiBGb3IgZXhhbXBsZSwgb24gb2xkZXIgYnJvd3NlcnMsIHRpbWV6b25lIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZS4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBpZiB0aGF0J3MgdGhlIGNhc2UuXHJcbiAgICogS2V5czpcclxuICAgKiAqIGB6b25lc2A6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBJQU5BIHRpbWV6b25lc1xyXG4gICAqICogYGludGxUb2tlbnNgOiB3aGV0aGVyIHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMgaW50ZXJuYXRpb25hbGl6ZWQgdG9rZW4tYmFzZWQgZm9ybWF0dGluZy9wYXJzaW5nXHJcbiAgICogKiBgaW50bGA6IHdoZXRoZXIgdGhpcyBlbnZpcm9ubWVudCBzdXBwb3J0cyBnZW5lcmFsIGludGVybmF0aW9uYWxpemF0aW9uXHJcbiAgICogQGV4YW1wbGUgSW5mby5mZWF0dXJlcygpIC8vPT4geyBpbnRsOiB0cnVlLCBpbnRsVG9rZW5zOiBmYWxzZSwgem9uZXM6IHRydWUgfVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIEluZm8uZmVhdHVyZXMgPSBmdW5jdGlvbiBmZWF0dXJlcygpIHtcbiAgICB2YXIgaW50bCA9IGZhbHNlLFxuICAgICAgICBpbnRsVG9rZW5zID0gZmFsc2UsXG4gICAgICAgIHpvbmVzID0gZmFsc2U7XG5cbiAgICBpZiAoaGFzSW50bCgpKSB7XG4gICAgICBpbnRsID0gdHJ1ZTtcbiAgICAgIGludGxUb2tlbnMgPSBoYXNGb3JtYXRUb1BhcnRzKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHpvbmVzID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoXCJlblwiLCB7XG4gICAgICAgICAgdGltZVpvbmU6IFwiQW1lcmljYS9OZXdfWW9ya1wiXG4gICAgICAgIH0pLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lID09PSBcIkFtZXJpY2EvTmV3X1lvcmtcIjtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgem9uZXMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW50bDogaW50bCxcbiAgICAgIGludGxUb2tlbnM6IGludGxUb2tlbnMsXG4gICAgICB6b25lczogem9uZXNcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBJbmZvO1xufSgpO1xuXG5mdW5jdGlvbiBkYXlEaWZmKGVhcmxpZXIsIGxhdGVyKSB7XG4gIHZhciB1dGNEYXlTdGFydCA9IGZ1bmN0aW9uIHV0Y0RheVN0YXJ0KGR0KSB7XG4gICAgcmV0dXJuIGR0LnRvVVRDKDAsIHtcbiAgICAgIGtlZXBMb2NhbFRpbWU6IHRydWVcbiAgICB9KS5zdGFydE9mKFwiZGF5XCIpLnZhbHVlT2YoKTtcbiAgfSxcbiAgICAgIG1zID0gdXRjRGF5U3RhcnQobGF0ZXIpIC0gdXRjRGF5U3RhcnQoZWFybGllcik7XG5cbiAgcmV0dXJuIE1hdGguZmxvb3IoRHVyYXRpb24uZnJvbU1pbGxpcyhtcykuYXMoXCJkYXlzXCIpKTtcbn1cblxuZnVuY3Rpb24gaGlnaE9yZGVyRGlmZnMoY3Vyc29yLCBsYXRlciwgdW5pdHMpIHtcbiAgdmFyIGRpZmZlcnMgPSBbW1wieWVhcnNcIiwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYi55ZWFyIC0gYS55ZWFyO1xuICB9XSwgW1wibW9udGhzXCIsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGIubW9udGggLSBhLm1vbnRoICsgKGIueWVhciAtIGEueWVhcikgKiAxMjtcbiAgfV0sIFtcIndlZWtzXCIsIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGRheXMgPSBkYXlEaWZmKGEsIGIpO1xuICAgIHJldHVybiAoZGF5cyAtIGRheXMgJSA3KSAvIDc7XG4gIH1dLCBbXCJkYXlzXCIsIGRheURpZmZdXTtcbiAgdmFyIHJlc3VsdHMgPSB7fTtcbiAgdmFyIGxvd2VzdE9yZGVyLCBoaWdoV2F0ZXI7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpZmZlcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIF9kaWZmZXJzJF9pID0gZGlmZmVyc1tfaV0sXG4gICAgICAgIHVuaXQgPSBfZGlmZmVycyRfaVswXSxcbiAgICAgICAgZGlmZmVyID0gX2RpZmZlcnMkX2lbMV07XG5cbiAgICBpZiAodW5pdHMuaW5kZXhPZih1bml0KSA+PSAwKSB7XG4gICAgICB2YXIgX2N1cnNvciRwbHVzO1xuXG4gICAgICBsb3dlc3RPcmRlciA9IHVuaXQ7XG4gICAgICB2YXIgZGVsdGEgPSBkaWZmZXIoY3Vyc29yLCBsYXRlcik7XG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzID0ge30sIF9jdXJzb3IkcGx1c1t1bml0XSA9IGRlbHRhLCBfY3Vyc29yJHBsdXMpKTtcblxuICAgICAgaWYgKGhpZ2hXYXRlciA+IGxhdGVyKSB7XG4gICAgICAgIHZhciBfaGlnaFdhdGVyJG1pbnVzO1xuXG4gICAgICAgIGN1cnNvciA9IGhpZ2hXYXRlci5taW51cygoX2hpZ2hXYXRlciRtaW51cyA9IHt9LCBfaGlnaFdhdGVyJG1pbnVzW3VuaXRdID0gMSwgX2hpZ2hXYXRlciRtaW51cykpO1xuICAgICAgICBkZWx0YSAtPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3Vyc29yID0gaGlnaFdhdGVyO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzW3VuaXRdID0gZGVsdGE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtjdXJzb3IsIHJlc3VsdHMsIGhpZ2hXYXRlciwgbG93ZXN0T3JkZXJdO1xufVxuXG5mdW5jdGlvbiBfZGlmZiAoZWFybGllciwgbGF0ZXIsIHVuaXRzLCBvcHRzKSB7XG4gIHZhciBfaGlnaE9yZGVyRGlmZnMgPSBoaWdoT3JkZXJEaWZmcyhlYXJsaWVyLCBsYXRlciwgdW5pdHMpLFxuICAgICAgY3Vyc29yID0gX2hpZ2hPcmRlckRpZmZzWzBdLFxuICAgICAgcmVzdWx0cyA9IF9oaWdoT3JkZXJEaWZmc1sxXSxcbiAgICAgIGhpZ2hXYXRlciA9IF9oaWdoT3JkZXJEaWZmc1syXSxcbiAgICAgIGxvd2VzdE9yZGVyID0gX2hpZ2hPcmRlckRpZmZzWzNdO1xuXG4gIHZhciByZW1haW5pbmdNaWxsaXMgPSBsYXRlciAtIGN1cnNvcjtcbiAgdmFyIGxvd2VyT3JkZXJVbml0cyA9IHVuaXRzLmZpbHRlcihmdW5jdGlvbiAodSkge1xuICAgIHJldHVybiBbXCJob3Vyc1wiLCBcIm1pbnV0ZXNcIiwgXCJzZWNvbmRzXCIsIFwibWlsbGlzZWNvbmRzXCJdLmluZGV4T2YodSkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGxvd2VyT3JkZXJVbml0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaGlnaFdhdGVyIDwgbGF0ZXIpIHtcbiAgICAgIHZhciBfY3Vyc29yJHBsdXMyO1xuXG4gICAgICBoaWdoV2F0ZXIgPSBjdXJzb3IucGx1cygoX2N1cnNvciRwbHVzMiA9IHt9LCBfY3Vyc29yJHBsdXMyW2xvd2VzdE9yZGVyXSA9IDEsIF9jdXJzb3IkcGx1czIpKTtcbiAgICB9XG5cbiAgICBpZiAoaGlnaFdhdGVyICE9PSBjdXJzb3IpIHtcbiAgICAgIHJlc3VsdHNbbG93ZXN0T3JkZXJdID0gKHJlc3VsdHNbbG93ZXN0T3JkZXJdIHx8IDApICsgcmVtYWluaW5nTWlsbGlzIC8gKGhpZ2hXYXRlciAtIGN1cnNvcik7XG4gICAgfVxuICB9XG5cbiAgdmFyIGR1cmF0aW9uID0gRHVyYXRpb24uZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHJlc3VsdHMsIG9wdHMpKTtcblxuICBpZiAobG93ZXJPcmRlclVuaXRzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgX0R1cmF0aW9uJGZyb21NaWxsaXM7XG5cbiAgICByZXR1cm4gKF9EdXJhdGlvbiRmcm9tTWlsbGlzID0gRHVyYXRpb24uZnJvbU1pbGxpcyhyZW1haW5pbmdNaWxsaXMsIG9wdHMpKS5zaGlmdFRvLmFwcGx5KF9EdXJhdGlvbiRmcm9tTWlsbGlzLCBsb3dlck9yZGVyVW5pdHMpLnBsdXMoZHVyYXRpb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkdXJhdGlvbjtcbiAgfVxufVxuXG52YXIgTUlTU0lOR19GVFAgPSBcIm1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnRcIjtcblxuZnVuY3Rpb24gaW50VW5pdChyZWdleCwgcG9zdCkge1xuICBpZiAocG9zdCA9PT0gdm9pZCAwKSB7XG4gICAgcG9zdCA9IGZ1bmN0aW9uIHBvc3QoaSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmKSB7XG4gICAgICB2YXIgcyA9IF9yZWZbMF07XG4gICAgICByZXR1cm4gcG9zdChwYXJzZUludChzKSk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBmaXhMaXN0UmVnZXgocykge1xuICAvLyBtYWtlIGRvdHMgb3B0aW9uYWwgYW5kIGFsc28gbWFrZSB0aGVtIGxpdGVyYWxcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuLywgXCJcXFxcLj9cIik7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5zZW5zaXRpdml0aWVzKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFwuLywgXCJcIikudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gb25lT2Yoc3RyaW5ncywgc3RhcnRJbmRleCkge1xuICBpZiAoc3RyaW5ncyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHN0cmluZ3MubWFwKGZpeExpc3RSZWdleCkuam9pbihcInxcIikpLFxuICAgICAgZGVzZXI6IGZ1bmN0aW9uIGRlc2VyKF9yZWYyKSB7XG4gICAgICAgIHZhciBzID0gX3JlZjJbMF07XG4gICAgICAgIHJldHVybiBzdHJpbmdzLmZpbmRJbmRleChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgIHJldHVybiBzdHJpcEluc2Vuc2l0aXZpdGllcyhzKSA9PT0gc3RyaXBJbnNlbnNpdGl2aXRpZXMoaSk7XG4gICAgICAgIH0pICsgc3RhcnRJbmRleDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIG9mZnNldChyZWdleCwgZ3JvdXBzKSB7XG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmMykge1xuICAgICAgdmFyIGggPSBfcmVmM1sxXSxcbiAgICAgICAgICBtID0gX3JlZjNbMl07XG4gICAgICByZXR1cm4gc2lnbmVkT2Zmc2V0KGgsIG0pO1xuICAgIH0sXG4gICAgZ3JvdXBzOiBncm91cHNcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlKHJlZ2V4KSB7XG4gIHJldHVybiB7XG4gICAgcmVnZXg6IHJlZ2V4LFxuICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNCkge1xuICAgICAgdmFyIHMgPSBfcmVmNFswXTtcbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5pdEZvclRva2VuKHRva2VuLCBsb2MpIHtcbiAgdmFyIG9uZSA9IC9cXGQvLFxuICAgICAgdHdvID0gL1xcZHsyfS8sXG4gICAgICB0aHJlZSA9IC9cXGR7M30vLFxuICAgICAgZm91ciA9IC9cXGR7NH0vLFxuICAgICAgb25lT3JUd28gPSAvXFxkezEsMn0vLFxuICAgICAgb25lVG9UaHJlZSA9IC9cXGR7MSwzfS8sXG4gICAgICB0d29Ub0ZvdXIgPSAvXFxkezIsNH0vLFxuICAgICAgbGl0ZXJhbCA9IGZ1bmN0aW9uIGxpdGVyYWwodCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWdleDogUmVnRXhwKHQudmFsKSxcbiAgICAgIGRlc2VyOiBmdW5jdGlvbiBkZXNlcihfcmVmNSkge1xuICAgICAgICB2YXIgcyA9IF9yZWY1WzBdO1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH0sXG4gICAgICBsaXRlcmFsOiB0cnVlXG4gICAgfTtcbiAgfSxcbiAgICAgIHVuaXRhdGUgPSBmdW5jdGlvbiB1bml0YXRlKHQpIHtcbiAgICBpZiAodG9rZW4ubGl0ZXJhbCkge1xuICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0LnZhbCkge1xuICAgICAgLy8gZXJhXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLmVyYXMoXCJzaG9ydFwiLCBmYWxzZSksIDApO1xuXG4gICAgICBjYXNlIFwiR0dcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5lcmFzKFwibG9uZ1wiLCBmYWxzZSksIDApO1xuICAgICAgLy8geWVhcnNcblxuICAgICAgY2FzZSBcInlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoL1xcZHsxLDZ9Lyk7XG5cbiAgICAgIGNhc2UgXCJ5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d29Ub0ZvdXIsIHVudHJ1bmNhdGVZZWFyKTtcblxuICAgICAgY2FzZSBcInl5eXlcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQoZm91cik7XG5cbiAgICAgIGNhc2UgXCJ5eXl5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezQsNn0vKTtcblxuICAgICAgY2FzZSBcInl5eXl5eVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCgvXFxkezZ9Lyk7XG4gICAgICAvLyBtb250aHNcblxuICAgICAgY2FzZSBcIk1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQob25lT3JUd28pO1xuXG4gICAgICBjYXNlIFwiTU1cIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvKTtcblxuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcImxvbmdcIiwgZmFsc2UsIGZhbHNlKSwgMSk7XG5cbiAgICAgIGNhc2UgXCJMXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcIkxMXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJMTExcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy5tb250aHMoXCJzaG9ydFwiLCB0cnVlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLm1vbnRocyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIC8vIGRhdGVzXG5cbiAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG4gICAgICAvLyBvcmRpbmFsc1xuXG4gICAgICBjYXNlIFwib1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVUb1RocmVlKTtcblxuICAgICAgY2FzZSBcIm9vb1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0aHJlZSk7XG4gICAgICAvLyB0aW1lXG5cbiAgICAgIGNhc2UgXCJISFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiSFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJoaFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwiaFwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJtbVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuXG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZU9yVHdvKTtcblxuICAgICAgY2FzZSBcInNzXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHR3byk7XG5cbiAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZVRvVGhyZWUpO1xuXG4gICAgICBjYXNlIFwiU1NTXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KHRocmVlKTtcblxuICAgICAgY2FzZSBcInVcIjpcbiAgICAgICAgcmV0dXJuIHNpbXBsZSgvXFxkezEsOX0vKTtcbiAgICAgIC8vIG1lcmlkaWVtXG5cbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgIHJldHVybiBvbmVPZihsb2MubWVyaWRpZW1zKCksIDApO1xuICAgICAgLy8gd2Vla1llYXIgKGspXG5cbiAgICAgIGNhc2UgXCJra2trXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KGZvdXIpO1xuXG4gICAgICBjYXNlIFwia2tcIjpcbiAgICAgICAgcmV0dXJuIGludFVuaXQodHdvVG9Gb3VyLCB1bnRydW5jYXRlWWVhcik7XG4gICAgICAvLyB3ZWVrTnVtYmVyIChXKVxuXG4gICAgICBjYXNlIFwiV1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdChvbmVPclR3byk7XG5cbiAgICAgIGNhc2UgXCJXV1wiOlxuICAgICAgICByZXR1cm4gaW50VW5pdCh0d28pO1xuICAgICAgLy8gd2Vla2RheXNcblxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBpbnRVbml0KG9uZSk7XG5cbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcInNob3J0XCIsIGZhbHNlLCBmYWxzZSksIDEpO1xuXG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwibG9uZ1wiLCBmYWxzZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gb25lT2YobG9jLndlZWtkYXlzKFwic2hvcnRcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcblxuICAgICAgY2FzZSBcImNjY2NcIjpcbiAgICAgICAgcmV0dXJuIG9uZU9mKGxvYy53ZWVrZGF5cyhcImxvbmdcIiwgdHJ1ZSwgZmFsc2UpLCAxKTtcbiAgICAgIC8vIG9mZnNldC96b25lXG5cbiAgICAgIGNhc2UgXCJaXCI6XG4gICAgICBjYXNlIFwiWlpcIjpcbiAgICAgICAgcmV0dXJuIG9mZnNldCgvKFsrLV1cXGR7MSwyfSkoPzo6KFxcZHsyfSkpPy8sIDIpO1xuXG4gICAgICBjYXNlIFwiWlpaXCI6XG4gICAgICAgIHJldHVybiBvZmZzZXQoLyhbKy1dXFxkezEsMn0pKFxcZHsyfSk/LywgMik7XG4gICAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IFpaWlogKFBTVCkgb3IgWlpaWlogKFBhY2lmaWMgU3RhbmRhcmQgVGltZSkgaW4gcGFyc2luZ1xuICAgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGFueSB3YXkgdG8gZmlndXJlIG91dCB3aGF0IHRoZXkgYXJlXG5cbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICAgIHJldHVybiBzaW1wbGUoL1thLXpfKy1dezEsMjU2fShcXC9bYS16XystXXsxLDI1Nn0oXFwvW2Etel8rLV17MSwyNTZ9KT8pPy9pKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxpdGVyYWwodCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciB1bml0ID0gdW5pdGF0ZSh0b2tlbikgfHwge1xuICAgIGludmFsaWRSZWFzb246IE1JU1NJTkdfRlRQXG4gIH07XG4gIHVuaXQudG9rZW4gPSB0b2tlbjtcbiAgcmV0dXJuIHVuaXQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVnZXgodW5pdHMpIHtcbiAgdmFyIHJlID0gdW5pdHMubWFwKGZ1bmN0aW9uICh1KSB7XG4gICAgcmV0dXJuIHUucmVnZXg7XG4gIH0pLnJlZHVjZShmdW5jdGlvbiAoZiwgcikge1xuICAgIHJldHVybiBmICsgXCIoXCIgKyByLnNvdXJjZSArIFwiKVwiO1xuICB9LCBcIlwiKTtcbiAgcmV0dXJuIFtcIl5cIiArIHJlICsgXCIkXCIsIHVuaXRzXTtcbn1cblxuZnVuY3Rpb24gbWF0Y2goaW5wdXQsIHJlZ2V4LCBoYW5kbGVycykge1xuICB2YXIgbWF0Y2hlcyA9IGlucHV0Lm1hdGNoKHJlZ2V4KTtcblxuICBpZiAobWF0Y2hlcykge1xuICAgIHZhciBhbGwgPSB7fTtcbiAgICB2YXIgbWF0Y2hJbmRleCA9IDE7XG5cbiAgICBmb3IgKHZhciBpIGluIGhhbmRsZXJzKSB7XG4gICAgICBpZiAoaGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgdmFyIGggPSBoYW5kbGVyc1tpXSxcbiAgICAgICAgICAgIGdyb3VwcyA9IGguZ3JvdXBzID8gaC5ncm91cHMgKyAxIDogMTtcblxuICAgICAgICBpZiAoIWgubGl0ZXJhbCAmJiBoLnRva2VuKSB7XG4gICAgICAgICAgYWxsW2gudG9rZW4udmFsWzBdXSA9IGguZGVzZXIobWF0Y2hlcy5zbGljZShtYXRjaEluZGV4LCBtYXRjaEluZGV4ICsgZ3JvdXBzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRjaEluZGV4ICs9IGdyb3VwcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW21hdGNoZXMsIGFsbF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttYXRjaGVzLCB7fV07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0ZVRpbWVGcm9tTWF0Y2hlcyhtYXRjaGVzKSB7XG4gIHZhciB0b0ZpZWxkID0gZnVuY3Rpb24gdG9GaWVsZCh0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJTXCI6XG4gICAgICAgIHJldHVybiBcIm1pbGxpc2Vjb25kXCI7XG5cbiAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHJldHVybiBcInNlY29uZFwiO1xuXG4gICAgICBjYXNlIFwibVwiOlxuICAgICAgICByZXR1cm4gXCJtaW51dGVcIjtcblxuICAgICAgY2FzZSBcImhcIjpcbiAgICAgIGNhc2UgXCJIXCI6XG4gICAgICAgIHJldHVybiBcImhvdXJcIjtcblxuICAgICAgY2FzZSBcImRcIjpcbiAgICAgICAgcmV0dXJuIFwiZGF5XCI7XG5cbiAgICAgIGNhc2UgXCJvXCI6XG4gICAgICAgIHJldHVybiBcIm9yZGluYWxcIjtcblxuICAgICAgY2FzZSBcIkxcIjpcbiAgICAgIGNhc2UgXCJNXCI6XG4gICAgICAgIHJldHVybiBcIm1vbnRoXCI7XG5cbiAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgIHJldHVybiBcInllYXJcIjtcblxuICAgICAgY2FzZSBcIkVcIjpcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBcIndlZWtkYXlcIjtcblxuICAgICAgY2FzZSBcIldcIjpcbiAgICAgICAgcmV0dXJuIFwid2Vla051bWJlclwiO1xuXG4gICAgICBjYXNlIFwia1wiOlxuICAgICAgICByZXR1cm4gXCJ3ZWVrWWVhclwiO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHpvbmU7XG5cbiAgaWYgKCFpc1VuZGVmaW5lZChtYXRjaGVzLlopKSB7XG4gICAgem9uZSA9IG5ldyBGaXhlZE9mZnNldFpvbmUobWF0Y2hlcy5aKTtcbiAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy56KSkge1xuICAgIHpvbmUgPSBuZXcgSUFOQVpvbmUobWF0Y2hlcy56KTtcbiAgfSBlbHNlIHtcbiAgICB6b25lID0gbnVsbDtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy5oKSkge1xuICAgIGlmIChtYXRjaGVzLmggPCAxMiAmJiBtYXRjaGVzLmEgPT09IDEpIHtcbiAgICAgIG1hdGNoZXMuaCArPSAxMjtcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMuaCA9PT0gMTIgJiYgbWF0Y2hlcy5hID09PSAwKSB7XG4gICAgICBtYXRjaGVzLmggPSAwO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaGVzLkcgPT09IDAgJiYgbWF0Y2hlcy55KSB7XG4gICAgbWF0Y2hlcy55ID0gLW1hdGNoZXMueTtcbiAgfVxuXG4gIGlmICghaXNVbmRlZmluZWQobWF0Y2hlcy51KSkge1xuICAgIG1hdGNoZXMuUyA9IHBhcnNlTWlsbGlzKG1hdGNoZXMudSk7XG4gIH1cblxuICB2YXIgdmFscyA9IE9iamVjdC5rZXlzKG1hdGNoZXMpLnJlZHVjZShmdW5jdGlvbiAociwgaykge1xuICAgIHZhciBmID0gdG9GaWVsZChrKTtcblxuICAgIGlmIChmKSB7XG4gICAgICByW2ZdID0gbWF0Y2hlc1trXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfSwge30pO1xuICByZXR1cm4gW3ZhbHMsIHpvbmVdO1xufVxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZSwgaW5wdXQsIGZvcm1hdCkge1xuICB2YXIgdG9rZW5zID0gRm9ybWF0dGVyLnBhcnNlRm9ybWF0KGZvcm1hdCksXG4gICAgICB1bml0cyA9IHRva2Vucy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICByZXR1cm4gdW5pdEZvclRva2VuKHQsIGxvY2FsZSk7XG4gIH0pLFxuICAgICAgZGlzcXVhbGlmeWluZ1VuaXQgPSB1bml0cy5maW5kKGZ1bmN0aW9uICh0KSB7XG4gICAgcmV0dXJuIHQuaW52YWxpZFJlYXNvbjtcbiAgfSk7XG5cbiAgaWYgKGRpc3F1YWxpZnlpbmdVbml0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgaW52YWxpZFJlYXNvbjogZGlzcXVhbGlmeWluZ1VuaXQuaW52YWxpZFJlYXNvblxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9idWlsZFJlZ2V4ID0gYnVpbGRSZWdleCh1bml0cyksXG4gICAgICAgIHJlZ2V4U3RyaW5nID0gX2J1aWxkUmVnZXhbMF0sXG4gICAgICAgIGhhbmRsZXJzID0gX2J1aWxkUmVnZXhbMV0sXG4gICAgICAgIHJlZ2V4ID0gUmVnRXhwKHJlZ2V4U3RyaW5nLCBcImlcIiksXG4gICAgICAgIF9tYXRjaCA9IG1hdGNoKGlucHV0LCByZWdleCwgaGFuZGxlcnMpLFxuICAgICAgICByYXdNYXRjaGVzID0gX21hdGNoWzBdLFxuICAgICAgICBtYXRjaGVzID0gX21hdGNoWzFdLFxuICAgICAgICBfcmVmNiA9IG1hdGNoZXMgPyBkYXRlVGltZUZyb21NYXRjaGVzKG1hdGNoZXMpIDogW251bGwsIG51bGxdLFxuICAgICAgICByZXN1bHQgPSBfcmVmNlswXSxcbiAgICAgICAgem9uZSA9IF9yZWY2WzFdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiBpbnB1dCxcbiAgICAgIHRva2VuczogdG9rZW5zLFxuICAgICAgcmVnZXg6IHJlZ2V4LFxuICAgICAgcmF3TWF0Y2hlczogcmF3TWF0Y2hlcyxcbiAgICAgIG1hdGNoZXM6IG1hdGNoZXMsXG4gICAgICByZXN1bHQ6IHJlc3VsdCxcbiAgICAgIHpvbmU6IHpvbmVcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBwYXJzZUZyb21Ub2tlbnMobG9jYWxlLCBpbnB1dCwgZm9ybWF0KSB7XG4gIHZhciBfZXhwbGFpbkZyb21Ub2tlbnMgPSBleHBsYWluRnJvbVRva2Vucyhsb2NhbGUsIGlucHV0LCBmb3JtYXQpLFxuICAgICAgcmVzdWx0ID0gX2V4cGxhaW5Gcm9tVG9rZW5zLnJlc3VsdCxcbiAgICAgIHpvbmUgPSBfZXhwbGFpbkZyb21Ub2tlbnMuem9uZSxcbiAgICAgIGludmFsaWRSZWFzb24gPSBfZXhwbGFpbkZyb21Ub2tlbnMuaW52YWxpZFJlYXNvbjtcblxuICByZXR1cm4gW3Jlc3VsdCwgem9uZSwgaW52YWxpZFJlYXNvbl07XG59XG5cbnZhciBub25MZWFwTGFkZGVyID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XSxcbiAgICBsZWFwTGFkZGVyID0gWzAsIDMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1XTtcblxuZnVuY3Rpb24gdW5pdE91dE9mUmFuZ2UodW5pdCwgdmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBJbnZhbGlkKFwidW5pdCBvdXQgb2YgcmFuZ2VcIiwgXCJ5b3Ugc3BlY2lmaWVkIFwiICsgdmFsdWUgKyBcIiAob2YgdHlwZSBcIiArIHR5cGVvZiB2YWx1ZSArIFwiKSBhcyBhIFwiICsgdW5pdCArIFwiLCB3aGljaCBpcyBpbnZhbGlkXCIpO1xufVxuXG5mdW5jdGlvbiBkYXlPZldlZWsoeWVhciwgbW9udGgsIGRheSkge1xuICB2YXIganMgPSBuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCAtIDEsIGRheSkpLmdldFVUQ0RheSgpO1xuICByZXR1cm4ganMgPT09IDAgPyA3IDoganM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVPcmRpbmFsKHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgcmV0dXJuIGRheSArIChpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIpW21vbnRoIC0gMV07XG59XG5cbmZ1bmN0aW9uIHVuY29tcHV0ZU9yZGluYWwoeWVhciwgb3JkaW5hbCkge1xuICB2YXIgdGFibGUgPSBpc0xlYXBZZWFyKHllYXIpID8gbGVhcExhZGRlciA6IG5vbkxlYXBMYWRkZXIsXG4gICAgICBtb250aDAgPSB0YWJsZS5maW5kSW5kZXgoZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gaSA8IG9yZGluYWw7XG4gIH0pLFxuICAgICAgZGF5ID0gb3JkaW5hbCAtIHRhYmxlW21vbnRoMF07XG4gIHJldHVybiB7XG4gICAgbW9udGg6IG1vbnRoMCArIDEsXG4gICAgZGF5OiBkYXlcbiAgfTtcbn1cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuXG5cbmZ1bmN0aW9uIGdyZWdvcmlhblRvV2VlayhncmVnT2JqKSB7XG4gIHZhciB5ZWFyID0gZ3JlZ09iai55ZWFyLFxuICAgICAgbW9udGggPSBncmVnT2JqLm1vbnRoLFxuICAgICAgZGF5ID0gZ3JlZ09iai5kYXksXG4gICAgICBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSksXG4gICAgICB3ZWVrZGF5ID0gZGF5T2ZXZWVrKHllYXIsIG1vbnRoLCBkYXkpO1xuICB2YXIgd2Vla051bWJlciA9IE1hdGguZmxvb3IoKG9yZGluYWwgLSB3ZWVrZGF5ICsgMTApIC8gNyksXG4gICAgICB3ZWVrWWVhcjtcblxuICBpZiAod2Vla051bWJlciA8IDEpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgLSAxO1xuICAgIHdlZWtOdW1iZXIgPSB3ZWVrc0luV2Vla1llYXIod2Vla1llYXIpO1xuICB9IGVsc2UgaWYgKHdlZWtOdW1iZXIgPiB3ZWVrc0luV2Vla1llYXIoeWVhcikpIHtcbiAgICB3ZWVrWWVhciA9IHllYXIgKyAxO1xuICAgIHdlZWtOdW1iZXIgPSAxO1xuICB9IGVsc2Uge1xuICAgIHdlZWtZZWFyID0geWVhcjtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB3ZWVrWWVhcjogd2Vla1llYXIsXG4gICAgd2Vla051bWJlcjogd2Vla051bWJlcixcbiAgICB3ZWVrZGF5OiB3ZWVrZGF5XG4gIH0sIHRpbWVPYmplY3QoZ3JlZ09iaikpO1xufVxuZnVuY3Rpb24gd2Vla1RvR3JlZ29yaWFuKHdlZWtEYXRhKSB7XG4gIHZhciB3ZWVrWWVhciA9IHdlZWtEYXRhLndlZWtZZWFyLFxuICAgICAgd2Vla051bWJlciA9IHdlZWtEYXRhLndlZWtOdW1iZXIsXG4gICAgICB3ZWVrZGF5ID0gd2Vla0RhdGEud2Vla2RheSxcbiAgICAgIHdlZWtkYXlPZkphbjQgPSBkYXlPZldlZWsod2Vla1llYXIsIDEsIDQpLFxuICAgICAgeWVhckluRGF5cyA9IGRheXNJblllYXIod2Vla1llYXIpO1xuICB2YXIgb3JkaW5hbCA9IHdlZWtOdW1iZXIgKiA3ICsgd2Vla2RheSAtIHdlZWtkYXlPZkphbjQgLSAzLFxuICAgICAgeWVhcjtcblxuICBpZiAob3JkaW5hbCA8IDEpIHtcbiAgICB5ZWFyID0gd2Vla1llYXIgLSAxO1xuICAgIG9yZGluYWwgKz0gZGF5c0luWWVhcih5ZWFyKTtcbiAgfSBlbHNlIGlmIChvcmRpbmFsID4geWVhckluRGF5cykge1xuICAgIHllYXIgPSB3ZWVrWWVhciArIDE7XG4gICAgb3JkaW5hbCAtPSBkYXlzSW5ZZWFyKHdlZWtZZWFyKTtcbiAgfSBlbHNlIHtcbiAgICB5ZWFyID0gd2Vla1llYXI7XG4gIH1cblxuICB2YXIgX3VuY29tcHV0ZU9yZGluYWwgPSB1bmNvbXB1dGVPcmRpbmFsKHllYXIsIG9yZGluYWwpLFxuICAgICAgbW9udGggPSBfdW5jb21wdXRlT3JkaW5hbC5tb250aCxcbiAgICAgIGRheSA9IF91bmNvbXB1dGVPcmRpbmFsLmRheTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBkYXlcbiAgfSwgdGltZU9iamVjdCh3ZWVrRGF0YSkpO1xufVxuZnVuY3Rpb24gZ3JlZ29yaWFuVG9PcmRpbmFsKGdyZWdEYXRhKSB7XG4gIHZhciB5ZWFyID0gZ3JlZ0RhdGEueWVhcixcbiAgICAgIG1vbnRoID0gZ3JlZ0RhdGEubW9udGgsXG4gICAgICBkYXkgPSBncmVnRGF0YS5kYXksXG4gICAgICBvcmRpbmFsID0gY29tcHV0ZU9yZGluYWwoeWVhciwgbW9udGgsIGRheSk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHtcbiAgICB5ZWFyOiB5ZWFyLFxuICAgIG9yZGluYWw6IG9yZGluYWxcbiAgfSwgdGltZU9iamVjdChncmVnRGF0YSkpO1xufVxuZnVuY3Rpb24gb3JkaW5hbFRvR3JlZ29yaWFuKG9yZGluYWxEYXRhKSB7XG4gIHZhciB5ZWFyID0gb3JkaW5hbERhdGEueWVhcixcbiAgICAgIG9yZGluYWwgPSBvcmRpbmFsRGF0YS5vcmRpbmFsLFxuICAgICAgX3VuY29tcHV0ZU9yZGluYWwyID0gdW5jb21wdXRlT3JkaW5hbCh5ZWFyLCBvcmRpbmFsKSxcbiAgICAgIG1vbnRoID0gX3VuY29tcHV0ZU9yZGluYWwyLm1vbnRoLFxuICAgICAgZGF5ID0gX3VuY29tcHV0ZU9yZGluYWwyLmRheTtcblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBkYXlcbiAgfSwgdGltZU9iamVjdChvcmRpbmFsRGF0YSkpO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZFdlZWtEYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLndlZWtZZWFyKSxcbiAgICAgIHZhbGlkV2VlayA9IG51bWJlckJldHdlZW4ob2JqLndlZWtOdW1iZXIsIDEsIHdlZWtzSW5XZWVrWWVhcihvYmoud2Vla1llYXIpKSxcbiAgICAgIHZhbGlkV2Vla2RheSA9IG51bWJlckJldHdlZW4ob2JqLndlZWtkYXksIDEsIDcpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwid2Vla1llYXJcIiwgb2JqLndlZWtZZWFyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRXZWVrKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwid2Vla1wiLCBvYmoud2Vlayk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkV2Vla2RheSkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIndlZWtkYXlcIiwgb2JqLndlZWtkYXkpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZE9yZGluYWxEYXRhKG9iaikge1xuICB2YXIgdmFsaWRZZWFyID0gaXNOdW1iZXIob2JqLnllYXIpLFxuICAgICAgdmFsaWRPcmRpbmFsID0gbnVtYmVyQmV0d2VlbihvYmoub3JkaW5hbCwgMSwgZGF5c0luWWVhcihvYmoueWVhcikpO1xuXG4gIGlmICghdmFsaWRZZWFyKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwieWVhclwiLCBvYmoueWVhcik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkT3JkaW5hbCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm9yZGluYWxcIiwgb2JqLm9yZGluYWwpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZEdyZWdvcmlhbkRhdGEob2JqKSB7XG4gIHZhciB2YWxpZFllYXIgPSBpc051bWJlcihvYmoueWVhciksXG4gICAgICB2YWxpZE1vbnRoID0gbnVtYmVyQmV0d2VlbihvYmoubW9udGgsIDEsIDEyKSxcbiAgICAgIHZhbGlkRGF5ID0gbnVtYmVyQmV0d2VlbihvYmouZGF5LCAxLCBkYXlzSW5Nb250aChvYmoueWVhciwgb2JqLm1vbnRoKSk7XG5cbiAgaWYgKCF2YWxpZFllYXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJ5ZWFyXCIsIG9iai55ZWFyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNb250aCkge1xuICAgIHJldHVybiB1bml0T3V0T2ZSYW5nZShcIm1vbnRoXCIsIG9iai5tb250aCk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkRGF5KSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwiZGF5XCIsIG9iai5kYXkpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzSW52YWxpZFRpbWVEYXRhKG9iaikge1xuICB2YXIgdmFsaWRIb3VyID0gbnVtYmVyQmV0d2VlbihvYmouaG91ciwgMCwgMjMpLFxuICAgICAgdmFsaWRNaW51dGUgPSBudW1iZXJCZXR3ZWVuKG9iai5taW51dGUsIDAsIDU5KSxcbiAgICAgIHZhbGlkU2Vjb25kID0gbnVtYmVyQmV0d2VlbihvYmouc2Vjb25kLCAwLCA1OSksXG4gICAgICB2YWxpZE1pbGxpc2Vjb25kID0gbnVtYmVyQmV0d2VlbihvYmoubWlsbGlzZWNvbmQsIDAsIDk5OSk7XG5cbiAgaWYgKCF2YWxpZEhvdXIpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJob3VyXCIsIG9iai5ob3VyKTtcbiAgfSBlbHNlIGlmICghdmFsaWRNaW51dGUpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtaW51dGVcIiwgb2JqLm1pbnV0ZSk7XG4gIH0gZWxzZSBpZiAoIXZhbGlkU2Vjb25kKSB7XG4gICAgcmV0dXJuIHVuaXRPdXRPZlJhbmdlKFwic2Vjb25kXCIsIG9iai5zZWNvbik7XG4gIH0gZWxzZSBpZiAoIXZhbGlkTWlsbGlzZWNvbmQpIHtcbiAgICByZXR1cm4gdW5pdE91dE9mUmFuZ2UoXCJtaWxsaXNlY29uZFwiLCBvYmoubWlsbGlzZWNvbmQpO1xuICB9IGVsc2UgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgSU5WQUxJRCQyID0gXCJJbnZhbGlkIERhdGVUaW1lXCI7XG5cbmZ1bmN0aW9uIHVuc3VwcG9ydGVkWm9uZSh6b25lKSB7XG4gIHJldHVybiBuZXcgSW52YWxpZChcInVuc3VwcG9ydGVkIHpvbmVcIiwgXCJ0aGUgem9uZSBcXFwiXCIgKyB6b25lLm5hbWUgKyBcIlxcXCIgaXMgbm90IHN1cHBvcnRlZFwiKTtcbn0gLy8gd2UgY2FjaGUgd2VlayBkYXRhIG9uIHRoZSBEVCBvYmplY3QgYW5kIHRoaXMgaW50ZXJtZWRpYXRlcyB0aGUgY2FjaGVcblxuXG5mdW5jdGlvbiBwb3NzaWJseUNhY2hlZFdlZWtEYXRhKGR0KSB7XG4gIGlmIChkdC53ZWVrRGF0YSA9PT0gbnVsbCkge1xuICAgIGR0LndlZWtEYXRhID0gZ3JlZ29yaWFuVG9XZWVrKGR0LmMpO1xuICB9XG5cbiAgcmV0dXJuIGR0LndlZWtEYXRhO1xufSAvLyBjbG9uZSByZWFsbHkgbWVhbnMsIFwibWFrZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGVzZSBtb2RpZmljYXRpb25zXCIuIGFsbCBcInNldHRlcnNcIiByZWFsbHkgdXNlIHRoaXNcbi8vIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2hpbGUgb25seSBjaGFuZ2luZyBzb21lIG9mIHRoZSBwcm9wZXJ0aWVzXG5cblxuZnVuY3Rpb24gY2xvbmUkMShpbnN0LCBhbHRzKSB7XG4gIHZhciBjdXJyZW50ID0ge1xuICAgIHRzOiBpbnN0LnRzLFxuICAgIHpvbmU6IGluc3Quem9uZSxcbiAgICBjOiBpbnN0LmMsXG4gICAgbzogaW5zdC5vLFxuICAgIGxvYzogaW5zdC5sb2MsXG4gICAgaW52YWxpZDogaW5zdC5pbnZhbGlkXG4gIH07XG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoT2JqZWN0LmFzc2lnbih7fSwgY3VycmVudCwgYWx0cywge1xuICAgIG9sZDogY3VycmVudFxuICB9KSk7XG59IC8vIGZpbmQgdGhlIHJpZ2h0IG9mZnNldCBhIGdpdmVuIGxvY2FsIHRpbWUuIFRoZSBvIGlucHV0IGlzIG91ciBndWVzcywgd2hpY2ggZGV0ZXJtaW5lcyB3aGljaFxuLy8gb2Zmc2V0IHdlJ2xsIHBpY2sgaW4gYW1iaWd1b3VzIGNhc2VzIChlLmcuIHRoZXJlIGFyZSB0d28gMyBBTXMgYi9jIEZhbGxiYWNrIERTVClcblxuXG5mdW5jdGlvbiBmaXhPZmZzZXQobG9jYWxUUywgbywgdHopIHtcbiAgLy8gT3VyIFVUQyB0aW1lIGlzIGp1c3QgYSBndWVzcyBiZWNhdXNlIG91ciBvZmZzZXQgaXMganVzdCBhIGd1ZXNzXG4gIHZhciB1dGNHdWVzcyA9IGxvY2FsVFMgLSBvICogNjAgKiAxMDAwOyAvLyBUZXN0IHdoZXRoZXIgdGhlIHpvbmUgbWF0Y2hlcyB0aGUgb2Zmc2V0IGZvciB0aGlzIHRzXG5cbiAgdmFyIG8yID0gdHoub2Zmc2V0KHV0Y0d1ZXNzKTsgLy8gSWYgc28sIG9mZnNldCBkaWRuJ3QgY2hhbmdlIGFuZCB3ZSdyZSBkb25lXG5cbiAgaWYgKG8gPT09IG8yKSB7XG4gICAgcmV0dXJuIFt1dGNHdWVzcywgb107XG4gIH0gLy8gSWYgbm90LCBjaGFuZ2UgdGhlIHRzIGJ5IHRoZSBkaWZmZXJlbmNlIGluIHRoZSBvZmZzZXRcblxuXG4gIHV0Y0d1ZXNzIC09IChvMiAtIG8pICogNjAgKiAxMDAwOyAvLyBJZiB0aGF0IGdpdmVzIHVzIHRoZSBsb2NhbCB0aW1lIHdlIHdhbnQsIHdlJ3JlIGRvbmVcblxuICB2YXIgbzMgPSB0ei5vZmZzZXQodXRjR3Vlc3MpO1xuXG4gIGlmIChvMiA9PT0gbzMpIHtcbiAgICByZXR1cm4gW3V0Y0d1ZXNzLCBvMl07XG4gIH0gLy8gSWYgaXQncyBkaWZmZXJlbnQsIHdlJ3JlIGluIGEgaG9sZSB0aW1lLiBUaGUgb2Zmc2V0IGhhcyBjaGFuZ2VkLCBidXQgdGhlIHdlIGRvbid0IGFkanVzdCB0aGUgdGltZVxuXG5cbiAgcmV0dXJuIFtsb2NhbFRTIC0gTWF0aC5taW4obzIsIG8zKSAqIDYwICogMTAwMCwgTWF0aC5tYXgobzIsIG8zKV07XG59IC8vIGNvbnZlcnQgYW4gZXBvY2ggdGltZXN0YW1wIGludG8gYSBjYWxlbmRhciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gb2Zmc2V0XG5cblxuZnVuY3Rpb24gdHNUb09iaih0cywgb2Zmc2V0KSB7XG4gIHRzICs9IG9mZnNldCAqIDYwICogMTAwMDtcbiAgdmFyIGQgPSBuZXcgRGF0ZSh0cyk7XG4gIHJldHVybiB7XG4gICAgeWVhcjogZC5nZXRVVENGdWxsWWVhcigpLFxuICAgIG1vbnRoOiBkLmdldFVUQ01vbnRoKCkgKyAxLFxuICAgIGRheTogZC5nZXRVVENEYXRlKCksXG4gICAgaG91cjogZC5nZXRVVENIb3VycygpLFxuICAgIG1pbnV0ZTogZC5nZXRVVENNaW51dGVzKCksXG4gICAgc2Vjb25kOiBkLmdldFVUQ1NlY29uZHMoKSxcbiAgICBtaWxsaXNlY29uZDogZC5nZXRVVENNaWxsaXNlY29uZHMoKVxuICB9O1xufSAvLyBjb3ZlcnQgYSBjYWxlbmRhciBvYmplY3QgdG8gYSBsb2NhbCB0aW1lc3RhbXAgKGVwb2NoLCBidXQgd2l0aCB0aGUgb2Zmc2V0IGJha2VkIGluKVxuXG5cbmZ1bmN0aW9uIG9ialRvTG9jYWxUUyhvYmopIHtcbiAgdmFyIGQgPSBEYXRlLlVUQyhvYmoueWVhciwgb2JqLm1vbnRoIC0gMSwgb2JqLmRheSwgb2JqLmhvdXIsIG9iai5taW51dGUsIG9iai5zZWNvbmQsIG9iai5taWxsaXNlY29uZCk7IC8vIGZvciBsZWdhY3kgcmVhc29ucywgeWVhcnMgYmV0d2VlbiAwIGFuZCA5OSBhcmUgaW50ZXJwcmV0ZWQgYXMgMTlYWDsgcmV2ZXJ0IHRoYXRcblxuICBpZiAob2JqLnllYXIgPCAxMDAgJiYgb2JqLnllYXIgPj0gMCkge1xuICAgIGQgPSBuZXcgRGF0ZShkKTtcbiAgICBkLnNldFVUQ0Z1bGxZZWFyKG9iai55ZWFyKTtcbiAgfVxuXG4gIHJldHVybiArZDtcbn0gLy8gY29udmVydCBhIGNhbGVuZGFyIG9iamVjdCB0byBhIGVwb2NoIHRpbWVzdGFtcFxuXG5cbmZ1bmN0aW9uIG9ialRvVFMob2JqLCBvZmZzZXQsIHpvbmUpIHtcbiAgcmV0dXJuIGZpeE9mZnNldChvYmpUb0xvY2FsVFMob2JqKSwgb2Zmc2V0LCB6b25lKTtcbn0gLy8gY3JlYXRlIGEgbmV3IERUIGluc3RhbmNlIGJ5IGFkZGluZyBhIGR1cmF0aW9uLCBhZGp1c3RpbmcgZm9yIERTVHNcblxuXG5mdW5jdGlvbiBhZGp1c3RUaW1lKGluc3QsIGR1cikge1xuICB2YXIgb1ByZSA9IGluc3QubyxcbiAgICAgIHllYXIgPSBpbnN0LmMueWVhciArIGR1ci55ZWFycyxcbiAgICAgIG1vbnRoID0gaW5zdC5jLm1vbnRoICsgZHVyLm1vbnRocyArIGR1ci5xdWFydGVycyAqIDMsXG4gICAgICBjID0gT2JqZWN0LmFzc2lnbih7fSwgaW5zdC5jLCB7XG4gICAgeWVhcjogeWVhcixcbiAgICBtb250aDogbW9udGgsXG4gICAgZGF5OiBNYXRoLm1pbihpbnN0LmMuZGF5LCBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpICsgZHVyLmRheXMgKyBkdXIud2Vla3MgKiA3XG4gIH0pLFxuICAgICAgbWlsbGlzVG9BZGQgPSBEdXJhdGlvbi5mcm9tT2JqZWN0KHtcbiAgICBob3VyczogZHVyLmhvdXJzLFxuICAgIG1pbnV0ZXM6IGR1ci5taW51dGVzLFxuICAgIHNlY29uZHM6IGR1ci5zZWNvbmRzLFxuICAgIG1pbGxpc2Vjb25kczogZHVyLm1pbGxpc2Vjb25kc1xuICB9KS5hcyhcIm1pbGxpc2Vjb25kc1wiKSxcbiAgICAgIGxvY2FsVFMgPSBvYmpUb0xvY2FsVFMoYyk7XG5cbiAgdmFyIF9maXhPZmZzZXQgPSBmaXhPZmZzZXQobG9jYWxUUywgb1ByZSwgaW5zdC56b25lKSxcbiAgICAgIHRzID0gX2ZpeE9mZnNldFswXSxcbiAgICAgIG8gPSBfZml4T2Zmc2V0WzFdO1xuXG4gIGlmIChtaWxsaXNUb0FkZCAhPT0gMCkge1xuICAgIHRzICs9IG1pbGxpc1RvQWRkOyAvLyB0aGF0IGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgb2Zmc2V0IGJ5IGdvaW5nIG92ZXIgYSBEU1QsIGJ1dCB3ZSB3YW50IHRvIGtlZXAgdGhlIHRzIHRoZSBzYW1lXG5cbiAgICBvID0gaW5zdC56b25lLm9mZnNldCh0cyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRzOiB0cyxcbiAgICBvOiBvXG4gIH07XG59IC8vIGhlbHBlciB1c2VmdWwgaW4gdHVybmluZyB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIGludG8gcmVhbCBkYXRlc1xuLy8gYnkgaGFuZGxpbmcgdGhlIHpvbmUgb3B0aW9uc1xuXG5cbmZ1bmN0aW9uIHBhcnNlRGF0YVRvRGF0ZVRpbWUocGFyc2VkLCBwYXJzZWRab25lLCBvcHRzLCBmb3JtYXQsIHRleHQpIHtcbiAgdmFyIHNldFpvbmUgPSBvcHRzLnNldFpvbmUsXG4gICAgICB6b25lID0gb3B0cy56b25lO1xuXG4gIGlmIChwYXJzZWQgJiYgT2JqZWN0LmtleXMocGFyc2VkKS5sZW5ndGggIT09IDApIHtcbiAgICB2YXIgaW50ZXJwcmV0YXRpb25ab25lID0gcGFyc2VkWm9uZSB8fCB6b25lLFxuICAgICAgICBpbnN0ID0gRGF0ZVRpbWUuZnJvbU9iamVjdChPYmplY3QuYXNzaWduKHBhcnNlZCwgb3B0cywge1xuICAgICAgem9uZTogaW50ZXJwcmV0YXRpb25ab25lXG4gICAgfSkpO1xuICAgIHJldHVybiBzZXRab25lID8gaW5zdCA6IGluc3Quc2V0Wm9uZSh6b25lKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChuZXcgSW52YWxpZChcInVucGFyc2FibGVcIiwgXCJ0aGUgaW5wdXQgXFxcIlwiICsgdGV4dCArIFwiXFxcIiBjYW4ndCBiZSBwYXJzZWQgYXMgXCIgKyBmb3JtYXQpKTtcbiAgfVxufSAvLyBpZiB5b3Ugd2FudCB0byBvdXRwdXQgYSB0ZWNobmljYWwgZm9ybWF0IChlLmcuIFJGQyAyODIyKSwgdGhpcyBoZWxwZXJcbi8vIGhlbHBzIGhhbmRsZSB0aGUgZGV0YWlsc1xuXG5cbmZ1bmN0aW9uIHRvVGVjaEZvcm1hdChkdCwgZm9ybWF0KSB7XG4gIHJldHVybiBkdC5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZShMb2NhbGUuY3JlYXRlKFwiZW4tVVNcIiksIHtcbiAgICBhbGxvd1o6IHRydWUsXG4gICAgZm9yY2VTaW1wbGU6IHRydWVcbiAgfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGR0LCBmb3JtYXQpIDogbnVsbDtcbn0gLy8gdGVjaG5pY2FsIHRpbWUgZm9ybWF0cyAoZS5nLiB0aGUgdGltZSBwYXJ0IG9mIElTTyA4NjAxKSwgdGFrZSBzb21lIG9wdGlvbnNcbi8vIGFuZCB0aGlzIGNvbW1vbml6ZXMgdGhlaXIgaGFuZGxpbmdcblxuXG5mdW5jdGlvbiB0b1RlY2hUaW1lRm9ybWF0KGR0LCBfcmVmKSB7XG4gIHZhciBfcmVmJHN1cHByZXNzU2Vjb25kcyA9IF9yZWYuc3VwcHJlc3NTZWNvbmRzLFxuICAgICAgc3VwcHJlc3NTZWNvbmRzID0gX3JlZiRzdXBwcmVzc1NlY29uZHMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzdXBwcmVzc1NlY29uZHMsXG4gICAgICBfcmVmJHN1cHByZXNzTWlsbGlzZWMgPSBfcmVmLnN1cHByZXNzTWlsbGlzZWNvbmRzLFxuICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBfcmVmJHN1cHByZXNzTWlsbGlzZWMgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzdXBwcmVzc01pbGxpc2VjLFxuICAgICAgX3JlZiRpbmNsdWRlT2Zmc2V0ID0gX3JlZi5pbmNsdWRlT2Zmc2V0LFxuICAgICAgaW5jbHVkZU9mZnNldCA9IF9yZWYkaW5jbHVkZU9mZnNldCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkaW5jbHVkZU9mZnNldCxcbiAgICAgIF9yZWYkaW5jbHVkZVpvbmUgPSBfcmVmLmluY2x1ZGVab25lLFxuICAgICAgaW5jbHVkZVpvbmUgPSBfcmVmJGluY2x1ZGVab25lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkaW5jbHVkZVpvbmUsXG4gICAgICBfcmVmJHNwYWNlWm9uZSA9IF9yZWYuc3BhY2Vab25lLFxuICAgICAgc3BhY2Vab25lID0gX3JlZiRzcGFjZVpvbmUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRzcGFjZVpvbmU7XG4gIHZhciBmbXQgPSBcIkhIOm1tXCI7XG5cbiAgaWYgKCFzdXBwcmVzc1NlY29uZHMgfHwgZHQuc2Vjb25kICE9PSAwIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgZm10ICs9IFwiOnNzXCI7XG5cbiAgICBpZiAoIXN1cHByZXNzTWlsbGlzZWNvbmRzIHx8IGR0Lm1pbGxpc2Vjb25kICE9PSAwKSB7XG4gICAgICBmbXQgKz0gXCIuU1NTXCI7XG4gICAgfVxuICB9XG5cbiAgaWYgKChpbmNsdWRlWm9uZSB8fCBpbmNsdWRlT2Zmc2V0KSAmJiBzcGFjZVpvbmUpIHtcbiAgICBmbXQgKz0gXCIgXCI7XG4gIH1cblxuICBpZiAoaW5jbHVkZVpvbmUpIHtcbiAgICBmbXQgKz0gXCJ6XCI7XG4gIH0gZWxzZSBpZiAoaW5jbHVkZU9mZnNldCkge1xuICAgIGZtdCArPSBcIlpaXCI7XG4gIH1cblxuICByZXR1cm4gdG9UZWNoRm9ybWF0KGR0LCBmbXQpO1xufSAvLyBkZWZhdWx0cyBmb3IgdW5zcGVjaWZpZWQgdW5pdHMgaW4gdGhlIHN1cHBvcnRlZCBjYWxlbmRhcnNcblxuXG52YXIgZGVmYXVsdFVuaXRWYWx1ZXMgPSB7XG4gIG1vbnRoOiAxLFxuICBkYXk6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufSxcbiAgICBkZWZhdWx0V2Vla1VuaXRWYWx1ZXMgPSB7XG4gIHdlZWtOdW1iZXI6IDEsXG4gIHdlZWtkYXk6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufSxcbiAgICBkZWZhdWx0T3JkaW5hbFVuaXRWYWx1ZXMgPSB7XG4gIG9yZGluYWw6IDEsXG4gIGhvdXI6IDAsXG4gIG1pbnV0ZTogMCxcbiAgc2Vjb25kOiAwLFxuICBtaWxsaXNlY29uZDogMFxufTsgLy8gVW5pdHMgaW4gdGhlIHN1cHBvcnRlZCBjYWxlbmRhcnMsIHNvcnRlZCBieSBiaWduZXNzXG5cbnZhciBvcmRlcmVkVW5pdHMkMSA9IFtcInllYXJcIiwgXCJtb250aFwiLCBcImRheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgICBvcmRlcmVkV2Vla1VuaXRzID0gW1wid2Vla1llYXJcIiwgXCJ3ZWVrTnVtYmVyXCIsIFwid2Vla2RheVwiLCBcImhvdXJcIiwgXCJtaW51dGVcIiwgXCJzZWNvbmRcIiwgXCJtaWxsaXNlY29uZFwiXSxcbiAgICBvcmRlcmVkT3JkaW5hbFVuaXRzID0gW1wieWVhclwiLCBcIm9yZGluYWxcIiwgXCJob3VyXCIsIFwibWludXRlXCIsIFwic2Vjb25kXCIsIFwibWlsbGlzZWNvbmRcIl07IC8vIHN0YW5kYXJkaXplIGNhc2UgYW5kIHBsdXJhbGl0eSBpbiB1bml0c1xuXG5mdW5jdGlvbiBub3JtYWxpemVVbml0KHVuaXQsIGlnbm9yZVVua25vd24pIHtcbiAgaWYgKGlnbm9yZVVua25vd24gPT09IHZvaWQgMCkge1xuICAgIGlnbm9yZVVua25vd24gPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBub3JtYWxpemVkID0ge1xuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbiAgICBtb250aDogXCJtb250aFwiLFxuICAgIG1vbnRoczogXCJtb250aFwiLFxuICAgIGRheTogXCJkYXlcIixcbiAgICBkYXlzOiBcImRheVwiLFxuICAgIGhvdXI6IFwiaG91clwiLFxuICAgIGhvdXJzOiBcImhvdXJcIixcbiAgICBtaW51dGU6IFwibWludXRlXCIsXG4gICAgbWludXRlczogXCJtaW51dGVcIixcbiAgICBzZWNvbmQ6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kczogXCJzZWNvbmRcIixcbiAgICBtaWxsaXNlY29uZDogXCJtaWxsaXNlY29uZFwiLFxuICAgIG1pbGxpc2Vjb25kczogXCJtaWxsaXNlY29uZFwiLFxuICAgIHdlZWtkYXk6IFwid2Vla2RheVwiLFxuICAgIHdlZWtkYXlzOiBcIndlZWtkYXlcIixcbiAgICB3ZWVrbnVtYmVyOiBcIndlZWtOdW1iZXJcIixcbiAgICB3ZWVrc251bWJlcjogXCJ3ZWVrTnVtYmVyXCIsXG4gICAgd2Vla251bWJlcnM6IFwid2Vla051bWJlclwiLFxuICAgIHdlZWt5ZWFyOiBcIndlZWtZZWFyXCIsXG4gICAgd2Vla3llYXJzOiBcIndlZWtZZWFyXCIsXG4gICAgb3JkaW5hbDogXCJvcmRpbmFsXCJcbiAgfVt1bml0ID8gdW5pdC50b0xvd2VyQ2FzZSgpIDogdW5pdF07XG4gIGlmICghaWdub3JlVW5rbm93biAmJiAhbm9ybWFsaXplZCkgdGhyb3cgbmV3IEludmFsaWRVbml0RXJyb3IodW5pdCk7XG4gIHJldHVybiBub3JtYWxpemVkO1xufSAvLyB0aGlzIGlzIGEgZHVtYmVkIGRvd24gdmVyc2lvbiBvZiBmcm9tT2JqZWN0KCkgdGhhdCBydW5zIGFib3V0IDYwJSBmYXN0ZXJcbi8vIGJ1dCBkb2Vzbid0IGRvIGFueSB2YWxpZGF0aW9uLCBtYWtlcyBhIGJ1bmNoIG9mIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgdW5pdHNcbi8vIGFyZSBwcmVzZW50LCBhbmQgc28gb24uXG5cblxuZnVuY3Rpb24gcXVpY2tEVChvYmosIHpvbmUpIHtcbiAgLy8gYXNzdW1lIHdlIGhhdmUgdGhlIGhpZ2hlci1vcmRlciB1bml0c1xuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgb3JkZXJlZFVuaXRzJDEubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIHUgPSBvcmRlcmVkVW5pdHMkMVtfaV07XG5cbiAgICBpZiAoaXNVbmRlZmluZWQob2JqW3VdKSkge1xuICAgICAgb2JqW3VdID0gZGVmYXVsdFVuaXRWYWx1ZXNbdV07XG4gICAgfVxuICB9XG5cbiAgdmFyIGludmFsaWQgPSBoYXNJbnZhbGlkR3JlZ29yaWFuRGF0YShvYmopIHx8IGhhc0ludmFsaWRUaW1lRGF0YShvYmopO1xuXG4gIGlmIChpbnZhbGlkKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gIH1cblxuICB2YXIgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgIG9mZnNldFByb3ZpcyA9IHpvbmUub2Zmc2V0KHRzTm93KSxcbiAgICAgIF9vYmpUb1RTID0gb2JqVG9UUyhvYmosIG9mZnNldFByb3Zpcywgem9uZSksXG4gICAgICB0cyA9IF9vYmpUb1RTWzBdLFxuICAgICAgbyA9IF9vYmpUb1RTWzFdO1xuXG4gIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgIHRzOiB0cyxcbiAgICB6b25lOiB6b25lLFxuICAgIG86IG9cbiAgfSk7XG59XG4vKipcclxuICogQSBEYXRlVGltZSBpcyBhbiBpbW11dGFibGUgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc3BlY2lmaWMgZGF0ZSBhbmQgdGltZSBhbmQgYWNjb21wYW55aW5nIG1ldGhvZHMuIEl0IGNvbnRhaW5zIGNsYXNzIGFuZCBpbnN0YW5jZSBtZXRob2RzIGZvciBjcmVhdGluZywgcGFyc2luZywgaW50ZXJyb2dhdGluZywgdHJhbnNmb3JtaW5nLCBhbmQgZm9ybWF0dGluZyB0aGVtLlxyXG4gKlxyXG4gKiBBIERhdGVUaW1lIGNvbXByaXNlcyBvZjpcclxuICogKiBBIHRpbWVzdGFtcC4gRWFjaCBEYXRlVGltZSBpbnN0YW5jZSByZWZlcnMgdG8gYSBzcGVjaWZpYyBtaWxsaXNlY29uZCBvZiB0aGUgVW5peCBlcG9jaC5cclxuICogKiBBIHRpbWUgem9uZS4gRWFjaCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGluIHRoZSBjb250ZXh0IG9mIGEgc3BlY2lmaWMgem9uZSAoYnkgZGVmYXVsdCB0aGUgbG9jYWwgc3lzdGVtJ3Mgem9uZSkuXHJcbiAqICogQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHRoYXQgZWZmZWN0IGhvdyBvdXRwdXQgc3RyaW5ncyBhcmUgZm9ybWF0dGVkLCBzdWNoIGFzIGBsb2NhbGVgLCBgbnVtYmVyaW5nU3lzdGVtYCwgYW5kIGBvdXRwdXRDYWxlbmRhcmAuXHJcbiAqXHJcbiAqIEhlcmUgaXMgYSBicmllZiBvdmVydmlldyBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIGZ1bmN0aW9uYWxpdHkgaXQgcHJvdmlkZXM6XHJcbiAqXHJcbiAqICogKipDcmVhdGlvbioqOiBUbyBjcmVhdGUgYSBEYXRlVGltZSBmcm9tIGl0cyBjb21wb25lbnRzLCB1c2Ugb25lIG9mIGl0cyBmYWN0b3J5IGNsYXNzIG1ldGhvZHM6IHtAbGluayBsb2NhbH0sIHtAbGluayB1dGN9LCBhbmQgKG1vc3QgZmxleGlibHkpIHtAbGluayBmcm9tT2JqZWN0fS4gVG8gY3JlYXRlIG9uZSBmcm9tIGEgc3RhbmRhcmQgc3RyaW5nIGZvcm1hdCwgdXNlIHtAbGluayBmcm9tSVNPfSwge0BsaW5rIGZyb21IVFRQfSwgYW5kIHtAbGluayBmcm9tUkZDMjgyMn0uIFRvIGNyZWF0ZSBvbmUgZnJvbSBhIGN1c3RvbSBzdHJpbmcgZm9ybWF0LCB1c2Uge0BsaW5rIGZyb21Gb3JtYXR9LiBUbyBjcmVhdGUgb25lIGZyb20gYSBuYXRpdmUgSlMgZGF0ZSwgdXNlIHtAbGluayBmcm9tSlNEYXRlfS5cclxuICogKiAqKkdyZWdvcmlhbiBjYWxlbmRhciBhbmQgdGltZSoqOiBUbyBleGFtaW5lIHRoZSBHcmVnb3JpYW4gcHJvcGVydGllcyBvZiBhIERhdGVUaW1lIGluZGl2aWR1YWxseSAoaS5lIGFzIG9wcG9zZWQgdG8gY29sbGVjdGl2ZWx5IHRocm91Z2gge0BsaW5rIHRvT2JqZWN0fSksIHVzZSB0aGUge0BsaW5rIHllYXJ9LCB7QGxpbmsgbW9udGh9LFxyXG4gKiB7QGxpbmsgZGF5fSwge0BsaW5rIGhvdXJ9LCB7QGxpbmsgbWludXRlfSwge0BsaW5rIHNlY29uZH0sIHtAbGluayBtaWxsaXNlY29uZH0gYWNjZXNzb3JzLlxyXG4gKiAqICoqV2VlayBjYWxlbmRhcioqOiBGb3IgSVNPIHdlZWsgY2FsZW5kYXIgYXR0cmlidXRlcywgc2VlIHRoZSB7QGxpbmsgd2Vla1llYXJ9LCB7QGxpbmsgd2Vla051bWJlcn0sIGFuZCB7QGxpbmsgd2Vla2RheX0gYWNjZXNzb3JzLlxyXG4gKiAqICoqQ29uZmlndXJhdGlvbioqIFNlZSB0aGUge0BsaW5rIGxvY2FsZX0gYW5kIHtAbGluayBudW1iZXJpbmdTeXN0ZW19IGFjY2Vzc29ycy5cclxuICogKiAqKlRyYW5zZm9ybWF0aW9uKio6IFRvIHRyYW5zZm9ybSB0aGUgRGF0ZVRpbWUgaW50byBvdGhlciBEYXRlVGltZXMsIHVzZSB7QGxpbmsgc2V0fSwge0BsaW5rIHJlY29uZmlndXJlfSwge0BsaW5rIHNldFpvbmV9LCB7QGxpbmsgc2V0TG9jYWxlfSwge0BsaW5rIHBsdXN9LCB7QGxpbmsgbWludXN9LCB7QGxpbmsgZW5kT2Z9LCB7QGxpbmsgc3RhcnRPZn0sIHtAbGluayB0b1VUQ30sIGFuZCB7QGxpbmsgdG9Mb2NhbH0uXHJcbiAqICogKipPdXRwdXQqKjogVG8gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gb3RoZXIgcmVwcmVzZW50YXRpb25zLCB1c2UgdGhlIHtAbGluayB0b0pTT059LCB7QGxpbmsgdG9JU099LCB7QGxpbmsgdG9IVFRQfSwge0BsaW5rIHRvT2JqZWN0fSwge0BsaW5rIHRvUkZDMjgyMn0sIHtAbGluayB0b1N0cmluZ30sIHtAbGluayB0b0xvY2FsZVN0cmluZ30sIHtAbGluayB0b0Zvcm1hdH0sIHtAbGluayB0b01pbGxpc30gYW5kIHtAbGluayB0b0pTRGF0ZX0uXHJcbiAqXHJcbiAqIFRoZXJlJ3MgcGxlbnR5IG90aGVycyBkb2N1bWVudGVkIGJlbG93LiBJbiBhZGRpdGlvbiwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc3VidGxlciB0b3BpY3MgbGlrZSBpbnRlcm5hdGlvbmFsaXphdGlvbiwgdGltZSB6b25lcywgYWx0ZXJuYXRpdmUgY2FsZW5kYXJzLCB2YWxpZGl0eSwgYW5kIHNvIG9uLCBzZWUgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24uXHJcbiAqL1xuXG5cbnZhciBEYXRlVGltZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAqL1xuICBmdW5jdGlvbiBEYXRlVGltZShjb25maWcpIHtcbiAgICB2YXIgem9uZSA9IGNvbmZpZy56b25lIHx8IFNldHRpbmdzLmRlZmF1bHRab25lLFxuICAgICAgICBpbnZhbGlkID0gY29uZmlnLmludmFsaWQgfHwgKE51bWJlci5pc05hTihjb25maWcudHMpID8gbmV3IEludmFsaWQoXCJpbnZhbGlkIGlucHV0XCIpIDogbnVsbCkgfHwgKCF6b25lLmlzVmFsaWQgPyB1bnN1cHBvcnRlZFpvbmUoem9uZSkgOiBudWxsKTtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLnRzID0gaXNVbmRlZmluZWQoY29uZmlnLnRzKSA/IFNldHRpbmdzLm5vdygpIDogY29uZmlnLnRzO1xuICAgIHZhciBjID0gbnVsbCxcbiAgICAgICAgbyA9IG51bGw7XG5cbiAgICBpZiAoIWludmFsaWQpIHtcbiAgICAgIHZhciB1bmNoYW5nZWQgPSBjb25maWcub2xkICYmIGNvbmZpZy5vbGQudHMgPT09IHRoaXMudHMgJiYgY29uZmlnLm9sZC56b25lLmVxdWFscyh6b25lKTtcbiAgICAgIGMgPSB1bmNoYW5nZWQgPyBjb25maWcub2xkLmMgOiB0c1RvT2JqKHRoaXMudHMsIHpvbmUub2Zmc2V0KHRoaXMudHMpKTtcbiAgICAgIG8gPSB1bmNoYW5nZWQgPyBjb25maWcub2xkLm8gOiB6b25lLm9mZnNldCh0aGlzLnRzKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG5cbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubG9jID0gY29uZmlnLmxvYyB8fCBMb2NhbGUuY3JlYXRlKCk7XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pbnZhbGlkID0gaW52YWxpZDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLndlZWtEYXRhID0gbnVsbDtcbiAgICAvKipcclxuICAgICAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmMgPSBjO1xuICAgIC8qKlxyXG4gICAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMubyA9IG87XG4gICAgLyoqXHJcbiAgICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5pc0x1eG9uRGF0ZVRpbWUgPSB0cnVlO1xuICB9IC8vIENPTlNUUlVDVFxuXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGxvY2FsIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHllYXIgLSBUaGUgY2FsZW5kYXIgeWVhci4gSWYgb21pdHRlZCAoYXMgaW4sIGNhbGwgYGxvY2FsKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL34+IG5vd1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcpICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAxLTAxVDAwOjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMykgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMDFUMDA6MDA6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1KSAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjAwOjAwXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMywgMTIsIDUsIDQ1KSAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6NDU6MDBcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDMsIDEyLCA1LCA0NSwgMTAsIDc2NSkgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjEwLjc2NVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUubG9jYWwgPSBmdW5jdGlvbiBsb2NhbCh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpIHtcbiAgICBpZiAoaXNVbmRlZmluZWQoeWVhcikpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogU2V0dGluZ3Mubm93KClcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVpY2tEVCh7XG4gICAgICAgIHllYXI6IHllYXIsXG4gICAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgICAgZGF5OiBkYXksXG4gICAgICAgIGhvdXI6IGhvdXIsXG4gICAgICAgIG1pbnV0ZTogbWludXRlLFxuICAgICAgICBzZWNvbmQ6IHNlY29uZCxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IG1pbGxpc2Vjb25kXG4gICAgICB9LCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBpbiBVVENcclxuICAgKiBAcGFyYW0ge251bWJlcn0geWVhciAtIFRoZSBjYWxlbmRhciB5ZWFyLiBJZiBvbWl0dGVkIChhcyBpbiwgY2FsbCBgdXRjKClgIHdpdGggbm8gYXJndW1lbnRzKSwgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW21vbnRoPTFdIC0gVGhlIG1vbnRoLCAxLWluZGV4ZWRcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RheT0xXSAtIFRoZSBkYXkgb2YgdGhlIG1vbnRoXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtob3VyPTBdIC0gVGhlIGhvdXIgb2YgdGhlIGRheSwgaW4gMjQtaG91ciB0aW1lXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaW51dGU9MF0gLSBUaGUgbWludXRlIG9mIHRoZSBob3VyLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNTlcclxuICAgKiBAcGFyYW0ge251bWJlcn0gW3NlY29uZD0wXSAtIFRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgaS5lLiBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFttaWxsaXNlY29uZD0wXSAtIFRoZSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCBpLmUuIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgOTk5XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9+PiBub3dcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNykgICAgICAgICAgICAgICAgICAgICAgICAvL34+IDIwMTctMDEtMDFUMDA6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMpICAgICAgICAgICAgICAgICAgICAgLy9+PiAyMDE3LTAzLTAxVDAwOjAwOjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMikgICAgICAgICAgICAgICAgIC8vfj4gMjAxNy0wMy0xMlQwMDowMDowMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUpICAgICAgICAgICAgICAvL34+IDIwMTctMDMtMTJUMDU6MDA6MDBaXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTcsIDMsIDEyLCA1LCA0NSkgICAgICAgICAgLy9+PiAyMDE3LTAzLTEyVDA1OjQ1OjAwWlxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE3LCAzLCAxMiwgNSwgNDUsIDEwKSAgICAgIC8vfj4gMjAxNy0wMy0xMlQwNTo0NToxMFpcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNywgMywgMTIsIDUsIDQ1LCAxMCwgNzY1KSAvL34+IDIwMTctMDMtMTJUMDU6NDU6MTAuNzY1WlxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUudXRjID0gZnVuY3Rpb24gdXRjKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCkge1xuICAgIGlmIChpc1VuZGVmaW5lZCh5ZWFyKSkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBTZXR0aW5ncy5ub3coKSxcbiAgICAgICAgem9uZTogRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1aWNrRFQoe1xuICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIGRheTogZGF5LFxuICAgICAgICBob3VyOiBob3VyLFxuICAgICAgICBtaW51dGU6IG1pbnV0ZSxcbiAgICAgICAgc2Vjb25kOiBzZWNvbmQsXG4gICAgICAgIG1pbGxpc2Vjb25kOiBtaWxsaXNlY29uZFxuICAgICAgfSwgRml4ZWRPZmZzZXRab25lLnV0Y0luc3RhbmNlKTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0LiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtEYXRlfSBkYXRlIC0gYSBKYXZhc2NyaXB0IERhdGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRpb25zLnpvbmU9J2xvY2FsJ10gLSB0aGUgem9uZSB0byBwbGFjZSB0aGUgRGF0ZVRpbWUgaW50b1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUpTRGF0ZSA9IGZ1bmN0aW9uIGZyb21KU0RhdGUoZGF0ZSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiBpc0RhdGUoZGF0ZSkgPyBkYXRlLnZhbHVlT2YoKSA6IE5hTixcbiAgICAgIHpvbmU6IG5vcm1hbGl6ZVpvbmUob3B0aW9ucy56b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSksXG4gICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpXG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAoaS5lLiBzaW5jZSAxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLiBVc2VzIHRoZSBkZWZhdWx0IHpvbmUuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1pbGxpc2Vjb25kcyAtIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21NaWxsaXMgPSBmdW5jdGlvbiBmcm9tTWlsbGlzKG1pbGxpc2Vjb25kcywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTnVtYmVyKG1pbGxpc2Vjb25kcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcImZyb21NaWxsaXMgcmVxdWlyZXMgYSBudW1lcmljYWwgaW5wdXRcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoe1xuICAgICAgICB0czogbWlsbGlzZWNvbmRzLFxuICAgICAgICB6b25lOiBub3JtYWxpemVab25lKG9wdGlvbnMuem9uZSwgU2V0dGluZ3MuZGVmYXVsdFpvbmUpLFxuICAgICAgICBsb2M6IExvY2FsZS5mcm9tT2JqZWN0KG9wdGlvbnMpXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2ggKGkuZS4gc2luY2UgMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4gVXNlcyB0aGUgZGVmYXVsdCB6b25lLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzZWNvbmRzIC0gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwIFVUQ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgRGF0ZVRpbWVcclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0aW9ucy56b25lPSdsb2NhbCddIC0gdGhlIHpvbmUgdG8gcGxhY2UgdGhlIERhdGVUaW1lIGludG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubG9jYWxlXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TZWNvbmRzID0gZnVuY3Rpb24gZnJvbVNlY29uZHMoc2Vjb25kcywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWlzTnVtYmVyKHNlY29uZHMpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXJyb3IoXCJmcm9tU2Vjb25kcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSh7XG4gICAgICAgIHRzOiBzZWNvbmRzICogMTAwMCxcbiAgICAgICAgem9uZTogbm9ybWFsaXplWm9uZShvcHRpb25zLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKSxcbiAgICAgICAgbG9jOiBMb2NhbGUuZnJvbU9iamVjdChvcHRpb25zKVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCBrZXlzIGxpa2UgJ3llYXInIGFuZCAnaG91cicgd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmogLSB0aGUgb2JqZWN0IHRvIGNyZWF0ZSB0aGUgRGF0ZVRpbWUgZnJvbVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoueWVhciAtIGEgeWVhciwgc3VjaCBhcyAxOTg3XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5tb250aCAtIGEgbW9udGgsIDEtMTJcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLmRheSAtIGEgZGF5IG9mIHRoZSBtb250aCwgMS0zMSwgZGVwZW5kaW5nIG9uIHRoZSBtb250aFxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoub3JkaW5hbCAtIGRheSBvZiB0aGUgeWVhciwgMS0zNjUgb3IgMzY2XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai53ZWVrWWVhciAtIGFuIElTTyB3ZWVrIHllYXJcclxuICAgKiBAcGFyYW0ge251bWJlcn0gb2JqLndlZWtOdW1iZXIgLSBhbiBJU08gd2VlayBudW1iZXIsIGJldHdlZW4gMSBhbmQgNTIgb3IgNTMsIGRlcGVuZGluZyBvbiB0aGUgeWVhclxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoud2Vla2RheSAtIGFuIElTTyB3ZWVrZGF5LCAxLTcsIHdoZXJlIDEgaXMgTW9uZGF5IGFuZCA3IGlzIFN1bmRheVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmouaG91ciAtIGhvdXIgb2YgdGhlIGRheSwgMC0yM1xyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWludXRlIC0gbWludXRlIG9mIHRoZSBob3VyLCAwLTU5XHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9iai5zZWNvbmQgLSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSwgMC01OVxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvYmoubWlsbGlzZWNvbmQgLSBtaWxsaXNlY29uZCBvZiB0aGUgc2Vjb25kLCAwLTk5OVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvYmouem9uZT0nbG9jYWwnXSAtIGludGVycHJldCB0aGUgbnVtYmVycyBpbiB0aGUgY29udGV4dCBvZiBhIHBhcnRpY3VsYXIgem9uZS4gQ2FuIHRha2UgYW55IHZhbHVlIHRha2VuIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRab25lKClcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29iai5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmoub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iai5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB5ZWFyOiAxOTgyLCBtb250aDogNSwgZGF5OiAyNX0pLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IHllYXI6IDE5ODIgfSkudG9JU09EYXRlKCkgLy89PiAnMTk4Mi0wMS0wMVQwMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tT2JqZWN0KHsgaG91cjogMTAsIG1pbnV0ZTogMjYsIHNlY29uZDogNiB9KSAvL34+IHRvZGF5IGF0IDEwOjI2OjA2XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICd1dGMnIH0pLFxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyBob3VyOiAxMCwgbWludXRlOiAyNiwgc2Vjb25kOiA2LCB6b25lOiAnbG9jYWwnIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbU9iamVjdCh7IGhvdXI6IDEwLCBtaW51dGU6IDI2LCBzZWNvbmQ6IDYsIHpvbmU6ICdBbWVyaWNhL05ld19Zb3JrJyB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21PYmplY3QoeyB3ZWVrWWVhcjogMjAxNiwgd2Vla051bWJlcjogMiwgd2Vla2RheTogMyB9KS50b0lTT0RhdGUoKSAvLz0+ICcyMDE2LTAxLTEzJ1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbU9iamVjdCA9IGZ1bmN0aW9uIGZyb21PYmplY3Qob2JqKSB7XG4gICAgdmFyIHpvbmVUb1VzZSA9IG5vcm1hbGl6ZVpvbmUob2JqLnpvbmUsIFNldHRpbmdzLmRlZmF1bHRab25lKTtcblxuICAgIGlmICghem9uZVRvVXNlLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5pbnZhbGlkKHVuc3VwcG9ydGVkWm9uZSh6b25lVG9Vc2UpKTtcbiAgICB9XG5cbiAgICB2YXIgdHNOb3cgPSBTZXR0aW5ncy5ub3coKSxcbiAgICAgICAgb2Zmc2V0UHJvdmlzID0gem9uZVRvVXNlLm9mZnNldCh0c05vdyksXG4gICAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPYmplY3Qob2JqLCBub3JtYWxpemVVbml0LCB0cnVlKSxcbiAgICAgICAgY29udGFpbnNPcmRpbmFsID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQub3JkaW5hbCksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yWWVhciA9ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLnllYXIpLFxuICAgICAgICBjb250YWluc0dyZWdvck1EID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQubW9udGgpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLmRheSksXG4gICAgICAgIGNvbnRhaW5zR3JlZ29yID0gY29udGFpbnNHcmVnb3JZZWFyIHx8IGNvbnRhaW5zR3JlZ29yTUQsXG4gICAgICAgIGRlZmluaXRlV2Vla0RlZiA9IG5vcm1hbGl6ZWQud2Vla1llYXIgfHwgbm9ybWFsaXplZC53ZWVrTnVtYmVyLFxuICAgICAgICBsb2MgPSBMb2NhbGUuZnJvbU9iamVjdChvYmopOyAvLyBjYXNlczpcbiAgICAvLyBqdXN0IGEgd2Vla2RheSAtPiB0aGlzIHdlZWsncyBpbnN0YW5jZSBvZiB0aGF0IHdlZWtkYXksIG5vIHdvcnJpZXNcbiAgICAvLyAoZ3JlZ29yaWFuIGRhdGEgb3Igb3JkaW5hbCkgKyAod2Vla1llYXIgb3Igd2Vla051bWJlcikgLT4gZXJyb3JcbiAgICAvLyAoZ3JlZ29yaWFuIG1vbnRoIG9yIGRheSkgKyBvcmRpbmFsIC0+IGVycm9yXG4gICAgLy8gb3RoZXJ3aXNlIGp1c3QgdXNlIHdlZWtzIG9yIG9yZGluYWxzIG9yIGdyZWdvcmlhbiwgZGVwZW5kaW5nIG9uIHdoYXQncyBzcGVjaWZpZWRcblxuICAgIGlmICgoY29udGFpbnNHcmVnb3IgfHwgY29udGFpbnNPcmRpbmFsKSAmJiBkZWZpbml0ZVdlZWtEZWYpIHtcbiAgICAgIHRocm93IG5ldyBDb25mbGljdGluZ1NwZWNpZmljYXRpb25FcnJvcihcIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHNcIik7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5zR3JlZ29yTUQgJiYgY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RpbmdTcGVjaWZpY2F0aW9uRXJyb3IoXCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheVwiKTtcbiAgICB9XG5cbiAgICB2YXIgdXNlV2Vla0RhdGEgPSBkZWZpbml0ZVdlZWtEZWYgfHwgbm9ybWFsaXplZC53ZWVrZGF5ICYmICFjb250YWluc0dyZWdvcjsgLy8gY29uZmlndXJlIG91cnNlbHZlcyB0byBkZWFsIHdpdGggZ3JlZ29yaWFuIGRhdGVzIG9yIHdlZWsgc3R1ZmZcblxuICAgIHZhciB1bml0cyxcbiAgICAgICAgZGVmYXVsdFZhbHVlcyxcbiAgICAgICAgb2JqTm93ID0gdHNUb09iaih0c05vdywgb2Zmc2V0UHJvdmlzKTtcblxuICAgIGlmICh1c2VXZWVrRGF0YSkge1xuICAgICAgdW5pdHMgPSBvcmRlcmVkV2Vla1VuaXRzO1xuICAgICAgZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRXZWVrVW5pdFZhbHVlcztcbiAgICAgIG9iak5vdyA9IGdyZWdvcmlhblRvV2VlayhvYmpOb3cpO1xuICAgIH0gZWxzZSBpZiAoY29udGFpbnNPcmRpbmFsKSB7XG4gICAgICB1bml0cyA9IG9yZGVyZWRPcmRpbmFsVW5pdHM7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdE9yZGluYWxVbml0VmFsdWVzO1xuICAgICAgb2JqTm93ID0gZ3JlZ29yaWFuVG9PcmRpbmFsKG9iak5vdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVuaXRzID0gb3JkZXJlZFVuaXRzJDE7XG4gICAgICBkZWZhdWx0VmFsdWVzID0gZGVmYXVsdFVuaXRWYWx1ZXM7XG4gICAgfSAvLyBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG1pc3Npbmcgc3R1ZmZcblxuXG4gICAgdmFyIGZvdW5kRmlyc3QgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IHVuaXRzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kyID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmMjtcblxuICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgIGlmIChfaTIgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgIF9yZWYyID0gX2l0ZXJhdG9yW19pMisrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pMiA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIGlmIChfaTIuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWYyID0gX2kyLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgdSA9IF9yZWYyO1xuICAgICAgdmFyIHYgPSBub3JtYWxpemVkW3VdO1xuXG4gICAgICBpZiAoIWlzVW5kZWZpbmVkKHYpKSB7XG4gICAgICAgIGZvdW5kRmlyc3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0KSB7XG4gICAgICAgIG5vcm1hbGl6ZWRbdV0gPSBkZWZhdWx0VmFsdWVzW3VdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9ybWFsaXplZFt1XSA9IG9iak5vd1t1XTtcbiAgICAgIH1cbiAgICB9IC8vIG1ha2Ugc3VyZSB0aGUgdmFsdWVzIHdlIGhhdmUgYXJlIGluIHJhbmdlXG5cblxuICAgIHZhciBoaWdoZXJPcmRlckludmFsaWQgPSB1c2VXZWVrRGF0YSA/IGhhc0ludmFsaWRXZWVrRGF0YShub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IGhhc0ludmFsaWRPcmRpbmFsRGF0YShub3JtYWxpemVkKSA6IGhhc0ludmFsaWRHcmVnb3JpYW5EYXRhKG5vcm1hbGl6ZWQpLFxuICAgICAgICBpbnZhbGlkID0gaGlnaGVyT3JkZXJJbnZhbGlkIHx8IGhhc0ludmFsaWRUaW1lRGF0YShub3JtYWxpemVkKTtcblxuICAgIGlmIChpbnZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChpbnZhbGlkKTtcbiAgICB9IC8vIGNvbXB1dGUgdGhlIGFjdHVhbCB0aW1lXG5cblxuICAgIHZhciBncmVnb3JpYW4gPSB1c2VXZWVrRGF0YSA/IHdlZWtUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IGNvbnRhaW5zT3JkaW5hbCA/IG9yZGluYWxUb0dyZWdvcmlhbihub3JtYWxpemVkKSA6IG5vcm1hbGl6ZWQsXG4gICAgICAgIF9vYmpUb1RTMiA9IG9ialRvVFMoZ3JlZ29yaWFuLCBvZmZzZXRQcm92aXMsIHpvbmVUb1VzZSksXG4gICAgICAgIHRzRmluYWwgPSBfb2JqVG9UUzJbMF0sXG4gICAgICAgIG9mZnNldEZpbmFsID0gX29ialRvVFMyWzFdLFxuICAgICAgICBpbnN0ID0gbmV3IERhdGVUaW1lKHtcbiAgICAgIHRzOiB0c0ZpbmFsLFxuICAgICAgem9uZTogem9uZVRvVXNlLFxuICAgICAgbzogb2Zmc2V0RmluYWwsXG4gICAgICBsb2M6IGxvY1xuICAgIH0pOyAvLyBncmVnb3JpYW4gZGF0YSArIHdlZWtkYXkgc2VydmVzIG9ubHkgdG8gdmFsaWRhdGVcblxuXG4gICAgaWYgKG5vcm1hbGl6ZWQud2Vla2RheSAmJiBjb250YWluc0dyZWdvciAmJiBvYmoud2Vla2RheSAhPT0gaW5zdC53ZWVrZGF5KSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZChcIm1pc21hdGNoZWQgd2Vla2RheVwiLCBcInlvdSBjYW4ndCBzcGVjaWZ5IGJvdGggYSB3ZWVrZGF5IG9mIFwiICsgbm9ybWFsaXplZC53ZWVrZGF5ICsgXCIgYW5kIGEgZGF0ZSBvZiBcIiArIGluc3QudG9JU08oKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3Q7XG4gIH07XG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERhdGVUaW1lIGZyb20gYW4gSVNPIDg2MDEgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgSVNPIHN0cmluZ1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0byBhZmZlY3QgdGhlIGNyZWF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW29wdHMuem9uZT0nbG9jYWwnXSAtIHVzZSB0aGlzIHpvbmUgaWYgbm8gb2Zmc2V0IGlzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgc3RyaW5nIGl0c2VsZi4gV2lsbCBhbHNvIGNvbnZlcnQgdGhlIHRpbWUgdG8gdGhpcyB6b25lXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSBmaXhlZC1vZmZzZXQgem9uZSBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZyBpdHNlbGYsIGlmIGl0IHNwZWNpZmllcyBvbmVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMubG9jYWxlPSdlbi1VUyddIC0gYSBsb2NhbGUgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byBzZXQgb24gdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpbnN0YW5jZVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtMDUtMjVUMDk6MDg6MzQuMTIzJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSVNPKCcyMDE2LTA1LTI1VDA5OjA4OjM0LjEyMyswNjowMCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMrMDY6MDAnLCB7c2V0Wm9uZTogdHJ1ZX0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbUlTTygnMjAxNi0wNS0yNVQwOTowODozNC4xMjMnLCB7em9uZTogJ3V0Yyd9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21JU08oJzIwMTYtVzA1LTQnKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUlTTyA9IGZ1bmN0aW9uIGZyb21JU08odGV4dCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX3BhcnNlSVNPRGF0ZSA9IHBhcnNlSVNPRGF0ZSh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZUlTT0RhdGVbMF0sXG4gICAgICAgIHBhcnNlZFpvbmUgPSBfcGFyc2VJU09EYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJJU08gODYwMVwiLCB0ZXh0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBSRkMgMjgyMiBzdHJpbmdcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBSRkMgMjgyMiBzdHJpbmdcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSBjb252ZXJ0IHRoZSB0aW1lIHRvIHRoaXMgem9uZS4gU2luY2UgdGhlIG9mZnNldCBpcyBhbHdheXMgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGludGVycHJldGF0aW9uIG9mIHN0cmluZywgbWVyZWx5IHRoZSB6b25lIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaXMgZXhwcmVzc2VkIGluLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc2V0Wm9uZT1mYWxzZV0gLSBvdmVycmlkZSB0aGUgem9uZSB3aXRoIGEgZml4ZWQtb2Zmc2V0IHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignMjUgTm92IDIwMTYgMTM6MjM6MTIgR01UJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tUkZDMjgyMignVHVlLCAyNSBOb3YgMjAxNiAxMzoyMzoxMiArMDYwMCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVJGQzI4MjIoJzI1IE5vdiAyMDE2IDEzOjIzIFonKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVJGQzI4MjIgPSBmdW5jdGlvbiBmcm9tUkZDMjgyMih0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VSRkMyODIyRGF0ZSA9IHBhcnNlUkZDMjgyMkRhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VSRkMyODIyRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVJGQzI4MjJEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJSRkMgMjgyMlwiLCB0ZXh0KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgRGF0ZVRpbWUgZnJvbSBhbiBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHNlZSBodHRwczovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy4zLjFcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBIVFRQIGhlYWRlciBkYXRlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gY29udmVydCB0aGUgdGltZSB0byB0aGlzIHpvbmUuIFNpbmNlIEhUVFAgZGF0ZXMgYXJlIGFsd2F5cyBpbiBVVEMsIHRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc3RyaW5nLCBtZXJlbHkgdGhlIHpvbmUgdGhlIHJlc3VsdGluZyBEYXRlVGltZSBpcyBleHByZXNzZWQgaW4uXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggdGhlIGZpeGVkLW9mZnNldCB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nLiBGb3IgSFRUUCBkYXRlcywgdGhpcyBpcyBhbHdheXMgVVRDLCBzbyB0aGlzIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGB6b25lYCBvcHRpb24gdG8gJ3V0YycsIGJ1dCB0aGlzIG9wdGlvbiBpcyBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzaW1pbGFyIG1ldGhvZHMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMubnVtYmVyaW5nU3lzdGVtIC0gdGhlIG51bWJlcmluZyBzeXN0ZW0gdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tSFRUUCgnU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQnKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21IVFRQKCdTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQnKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbUhUVFAgPSBmdW5jdGlvbiBmcm9tSFRUUCh0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VIVFRQRGF0ZSA9IHBhcnNlSFRUUERhdGUodGV4dCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VIVFRQRGF0ZVswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZUhUVFBEYXRlWzFdO1xuXG4gICAgcmV0dXJuIHBhcnNlRGF0YVRvRGF0ZVRpbWUodmFscywgcGFyc2VkWm9uZSwgb3B0cywgXCJIVFRQXCIsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGFuIGlucHV0IHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gdGhlIHN0cmluZyB0byBwYXJzZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbXQgLSB0aGUgZm9ybWF0IHRoZSBzdHJpbmcgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gKHNlZSBkZXNjcmlwdGlvbilcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIG9wdGlvbnMgdG8gYWZmZWN0IHRoZSBjcmVhdGlvblxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfFpvbmV9IFtvcHRzLnpvbmU9J2xvY2FsJ10gLSB1c2UgdGhpcyB6b25lIGlmIG5vIG9mZnNldCBpcyBzcGVjaWZpZWQgaW4gdGhlIGlucHV0IHN0cmluZyBpdHNlbGYuIFdpbGwgYWxzbyBjb252ZXJ0IHRoZSBEYXRlVGltZSB0byB0aGlzIHpvbmVcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLnNldFpvbmU9ZmFsc2VdIC0gb3ZlcnJpZGUgdGhlIHpvbmUgd2l0aCBhIHpvbmUgc3BlY2lmaWVkIGluIHRoZSBzdHJpbmcgaXRzZWxmLCBpZiBpdCBzcGVjaWZpZXMgb25lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmxvY2FsZT0nZW4tVVMnXSAtIGEgbG9jYWxlIHN0cmluZyB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSBEYXRlVGltZSB0byB0aGlzIGxvY2FsZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRzLm51bWJlcmluZ1N5c3RlbSAtIHRoZSBudW1iZXJpbmcgc3lzdGVtIHRvIHVzZSB3aGVuIHBhcnNpbmcuIFdpbGwgYWxzbyBzZXQgdGhlIHJlc3VsdGluZyBEYXRlVGltZSB0byB0aGlzIG51bWJlcmluZyBzeXN0ZW1cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5vdXRwdXRDYWxlbmRhciAtIHRoZSBvdXRwdXQgY2FsZW5kYXIgdG8gc2V0IG9uIHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgaW5zdGFuY2VcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXQgPSBmdW5jdGlvbiBmcm9tRm9ybWF0KHRleHQsIGZtdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbmRlZmluZWQodGV4dCkgfHwgaXNVbmRlZmluZWQoZm10KSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFwiZnJvbUZvcm1hdCByZXF1aXJlcyBhbiBpbnB1dCBzdHJpbmcgYW5kIGEgZm9ybWF0XCIpO1xuICAgIH1cblxuICAgIHZhciBfb3B0cyA9IG9wdHMsXG4gICAgICAgIF9vcHRzJGxvY2FsZSA9IF9vcHRzLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdHMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX29wdHMkbG9jYWxlLFxuICAgICAgICBfb3B0cyRudW1iZXJpbmdTeXN0ZW0gPSBfb3B0cy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9vcHRzJG51bWJlcmluZ1N5c3RlbSA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRzJG51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSksXG4gICAgICAgIF9wYXJzZUZyb21Ub2tlbnMgPSBwYXJzZUZyb21Ub2tlbnMobG9jYWxlVG9Vc2UsIHRleHQsIGZtdCksXG4gICAgICAgIHZhbHMgPSBfcGFyc2VGcm9tVG9rZW5zWzBdLFxuICAgICAgICBwYXJzZWRab25lID0gX3BhcnNlRnJvbVRva2Vuc1sxXSxcbiAgICAgICAgaW52YWxpZCA9IF9wYXJzZUZyb21Ub2tlbnNbMl07XG5cbiAgICBpZiAoaW52YWxpZCkge1xuICAgICAgcmV0dXJuIERhdGVUaW1lLmludmFsaWQoaW52YWxpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiZm9ybWF0IFwiICsgZm10LCB0ZXh0KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIHVzZSBmcm9tRm9ybWF0IGluc3RlYWRcclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21TdHJpbmcgPSBmdW5jdGlvbiBmcm9tU3RyaW5nKHRleHQsIGZtdCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUZvcm1hdCh0ZXh0LCBmbXQsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYSBEYXRlVGltZSBmcm9tIGEgU1FMIGRhdGUsIHRpbWUsIG9yIGRhdGV0aW1lXHJcbiAgICogRGVmYXVsdHMgdG8gZW4tVVMgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZCwgcmVnYXJkbGVzcyBvZiB0aGUgc3lzdGVtJ3MgbG9jYWxlXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSB0aGUgc3RyaW5nIHRvIHBhcnNlXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRvIGFmZmVjdCB0aGUgY3JlYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xab25lfSBbb3B0cy56b25lPSdsb2NhbCddIC0gdXNlIHRoaXMgem9uZSBpZiBubyBvZmZzZXQgaXMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBzdHJpbmcgaXRzZWxmLiBXaWxsIGFsc28gY29udmVydCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyB6b25lXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zZXRab25lPWZhbHNlXSAtIG92ZXJyaWRlIHRoZSB6b25lIHdpdGggYSB6b25lIHNwZWNpZmllZCBpbiB0aGUgc3RyaW5nIGl0c2VsZiwgaWYgaXQgc3BlY2lmaWVzIG9uZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5sb2NhbGU9J2VuLVVTJ10gLSBhIGxvY2FsZSBzdHJpbmcgdG8gdXNlIHdoZW4gcGFyc2luZy4gV2lsbCBhbHNvIHNldCB0aGUgRGF0ZVRpbWUgdG8gdGhpcyBsb2NhbGVcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0cy5udW1iZXJpbmdTeXN0ZW0gLSB0aGUgbnVtYmVyaW5nIHN5c3RlbSB0byB1c2Ugd2hlbiBwYXJzaW5nLiBXaWxsIGFsc28gc2V0IHRoZSByZXN1bHRpbmcgRGF0ZVRpbWUgdG8gdGhpcyBudW1iZXJpbmcgc3lzdGVtXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdHMub3V0cHV0Q2FsZW5kYXIgLSB0aGUgb3V0cHV0IGNhbGVuZGFyIHRvIHNldCBvbiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lIGluc3RhbmNlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNScpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNCcpXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzIwMTctMDUtMTUgMDk6MTI6MzQuMzQyKzA2OjAwJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJylcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5mcm9tU1FMKCcyMDE3LTA1LTE1IDA5OjEyOjM0LjM0MiBBbWVyaWNhL0xvc19BbmdlbGVzJywgeyBzZXRab25lOiB0cnVlIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUuZnJvbVNRTCgnMjAxNy0wNS0xNSAwOToxMjozNC4zNDInLCB7IHpvbmU6ICdBbWVyaWNhL0xvc19BbmdlbGVzJyB9KVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmZyb21TUUwoJzA5OjEyOjM0LjM0MicpXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5mcm9tU1FMID0gZnVuY3Rpb24gZnJvbVNRTCh0ZXh0LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcGFyc2VTUUwgPSBwYXJzZVNRTCh0ZXh0KSxcbiAgICAgICAgdmFscyA9IF9wYXJzZVNRTFswXSxcbiAgICAgICAgcGFyc2VkWm9uZSA9IF9wYXJzZVNRTFsxXTtcblxuICAgIHJldHVybiBwYXJzZURhdGFUb0RhdGVUaW1lKHZhbHMsIHBhcnNlZFpvbmUsIG9wdHMsIFwiU1FMXCIsIHRleHQpO1xuICB9O1xuICAvKipcclxuICAgKiBDcmVhdGUgYW4gaW52YWxpZCBEYXRlVGltZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVhc29uIC0gc2ltcGxlIHN0cmluZyBvZiB3aHkgdGhpcyBEYXRlVGltZSBpcyBpbnZhbGlkLiBTaG91bGQgbm90IGNvbnRhaW4gcGFyYW1ldGVycyBvciBhbnl0aGluZyBlbHNlIGRhdGEtZGVwZW5kZW50XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHBsYW5hdGlvbj1udWxsXSAtIGxvbmdlciBleHBsYW5hdGlvbiwgbWF5IGluY2x1ZGUgcGFyYW1ldGVycyBhbmQgb3RoZXIgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuaW52YWxpZCA9IGZ1bmN0aW9uIGludmFsaWQocmVhc29uLCBleHBsYW5hdGlvbikge1xuICAgIGlmIChleHBsYW5hdGlvbiA9PT0gdm9pZCAwKSB7XG4gICAgICBleHBsYW5hdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCFyZWFzb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZFwiKTtcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZCA9IHJlYXNvbiBpbnN0YW5jZW9mIEludmFsaWQgPyByZWFzb24gOiBuZXcgSW52YWxpZChyZWFzb24sIGV4cGxhbmF0aW9uKTtcblxuICAgIGlmIChTZXR0aW5ncy50aHJvd09uSW52YWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRlVGltZUVycm9yKGludmFsaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IERhdGVUaW1lKHtcbiAgICAgICAgaW52YWxpZDogaW52YWxpZFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICAvKipcclxuICAgKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgYSBEYXRlVGltZS4gV29ya3MgYWNyb3NzIGNvbnRleHQgYm91bmRhcmllc1xyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmlzRGF0ZVRpbWUgPSBmdW5jdGlvbiBpc0RhdGVUaW1lKG8pIHtcbiAgICByZXR1cm4gby5pc0x1eG9uRGF0ZVRpbWU7XG4gIH07IC8vIElORk9cblxuICAvKipcclxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHVuaXQuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBhIHVuaXQgc3VjaCBhcyAnbWludXRlJyBvciAnZGF5J1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDcsIDQpLmdldCgnbW9udGgnKTsgLy89PiA3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNywgNCkuZ2V0KCdkYXknKTsgLy89PiA0XHJcbiAgICogQHJldHVybiB7bnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IERhdGVUaW1lLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KHVuaXQpIHtcbiAgICByZXR1cm4gdGhpc1t1bml0XTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyB2YWxpZC4gSW52YWxpZCBEYXRlVGltZXMgb2NjdXIgd2hlbjpcclxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBmcm9tIGludmFsaWQgY2FsZW5kYXIgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIDEzdGggbW9udGggb3IgRmVicnVhcnkgMzBcclxuICAgKiAqIFRoZSBEYXRlVGltZSB3YXMgY3JlYXRlZCBieSBhbiBvcGVyYXRpb24gb24gYW5vdGhlciBpbnZhbGlkIGRhdGVcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cblxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIEludGwgb3B0aW9ucyBmb3IgdGhpcyBEYXRlVGltZS5cclxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpbiB1bmRlcnN0YW5kaW5nIHRoZSBiZWhhdmlvciBvZiBmb3JtYXR0aW5nIG1ldGhvZHNcclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIHRoZSBzYW1lIG9wdGlvbnMgYXMgdG9Mb2NhbGVTdHJpbmdcclxuICAgKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAgICovXG4gIF9wcm90by5yZXNvbHZlZExvY2FsZU9wdHMgPSBmdW5jdGlvbiByZXNvbHZlZExvY2FsZU9wdHMob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX0Zvcm1hdHRlciRjcmVhdGUkcmVzID0gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykucmVzb2x2ZWRPcHRpb25zKHRoaXMpLFxuICAgICAgICBsb2NhbGUgPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMubG9jYWxlLFxuICAgICAgICBudW1iZXJpbmdTeXN0ZW0gPSBfRm9ybWF0dGVyJGNyZWF0ZSRyZXMubnVtYmVyaW5nU3lzdGVtLFxuICAgICAgICBjYWxlbmRhciA9IF9Gb3JtYXR0ZXIkY3JlYXRlJHJlcy5jYWxlbmRhcjtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IGNhbGVuZGFyXG4gICAgfTtcbiAgfTsgLy8gVFJBTlNGT1JNXG5cbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgRGF0ZVRpbWUncyB6b25lIHRvIFVUQy4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqXHJcbiAgICogRXF1aXZhbGVudCB0byB7QGxpbmsgc2V0Wm9uZX0oJ3V0YycpXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtvZmZzZXQ9MF0gLSBvcHRpb25hbGx5LCBhbiBvZmZzZXQgZnJvbSBVVEMgaW4gbWludXRlc1xyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cz17fV0gLSBvcHRpb25zIHRvIHBhc3MgdG8gYHNldFpvbmUoKWBcclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by50b1VUQyA9IGZ1bmN0aW9uIHRvVVRDKG9mZnNldCwgb3B0cykge1xuICAgIGlmIChvZmZzZXQgPT09IHZvaWQgMCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShGaXhlZE9mZnNldFpvbmUuaW5zdGFuY2Uob2Zmc2V0KSwgb3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIERhdGVUaW1lJ3Mgem9uZSB0byB0aGUgaG9zdCdzIGxvY2FsIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEVxdWl2YWxlbnQgdG8gYHNldFpvbmUoJ2xvY2FsJylgXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9Mb2NhbCA9IGZ1bmN0aW9uIHRvTG9jYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0Wm9uZShuZXcgTG9jYWxab25lKCkpO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSBEYXRlVGltZSdzIHpvbmUgdG8gc3BlY2lmaWVkIHpvbmUuIFJldHVybnMgYSBuZXdseS1jb25zdHJ1Y3RlZCBEYXRlVGltZS5cclxuICAgKlxyXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBzZXR0ZXIga2VlcHMgdGhlIHVuZGVybHlpbmcgdGltZSB0aGUgc2FtZSAoYXMgaW4sIHRoZSBzYW1lIFVUQyB0aW1lc3RhbXApLCBidXQgdGhlIG5ldyBpbnN0YW5jZSB3aWxsIHJlcG9ydCBkaWZmZXJlbnQgbG9jYWwgdGltZXMgYW5kIGNvbnNpZGVyIERTVHMgd2hlbiBtYWtpbmcgY29tcHV0YXRpb25zLCBhcyB3aXRoIHtAbGluayBwbHVzfS4gWW91IG1heSB3aXNoIHRvIHVzZSB7QGxpbmsgdG9Mb2NhbH0gYW5kIHtAbGluayB0b1VUQ30gd2hpY2ggcHJvdmlkZSBzaW1wbGUgY29udmVuaWVuY2Ugd3JhcHBlcnMgZm9yIGNvbW1vbmx5IHVzZWQgem9uZXMuXHJcbiAgICogQHBhcmFtIHtzdHJpbmd8Wm9uZX0gW3pvbmU9J2xvY2FsJ10gLSBhIHpvbmUgaWRlbnRpZmllci4gQXMgYSBzdHJpbmcsIHRoYXQgY2FuIGJlIGFueSBJQU5BIHpvbmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IGVudmlyb25tZW50LCBvciBhIGZpeGVkLW9mZnNldCBuYW1lIG9mIHRoZSBmb3JtICd1dGMrMycsIG9yIHRoZSBzdHJpbmdzICdsb2NhbCcgb3IgJ3V0YycuIFlvdSBtYXkgYWxzbyBzdXBwbHkgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgWm9uZX0gY2xhc3MuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5rZWVwTG9jYWxUaW1lPWZhbHNlXSAtIElmIHRydWUsIGFkanVzdCB0aGUgdW5kZXJseWluZyB0aW1lIHNvIHRoYXQgdGhlIGxvY2FsIHRpbWUgc3RheXMgdGhlIHNhbWUsIGJ1dCBpbiB0aGUgdGFyZ2V0IHpvbmUuIFlvdSBzaG91bGQgcmFyZWx5IG5lZWQgdGhpcy5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by5zZXRab25lID0gZnVuY3Rpb24gc2V0Wm9uZSh6b25lLCBfdGVtcCkge1xuICAgIHZhciBfcmVmMyA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBfcmVmMyRrZWVwTG9jYWxUaW1lID0gX3JlZjMua2VlcExvY2FsVGltZSxcbiAgICAgICAga2VlcExvY2FsVGltZSA9IF9yZWYzJGtlZXBMb2NhbFRpbWUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjMka2VlcExvY2FsVGltZSxcbiAgICAgICAgX3JlZjMka2VlcENhbGVuZGFyVGltID0gX3JlZjMua2VlcENhbGVuZGFyVGltZSxcbiAgICAgICAga2VlcENhbGVuZGFyVGltZSA9IF9yZWYzJGtlZXBDYWxlbmRhclRpbSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMyRrZWVwQ2FsZW5kYXJUaW07XG5cbiAgICB6b25lID0gbm9ybWFsaXplWm9uZSh6b25lLCBTZXR0aW5ncy5kZWZhdWx0Wm9uZSk7XG5cbiAgICBpZiAoem9uZS5lcXVhbHModGhpcy56b25lKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBlbHNlIGlmICghem9uZS5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCh1bnN1cHBvcnRlZFpvbmUoem9uZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbmV3VFMgPSBrZWVwTG9jYWxUaW1lIHx8IGtlZXBDYWxlbmRhclRpbWUgLy8ga2VlcENhbGVuZGFyVGltZSBpcyB0aGUgZGVwcmVjYXRlZCBuYW1lIGZvciBrZWVwTG9jYWxUaW1lXG4gICAgICA/IHRoaXMudHMgKyAodGhpcy5vIC0gem9uZS5vZmZzZXQodGhpcy50cykpICogNjAgKiAxMDAwIDogdGhpcy50cztcbiAgICAgIHJldHVybiBjbG9uZSQxKHRoaXMsIHtcbiAgICAgICAgdHM6IG5ld1RTLFxuICAgICAgICB6b25lOiB6b25lXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIFwiU2V0XCIgdGhlIGxvY2FsZSwgbnVtYmVyaW5nU3lzdGVtLCBvciBvdXRwdXRDYWxlbmRhci4gUmV0dXJucyBhIG5ld2x5LWNvbnN0cnVjdGVkIERhdGVUaW1lLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIC0gdGhlIHByb3BlcnRpZXMgdG8gc2V0XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnJlY29uZmlndXJlKHsgbG9jYWxlOiAnZW4tR0InIH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8ucmVjb25maWd1cmUgPSBmdW5jdGlvbiByZWNvbmZpZ3VyZShfdGVtcDIpIHtcbiAgICB2YXIgX3JlZjQgPSBfdGVtcDIgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAyLFxuICAgICAgICBsb2NhbGUgPSBfcmVmNC5sb2NhbGUsXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9yZWY0Lm51bWJlcmluZ1N5c3RlbSxcbiAgICAgICAgb3V0cHV0Q2FsZW5kYXIgPSBfcmVmNC5vdXRwdXRDYWxlbmRhcjtcblxuICAgIHZhciBsb2MgPSB0aGlzLmxvYy5jbG9uZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgIG51bWJlcmluZ1N5c3RlbTogbnVtYmVyaW5nU3lzdGVtLFxuICAgICAgb3V0cHV0Q2FsZW5kYXI6IG91dHB1dENhbGVuZGFyXG4gICAgfSk7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywge1xuICAgICAgbG9jOiBsb2NcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGUgbG9jYWxlLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogSnVzdCBhIGNvbnZlbmllbnQgYWxpYXMgZm9yIHJlY29uZmlndXJlKHsgbG9jYWxlIH0pXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnNldExvY2FsZSgnZW4tR0InKVxyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnNldExvY2FsZSA9IGZ1bmN0aW9uIHNldExvY2FsZShsb2NhbGUpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvbmZpZ3VyZSh7XG4gICAgICBsb2NhbGU6IGxvY2FsZVxuICAgIH0pO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoZSB2YWx1ZXMgb2Ygc3BlY2lmaWVkIHVuaXRzLiBSZXR1cm5zIGEgbmV3bHktY29uc3RydWN0ZWQgRGF0ZVRpbWUuXHJcbiAgICogWW91IGNhbiBvbmx5IHNldCB1bml0cyB3aXRoIHRoaXMgbWV0aG9kOyBmb3IgXCJzZXR0aW5nXCIgbWV0YWRhdGEsIHNlZSB7QGxpbmsgcmVjb25maWd1cmV9IGFuZCB7QGxpbmsgc2V0Wm9uZX0uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlcyAtIGEgbWFwcGluZyBvZiB1bml0cyB0byBudW1iZXJzXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAxNyB9KVxyXG4gICAqIEBleGFtcGxlIGR0LnNldCh7IGhvdXI6IDgsIG1pbnV0ZTogMzAgfSlcclxuICAgKiBAZXhhbXBsZSBkdC5zZXQoeyB3ZWVrZGF5OiA1IH0pXHJcbiAgICogQGV4YW1wbGUgZHQuc2V0KHsgeWVhcjogMjAwNSwgb3JkaW5hbDogMjM0IH0pXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc2V0ID0gZnVuY3Rpb24gc2V0KHZhbHVlcykge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZU9iamVjdCh2YWx1ZXMsIG5vcm1hbGl6ZVVuaXQpLFxuICAgICAgICBzZXR0aW5nV2Vla1N0dWZmID0gIWlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQud2Vla1llYXIpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtOdW1iZXIpIHx8ICFpc1VuZGVmaW5lZChub3JtYWxpemVkLndlZWtkYXkpO1xuICAgIHZhciBtaXhlZDtcblxuICAgIGlmIChzZXR0aW5nV2Vla1N0dWZmKSB7XG4gICAgICBtaXhlZCA9IHdlZWtUb0dyZWdvcmlhbihPYmplY3QuYXNzaWduKGdyZWdvcmlhblRvV2Vlayh0aGlzLmMpLCBub3JtYWxpemVkKSk7XG4gICAgfSBlbHNlIGlmICghaXNVbmRlZmluZWQobm9ybWFsaXplZC5vcmRpbmFsKSkge1xuICAgICAgbWl4ZWQgPSBvcmRpbmFsVG9HcmVnb3JpYW4oT2JqZWN0LmFzc2lnbihncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKSwgbm9ybWFsaXplZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaXhlZCA9IE9iamVjdC5hc3NpZ24odGhpcy50b09iamVjdCgpLCBub3JtYWxpemVkKTsgLy8gaWYgd2UgZGlkbid0IHNldCB0aGUgZGF5IGJ1dCB3ZSBlbmRlZCB1cCBvbiBhbiBvdmVyZmxvdyBkYXRlLFxuICAgICAgLy8gdXNlIHRoZSBsYXN0IGRheSBvZiB0aGUgcmlnaHQgbW9udGhcblxuICAgICAgaWYgKGlzVW5kZWZpbmVkKG5vcm1hbGl6ZWQuZGF5KSkge1xuICAgICAgICBtaXhlZC5kYXkgPSBNYXRoLm1pbihkYXlzSW5Nb250aChtaXhlZC55ZWFyLCBtaXhlZC5tb250aCksIG1peGVkLmRheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIF9vYmpUb1RTMyA9IG9ialRvVFMobWl4ZWQsIHRoaXMubywgdGhpcy56b25lKSxcbiAgICAgICAgdHMgPSBfb2JqVG9UUzNbMF0sXG4gICAgICAgIG8gPSBfb2JqVG9UUzNbMV07XG5cbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCB7XG4gICAgICB0czogdHMsXG4gICAgICBvOiBvXG4gICAgfSk7XG4gIH07XG4gIC8qKlxyXG4gICAqIEFkZCBhIHBlcmlvZCBvZiB0aW1lIHRvIHRoaXMgRGF0ZVRpbWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIERhdGVUaW1lXHJcbiAgICpcclxuICAgKiBBZGRpbmcgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG9yIG1pbGxpc2Vjb25kcyBpbmNyZWFzZXMgdGhlIHRpbWVzdGFtcCBieSB0aGUgcmlnaHQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4gQWRkaW5nIGRheXMsIG1vbnRocywgb3IgeWVhcnMgc2hpZnRzIHRoZSBjYWxlbmRhciwgYWNjb3VudGluZyBmb3IgRFNUcyBhbmQgbGVhcCB5ZWFycyBhbG9uZyB0aGUgd2F5LiBUaHVzLCBgZHQucGx1cyh7IGhvdXJzOiAyNCB9KWAgbWF5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCB0aW1lIHRoYW4gYGR0LnBsdXMoeyBkYXlzOiAxIH0pYCBpZiB0aGVyZSdzIGEgRFNUIHNoaWZ0IGluIGJldHdlZW4uXHJcbiAgICogQHBhcmFtIHtEdXJhdGlvbnxPYmplY3R8bnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbW91bnQgdG8gYWRkLiBFaXRoZXIgYSBMdXhvbiBEdXJhdGlvbiwgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLCB0aGUgb2JqZWN0IGFyZ3VtZW50IHRvIER1cmF0aW9uLmZyb21PYmplY3QoKVxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cygxMjMpIC8vfj4gaW4gMTIzIG1pbGxpc2Vjb25kc1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cyh7IG1pbnV0ZXM6IDE1IH0pIC8vfj4gaW4gMTUgbWludXRlc1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkucGx1cyh7IGRheXM6IDEgfSkgLy9+PiB0aGlzIHRpbWUgdG9tb3Jyb3dcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBkYXlzOiAtMSB9KSAvL34+IHRoaXMgdGltZSB5ZXN0ZXJkYXlcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoeyBob3VyczogMywgbWludXRlczogMTMgfSkgLy9+PiBpbiAxIGhyLCAxMyBtaW5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnBsdXMoRHVyYXRpb24uZnJvbU9iamVjdCh7IGhvdXJzOiAzLCBtaW51dGVzOiAxMyB9KSkgLy9+PiBpbiAxIGhyLCAxMyBtaW5cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX1cclxuICAgKi9cblxuXG4gIF9wcm90by5wbHVzID0gZnVuY3Rpb24gcGx1cyhkdXJhdGlvbikge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgZHVyID0gZnJpZW5kbHlEdXJhdGlvbihkdXJhdGlvbik7XG4gICAgcmV0dXJuIGNsb25lJDEodGhpcywgYWRqdXN0VGltZSh0aGlzLCBkdXIpKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogU3VidHJhY3QgYSBwZXJpb2Qgb2YgdGltZSB0byB0aGlzIERhdGVUaW1lIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBEYXRlVGltZVxyXG4gICAqIFNlZSB7QGxpbmsgcGx1c31cclxuICAgKiBAcGFyYW0ge0R1cmF0aW9ufE9iamVjdHxudW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFtb3VudCB0byBzdWJ0cmFjdC4gRWl0aGVyIGEgTHV4b24gRHVyYXRpb24sIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgdGhlIG9iamVjdCBhcmd1bWVudCB0byBEdXJhdGlvbi5mcm9tT2JqZWN0KClcclxuICAgQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgKi9cblxuXG4gIF9wcm90by5taW51cyA9IGZ1bmN0aW9uIG1pbnVzKGR1cmF0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHJldHVybiB0aGlzO1xuICAgIHZhciBkdXIgPSBmcmllbmRseUR1cmF0aW9uKGR1cmF0aW9uKS5uZWdhdGUoKTtcbiAgICByZXR1cm4gY2xvbmUkMSh0aGlzLCBhZGp1c3RUaW1lKHRoaXMsIGR1cikpO1xuICB9O1xuICAvKipcclxuICAgKiBcIlNldFwiIHRoaXMgRGF0ZVRpbWUgdG8gdGhlIGJlZ2lubmluZyBvZiBhIHVuaXQgb2YgdGltZS5cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5pdCAtIFRoZSB1bml0IHRvIGdvIHRvIHRoZSBiZWdpbm5pbmcgb2YuIENhbiBiZSAneWVhcicsICdtb250aCcsICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJywgb3IgJ21pbGxpc2Vjb25kJy5cclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzKS5zdGFydE9mKCdtb250aCcpLnRvSVNPRGF0ZSgpOyAvLz0+ICcyMDE0LTAzLTAxJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMpLnN0YXJ0T2YoJ3llYXInKS50b0lTT0RhdGUoKTsgLy89PiAnMjAxNC0wMS0wMSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignZGF5JykudG9JU09UaW1lKCk7IC8vPT4gJzAwOjAwLjAwMC0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuc3RhcnRPZignaG91cicpLnRvSVNPVGltZSgpOyAvLz0+ICcwNTowMDowMC4wMDAtMDU6MDAnXHJcbiAgICogQHJldHVybiB7RGF0ZVRpbWV9XHJcbiAgICovXG5cblxuICBfcHJvdG8uc3RhcnRPZiA9IGZ1bmN0aW9uIHN0YXJ0T2YodW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gdGhpcztcbiAgICB2YXIgbyA9IHt9LFxuICAgICAgICBub3JtYWxpemVkVW5pdCA9IER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQodW5pdCk7XG5cbiAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRVbml0KSB7XG4gICAgICBjYXNlIFwieWVhcnNcIjpcbiAgICAgICAgby5tb250aCA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJxdWFydGVyc1wiOlxuICAgICAgY2FzZSBcIm1vbnRoc1wiOlxuICAgICAgICBvLmRheSA9IDE7XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG5cbiAgICAgIGNhc2UgXCJ3ZWVrc1wiOlxuICAgICAgY2FzZSBcImRheXNcIjpcbiAgICAgICAgby5ob3VyID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcImhvdXJzXCI6XG4gICAgICAgIG8ubWludXRlID0gMDtcbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcblxuICAgICAgY2FzZSBcIm1pbnV0ZXNcIjpcbiAgICAgICAgby5zZWNvbmQgPSAwO1xuICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgICBjYXNlIFwic2Vjb25kc1wiOlxuICAgICAgICBvLm1pbGxpc2Vjb25kID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJtaWxsaXNlY29uZHNcIjpcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVW5pdEVycm9yKHVuaXQpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkVW5pdCA9PT0gXCJ3ZWVrc1wiKSB7XG4gICAgICBvLndlZWtkYXkgPSAxO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkVW5pdCA9PT0gXCJxdWFydGVyc1wiKSB7XG4gICAgICB2YXIgcSA9IE1hdGguY2VpbCh0aGlzLm1vbnRoIC8gMyk7XG4gICAgICBvLm1vbnRoID0gKHEgLSAxKSAqIDMgKyAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldChvKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogXCJTZXRcIiB0aGlzIERhdGVUaW1lIHRvIHRoZSBlbmQgKGkuZS4gdGhlIGxhc3QgbWlsbGlzZWNvbmQpIG9mIGEgdW5pdCBvZiB0aW1lXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVuaXQgLSBUaGUgdW5pdCB0byBnbyB0byB0aGUgZW5kIG9mLiBDYW4gYmUgJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsIG9yICdtaWxsaXNlY29uZCcuXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ21vbnRoJykudG9JU08oKTsgLy89PiAnMjAxNC0wMy0zMVQyMzo1OTo1OS45OTktMDU6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNCwgMywgMykuZW5kT2YoJ3llYXInKS50b0lTTygpOyAvLz0+ICcyMDE0LTEyLTMxVDIzOjU5OjU5Ljk5OS0wNTowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAzLCAzLCA1LCAzMCkuZW5kT2YoJ2RheScpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMjM6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDMsIDMsIDUsIDMwKS5lbmRPZignaG91cicpLnRvSVNPKCk7IC8vPT4gJzIwMTQtMDMtMDNUMDU6NTk6NTkuOTk5LTA1OjAwJ1xyXG4gICAqIEByZXR1cm4ge0RhdGVUaW1lfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmVuZE9mID0gZnVuY3Rpb24gZW5kT2YodW5pdCkge1xuICAgIHZhciBfdGhpcyRzdGFydE9mJHBsdXM7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5zdGFydE9mKHVuaXQpLnBsdXMoKF90aGlzJHN0YXJ0T2YkcGx1cyA9IHt9LCBfdGhpcyRzdGFydE9mJHBsdXNbdW5pdF0gPSAxLCBfdGhpcyRzdGFydE9mJHBsdXMpKS5taW51cygxKSA6IHRoaXM7XG4gIH07IC8vIE9VVFBVVFxuXG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy5cclxuICAgKiAqKllvdSBtYXkgbm90IHdhbnQgdGhpcy4qKiBTZWUge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3IgYSBtb3JlIGZsZXhpYmxlIGZvcm1hdHRpbmcgdG9vbC4gRm9yIGEgdGFibGUgb2YgdG9rZW5zIGFuZCB0aGVpciBpbnRlcnByZXRhdGlvbnMsIHNlZSBbaGVyZV0oaHR0cHM6Ly9tb21lbnQuZ2l0aHViLmlvL2x1eG9uL2RvY3MvbWFudWFsL2Zvcm1hdHRpbmcuaHRtbCN0YWJsZS1vZi10b2tlbnMpLlxyXG4gICAqIERlZmF1bHRzIHRvIGVuLVVTIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN5c3RlbSdzIGxvY2FsZS5cclxuICAgKiBAc2VlIGh0dHBzOi8vbW9tZW50LmdpdGh1Yi5pby9sdXhvbi9kb2NzL21hbnVhbC9mb3JtYXR0aW5nLmh0bWwjdGFibGUtb2YtdG9rZW5zXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZtdCAtIHRoZSBmb3JtYXQgc3RyaW5nXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRzIHRvIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgQXByIDIyJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuc2V0TG9jYWxlKCdmcicpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcpIC8vPT4gJzIwMTcgYXZyLiAyMidcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvRm9ybWF0KCd5eXl5IExMTCBkZCcsIHsgbG9jYWxlOiBcImZyXCIgfSkgLy89PiAnMjAxNyBhdnIuIDIyJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9Gb3JtYXQoXCJISCAnaG91cnMgYW5kJyBtbSAnbWludXRlcydcIikgLy89PiAnMjAgaG91cnMgYW5kIDU1IG1pbnV0ZXMnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvRm9ybWF0ID0gZnVuY3Rpb24gdG9Gb3JtYXQoZm10LCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBGb3JtYXR0ZXIuY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4ob3B0cykpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLCBmbXQpIDogSU5WQUxJRCQyO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgbG9jYWxpemVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyBkYXRlLiBBY2NlcHRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgdGhlIEludGwuRGF0ZVRpbWVGb3JtYXQgY29uc3RydWN0b3IgYW5kIGFueSBwcmVzZXRzIGRlZmluZWQgYnkgTHV4b24sIHN1Y2ggYXMgYERhdGVUaW1lLkRBVEVfRlVMTGAgb3IgYERhdGVUaW1lLlRJTUVfU0lNUExFYC5cclxuICAgKiBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgYnJvd3Nlci1zcGVjaWZpYywgYnV0IGluIGdlbmVyYWwgaXQgd2lsbCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgcmVwcmVzZW50YXRpb24uXHJcbiAgICogb2YgdGhlIERhdGVUaW1lIGluIHRoZSBhc3NpZ25lZCBsb2NhbGUuXHJcbiAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9EYXRlVGltZUZvcm1hdFxyXG4gICAqIEBwYXJhbSBvcHRzIHtPYmplY3R9IC0gSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBvcHRpb25zIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnNcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKCk7IC8vPT4gNC8yMC8yMDE3XHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS5zZXRMb2NhbGUoJ2VuLWdiJykudG9Mb2NhbGVTdHJpbmcoKTsgLy89PiAnMjAvMDQvMjAxNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHsgbG9jYWxlOiBcImVuLWdiXCIgfSk7IC8vPT4gJzIwLzA0LzIwMTcnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX0ZVTEwpOyAvLz0+ICdBcHJpbCAyMCwgMjAxNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLlRJTUVfU0lNUExFKTsgLy89PiAnMTE6MzIgQU0nXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFVElNRV9TSE9SVCk7IC8vPT4gJzQvMjAvMjAxNywgMTE6MzIgQU0nXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZyh7d2Vla2RheTogJ2xvbmcnLCBtb250aDogJ2xvbmcnLCBkYXk6ICcyLWRpZ2l0J30pOyAvLz0+ICdUaHUsIEFwciAyMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHt3ZWVrZGF5OiAnbG9uZycsIG1vbnRoOiAnbG9uZycsIGRheTogJzItZGlnaXQnLCBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnfSk7IC8vPT4gJ1RodSwgQXByIDIwLCAxMToyNydcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvTG9jYWxlU3RyaW5nKHtob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnfSk7IC8vPT4gJzExOjMyJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0gREFURV9TSE9SVDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWUodGhpcykgOiBJTlZBTElEJDI7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgZm9ybWF0IFwicGFydHNcIiwgaS5lLiBpbmRpdmlkdWFsIHRva2VucyBhbG9uZyB3aXRoIG1ldGFkYXRhLiBUaGlzIGlzIGFsbG93cyBjYWxsZXJzIHRvIHBvc3QtcHJvY2VzcyBpbmRpdmlkdWFsIHNlY3Rpb25zIG9mIHRoZSBmb3JtYXR0ZWQgb3V0cHV0LlxyXG4gICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZVRpbWVGb3JtYXQvZm9ybWF0VG9QYXJ0c1xyXG4gICAqIEBwYXJhbSBvcHRzIHtPYmplY3R9IC0gSW50bC5EYXRlVGltZUZvcm1hdCBjb25zdHJ1Y3RvciBvcHRpb25zLCBzYW1lIGFzIGB0b0xvY2FsZVN0cmluZ2AuXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0xvY2FsZVN0cmluZygpOyAvLz0+IFtcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPT4gICB7IHR5cGU6ICdkYXknLCB2YWx1ZTogJzI1JyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAnbW9udGgnLCB2YWx1ZTogJzA1JyB9LFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiAgIHsgdHlwZTogJ2xpdGVyYWwnLCB2YWx1ZTogJy8nIH0sXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLz0+ICAgeyB0eXBlOiAneWVhcicsIHZhbHVlOiAnMTk4MicgfVxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy89PiBdXHJcbiAgICovXG5cblxuICBfcHJvdG8udG9Mb2NhbGVQYXJ0cyA9IGZ1bmN0aW9uIHRvTG9jYWxlUGFydHMob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gRm9ybWF0dGVyLmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShvcHRzKSwgb3B0cykuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKSA6IFtdO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9uc1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NNaWxsaXNlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBtaWxsaXNlY29uZHMgZnJvbSB0aGUgZm9ybWF0IGlmIHRoZXkncmUgMFxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuc3VwcHJlc3NTZWNvbmRzPWZhbHNlXSAtIGV4Y2x1ZGUgc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygxOTgyLCA1LCAyNSkudG9JU08oKSAvLz0+ICcxOTgyLTA1LTI1VDAwOjAwOjAwLjAwMFonXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b0lTTygpIC8vPT4gJzIwMTctMDQtMjJUMjA6NDc6MDUuMzM1LTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkudG9JU08oeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE3LTA0LTIyVDIwOjQ3OjA1LjMzNSdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9JU08gPSBmdW5jdGlvbiB0b0lTTyhvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50b0lTT0RhdGUoKSArIFwiVFwiICsgdGhpcy50b0lTT1RpbWUob3B0cyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYW4gSVNPIDg2MDEtY29tcGxpYW50IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lJ3MgZGF0ZSBjb21wb25lbnRcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPRGF0ZSgpIC8vPT4gJzE5ODItMDUtMjUnXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSVNPRGF0ZSA9IGZ1bmN0aW9uIHRvSVNPRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwieXl5eS1NTS1kZFwiKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBJU08gODYwMS1jb21wbGlhbnQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUncyB3ZWVrIGRhdGVcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMTk4MiwgNSwgMjUpLnRvSVNPV2Vla0RhdGUoKSAvLz0+ICcxOTgyLVcyMS0yJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0lTT1dlZWtEYXRlID0gZnVuY3Rpb24gdG9JU09XZWVrRGF0ZSgpIHtcbiAgICByZXR1cm4gdG9UZWNoRm9ybWF0KHRoaXMsIFwia2tray0nVydXVy1jXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxLWNvbXBsaWFudCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSdzIHRpbWUgY29tcG9uZW50XHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc01pbGxpc2Vjb25kcz1mYWxzZV0gLSBleGNsdWRlIG1pbGxpc2Vjb25kcyBmcm9tIHRoZSBmb3JtYXQgaWYgdGhleSdyZSAwXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5zdXBwcmVzc1NlY29uZHM9ZmFsc2VdIC0gZXhjbHVkZSBzZWNvbmRzIGZyb20gdGhlIGZvcm1hdCBpZiB0aGV5J3JlIDBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuaG91cig3KS5taW51dGUoMzQpLnRvSVNPVGltZSgpIC8vPT4gJzA3OjM0OjE5LjM2MVonXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkuaG91cig3KS5taW51dGUoMzQpLnRvSVNPVGltZSh7IHN1cHByZXNzU2Vjb25kczogdHJ1ZSB9KSAvLz0+ICcwNzozNFonXHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvSVNPVGltZSA9IGZ1bmN0aW9uIHRvSVNPVGltZShfdGVtcDMpIHtcbiAgICB2YXIgX3JlZjUgPSBfdGVtcDMgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAzLFxuICAgICAgICBfcmVmNSRzdXBwcmVzc01pbGxpc2UgPSBfcmVmNS5zdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgICAgc3VwcHJlc3NNaWxsaXNlY29uZHMgPSBfcmVmNSRzdXBwcmVzc01pbGxpc2UgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjUkc3VwcHJlc3NNaWxsaXNlLFxuICAgICAgICBfcmVmNSRzdXBwcmVzc1NlY29uZHMgPSBfcmVmNS5zdXBwcmVzc1NlY29uZHMsXG4gICAgICAgIHN1cHByZXNzU2Vjb25kcyA9IF9yZWY1JHN1cHByZXNzU2Vjb25kcyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNSRzdXBwcmVzc1NlY29uZHMsXG4gICAgICAgIF9yZWY1JGluY2x1ZGVPZmZzZXQgPSBfcmVmNS5pbmNsdWRlT2Zmc2V0LFxuICAgICAgICBpbmNsdWRlT2Zmc2V0ID0gX3JlZjUkaW5jbHVkZU9mZnNldCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWY1JGluY2x1ZGVPZmZzZXQ7XG5cbiAgICByZXR1cm4gdG9UZWNoVGltZUZvcm1hdCh0aGlzLCB7XG4gICAgICBzdXBwcmVzc1NlY29uZHM6IHN1cHByZXNzU2Vjb25kcyxcbiAgICAgIHN1cHByZXNzTWlsbGlzZWNvbmRzOiBzdXBwcmVzc01pbGxpc2Vjb25kcyxcbiAgICAgIGluY2x1ZGVPZmZzZXQ6IGluY2x1ZGVPZmZzZXRcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhbiBSRkMgMjgyMi1jb21wYXRpYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lLCBhbHdheXMgaW4gVVRDXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1JGQzI4MjIoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwICswMDAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1JGQzI4MjIoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIC0wNDAwJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1JGQzI4MjIgPSBmdW5jdGlvbiB0b1JGQzI4MjIoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaXCIpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBIVFRQIGhlYWRlcnMuXHJcbiAgICogU3BlY2lmaWNhbGx5LCB0aGUgc3RyaW5nIGNvbmZvcm1zIHRvIFJGQyAxMTIzLlxyXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMy5odG1sI3NlYzMuMy4xXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDAwOjAwOjAwIEdNVCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS51dGMoMjAxNCwgNywgMTMsIDE5KS50b0hUVFAoKSAvLz0+ICdTdW4sIDEzIEp1bCAyMDE0IDE5OjAwOjAwIEdNVCdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9IVFRQID0gZnVuY3Rpb24gdG9IVFRQKCkge1xuICAgIHJldHVybiB0b1RlY2hGb3JtYXQodGhpcy50b1VUQygpLCBcIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgJ0dNVCdcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBEYXRlXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKDIwMTQsIDcsIDEzKS50b1NRTERhdGUoKSAvLz0+ICcyMDE0LTA3LTEzJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NRTERhdGUgPSBmdW5jdGlvbiB0b1NRTERhdGUoKSB7XG4gICAgcmV0dXJuIHRvVGVjaEZvcm1hdCh0aGlzLCBcInl5eXktTU0tZGRcIik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEYXRlVGltZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIFNRTCBUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlWm9uZT1mYWxzZV0gLSBpbmNsdWRlIHRoZSB6b25lLCBzdWNoIGFzICdBbWVyaWNhL05ld19Zb3JrJy4gT3ZlcmlkZXMgaW5jbHVkZU9mZnNldC5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmluY2x1ZGVPZmZzZXQ9dHJ1ZV0gLSBpbmNsdWRlIHRoZSBvZmZzZXQsIHN1Y2ggYXMgJ1onIG9yICctMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkudG9TUUwoKSAvLz0+ICcwNToxNToxNi4zNDUnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCgpIC8vPT4gJzA1OjE1OjE2LjM0NSAtMDQ6MDAnXHJcbiAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoKS50b1NRTCh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvU1FMKHsgaW5jbHVkZVpvbmU6IGZhbHNlIH0pIC8vPT4gJzA1OjE1OjE2LjM0NSBBbWVyaWNhL05ld19Zb3JrJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NRTFRpbWUgPSBmdW5jdGlvbiB0b1NRTFRpbWUoX3RlbXA0KSB7XG4gICAgdmFyIF9yZWY2ID0gX3RlbXA0ID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wNCxcbiAgICAgICAgX3JlZjYkaW5jbHVkZU9mZnNldCA9IF9yZWY2LmluY2x1ZGVPZmZzZXQsXG4gICAgICAgIGluY2x1ZGVPZmZzZXQgPSBfcmVmNiRpbmNsdWRlT2Zmc2V0ID09PSB2b2lkIDAgPyB0cnVlIDogX3JlZjYkaW5jbHVkZU9mZnNldCxcbiAgICAgICAgX3JlZjYkaW5jbHVkZVpvbmUgPSBfcmVmNi5pbmNsdWRlWm9uZSxcbiAgICAgICAgaW5jbHVkZVpvbmUgPSBfcmVmNiRpbmNsdWRlWm9uZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmNiRpbmNsdWRlWm9uZTtcblxuICAgIHJldHVybiB0b1RlY2hUaW1lRm9ybWF0KHRoaXMsIHtcbiAgICAgIGluY2x1ZGVPZmZzZXQ6IGluY2x1ZGVPZmZzZXQsXG4gICAgICBpbmNsdWRlWm9uZTogaW5jbHVkZVpvbmUsXG4gICAgICBzcGFjZVpvbmU6IHRydWVcbiAgICB9KTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gU1FMIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlWm9uZT1mYWxzZV0gLSBpbmNsdWRlIHRoZSB6b25lLCBzdWNoIGFzICdBbWVyaWNhL05ld19Zb3JrJy4gT3ZlcnJpZGVzIGluY2x1ZGVPZmZzZXQuXHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlT2Zmc2V0PXRydWVdIC0gaW5jbHVkZSB0aGUgb2Zmc2V0LCBzdWNoIGFzICdaJyBvciAnLTA0OjAwJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLnV0YygyMDE0LCA3LCAxMykudG9TUUwoKSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBaJ1xyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDcsIDEzKS50b1NRTCgpIC8vPT4gJzIwMTQtMDctMTMgMDA6MDA6MDAuMDAwIC0wNDowMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCdcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCA3LCAxMykudG9TUUwoeyBpbmNsdWRlWm9uZTogdHJ1ZSB9KSAvLz0+ICcyMDE0LTA3LTEzIDAwOjAwOjAwLjAwMCBBbWVyaWNhL05ld19Zb3JrJ1xyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NRTCA9IGZ1bmN0aW9uIHRvU1FMKG9wdHMpIHtcbiAgICBpZiAob3B0cyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRzID0ge307XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRvU1FMRGF0ZSgpICsgXCIgXCIgKyB0aGlzLnRvU1FMVGltZShvcHRzKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERhdGVUaW1lIGFwcHJvcHJpYXRlIGZvciBkZWJ1Z2dpbmdcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50b0lTTygpIDogSU5WQUxJRCQyO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS4gQWxpYXMgb2Yge0BsaW5rIHRvTWlsbGlzfVxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by52YWx1ZU9mID0gZnVuY3Rpb24gdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy50b01pbGxpcygpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBlcG9jaCBtaWxsaXNlY29uZHMgb2YgdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAgICovXG5cblxuICBfcHJvdG8udG9NaWxsaXMgPSBmdW5jdGlvbiB0b01pbGxpcygpIHtcbiAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy50cyA6IE5hTjtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgZXBvY2ggc2Vjb25kcyBvZiB0aGlzIERhdGVUaW1lLlxyXG4gICAqIEByZXR1cm4ge251bWJlcn1cclxuICAgKi9cblxuXG4gIF9wcm90by50b1NlY29uZHMgPSBmdW5jdGlvbiB0b1NlY29uZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMudHMgLyAxMDAwIDogTmFOO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGFuIElTTyA4NjAxIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgRGF0ZVRpbWUgYXBwcm9wcmlhdGUgZm9yIHVzZSBpbiBKU09OLlxyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cclxuICAgKi9cblxuXG4gIF9wcm90by50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9JU08oKTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEJTT04gc2VyaWFsaXphYmxlIGVxdWl2YWxlbnQgdG8gdGhpcyBEYXRlVGltZS5cclxuICAgKiBAcmV0dXJuIHtEYXRlfVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvQlNPTiA9IGZ1bmN0aW9uIHRvQlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0pTRGF0ZSgpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm5zIGEgSmF2YXNjcmlwdCBvYmplY3Qgd2l0aCB0aGlzIERhdGVUaW1lJ3MgeWVhciwgbW9udGgsIGRheSwgYW5kIHNvIG9uLlxyXG4gICAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgZ2VuZXJhdGluZyB0aGUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pbmNsdWRlQ29uZmlnPWZhbHNlXSAtIGluY2x1ZGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGluIHRoZSBvdXRwdXRcclxuICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgpLnRvT2JqZWN0KCkgLy89PiB7IHllYXI6IDIwMTcsIG1vbnRoOiA0LCBkYXk6IDIyLCBob3VyOiAyMCwgbWludXRlOiA0OSwgc2Vjb25kOiA0MiwgbWlsbGlzZWNvbmQ6IDI2OCB9XHJcbiAgICogQHJldHVybiB7T2JqZWN0fVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLnRvT2JqZWN0ID0gZnVuY3Rpb24gdG9PYmplY3Qob3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCkgcmV0dXJuIHt9O1xuICAgIHZhciBiYXNlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jKTtcblxuICAgIGlmIChvcHRzLmluY2x1ZGVDb25maWcpIHtcbiAgICAgIGJhc2Uub3V0cHV0Q2FsZW5kYXIgPSB0aGlzLm91dHB1dENhbGVuZGFyO1xuICAgICAgYmFzZS5udW1iZXJpbmdTeXN0ZW0gPSB0aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW07XG4gICAgICBiYXNlLmxvY2FsZSA9IHRoaXMubG9jLmxvY2FsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZTtcbiAgfTtcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIEphdmFzY3JpcHQgRGF0ZSBlcXVpdmFsZW50IHRvIHRoaXMgRGF0ZVRpbWUuXHJcbiAgICogQHJldHVybiB7RGF0ZX1cclxuICAgKi9cblxuXG4gIF9wcm90by50b0pTRGF0ZSA9IGZ1bmN0aW9uIHRvSlNEYXRlKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmlzVmFsaWQgPyB0aGlzLnRzIDogTmFOKTtcbiAgfTsgLy8gQ09NUEFSRVxuXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBEYXRlVGltZXMgYXMgYSBEdXJhdGlvbi5cclxuICAgKiBAcGFyYW0ge0RhdGVUaW1lfSBvdGhlckRhdGVUaW1lIC0gdGhlIERhdGVUaW1lIHRvIGNvbXBhcmUgdGhpcyBvbmUgdG9cclxuICAgKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gW3VuaXQ9WydtaWxsaXNlY29uZHMnXV0gLSB0aGUgdW5pdCBvciBhcnJheSBvZiB1bml0cyAoc3VjaCBhcyAnaG91cnMnIG9yICdkYXlzJykgdG8gaW5jbHVkZSBpbiB0aGUgZHVyYXRpb24uXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBjcmVhdGlvbiBvZiB0aGUgRHVyYXRpb25cclxuICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udmVyc2lvbkFjY3VyYWN5PSdjYXN1YWwnXSAtIHRoZSBjb252ZXJzaW9uIHN5c3RlbSB0byB1c2VcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIHZhciBpMSA9IERhdGVUaW1lLmZyb21JU08oJzE5ODItMDUtMjVUMDk6NDUnKSxcclxuICAgKiAgICAgaTIgPSBEYXRlVGltZS5mcm9tSVNPKCcxOTgzLTEwLTE0VDEwOjMwJyk7XHJcbiAgICogaTIuZGlmZihpMSkudG9PYmplY3QoKSAvLz0+IHsgbWlsbGlzZWNvbmRzOiA0MzgwNzUwMDAwMCB9XHJcbiAgICogaTIuZGlmZihpMSwgJ2hvdXJzJykudG9PYmplY3QoKSAvLz0+IHsgaG91cnM6IDEyMTY4Ljc1IH1cclxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LjAzMTI1IH1cclxuICAgKiBpMi5kaWZmKGkxLCBbJ21vbnRocycsICdkYXlzJywgJ2hvdXJzJ10pLnRvT2JqZWN0KCkgLy89PiB7IG1vbnRoczogMTYsIGRheXM6IDE5LCBob3VyczogMC43NSB9XHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uZGlmZiA9IGZ1bmN0aW9uIGRpZmYob3RoZXJEYXRlVGltZSwgdW5pdCwgb3B0cykge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNWYWxpZCB8fCAhb3RoZXJEYXRlVGltZS5pc1ZhbGlkKSByZXR1cm4gRHVyYXRpb24uaW52YWxpZCh0aGlzLmludmFsaWQgfHwgb3RoZXJEYXRlVGltZS5pbnZhbGlkKTtcblxuICAgIHZhciB1bml0cyA9IG1heWJlQXJyYXkodW5pdCkubWFwKER1cmF0aW9uLm5vcm1hbGl6ZVVuaXQpLFxuICAgICAgICBvdGhlcklzTGF0ZXIgPSBvdGhlckRhdGVUaW1lLnZhbHVlT2YoKSA+IHRoaXMudmFsdWVPZigpLFxuICAgICAgICBlYXJsaWVyID0gb3RoZXJJc0xhdGVyID8gdGhpcyA6IG90aGVyRGF0ZVRpbWUsXG4gICAgICAgIGxhdGVyID0gb3RoZXJJc0xhdGVyID8gb3RoZXJEYXRlVGltZSA6IHRoaXMsXG4gICAgICAgIGRpZmZlZCA9IF9kaWZmKGVhcmxpZXIsIGxhdGVyLCB1bml0cywgb3B0cyk7XG5cbiAgICByZXR1cm4gb3RoZXJJc0xhdGVyID8gZGlmZmVkLm5lZ2F0ZSgpIDogZGlmZmVkO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCByaWdodCBub3cuXHJcbiAgICogU2VlIHtAbGluayBkaWZmfVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfHN0cmluZ1tdfSBbdW5pdD1bJ21pbGxpc2Vjb25kcyddXSAtIHRoZSB1bml0IG9yIHVuaXRzIHVuaXRzIChzdWNoIGFzICdob3Vycycgb3IgJ2RheXMnKSB0byBpbmNsdWRlIGluIHRoZSBkdXJhdGlvblxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgY3JlYXRpb24gb2YgdGhlIER1cmF0aW9uXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmNvbnZlcnNpb25BY2N1cmFjeT0nY2FzdWFsJ10gLSB0aGUgY29udmVyc2lvbiBzeXN0ZW0gdG8gdXNlXHJcbiAgICogQHJldHVybiB7RHVyYXRpb259XHJcbiAgICovXG5cblxuICBfcHJvdG8uZGlmZk5vdyA9IGZ1bmN0aW9uIGRpZmZOb3codW5pdCwgb3B0cykge1xuICAgIGlmICh1bml0ID09PSB2b2lkIDApIHtcbiAgICAgIHVuaXQgPSBcIm1pbGxpc2Vjb25kc1wiO1xuICAgIH1cblxuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kaWZmKERhdGVUaW1lLmxvY2FsKCksIHVuaXQsIG9wdHMpO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gYW4gSW50ZXJ2YWwgc3Bhbm5pbmcgYmV0d2VlbiB0aGlzIERhdGVUaW1lIGFuZCBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBlbmQgcG9pbnQgb2YgdGhlIEludGVydmFsXHJcbiAgICogQHJldHVybiB7SW50ZXJ2YWx9XHJcbiAgICovXG5cblxuICBfcHJvdG8udW50aWwgPSBmdW5jdGlvbiB1bnRpbChvdGhlckRhdGVUaW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEludGVydmFsLmZyb21EYXRlVGltZXModGhpcywgb3RoZXJEYXRlVGltZSkgOiB0aGlzO1xuICB9O1xuICAvKipcclxuICAgKiBSZXR1cm4gd2hldGhlciB0aGlzIERhdGVUaW1lIGlzIGluIHRoZSBzYW1lIHVuaXQgb2YgdGltZSBhcyBhbm90aGVyIERhdGVUaW1lXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXJEYXRlVGltZSAtIHRoZSBvdGhlciBEYXRlVGltZVxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1bml0IC0gdGhlIHVuaXQgb2YgdGltZSB0byBjaGVjayBzYW1lbmVzcyBvblxyXG4gICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkuaGFzU2FtZShvdGhlckRULCAnZGF5Jyk7IC8vfj4gdHJ1ZSBpZiBib3RoIHRoZSBzYW1lIGNhbGVuZGFyIGRheVxyXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAgICovXG5cblxuICBfcHJvdG8uaGFzU2FtZSA9IGZ1bmN0aW9uIGhhc1NhbWUob3RoZXJEYXRlVGltZSwgdW5pdCkge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodW5pdCA9PT0gXCJtaWxsaXNlY29uZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPT09IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgaW5wdXRNcyA9IG90aGVyRGF0ZVRpbWUudmFsdWVPZigpO1xuICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZih1bml0KSA8PSBpbnB1dE1zICYmIGlucHV0TXMgPD0gdGhpcy5lbmRPZih1bml0KTtcbiAgICB9XG4gIH07XG4gIC8qKlxyXG4gICAqIEVxdWFsaXR5IGNoZWNrXHJcbiAgICogVHdvIERhdGVUaW1lcyBhcmUgZXF1YWwgaWZmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIG1pbGxpc2Vjb25kLCBoYXZlIHRoZSBzYW1lIHpvbmUgYW5kIGxvY2F0aW9uLCBhbmQgYXJlIGJvdGggdmFsaWQuXHJcbiAgICogVG8gY29tcGFyZSBqdXN0IHRoZSBtaWxsaXNlY29uZCB2YWx1ZXMsIHVzZSBgK2R0MSA9PT0gfmR0MmAuXHJcbiAgICogQHBhcmFtIHtEYXRlVGltZX0gb3RoZXIgLSB0aGUgb3RoZXIgRGF0ZVRpbWVcclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICAqL1xuXG5cbiAgX3Byb3RvLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyhvdGhlcikge1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWQgJiYgb3RoZXIuaXNWYWxpZCAmJiB0aGlzLnZhbHVlT2YoKSA9PT0gb3RoZXIudmFsdWVPZigpICYmIHRoaXMuem9uZS5lcXVhbHMob3RoZXIuem9uZSkgJiYgdGhpcy5sb2MuZXF1YWxzKG90aGVyLmxvYyk7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWluIG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1pbmltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1pbiBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5taW4gPSBmdW5jdGlvbiBtaW4oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGVUaW1lcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmVzdEJ5KGRhdGVUaW1lcywgZnVuY3Rpb24gKGkpIHtcbiAgICAgIHJldHVybiBpLnZhbHVlT2YoKTtcbiAgICB9LCBNYXRoLm1pbik7XG4gIH07XG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgbWF4IG9mIHNldmVyYWwgZGF0ZSB0aW1lc1xyXG4gICAqIEBwYXJhbSB7Li4uRGF0ZVRpbWV9IGRhdGVUaW1lcyAtIHRoZSBEYXRlVGltZXMgZnJvbSB3aGljaCB0byBjaG9vc2UgdGhlIG1heGltdW1cclxuICAgKiBAcmV0dXJuIHtEYXRlVGltZX0gdGhlIG1heCBEYXRlVGltZSwgb3IgdW5kZWZpbmVkIGlmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50XHJcbiAgICovXG5cblxuICBEYXRlVGltZS5tYXggPSBmdW5jdGlvbiBtYXgoKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBkYXRlVGltZXMgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGRhdGVUaW1lc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHJldHVybiBiZXN0QnkoZGF0ZVRpbWVzLCBmdW5jdGlvbiAoaSkge1xuICAgICAgcmV0dXJuIGkudmFsdWVPZigpO1xuICAgIH0sIE1hdGgubWF4KTtcbiAgfTsgLy8gTUlTQ1xuXG4gIC8qKlxyXG4gICAqIEV4cGxhaW4gaG93IGEgc3RyaW5nIHdvdWxkIGJlIHBhcnNlZCBieSBmcm9tRm9ybWF0KClcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIHRoZSBzdHJpbmcgdG8gcGFyc2VcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZm10IC0gdGhlIGZvcm1hdCB0aGUgc3RyaW5nIGlzIGV4cGVjdGVkIHRvIGJlIGluIChzZWUgZGVzY3JpcHRpb24pXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRha2VuIGJ5IGZyb21Gb3JtYXQoKVxyXG4gICAqIEByZXR1cm4ge09iamVjdH1cclxuICAgKi9cblxuXG4gIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluID0gZnVuY3Rpb24gZnJvbUZvcm1hdEV4cGxhaW4odGV4dCwgZm10LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICAgIF9vcHRpb25zJGxvY2FsZSA9IF9vcHRpb25zLmxvY2FsZSxcbiAgICAgICAgbG9jYWxlID0gX29wdGlvbnMkbG9jYWxlID09PSB2b2lkIDAgPyBudWxsIDogX29wdGlvbnMkbG9jYWxlLFxuICAgICAgICBfb3B0aW9ucyRudW1iZXJpbmdTeXMgPSBfb3B0aW9ucy5udW1iZXJpbmdTeXN0ZW0sXG4gICAgICAgIG51bWJlcmluZ1N5c3RlbSA9IF9vcHRpb25zJG51bWJlcmluZ1N5cyA9PT0gdm9pZCAwID8gbnVsbCA6IF9vcHRpb25zJG51bWJlcmluZ1N5cyxcbiAgICAgICAgbG9jYWxlVG9Vc2UgPSBMb2NhbGUuZnJvbU9wdHMoe1xuICAgICAgbG9jYWxlOiBsb2NhbGUsXG4gICAgICBudW1iZXJpbmdTeXN0ZW06IG51bWJlcmluZ1N5c3RlbSxcbiAgICAgIGRlZmF1bHRUb0VOOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cGxhaW5Gcm9tVG9rZW5zKGxvY2FsZVRvVXNlLCB0ZXh0LCBmbXQpO1xuICB9O1xuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUZvcm1hdEV4cGxhaW4gaW5zdGVhZFxyXG4gICAqL1xuXG5cbiAgRGF0ZVRpbWUuZnJvbVN0cmluZ0V4cGxhaW4gPSBmdW5jdGlvbiBmcm9tU3RyaW5nRXhwbGFpbih0ZXh0LCBmbXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21Gb3JtYXRFeHBsYWluKHRleHQsIGZtdCwgb3B0aW9ucyk7XG4gIH07IC8vIEZPUk1BVCBQUkVTRVRTXG5cbiAgLyoqXHJcbiAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAxMC8xNC8xOTgzXHJcbiAgICogQHR5cGUge09iamVjdH1cclxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhEYXRlVGltZSwgW3tcbiAgICBrZXk6IFwiaXNWYWxpZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA9PT0gbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhpcyBEYXRlVGltZSBpcyBpbnZhbGlkLCBvciBudWxsIGlmIHRoZSBEYXRlVGltZSBpcyB2YWxpZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW52YWxpZFJlYXNvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW52YWxpZCA/IHRoaXMuaW52YWxpZC5yZWFzb24gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgRGF0ZVRpbWUgYmVjYW1lIGludmFsaWQsIG9yIG51bGwgaWYgdGhlIERhdGVUaW1lIGlzIHZhbGlkXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnZhbGlkRXhwbGFuYXRpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmludmFsaWQgPyB0aGlzLmludmFsaWQuZXhwbGFuYXRpb24gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9jYWxlIG9mIGEgRGF0ZVRpbWUsIHN1Y2ggJ2VuLUdCJy4gVGhlIGxvY2FsZSBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJsb2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmxvYy5sb2NhbGUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyaW5nIHN5c3RlbSBvZiBhIERhdGVUaW1lLCBzdWNoICdiZW5nJy4gVGhlIG51bWJlcmluZyBzeXN0ZW0gaXMgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIERhdGVUaW1lXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibnVtYmVyaW5nU3lzdGVtXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5sb2MubnVtYmVyaW5nU3lzdGVtIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG91dHB1dCBjYWxlbmRhciBvZiBhIERhdGVUaW1lLCBzdWNoICdpc2xhbWljJy4gVGhlIG91dHB1dCBjYWxlbmRhciBpcyB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgRGF0ZVRpbWVcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvdXRwdXRDYWxlbmRhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMubG9jLm91dHB1dENhbGVuZGFyIDogbnVsbDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHRpbWUgem9uZS5cclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInpvbmVOYW1lXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLm5hbWUgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgeWVhclxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLnllYXIgLy89PiAyMDE3XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ5ZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnllYXIgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBxdWFydGVyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkucXVhcnRlciAvLz0+IDJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInF1YXJ0ZXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBNYXRoLmNlaWwodGhpcy5jLm1vbnRoIC8gMykgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBtb250aCAoMS0xMikuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSkubW9udGggLy89PiA1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5tb250aCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgbW9udGggKDEtMzBpc2gpLlxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLmRheSAvLz0+IDI1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkYXlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyB0aGlzLmMuZGF5IDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaG91ciBvZiB0aGUgZGF5ICgwLTIzKS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5KS5ob3VyIC8vPT4gOVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaG91clwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5ob3VyIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbWludXRlIG9mIHRoZSBob3VyICgwLTU5KS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCkubWludXRlIC8vPT4gMzBcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbnV0ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuYy5taW51dGUgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBzZWNvbmQgb2YgdGhlIG1pbnV0ZSAoMC01OSkuXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCA1LCAyNSwgOSwgMzAsIDUyKS5zZWNvbmQgLy89PiA1MlxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2Vjb25kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLnNlY29uZCA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kIG9mIHRoZSBzZWNvbmQgKDAtOTk5KS5cclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTcsIDUsIDI1LCA5LCAzMCwgNTIsIDY1NCkubWlsbGlzZWNvbmQgLy89PiA2NTRcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1pbGxpc2Vjb25kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy5jLm1pbGxpc2Vjb25kIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgd2VlayB5ZWFyXHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTQsIDExLCAzMSkud2Vla1llYXIgLy89PiAyMDE1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla1llYXIgOiBOYU47XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB3ZWVrIG51bWJlciBvZiB0aGUgd2VlayB5ZWFyICgxLTUyaXNoKS5cclxuICAgICAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLndlZWtOdW1iZXIgLy89PiAyMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla051bWJlclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHBvc3NpYmx5Q2FjaGVkV2Vla0RhdGEodGhpcykud2Vla051bWJlciA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGRheSBvZiB0aGUgd2Vlay5cclxuICAgICAqIDEgaXMgTW9uZGF5IGFuZCA3IGlzIFN1bmRheVxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE0LCAxMSwgMzEpLndlZWtkYXkgLy89PiA0XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrZGF5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gcG9zc2libHlDYWNoZWRXZWVrRGF0YSh0aGlzKS53ZWVrZGF5IDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgb3JkaW5hbCAoaS5lLiB0aGUgZGF5IG9mIHRoZSB5ZWFyKVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgNSwgMjUpLm9yZGluYWwgLy89PiAxNDVcclxuICAgICAqIEB0eXBlIHtudW1iZXJ8RGF0ZVRpbWV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9yZGluYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQgPyBncmVnb3JpYW5Ub09yZGluYWwodGhpcy5jKS5vcmRpbmFsIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgc2hvcnQgbW9udGggbmFtZSwgc3VjaCBhcyAnT2N0Jy5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNywgMTAsIDMwKS5tb250aFNob3J0IC8vPT4gT2N0XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJtb250aFNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby5tb250aHMoXCJzaG9ydFwiLCB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBsb25nIG1vbnRoIG5hbWUsIHN1Y2ggYXMgJ09jdG9iZXInLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLm1vbnRoTG9uZyAvLz0+IE9jdG9iZXJcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1vbnRoTG9uZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ubW9udGhzKFwibG9uZ1wiLCB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGVcbiAgICAgIH0pW3RoaXMubW9udGggLSAxXSA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBodW1hbiByZWFkYWJsZSBzaG9ydCB3ZWVrZGF5LCBzdWNoIGFzICdNb24nLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLndlZWtkYXlTaG9ydCAvLz0+IE1vblxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid2Vla2RheVNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gSW5mby53ZWVrZGF5cyhcInNob3J0XCIsIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaHVtYW4gcmVhZGFibGUgbG9uZyB3ZWVrZGF5LCBzdWNoIGFzICdNb25kYXknLlxyXG4gICAgICogRGVmYXVsdHMgdG8gdGhlIHN5c3RlbSdzIGxvY2FsZSBpZiBubyBsb2NhbGUgaGFzIGJlZW4gc3BlY2lmaWVkXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE3LCAxMCwgMzApLndlZWtkYXlMb25nIC8vPT4gTW9uZGF5XHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3ZWVrZGF5TG9uZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IEluZm8ud2Vla2RheXMoXCJsb25nXCIsIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgfSlbdGhpcy53ZWVrZGF5IC0gMV0gOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgVVRDIG9mZnNldCBvZiB0aGlzIERhdGVUaW1lIGluIG1pbnV0ZXNcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKCkub2Zmc2V0IC8vPT4gLTI0MFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUudXRjKCkub2Zmc2V0IC8vPT4gMFxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib2Zmc2V0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gdGhpcy56b25lLm9mZnNldCh0aGlzLnRzKSA6IE5hTjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoZSB6b25lJ3MgY3VycmVudCBvZmZzZXQsIGZvciBleGFtcGxlIFwiRVNUXCIgb3IgXCJFRFRcIi5cclxuICAgICAqIERlZmF1bHRzIHRvIHRoZSBzeXN0ZW0ncyBsb2NhbGUgaWYgbm8gbG9jYWxlIGhhcyBiZWVuIHNwZWNpZmllZFxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib2Zmc2V0TmFtZVNob3J0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiBcInNob3J0XCIsXG4gICAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbG9uZyBodW1hbiBuYW1lIGZvciB0aGUgem9uZSdzIGN1cnJlbnQgb2Zmc2V0LCBmb3IgZXhhbXBsZSBcIkVhc3Rlcm4gU3RhbmRhcmQgVGltZVwiIG9yIFwiRWFzdGVybiBEYXlsaWdodCBUaW1lXCIuXHJcbiAgICAgKiBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgbG9jYWxlIGlmIG5vIGxvY2FsZSBoYXMgYmVlbiBzcGVjaWZpZWRcclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9mZnNldE5hbWVMb25nXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnpvbmUub2Zmc2V0TmFtZSh0aGlzLnRzLCB7XG4gICAgICAgICAgZm9ybWF0OiBcImxvbmdcIixcbiAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogR2V0IHdoZXRoZXIgdGhpcyB6b25lJ3Mgb2Zmc2V0IGV2ZXIgY2hhbmdlcywgYXMgaW4gYSBEU1QuXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNPZmZzZXRGaXhlZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHRoaXMuem9uZS51bml2ZXJzYWwgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEdldCB3aGV0aGVyIHRoZSBEYXRlVGltZSBpcyBpbiBhIERTVC5cclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpc0luRFNUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAodGhpcy5pc09mZnNldEZpeGVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9mZnNldCA+IHRoaXMuc2V0KHtcbiAgICAgICAgICBtb250aDogMVxuICAgICAgICB9KS5vZmZzZXQgfHwgdGhpcy5vZmZzZXQgPiB0aGlzLnNldCh7XG4gICAgICAgICAgbW9udGg6IDVcbiAgICAgICAgfSkub2Zmc2V0O1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIERhdGVUaW1lIGlzIGluIGEgbGVhcCB5ZWFyLCBmYWxzZSBvdGhlcndpc2VcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTYpLmlzSW5MZWFwWWVhciAvLz0+IHRydWVcclxuICAgICAqIEBleGFtcGxlIERhdGVUaW1lLmxvY2FsKDIwMTMpLmlzSW5MZWFwWWVhciAvLz0+IGZhbHNlXHJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJbkxlYXBZZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gaXNMZWFwWWVhcih0aGlzLnllYXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyBtb250aFxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMikuZGF5c0luTW9udGggLy89PiAyOVxyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxNiwgMykuZGF5c0luTW9udGggLy89PiAzMVxyXG4gICAgICogQHR5cGUge251bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGF5c0luTW9udGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIsIHRoaXMubW9udGgpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoaXMgRGF0ZVRpbWUncyB5ZWFyXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDE2KS5kYXlzSW5ZZWFyIC8vPT4gMzY2XHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDEzKS5kYXlzSW5ZZWFyIC8vPT4gMzY1XHJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkYXlzSW5ZZWFyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkID8gZGF5c0luWWVhcih0aGlzLnllYXIpIDogTmFOO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3ZWVrcyBpbiB0aGlzIERhdGVUaW1lJ3MgeWVhclxyXG4gICAgICogQHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXHJcbiAgICAgKiBAZXhhbXBsZSBEYXRlVGltZS5sb2NhbCgyMDA0KS53ZWVrc0luV2Vla1llYXIgLy89PiA1M1xyXG4gICAgICogQGV4YW1wbGUgRGF0ZVRpbWUubG9jYWwoMjAxMykud2Vla3NJbldlZWtZZWFyIC8vPT4gNTJcclxuICAgICAqIEB0eXBlIHtudW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndlZWtzSW5XZWVrWWVhclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCA/IHdlZWtzSW5XZWVrWWVhcih0aGlzLndlZWtZZWFyKSA6IE5hTjtcbiAgICB9XG4gIH1dLCBbe1xuICAgIGtleTogXCJEQVRFX1NIT1JUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURV9TSE9SVDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3QgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFX01FRFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVfTUVEO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJ09jdG9iZXIgMTQsIDE5ODMnXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFX0ZVTExcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFX0ZVTEw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnVHVlc2RheSwgT2N0b2JlciAxNCwgMTk4MydcclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVfSFVHRVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVfSFVHRTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV9TSU1QTEVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FX1NJTVBMRTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FX1dJVEhfU0VDT05EUztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcwOTozMDoyMyBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIlRJTUVfV0lUSF9TSE9SVF9PRkZTRVRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV9XSVRIX0xPTkdfT0ZGU0VUXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gVElNRV9XSVRIX0xPTkdfT0ZGU0VUO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FXzI0X1NJTVBMRVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfU0lNUExFO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FXzI0X1dJVEhfU0VDT05EU1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9TRUNPTkRTO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIHtAbGluayB0b0xvY2FsZVN0cmluZ30gZm9ybWF0IGxpa2UgJzA5OjMwOjIzIEVEVCcsIGFsd2F5cyAyNC1ob3VyLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiVElNRV8yNF9XSVRIX1NIT1JUX09GRlNFVFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMDk6MzA6MjMgRWFzdGVybiBEYXlsaWdodCBUaW1lJywgYWx3YXlzIDI0LWhvdXIuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnMTAvMTQvMTk4MywgOTozMCBBTScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfU0hPUlRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9TSE9SVDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICcxMC8xNC8xOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9TSE9SVF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9NRURcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9NRUQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0IDE0LCAxOTgzLCA5OjMwOjMzIEFNJy4gT25seSAxMi1ob3VyIGlmIHRoZSBsb2NhbGUgaXMuXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJEQVRFVElNRV9NRURfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfTUVEX1dJVEhfU0VDT05EUztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiB7QGxpbmsgdG9Mb2NhbGVTdHJpbmd9IGZvcm1hdCBsaWtlICdPY3RvYmVyIDE0LCAxOTgzLCA5OjMwIEFNIEVEVCcuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfRlVMTFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0ZVTEw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnT2N0b2JlciAxNCwgMTk4MywgOTozMDozMyBBTSBFRFQnLiBPbmx5IDEyLWhvdXIgaWYgdGhlIGxvY2FsZSBpcy5cclxuICAgICAqIEB0eXBlIHtPYmplY3R9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIkRBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gREFURVRJTUVfRlVMTF9XSVRIX1NFQ09ORFM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpZGF5LCBPY3RvYmVyIDE0LCAxOTgzLCA5OjMwIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfSFVHRVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIERBVEVUSU1FX0hVR0U7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICoge0BsaW5rIHRvTG9jYWxlU3RyaW5nfSBmb3JtYXQgbGlrZSAnRnJpZGF5LCBPY3RvYmVyIDE0LCAxOTgzLCA5OjMwOjMzIEFNIEVhc3Rlcm4gRGF5bGlnaHQgVGltZScuIE9ubHkgMTItaG91ciBpZiB0aGUgbG9jYWxlIGlzLlxyXG4gICAgICogQHR5cGUge09iamVjdH1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiREFURVRJTUVfSFVHRV9XSVRIX1NFQ09ORFNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBEQVRFVElNRV9IVUdFX1dJVEhfU0VDT05EUztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRGF0ZVRpbWU7XG59KCk7XG5mdW5jdGlvbiBmcmllbmRseURhdGVUaW1lKGRhdGVUaW1laXNoKSB7XG4gIGlmIChEYXRlVGltZS5pc0RhdGVUaW1lKGRhdGVUaW1laXNoKSkge1xuICAgIHJldHVybiBkYXRlVGltZWlzaDtcbiAgfSBlbHNlIGlmIChkYXRlVGltZWlzaCAmJiBkYXRlVGltZWlzaC52YWx1ZU9mICYmIGlzTnVtYmVyKGRhdGVUaW1laXNoLnZhbHVlT2YoKSkpIHtcbiAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUpTRGF0ZShkYXRlVGltZWlzaCk7XG4gIH0gZWxzZSBpZiAoZGF0ZVRpbWVpc2ggJiYgdHlwZW9mIGRhdGVUaW1laXNoID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIERhdGVUaW1lLmZyb21PYmplY3QoZGF0ZVRpbWVpc2gpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcIlVua25vd24gZGF0ZXRpbWUgYXJndW1lbnQ6IFwiICsgZGF0ZVRpbWVpc2ggKyBcIiwgb2YgdHlwZSBcIiArIHR5cGVvZiBkYXRlVGltZWlzaCk7XG4gIH1cbn1cblxuZXhwb3J0cy5EYXRlVGltZSA9IERhdGVUaW1lO1xuZXhwb3J0cy5EdXJhdGlvbiA9IER1cmF0aW9uO1xuZXhwb3J0cy5JbnRlcnZhbCA9IEludGVydmFsO1xuZXhwb3J0cy5JbmZvID0gSW5mbztcbmV4cG9ydHMuWm9uZSA9IFpvbmU7XG5leHBvcnRzLkZpeGVkT2Zmc2V0Wm9uZSA9IEZpeGVkT2Zmc2V0Wm9uZTtcbmV4cG9ydHMuSUFOQVpvbmUgPSBJQU5BWm9uZTtcbmV4cG9ydHMuTG9jYWxab25lID0gTG9jYWxab25lO1xuZXhwb3J0cy5TZXR0aW5ncyA9IFNldHRpbmdzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bHV4b24uanMubWFwXG4iXX0=
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fleetio_spark
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Mathis
@@ -180,10 +180,10 @@ files:
180
180
  - lib/fleetio_spark.rb
181
181
  - lib/fleetio_spark/helper.rb
182
182
  - lib/fleetio_spark/version.rb
183
- - public/spark-0.1.1.css
184
- - public/spark-0.1.1.css.gz
185
- - public/spark-0.1.1.js
186
- - public/spark-0.1.1.js.gz
183
+ - public/spark-0.1.2.css
184
+ - public/spark-0.1.2.css.gz
185
+ - public/spark-0.1.2.js
186
+ - public/spark-0.1.2.js.gz
187
187
  homepage:
188
188
  licenses:
189
189
  - MIT
Binary file