diff --git a/conway/conway_test.go b/conway/conway_test.go
index 0bf5c3c..e723daa 100644
--- a/conway/conway_test.go
+++ b/conway/conway_test.go
@@ -1,8 +1,14 @@
package conway_test
import (
+ "bytes"
+ "encoding/base64"
+ "encoding/json"
"fmt"
+ "image/png"
"math/rand"
+ "net/http"
+ "regexp"
"strings"
"testing"
)
@@ -104,7 +110,24 @@ func TestGameOfLifeCanDisplayItselfAsAString(t *testing.T) {
}
func TestGameOfLifeCanDisplayItselfAsAnImage(t *testing.T) {
- t.Fail()
+ game := newTestGameOfLife()
+
+ img, err := game.Image(1, 1)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ bounds := img.Bounds()
+ if bounds.Max.Y < 16 {
+ t.Errorf("image.Max.Y < 16!: %d", bounds.Max.Y)
+ return
+ }
+
+ if bounds.Max.X < 16 {
+ t.Errorf("image.Max.X < 16!: %d", bounds.Max.X)
+ return
+ }
}
func TestNewGameOfLifeHasCorrectDimensions(t *testing.T) {
@@ -416,3 +439,128 @@ func TestGameStateCoordsAreNeverOutOfBounds(t *testing.T) {
t.Errorf("(%d, %d) != %d: %d", oobX, oobY, newVal, cell.Value)
}
}
+
+type testResponseWriter struct {
+ Status int
+ Headers http.Header
+ Body []byte
+}
+
+func (w *testResponseWriter) WriteHeader(status int) {
+ w.Status = status
+}
+
+func (w *testResponseWriter) Header() http.Header {
+ return w.Headers
+}
+
+func (w *testResponseWriter) Write(bytes []byte) (int, error) {
+ w.Body = append(w.Body, bytes[:]...)
+ return len(bytes), nil
+}
+
+func newTestResponseWriter() *testResponseWriter {
+ return &testResponseWriter{
+ Body: []byte(""),
+ Headers: make(map[string][]string),
+ }
+}
+
+func TestHandleWebGameRootReturnsIndexPageForGET(t *testing.T) {
+ req, err := http.NewRequest("GET", "http://localhost:9775/", nil)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ w := newTestResponseWriter()
+ HandleWebGameRoot(w, req)
+
+ if w.Status != http.StatusOK {
+ t.Fail()
+ return
+ }
+
+ matched, err := regexp.MatchString("
Conway's Game of Life
", string(w.Body))
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ if !matched {
+ t.Fail()
+ return
+ }
+}
+
+func TestHandleWebGameRootReturns405ForNonGET(t *testing.T) {
+ req, err := http.NewRequest("OPTIONS", "http://localhost:9775/", nil)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ w := newTestResponseWriter()
+ HandleWebGameRoot(w, req)
+
+ if w.Status != http.StatusMethodNotAllowed {
+ t.Fail()
+ return
+ }
+
+ matched, err := regexp.MatchString("Nope", string(w.Body))
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ if !matched {
+ t.Fail()
+ return
+ }
+}
+
+func TestHandleWebGameStateForGET(t *testing.T) {
+ req, err := http.NewRequest("GET", "http://localhost:9775/state.png?random=1", nil)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ w := newTestResponseWriter()
+ HandleWebGameState(w, req)
+
+ if w.Status != http.StatusOK {
+ t.Errorf("status != %d: %d", http.StatusOK, w.Status)
+ return
+ }
+
+ webState := &WebGameState{}
+ err = json.Unmarshal(w.Body, webState)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ imgB64 := []byte(webState.Img)
+ imgBytes := make([]byte, len(imgB64))
+
+ _, err = base64.StdEncoding.Decode(imgBytes, imgB64)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ img, err := png.Decode(bytes.NewBuffer(imgBytes))
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ bounds := img.Bounds()
+
+ if bounds.Max.Y < 80 || bounds.Max.X < 80 {
+ t.Errorf("Image has incorrect bounds: %+v", bounds)
+ return
+ }
+}
diff --git a/conway/conways-game-of-life/main.go b/conway/conways-game-of-life/main.go
index 8aef411..f099de6 100644
--- a/conway/conways-game-of-life/main.go
+++ b/conway/conways-game-of-life/main.go
@@ -11,10 +11,12 @@ import (
)
var (
- height = flag.Int("height", 40, "Game height")
- width = flag.Int("width", 80, "Game width")
- mutate = flag.Bool("mutate", false, "Mutate every other generation")
- web = flag.Bool("web", false, "Run server for web-based game")
+ height = flag.Int("height", 40, "Game height")
+ width = flag.Int("width", 80, "Game width")
+ mutate = flag.Bool("mutate", false, "Mutate every other generation")
+ web = flag.Bool("web", false, "Run a web-based game.")
+ addr = flag.String("addr", ":9775",
+ "Address for server of web-based game (ignored if running a console game.)")
sleepMs = flag.Int("sleep.ms", 200,
"Millisecond sleep interval per generation")
)
@@ -28,7 +30,7 @@ func main() {
)
if *web {
- retCode, err = RunWebGame(*height, *width, *sleepMs, *mutate)
+ retCode, err = RunWebGame(*addr, *height, *width, *sleepMs, *mutate)
if err != nil {
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
}
diff --git a/conway/game_of_life.go b/conway/game_of_life.go
index b6acbe8..1a5ff6e 100644
--- a/conway/game_of_life.go
+++ b/conway/game_of_life.go
@@ -102,7 +102,7 @@ func (game *GameOfLife) String() string {
return fmt.Sprintf("%s\n", game.State)
}
-func (game *GameOfLife) Image(xMult, yMult int) (*image.Gray16, error) {
+func (game *GameOfLife) Image(xMult, yMult int) (*image.Gray, error) {
return game.State.Image(xMult, yMult)
}
diff --git a/conway/game_state.go b/conway/game_state.go
index 5d86872..f34667f 100644
--- a/conway/game_state.go
+++ b/conway/game_state.go
@@ -5,6 +5,8 @@ import (
"errors"
"fmt"
"image"
+ "image/color"
+ "image/draw"
"math"
"math/rand"
"strings"
@@ -16,18 +18,18 @@ const (
)
type GameStateCell struct {
- Value int
- X int
- Y int
+ Value int `json:"value"`
+ X int `json:"x"`
+ Y int `json:"y"`
}
type GameStateRow struct {
- Y int
- Cells []*GameStateCell
+ Y int `json:"y"`
+ Cells []*GameStateCell `json:"cells"`
}
type GameState struct {
- Rows []*GameStateRow
+ Rows []*GameStateRow `json:"rows"`
}
func NewGameState(height, width int) *GameState {
@@ -175,6 +177,29 @@ func (state *GameState) String() string {
return strings.Join(rows, "\n")
}
-func (state *GameState) Image(xMult, yMult int) (*image.Gray16, error) {
- return nil, errors.New("Not implemented!")
+func (state *GameState) Image(xMult, yMult int) (*image.Gray, error) {
+ img := image.NewGray(image.Rect(0, 0, state.Height()*xMult, state.Width()*yMult))
+ draw.Draw(img, img.Bounds(), &image.Uniform{color.Gray16{0xff}},
+ image.ZP, draw.Src)
+
+ cells, err := state.Cells()
+ if err != nil {
+ return nil, err
+ }
+
+ black := &image.Uniform{color.Black}
+ white := &image.Uniform{color.White}
+
+ for cell := range cells {
+ color := white
+ if cell.Value == 1 {
+ color = black
+ }
+
+ square := image.Rect(cell.X*xMult, cell.Y*yMult,
+ (cell.X*xMult)+xMult, (cell.Y*yMult)+yMult)
+ draw.Draw(img, square, color, image.ZP, draw.Src)
+ }
+
+ return img, nil
}
diff --git a/conway/web.go b/conway/web.go
index a08cb7d..c97e730 100644
--- a/conway/web.go
+++ b/conway/web.go
@@ -1,14 +1,215 @@
package conway
import (
+ "bytes"
+ "encoding/base64"
+ "encoding/json"
+ "fmt"
+ "image/png"
+ "log"
"math/rand"
+ "net/http"
+ "net/url"
+ "strconv"
"time"
)
-func init() {
- rand.Seed(time.Now().UTC().UnixNano())
+type WebGameParams struct {
+ Random bool
+ Height int
+ Width int
+ Xmul int
+ Ymul int
}
-func RunWebGame(height, width, sleepMs int, mutate bool) (int, error) {
- return -1, nil
+type WebGameState struct {
+ State *GameState `json:"state"`
+ Img string `json:"img"`
+}
+
+var jQueryMinJs = []byte("")
+
+func init() {
+ rand.Seed(time.Now().UTC().UnixNano())
+ jqmin, err := base64.StdEncoding.DecodeString(JQUERY_MIN_JS)
+ if err != nil {
+ log.Fatal("Failed to decode internal jquery.min.js")
+ }
+ jQueryMinJs = append(jQueryMinJs, jqmin...)
+}
+
+func NewWebGameParams(q url.Values) *WebGameParams {
+ params := &WebGameParams{
+ Height: 50,
+ Width: 50,
+ Xmul: 10,
+ Ymul: 10,
+ }
+
+ if len(q.Get("random")) > 0 {
+ params.Random = true
+ }
+
+ h := q.Get("h")
+ if len(h) > 0 {
+ if i, err := strconv.Atoi(h); err == nil {
+ params.Height = i
+ }
+ }
+
+ w := q.Get("w")
+ if len(w) > 0 {
+ if i, err := strconv.Atoi(w); err == nil {
+ params.Width = i
+ }
+ }
+
+ xm := q.Get("xm")
+ if len(xm) > 0 {
+ if i, err := strconv.Atoi(xm); err == nil {
+ params.Xmul = i
+ }
+ }
+
+ ym := q.Get("ym")
+ if len(ym) > 0 {
+ if i, err := strconv.Atoi(ym); err == nil {
+ params.Ymul = i
+ }
+ }
+
+ return params
+}
+
+func handle405(method, uri string, w http.ResponseWriter) {
+ w.Header().Set("Content-Type", "text/plain")
+ w.WriteHeader(http.StatusMethodNotAllowed)
+ w.Write([]byte(fmt.Sprintf("Nope. %v not allowed at %v\n", method, uri)))
+}
+
+func handle500(err error, w http.ResponseWriter) {
+ log.Println("ERROR:", err)
+ w.Header().Set("Content-Type", "text/plain")
+ w.WriteHeader(http.StatusInternalServerError)
+ w.Write([]byte(fmt.Sprintf("We exploded!: %v\n", err)))
+}
+
+func HandleWebGameRoot(w http.ResponseWriter, req *http.Request) {
+ if req.Method != "GET" {
+ handle405(req.Method, req.RequestURI, w)
+ return
+ }
+
+ w.Header().Set("Content-Type", "text/html")
+ w.WriteHeader(http.StatusOK)
+ w.Write([]byte(GAME_OF_LIFE_INDEX_HTML))
+ return
+}
+
+func HandleWebGameStatic(w http.ResponseWriter, req *http.Request) {
+ if req.Method != "GET" {
+ handle405(req.Method, req.RequestURI, w)
+ return
+ }
+
+ if req.URL.Path == "/static/normalize.css" {
+ w.Header().Set("Content-Type", "text/css")
+ w.WriteHeader(http.StatusOK)
+ w.Write([]byte(NORMALIZE_CSS))
+ return
+ }
+
+ if req.URL.Path == "/static/jquery.min.js" {
+ w.Header().Set("Content-Type", "text/javascript")
+ w.WriteHeader(http.StatusOK)
+ w.Write(jQueryMinJs)
+ return
+ }
+
+ w.Header().Set("Content-Type", "text/plain")
+ w.WriteHeader(http.StatusNotFound)
+ w.Write([]byte(fmt.Sprintf("Don't have: %v\n", req.URL.Path)))
+}
+
+func HandleWebGameState(w http.ResponseWriter, req *http.Request) {
+ if req.Method != "GET" {
+ handle405(req.Method, req.RequestURI, w)
+ return
+ }
+
+ q := req.URL.Query()
+ params := NewWebGameParams(q)
+
+ if params.Random {
+ game := NewGameOfLife(params.Height, params.Width)
+ err := game.ImportRandomState()
+ if err != nil {
+ handle500(err, w)
+ return
+ }
+
+ img, err := game.Image(params.Xmul, params.Ymul)
+
+ if err != nil {
+ handle500(err, w)
+ return
+ }
+
+ log.Println("Serving random state image.")
+
+ var pngBuf bytes.Buffer
+ err = png.Encode(&pngBuf, img)
+ if err != nil {
+ handle500(err, w)
+ }
+
+ imgB64 := base64.StdEncoding.EncodeToString(pngBuf.Bytes())
+ webGameState := &WebGameState{State: game.State, Img: imgB64}
+ wgsJson, err := json.Marshal(webGameState)
+
+ if err != nil {
+ handle500(err, w)
+ }
+
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(http.StatusOK)
+ w.Write(wgsJson)
+
+ return
+ }
+
+ rawState := q.Get("s")
+ if len(rawState) < 1 {
+ w.Header().Set("Content-Type", "text/plain")
+ w.WriteHeader(http.StatusBadRequest)
+ w.Write([]byte("Missing query param \"s\".\n"))
+ return
+ }
+
+ //state := &GameState{}
+ //err := json.Unmarshal([]byte(rawState), state)
+ //if err != nil {
+ //w.Header().Set("Content-Type", "text/plain")
+ //w.WriteHeader(http.StatusBadRequest)
+ //w.Write([]byte(fmt.Sprintf("Invalid query param \"s\": %v\n", err)))
+ //return
+ //}
+
+ w.Header().Set("Content-Type", "application/json")
+ w.WriteHeader(http.StatusOK)
+ w.Write([]byte(`{"state":null,"img":""}`))
+ return
+}
+
+func RunWebGame(address string, height, width, sleepMs int, mutate bool) (int, error) {
+ http.HandleFunc("/", HandleWebGameRoot)
+ http.HandleFunc("/state", HandleWebGameState)
+ http.HandleFunc("/static/", HandleWebGameStatic)
+
+ fmt.Printf("Serving on %v\n", address)
+ err := http.ListenAndServe(address, nil)
+ if err != nil {
+ return 1, err
+ }
+ return 0, nil
}
diff --git a/conway/web_assets.go b/conway/web_assets.go
new file mode 100644
index 0000000..b43e6d3
--- /dev/null
+++ b/conway/web_assets.go
@@ -0,0 +1,1849 @@
+package conway
+
+const (
+ GAME_OF_LIFE_INDEX_HTML = `
+
+
+
+ Conway's Game of Life
+
+
+
+
+
+ Conway's Game of Life
+
+
+
+
+
+
+
+
+`
+ NORMALIZE_CSS = `
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section,
+summary {
+ display: block;
+}
+audio,
+canvas,
+video {
+ display: inline-block;
+}
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+[hidden] {
+ display: none;
+}
+html {
+ font-family: sans-serif;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+body {
+ margin: 0;
+}
+a:focus {
+ outline: thin dotted;
+}
+a:active,
+a:hover {
+ outline: 0;
+}
+h1 {
+ font-size: 2em;
+}
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+b,
+strong {
+ font-weight: bold;
+}
+dfn {
+ font-style: italic;
+}
+mark {
+ background: #ff0;
+ color: #000;
+}
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, serif;
+ font-size: 1em;
+}
+pre {
+ white-space: pre;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+q {
+ quotes: "\201C" "\201D" "\2018" "\2019";
+}
+small {
+ font-size: 80%;
+}
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+sup {
+ top: -0.5em;
+}
+sub {
+ bottom: -0.25em;
+}
+img {
+ border: 0;
+}
+svg:not(:root) {
+ overflow: hidden;
+}
+figure {
+ margin: 0;
+}
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+legend {
+ border: 0;
+ padding: 0;
+}
+button,
+input,
+select,
+textarea {
+ font-family: inherit;
+ font-size: 100%;
+ margin: 0;
+}
+button,
+input {
+ line-height: normal;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer;
+}
+button[disabled],
+input[disabled] {
+ cursor: default;
+}
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+input[type="search"] {
+ -webkit-appearance: textfield;
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+textarea {
+ overflow: auto;
+ vertical-align: top;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+`
+ JQUERY_MIN_JS = `
+LyohIGpRdWVyeSB2MS44LjMganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLw0KKGZ1
+bmN0aW9uKGUsdCl7ZnVuY3Rpb24gXyhlKXt2YXIgdD1NW2VdPXt9O3JldHVybiB2LmVhY2goZS5z
+cGxpdCh5KSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fWZ1bmN0aW9uIEgoZSxuLHIpe2lmKHI9
+PT10JiZlLm5vZGVUeXBlPT09MSl7dmFyIGk9ImRhdGEtIituLnJlcGxhY2UoUCwiLSQxIikudG9M
+b3dlckNhc2UoKTtyPWUuZ2V0QXR0cmlidXRlKGkpO2lmKHR5cGVvZiByPT0ic3RyaW5nIil7dHJ5
+e3I9cj09PSJ0cnVlIj8hMDpyPT09ImZhbHNlIj8hMTpyPT09Im51bGwiP251bGw6K3IrIiI9PT1y
+PytyOkQudGVzdChyKT92LnBhcnNlSlNPTihyKTpyfWNhdGNoKHMpe312LmRhdGEoZSxuLHIpfWVs
+c2Ugcj10fXJldHVybiByfWZ1bmN0aW9uIEIoZSl7dmFyIHQ7Zm9yKHQgaW4gZSl7aWYodD09PSJk
+YXRhIiYmdi5pc0VtcHR5T2JqZWN0KGVbdF0pKWNvbnRpbnVlO2lmKHQhPT0idG9KU09OIilyZXR1
+cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBldCgpe3JldHVybiExfWZ1bmN0aW9uIHR0KCl7cmV0dXJu
+ITB9ZnVuY3Rpb24gdXQoZSl7cmV0dXJuIWV8fCFlLnBhcmVudE5vZGV8fGUucGFyZW50Tm9kZS5u
+b2RlVHlwZT09PTExfWZ1bmN0aW9uIGF0KGUsdCl7ZG8gZT1lW3RdO3doaWxlKGUmJmUubm9kZVR5
+cGUhPT0xKTtyZXR1cm4gZX1mdW5jdGlvbiBmdChlLHQsbil7dD10fHwwO2lmKHYuaXNGdW5jdGlv
+bih0KSlyZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxyKXt2YXIgaT0hIXQuY2FsbChlLHIsZSk7
+cmV0dXJuIGk9PT1ufSk7aWYodC5ub2RlVHlwZSlyZXR1cm4gdi5ncmVwKGUsZnVuY3Rpb24oZSxy
+KXtyZXR1cm4gZT09PXQ9PT1ufSk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt2YXIgcj12LmdyZXAo
+ZSxmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTF9KTtpZihpdC50ZXN0KHQpKXJldHVy
+biB2LmZpbHRlcih0LHIsIW4pO3Q9di5maWx0ZXIodCxyKX1yZXR1cm4gdi5ncmVwKGUsZnVuY3Rp
+b24oZSxyKXtyZXR1cm4gdi5pbkFycmF5KGUsdCk+PTA9PT1ufSl9ZnVuY3Rpb24gbHQoZSl7dmFy
+IHQ9Y3Quc3BsaXQoInwiKSxuPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKG4uY3JlYXRl
+RWxlbWVudCl3aGlsZSh0Lmxlbmd0aCluLmNyZWF0ZUVsZW1lbnQodC5wb3AoKSk7cmV0dXJuIG59
+ZnVuY3Rpb24gTHQoZSx0KXtyZXR1cm4gZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXXx8ZS5h
+cHBlbmRDaGlsZChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSl9ZnVuY3Rpb24gQXQo
+ZSx0KXtpZih0Lm5vZGVUeXBlIT09MXx8IXYuaGFzRGF0YShlKSlyZXR1cm47dmFyIG4scixpLHM9
+di5fZGF0YShlKSxvPXYuX2RhdGEodCxzKSx1PXMuZXZlbnRzO2lmKHUpe2RlbGV0ZSBvLmhhbmRs
+ZSxvLmV2ZW50cz17fTtmb3IobiBpbiB1KWZvcihyPTAsaT11W25dLmxlbmd0aDtyPGk7cisrKXYu
+ZXZlbnQuYWRkKHQsbix1W25dW3JdKX1vLmRhdGEmJihvLmRhdGE9di5leHRlbmQoe30sby5kYXRh
+KSl9ZnVuY3Rpb24gT3QoZSx0KXt2YXIgbjtpZih0Lm5vZGVUeXBlIT09MSlyZXR1cm47dC5jbGVh
+ckF0dHJpYnV0ZXMmJnQuY2xlYXJBdHRyaWJ1dGVzKCksdC5tZXJnZUF0dHJpYnV0ZXMmJnQubWVy
+Z2VBdHRyaWJ1dGVzKGUpLG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG49PT0ib2JqZWN0Ij8o
+dC5wYXJlbnROb2RlJiYodC5vdXRlckhUTUw9ZS5vdXRlckhUTUwpLHYuc3VwcG9ydC5odG1sNUNs
+b25lJiZlLmlubmVySFRNTCYmIXYudHJpbSh0LmlubmVySFRNTCkmJih0LmlubmVySFRNTD1lLmlu
+bmVySFRNTCkpOm49PT0iaW5wdXQiJiZFdC50ZXN0KGUudHlwZSk/KHQuZGVmYXVsdENoZWNrZWQ9
+dC5jaGVja2VkPWUuY2hlY2tlZCx0LnZhbHVlIT09ZS52YWx1ZSYmKHQudmFsdWU9ZS52YWx1ZSkp
+Om49PT0ib3B0aW9uIj90LnNlbGVjdGVkPWUuZGVmYXVsdFNlbGVjdGVkOm49PT0iaW5wdXQifHxu
+PT09InRleHRhcmVhIj90LmRlZmF1bHRWYWx1ZT1lLmRlZmF1bHRWYWx1ZTpuPT09InNjcmlwdCIm
+JnQudGV4dCE9PWUudGV4dCYmKHQudGV4dD1lLnRleHQpLHQucmVtb3ZlQXR0cmlidXRlKHYuZXhw
+YW5kbyl9ZnVuY3Rpb24gTXQoZSl7cmV0dXJuIHR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1l
+IT0idW5kZWZpbmVkIj9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6dHlwZW9mIGUucXVlcnlT
+ZWxlY3RvckFsbCE9InVuZGVmaW5lZCI/ZS5xdWVyeVNlbGVjdG9yQWxsKCIqIik6W119ZnVuY3Rp
+b24gX3QoZSl7RXQudGVzdChlLnR5cGUpJiYoZS5kZWZhdWx0Q2hlY2tlZD1lLmNoZWNrZWQpfWZ1
+bmN0aW9uIFF0KGUsdCl7aWYodCBpbiBlKXJldHVybiB0O3ZhciBuPXQuY2hhckF0KDApLnRvVXBw
+ZXJDYXNlKCkrdC5zbGljZSgxKSxyPXQsaT1KdC5sZW5ndGg7d2hpbGUoaS0tKXt0PUp0W2ldK247
+aWYodCBpbiBlKXJldHVybiB0fXJldHVybiByfWZ1bmN0aW9uIEd0KGUsdCl7cmV0dXJuIGU9dHx8
+ZSx2LmNzcyhlLCJkaXNwbGF5Iik9PT0ibm9uZSJ8fCF2LmNvbnRhaW5zKGUub3duZXJEb2N1bWVu
+dCxlKX1mdW5jdGlvbiBZdChlLHQpe3ZhciBuLHIsaT1bXSxzPTAsbz1lLmxlbmd0aDtmb3IoO3M8
+bztzKyspe249ZVtzXTtpZighbi5zdHlsZSljb250aW51ZTtpW3NdPXYuX2RhdGEobiwib2xkZGlz
+cGxheSIpLHQ/KCFpW3NdJiZuLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSImJihuLnN0eWxlLmRpc3Bs
+YXk9IiIpLG4uc3R5bGUuZGlzcGxheT09PSIiJiZHdChuKSYmKGlbc109di5fZGF0YShuLCJvbGRk
+aXNwbGF5IixubihuLm5vZGVOYW1lKSkpKToocj1EdChuLCJkaXNwbGF5IiksIWlbc10mJnIhPT0i
+bm9uZSImJnYuX2RhdGEobiwib2xkZGlzcGxheSIscikpfWZvcihzPTA7czxvO3MrKyl7bj1lW3Nd
+O2lmKCFuLnN0eWxlKWNvbnRpbnVlO2lmKCF0fHxuLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fG4u
+c3R5bGUuZGlzcGxheT09PSIiKW4uc3R5bGUuZGlzcGxheT10P2lbc118fCIiOiJub25lIn1yZXR1
+cm4gZX1mdW5jdGlvbiBadChlLHQsbil7dmFyIHI9UnQuZXhlYyh0KTtyZXR1cm4gcj9NYXRoLm1h
+eCgwLHJbMV0tKG58fDApKSsoclsyXXx8InB4Iik6dH1mdW5jdGlvbiBlbihlLHQsbixyKXt2YXIg
+aT1uPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKT80OnQ9PT0id2lkdGgiPzE6MCxzPTA7Zm9yKDtp
+PDQ7aSs9MiluPT09Im1hcmdpbiImJihzKz12LmNzcyhlLG4rJHRbaV0sITApKSxyPyhuPT09ImNv
+bnRlbnQiJiYocy09cGFyc2VGbG9hdChEdChlLCJwYWRkaW5nIiskdFtpXSkpfHwwKSxuIT09Im1h
+cmdpbiImJihzLT1wYXJzZUZsb2F0KER0KGUsImJvcmRlciIrJHRbaV0rIldpZHRoIikpfHwwKSk6
+KHMrPXBhcnNlRmxvYXQoRHQoZSwicGFkZGluZyIrJHRbaV0pKXx8MCxuIT09InBhZGRpbmciJiYo
+cys9cGFyc2VGbG9hdChEdChlLCJib3JkZXIiKyR0W2ldKyJXaWR0aCIpKXx8MCkpO3JldHVybiBz
+fWZ1bmN0aW9uIHRuKGUsdCxuKXt2YXIgcj10PT09IndpZHRoIj9lLm9mZnNldFdpZHRoOmUub2Zm
+c2V0SGVpZ2h0LGk9ITAscz12LnN1cHBvcnQuYm94U2l6aW5nJiZ2LmNzcyhlLCJib3hTaXppbmci
+KT09PSJib3JkZXItYm94IjtpZihyPD0wfHxyPT1udWxsKXtyPUR0KGUsdCk7aWYocjwwfHxyPT1u
+dWxsKXI9ZS5zdHlsZVt0XTtpZihVdC50ZXN0KHIpKXJldHVybiByO2k9cyYmKHYuc3VwcG9ydC5i
+b3hTaXppbmdSZWxpYWJsZXx8cj09PWUuc3R5bGVbdF0pLHI9cGFyc2VGbG9hdChyKXx8MH1yZXR1
+cm4gcitlbihlLHQsbnx8KHM/ImJvcmRlciI6ImNvbnRlbnQiKSxpKSsicHgifWZ1bmN0aW9uIG5u
+KGUpe2lmKFd0W2VdKXJldHVybiBXdFtlXTt2YXIgdD12KCI8IitlKyI+IikuYXBwZW5kVG8oaS5i
+b2R5KSxuPXQuY3NzKCJkaXNwbGF5Iik7dC5yZW1vdmUoKTtpZihuPT09Im5vbmUifHxuPT09IiIp
+e1B0PWkuYm9keS5hcHBlbmRDaGlsZChQdHx8di5leHRlbmQoaS5jcmVhdGVFbGVtZW50KCJpZnJh
+bWUiKSx7ZnJhbWVCb3JkZXI6MCx3aWR0aDowLGhlaWdodDowfSkpO2lmKCFIdHx8IVB0LmNyZWF0
+ZUVsZW1lbnQpSHQ9KFB0LmNvbnRlbnRXaW5kb3d8fFB0LmNvbnRlbnREb2N1bWVudCkuZG9jdW1l
+bnQsSHQud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLEh0LmNsb3NlKCk7dD1I
+dC5ib2R5LmFwcGVuZENoaWxkKEh0LmNyZWF0ZUVsZW1lbnQoZSkpLG49RHQodCwiZGlzcGxheSIp
+LGkuYm9keS5yZW1vdmVDaGlsZChQdCl9cmV0dXJuIFd0W2VdPW4sbn1mdW5jdGlvbiBmbihlLHQs
+bixyKXt2YXIgaTtpZih2LmlzQXJyYXkodCkpdi5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHxzbi50
+ZXN0KGUpP3IoZSxpKTpmbihlKyJbIisodHlwZW9mIGk9PSJvYmplY3QiP3Q6IiIpKyJdIixpLG4s
+cil9KTtlbHNlIGlmKCFuJiZ2LnR5cGUodCk9PT0ib2JqZWN0Iilmb3IoaSBpbiB0KWZuKGUrIlsi
+K2krIl0iLHRbaV0sbixyKTtlbHNlIHIoZSx0KX1mdW5jdGlvbiBDbihlKXtyZXR1cm4gZnVuY3Rp
+b24odCxuKXt0eXBlb2YgdCE9InN0cmluZyImJihuPXQsdD0iKiIpO3ZhciByLGkscyxvPXQudG9M
+b3dlckNhc2UoKS5zcGxpdCh5KSx1PTAsYT1vLmxlbmd0aDtpZih2LmlzRnVuY3Rpb24obikpZm9y
+KDt1PGE7dSsrKXI9b1t1XSxzPS9eXCsvLnRlc3QocikscyYmKHI9ci5zdWJzdHIoMSl8fCIqIiks
+aT1lW3JdPWVbcl18fFtdLGlbcz8idW5zaGlmdCI6InB1c2giXShuKX19ZnVuY3Rpb24ga24oZSxu
+LHIsaSxzLG8pe3M9c3x8bi5kYXRhVHlwZXNbMF0sbz1vfHx7fSxvW3NdPSEwO3ZhciB1LGE9ZVtz
+XSxmPTAsbD1hP2EubGVuZ3RoOjAsYz1lPT09U247Zm9yKDtmPGwmJihjfHwhdSk7ZisrKXU9YVtm
+XShuLHIsaSksdHlwZW9mIHU9PSJzdHJpbmciJiYoIWN8fG9bdV0/dT10OihuLmRhdGFUeXBlcy51
+bnNoaWZ0KHUpLHU9a24oZSxuLHIsaSx1LG8pKSk7cmV0dXJuKGN8fCF1KSYmIW9bIioiXSYmKHU9
+a24oZSxuLHIsaSwiKiIsbykpLHV9ZnVuY3Rpb24gTG4oZSxuKXt2YXIgcixpLHM9di5hamF4U2V0
+dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihyIGluIG4pbltyXSE9PXQmJigoc1tyXT9lOml8fChp
+PXt9KSlbcl09bltyXSk7aSYmdi5leHRlbmQoITAsZSxpKX1mdW5jdGlvbiBBbihlLG4scil7dmFy
+IGkscyxvLHUsYT1lLmNvbnRlbnRzLGY9ZS5kYXRhVHlwZXMsbD1lLnJlc3BvbnNlRmllbGRzO2Zv
+cihzIGluIGwpcyBpbiByJiYobltsW3NdXT1yW3NdKTt3aGlsZShmWzBdPT09IioiKWYuc2hpZnQo
+KSxpPT09dCYmKGk9ZS5taW1lVHlwZXx8bi5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBl
+IikpO2lmKGkpZm9yKHMgaW4gYSlpZihhW3NdJiZhW3NdLnRlc3QoaSkpe2YudW5zaGlmdChzKTti
+cmVha31pZihmWzBdaW4gcilvPWZbMF07ZWxzZXtmb3IocyBpbiByKXtpZighZlswXXx8ZS5jb252
+ZXJ0ZXJzW3MrIiAiK2ZbMF1dKXtvPXM7YnJlYWt9dXx8KHU9cyl9bz1vfHx1fWlmKG8pcmV0dXJu
+IG8hPT1mWzBdJiZmLnVuc2hpZnQobykscltvXX1mdW5jdGlvbiBPbihlLHQpe3ZhciBuLHIsaSxz
+LG89ZS5kYXRhVHlwZXMuc2xpY2UoKSx1PW9bMF0sYT17fSxmPTA7ZS5kYXRhRmlsdGVyJiYodD1l
+LmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSk7aWYob1sxXSlmb3IobiBpbiBlLmNvbnZlcnRlcnMp
+YVtuLnRvTG93ZXJDYXNlKCldPWUuY29udmVydGVyc1tuXTtmb3IoO2k9b1srK2ZdOylpZihpIT09
+IioiKXtpZih1IT09IioiJiZ1IT09aSl7bj1hW3UrIiAiK2ldfHxhWyIqICIraV07aWYoIW4pZm9y
+KHIgaW4gYSl7cz1yLnNwbGl0KCIgIik7aWYoc1sxXT09PWkpe249YVt1KyIgIitzWzBdXXx8YVsi
+KiAiK3NbMF1dO2lmKG4pe249PT0hMD9uPWFbcl06YVtyXSE9PSEwJiYoaT1zWzBdLG8uc3BsaWNl
+KGYtLSwwLGkpKTticmVha319fWlmKG4hPT0hMClpZihuJiZlWyJ0aHJvd3MiXSl0PW4odCk7ZWxz
+ZSB0cnl7dD1uKHQpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOm4/
+bDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIraX19fXU9aX1yZXR1cm57c3RhdGU6InN1
+Y2Nlc3MiLGRhdGE6dH19ZnVuY3Rpb24gRm4oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1
+ZXN0fWNhdGNoKHQpe319ZnVuY3Rpb24gSW4oKXt0cnl7cmV0dXJuIG5ldyBlLkFjdGl2ZVhPYmpl
+Y3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2godCl7fX1mdW5jdGlvbiAkbigpe3JldHVybiBz
+ZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cW49dH0sMCkscW49di5ub3coKX1mdW5jdGlvbiBKbihlLHQp
+e3YuZWFjaCh0LGZ1bmN0aW9uKHQsbil7dmFyIHI9KFZuW3RdfHxbXSkuY29uY2F0KFZuWyIqIl0p
+LGk9MCxzPXIubGVuZ3RoO2Zvcig7aTxzO2krKylpZihyW2ldLmNhbGwoZSx0LG4pKXJldHVybn0p
+fWZ1bmN0aW9uIEtuKGUsdCxuKXt2YXIgcixpPTAscz0wLG89WG4ubGVuZ3RoLHU9di5EZWZlcnJl
+ZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBhLmVsZW19KSxhPWZ1bmN0aW9uKCl7dmFyIHQ9
+cW58fCRuKCksbj1NYXRoLm1heCgwLGYuc3RhcnRUaW1lK2YuZHVyYXRpb24tdCkscj1uL2YuZHVy
+YXRpb258fDAsaT0xLXIscz0wLG89Zi50d2VlbnMubGVuZ3RoO2Zvcig7czxvO3MrKylmLnR3ZWVu
+c1tzXS5ydW4oaSk7cmV0dXJuIHUubm90aWZ5V2l0aChlLFtmLGksbl0pLGk8MSYmbz9uOih1LnJl
+c29sdmVXaXRoKGUsW2ZdKSwhMSl9LGY9dS5wcm9taXNlKHtlbGVtOmUscHJvcHM6di5leHRlbmQo
+e30sdCksb3B0czp2LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fX0sbiksb3JpZ2luYWxQcm9w
+ZXJ0aWVzOnQsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOnFufHwkbigpLGR1cmF0aW9uOm4u
+ZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKHQsbixyKXt2YXIgaT12LlR3
+ZWVuKGUsZi5vcHRzLHQsbixmLm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8Zi5vcHRzLmVhc2luZyk7
+cmV0dXJuIGYudHdlZW5zLnB1c2goaSksaX0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD9m
+LnR3ZWVucy5sZW5ndGg6MDtmb3IoO248cjtuKyspZi50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0
+P3UucmVzb2x2ZVdpdGgoZSxbZix0XSk6dS5yZWplY3RXaXRoKGUsW2YsdF0pLHRoaXN9fSksbD1m
+LnByb3BzO1FuKGwsZi5vcHRzLnNwZWNpYWxFYXNpbmcpO2Zvcig7aTxvO2krKyl7cj1YbltpXS5j
+YWxsKGYsZSxsLGYub3B0cyk7aWYocilyZXR1cm4gcn1yZXR1cm4gSm4oZixsKSx2LmlzRnVuY3Rp
+b24oZi5vcHRzLnN0YXJ0KSYmZi5vcHRzLnN0YXJ0LmNhbGwoZSxmKSx2LmZ4LnRpbWVyKHYuZXh0
+ZW5kKGEse2FuaW06ZixxdWV1ZTpmLm9wdHMucXVldWUsZWxlbTplfSkpLGYucHJvZ3Jlc3MoZi5v
+cHRzLnByb2dyZXNzKS5kb25lKGYub3B0cy5kb25lLGYub3B0cy5jb21wbGV0ZSkuZmFpbChmLm9w
+dHMuZmFpbCkuYWx3YXlzKGYub3B0cy5hbHdheXMpfWZ1bmN0aW9uIFFuKGUsdCl7dmFyIG4scixp
+LHMsbztmb3IobiBpbiBlKXtyPXYuY2FtZWxDYXNlKG4pLGk9dFtyXSxzPWVbbl0sdi5pc0FycmF5
+KHMpJiYoaT1zWzFdLHM9ZVtuXT1zWzBdKSxuIT09ciYmKGVbcl09cyxkZWxldGUgZVtuXSksbz12
+LmNzc0hvb2tzW3JdO2lmKG8mJiJleHBhbmQiaW4gbyl7cz1vLmV4cGFuZChzKSxkZWxldGUgZVty
+XTtmb3IobiBpbiBzKW4gaW4gZXx8KGVbbl09c1tuXSx0W25dPWkpfWVsc2UgdFtyXT1pfX1mdW5j
+dGlvbiBHbihlLHQsbil7dmFyIHIsaSxzLG8sdSxhLGYsbCxjLGg9dGhpcyxwPWUuc3R5bGUsZD17
+fSxtPVtdLGc9ZS5ub2RlVHlwZSYmR3QoZSk7bi5xdWV1ZXx8KGw9di5fcXVldWVIb29rcyhlLCJm
+eCIpLGwudW5xdWV1ZWQ9PW51bGwmJihsLnVucXVldWVkPTAsYz1sLmVtcHR5LmZpcmUsbC5lbXB0
+eS5maXJlPWZ1bmN0aW9uKCl7bC51bnF1ZXVlZHx8YygpfSksbC51bnF1ZXVlZCsrLGguYWx3YXlz
+KGZ1bmN0aW9uKCl7aC5hbHdheXMoZnVuY3Rpb24oKXtsLnVucXVldWVkLS0sdi5xdWV1ZShlLCJm
+eCIpLmxlbmd0aHx8bC5lbXB0eS5maXJlKCl9KX0pKSxlLm5vZGVUeXBlPT09MSYmKCJoZWlnaHQi
+aW4gdHx8IndpZHRoImluIHQpJiYobi5vdmVyZmxvdz1bcC5vdmVyZmxvdyxwLm92ZXJmbG93WCxw
+Lm92ZXJmbG93WV0sdi5jc3MoZSwiZGlzcGxheSIpPT09ImlubGluZSImJnYuY3NzKGUsImZsb2F0
+Iik9PT0ibm9uZSImJighdi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fG5uKGUubm9k
+ZU5hbWUpPT09ImlubGluZSI/cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnAuem9vbT0xKSksbi5v
+dmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsdi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3N8
+fGguZG9uZShmdW5jdGlvbigpe3Aub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1u
+Lm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSk7Zm9yKHIgaW4gdCl7cz10
+W3JdO2lmKFVuLmV4ZWMocykpe2RlbGV0ZSB0W3JdLGE9YXx8cz09PSJ0b2dnbGUiO2lmKHM9PT0o
+Zz8iaGlkZSI6InNob3ciKSljb250aW51ZTttLnB1c2gocil9fW89bS5sZW5ndGg7aWYobyl7dT12
+Ll9kYXRhKGUsImZ4c2hvdyIpfHx2Ll9kYXRhKGUsImZ4c2hvdyIse30pLCJoaWRkZW4iaW4gdSYm
+KGc9dS5oaWRkZW4pLGEmJih1LmhpZGRlbj0hZyksZz92KGUpLnNob3coKTpoLmRvbmUoZnVuY3Rp
+b24oKXt2KGUpLmhpZGUoKX0pLGguZG9uZShmdW5jdGlvbigpe3ZhciB0O3YucmVtb3ZlRGF0YShl
+LCJmeHNob3ciLCEwKTtmb3IodCBpbiBkKXYuc3R5bGUoZSx0LGRbdF0pfSk7Zm9yKHI9MDtyPG87
+cisrKWk9bVtyXSxmPWguY3JlYXRlVHdlZW4oaSxnP3VbaV06MCksZFtpXT11W2ldfHx2LnN0eWxl
+KGUsaSksaSBpbiB1fHwodVtpXT1mLnN0YXJ0LGcmJihmLmVuZD1mLnN0YXJ0LGYuc3RhcnQ9aT09
+PSJ3aWR0aCJ8fGk9PT0iaGVpZ2h0Ij8xOjApKX19ZnVuY3Rpb24gWW4oZSx0LG4scixpKXtyZXR1
+cm4gbmV3IFluLnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9ZnVuY3Rpb24gWm4oZSx0KXt2YXIg
+bixyPXtoZWlnaHQ6ZX0saT0wO3Q9dD8xOjA7Zm9yKDtpPDQ7aSs9Mi10KW49JHRbaV0sclsibWFy
+Z2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSks
+cn1mdW5jdGlvbiB0cihlKXtyZXR1cm4gdi5pc1dpbmRvdyhlKT9lOmUubm9kZVR5cGU9PT05P2Uu
+ZGVmYXVsdFZpZXd8fGUucGFyZW50V2luZG93OiExfXZhciBuLHIsaT1lLmRvY3VtZW50LHM9ZS5s
+b2NhdGlvbixvPWUubmF2aWdhdG9yLHU9ZS5qUXVlcnksYT1lLiQsZj1BcnJheS5wcm90b3R5cGUu
+cHVzaCxsPUFycmF5LnByb3RvdHlwZS5zbGljZSxjPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLGg9
+T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxwPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVy
+dHksZD1TdHJpbmcucHJvdG90eXBlLnRyaW0sdj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdi5m
+bi5pbml0KGUsdCxuKX0sbT0vW1wtK10/KD86XGQqXC58KVxkKyg/OltlRV1bXC0rXT9cZCt8KS8u
+c291cmNlLGc9L1xTLyx5PS9ccysvLGI9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0r
+JC9nLHc9L14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLEU9L148KFx3
+KylccypcLz8+KD86PFwvXDE+fCkkLyxTPS9eW1xdLDp7fVxzXSokLyx4PS8oPzpefDp8LCkoPzpc
+cypcWykrL2csVD0vXFwoPzpbIlxcXC9iZm5ydF18dVtcZGEtZkEtRl17NH0pL2csTj0vIlteIlxc
+XHJcbl0qInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcZFxkKlwufClcZCsoPzpbZUVdW1wtK10/XGQr
+fCkvZyxDPS9eLW1zLS8saz0vLShbXGRhLXpdKS9naSxMPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQr
+IiIpLnRvVXBwZXJDYXNlKCl9LEE9ZnVuY3Rpb24oKXtpLmFkZEV2ZW50TGlzdGVuZXI/KGkucmVt
+b3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQSwhMSksdi5yZWFkeSgpKTppLnJl
+YWR5U3RhdGU9PT0iY29tcGxldGUiJiYoaS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdl
+IixBKSx2LnJlYWR5KCkpfSxPPXt9O3YuZm49di5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnYsaW5p
+dDpmdW5jdGlvbihlLG4scil7dmFyIHMsbyx1LGE7aWYoIWUpcmV0dXJuIHRoaXM7aWYoZS5ub2Rl
+VHlwZSlyZXR1cm4gdGhpcy5jb250ZXh0PXRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXM7aWYo
+dHlwZW9mIGU9PSJzdHJpbmciKXtlLmNoYXJBdCgwKT09PSI8IiYmZS5jaGFyQXQoZS5sZW5ndGgt
+MSk9PT0iPiImJmUubGVuZ3RoPj0zP3M9W251bGwsZSxudWxsXTpzPXcuZXhlYyhlKTtpZihzJiYo
+c1sxXXx8IW4pKXtpZihzWzFdKXJldHVybiBuPW4gaW5zdGFuY2VvZiB2P25bMF06bixhPW4mJm4u
+bm9kZVR5cGU/bi5vd25lckRvY3VtZW50fHxuOmksZT12LnBhcnNlSFRNTChzWzFdLGEsITApLEUu
+dGVzdChzWzFdKSYmdi5pc1BsYWluT2JqZWN0KG4pJiZ0aGlzLmF0dHIuY2FsbChlLG4sITApLHYu
+bWVyZ2UodGhpcyxlKTtvPWkuZ2V0RWxlbWVudEJ5SWQoc1syXSk7aWYobyYmby5wYXJlbnROb2Rl
+KXtpZihvLmlkIT09c1syXSlyZXR1cm4gci5maW5kKGUpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1v
+fXJldHVybiB0aGlzLmNvbnRleHQ9aSx0aGlzLnNlbGVjdG9yPWUsdGhpc31yZXR1cm4hbnx8bi5q
+cXVlcnk/KG58fHIpLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3RvcihuKS5maW5kKGUpfXJldHVybiB2
+LmlzRnVuY3Rpb24oZSk/ci5yZWFkeShlKTooZS5zZWxlY3RvciE9PXQmJih0aGlzLnNlbGVjdG9y
+PWUuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWUuY29udGV4dCksdi5tYWtlQXJyYXkoZSx0aGlzKSl9
+LHNlbGVjdG9yOiIiLGpxdWVyeToiMS44LjMiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1
+cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gbC5jYWxsKHRoaXMpfSxn
+ZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PW51bGw/dGhpcy50b0FycmF5KCk6ZTwwP3RoaXNbdGhp
+cy5sZW5ndGgrZV06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj12Lm1l
+cmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gci5wcmV2T2JqZWN0PXRoaXMsci5jb250
+ZXh0PXRoaXMuY29udGV4dCx0PT09ImZpbmQiP3Iuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhp
+cy5zZWxlY3Rvcj8iICI6IiIpK246dCYmKHIuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrdCsi
+KCIrbisiKSIpLHJ9LGVhY2g6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5lYWNoKHRoaXMsZSx0KX0s
+cmVhZHk6ZnVuY3Rpb24oZSl7cmV0dXJuIHYucmVhZHkucHJvbWlzZSgpLmRvbmUoZSksdGhpc30s
+ZXE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9K2UsZT09PS0xP3RoaXMuc2xpY2UoZSk6dGhpcy5zbGlj
+ZShlLGUrMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rp
+b24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVz
+aFN0YWNrKGwuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsbC5jYWxsKGFyZ3VtZW50cyku
+am9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayh2Lm1hcCh0
+aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LGVuZDpmdW5jdGlvbigp
+e3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6Zixz
+b3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sdi5mbi5pbml0LnByb3RvdHlwZT12LmZuLHYu
+ZXh0ZW5kPXYuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsbixyLGkscyxvLHU9YXJndW1lbnRz
+WzBdfHx7fSxhPTEsZj1hcmd1bWVudHMubGVuZ3RoLGw9ITE7dHlwZW9mIHU9PSJib29sZWFuIiYm
+KGw9dSx1PWFyZ3VtZW50c1sxXXx8e30sYT0yKSx0eXBlb2YgdSE9Im9iamVjdCImJiF2LmlzRnVu
+Y3Rpb24odSkmJih1PXt9KSxmPT09YSYmKHU9dGhpcywtLWEpO2Zvcig7YTxmO2ErKylpZigoZT1h
+cmd1bWVudHNbYV0pIT1udWxsKWZvcihuIGluIGUpe3I9dVtuXSxpPWVbbl07aWYodT09PWkpY29u
+dGludWU7bCYmaSYmKHYuaXNQbGFpbk9iamVjdChpKXx8KHM9di5pc0FycmF5KGkpKSk/KHM/KHM9
+ITEsbz1yJiZ2LmlzQXJyYXkocik/cjpbXSk6bz1yJiZ2LmlzUGxhaW5PYmplY3Qocik/cjp7fSx1
+W25dPXYuZXh0ZW5kKGwsbyxpKSk6aSE9PXQmJih1W25dPWkpfXJldHVybiB1fSx2LmV4dGVuZCh7
+bm9Db25mbGljdDpmdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09diYmKGUuJD1hKSx0JiZlLmpRdWVy
+eT09PXYmJihlLmpRdWVyeT11KSx2fSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpm
+dW5jdGlvbihlKXtlP3YucmVhZHlXYWl0Kys6di5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGUp
+e2lmKGU9PT0hMD8tLXYucmVhZHlXYWl0OnYuaXNSZWFkeSlyZXR1cm47aWYoIWkuYm9keSlyZXR1
+cm4gc2V0VGltZW91dCh2LnJlYWR5LDEpO3YuaXNSZWFkeT0hMDtpZihlIT09ITAmJi0tdi5yZWFk
+eVdhaXQ+MClyZXR1cm47ci5yZXNvbHZlV2l0aChpLFt2XSksdi5mbi50cmlnZ2VyJiZ2KGkpLnRy
+aWdnZXIoInJlYWR5Iikub2ZmKCJyZWFkeSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVy
+biB2LnR5cGUoZSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9u
+KGUpe3JldHVybiB2LnR5cGUoZSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihlKXtyZXR1
+cm4gZSE9bnVsbCYmZT09ZS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihlKXtyZXR1cm4haXNO
+YU4ocGFyc2VGbG9hdChlKSkmJmlzRmluaXRlKGUpfSx0eXBlOmZ1bmN0aW9uKGUpe3JldHVybiBl
+PT1udWxsP1N0cmluZyhlKTpPW2guY2FsbChlKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1
+bmN0aW9uKGUpe2lmKCFlfHx2LnR5cGUoZSkhPT0ib2JqZWN0Inx8ZS5ub2RlVHlwZXx8di5pc1dp
+bmRvdyhlKSlyZXR1cm4hMTt0cnl7aWYoZS5jb25zdHJ1Y3RvciYmIXAuY2FsbChlLCJjb25zdHJ1
+Y3RvciIpJiYhcC5jYWxsKGUuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikp
+cmV0dXJuITF9Y2F0Y2gobil7cmV0dXJuITF9dmFyIHI7Zm9yKHIgaW4gZSk7cmV0dXJuIHI9PT10
+fHxwLmNhbGwoZSxyKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihlKXt2YXIgdDtmb3IodCBpbiBl
+KXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9
+LHBhcnNlSFRNTDpmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIWV8fHR5cGVvZiBlIT0ic3Ry
+aW5nIj9udWxsOih0eXBlb2YgdD09ImJvb2xlYW4iJiYobj10LHQ9MCksdD10fHxpLChyPUUuZXhl
+YyhlKSk/W3QuY3JlYXRlRWxlbWVudChyWzFdKV06KHI9di5idWlsZEZyYWdtZW50KFtlXSx0LG4/
+bnVsbDpbXSksdi5tZXJnZShbXSwoci5jYWNoZWFibGU/di5jbG9uZShyLmZyYWdtZW50KTpyLmZy
+YWdtZW50KS5jaGlsZE5vZGVzKSkpfSxwYXJzZUpTT046ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVv
+ZiB0IT0ic3RyaW5nIilyZXR1cm4gbnVsbDt0PXYudHJpbSh0KTtpZihlLkpTT04mJmUuSlNPTi5w
+YXJzZSlyZXR1cm4gZS5KU09OLnBhcnNlKHQpO2lmKFMudGVzdCh0LnJlcGxhY2UoVCwiQCIpLnJl
+cGxhY2UoTiwiXSIpLnJlcGxhY2UoeCwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAi
+K3QpKSgpO3YuZXJyb3IoIkludmFsaWQgSlNPTjogIit0KX0scGFyc2VYTUw6ZnVuY3Rpb24obil7
+dmFyIHIsaTtpZighbnx8dHlwZW9mIG4hPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXtlLkRPTVBh
+cnNlcj8oaT1uZXcgRE9NUGFyc2VyLHI9aS5wYXJzZUZyb21TdHJpbmcobiwidGV4dC94bWwiKSk6
+KHI9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxyLmFzeW5jPSJmYWxzZSIs
+ci5sb2FkWE1MKG4pKX1jYXRjaChzKXtyPXR9cmV0dXJuKCFyfHwhci5kb2N1bWVudEVsZW1lbnR8
+fHIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmdi5lcnJvcigi
+SW52YWxpZCBYTUw6ICIrbikscn0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlv
+bih0KXt0JiZnLnRlc3QodCkmJihlLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKHQpe2UuZXZhbC5jYWxs
+KGUsdCl9KSh0KX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoQywibXMt
+IikucmVwbGFjZShrLEwpfSxub2RlTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLm5vZGVOYW1l
+JiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rp
+b24oZSxuLHIpe3ZhciBpLHM9MCxvPWUubGVuZ3RoLHU9bz09PXR8fHYuaXNGdW5jdGlvbihlKTtp
+ZihyKXtpZih1KXtmb3IoaSBpbiBlKWlmKG4uYXBwbHkoZVtpXSxyKT09PSExKWJyZWFrfWVsc2Ug
+Zm9yKDtzPG87KWlmKG4uYXBwbHkoZVtzKytdLHIpPT09ITEpYnJlYWt9ZWxzZSBpZih1KXtmb3Io
+aSBpbiBlKWlmKG4uY2FsbChlW2ldLGksZVtpXSk9PT0hMSlicmVha31lbHNlIGZvcig7czxvOylp
+ZihuLmNhbGwoZVtzXSxzLGVbcysrXSk9PT0hMSlicmVhaztyZXR1cm4gZX0sdHJpbTpkJiYhZC5j
+YWxsKCJcdWZlZmZcdTAwYTAiKT9mdW5jdGlvbihlKXtyZXR1cm4gZT09bnVsbD8iIjpkLmNhbGwo
+ZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBlPT1udWxsPyIiOihlKyIiKS5yZXBsYWNlKGIsIiIpfSxt
+YWtlQXJyYXk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXR8fFtdO3JldHVybiBlIT1udWxsJiYobj12
+LnR5cGUoZSksZS5sZW5ndGg9PW51bGx8fG49PT0ic3RyaW5nInx8bj09PSJmdW5jdGlvbiJ8fG49
+PT0icmVnZXhwInx8di5pc1dpbmRvdyhlKT9mLmNhbGwocixlKTp2Lm1lcmdlKHIsZSkpLHJ9LGlu
+QXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKHQpe2lmKGMpcmV0dXJuIGMuY2FsbCh0LGUs
+bik7cj10Lmxlbmd0aCxuPW4/bjwwP01hdGgubWF4KDAscituKTpuOjA7Zm9yKDtuPHI7bisrKWlm
+KG4gaW4gdCYmdFtuXT09PWUpcmV0dXJuIG59cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGUsbil7
+dmFyIHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxzPTA7aWYodHlwZW9mIHI9PSJudW1iZXIiKWZvcig7
+czxyO3MrKyllW2krK109bltzXTtlbHNlIHdoaWxlKG5bc10hPT10KWVbaSsrXT1uW3MrK107cmV0
+dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1bXSxzPTAsbz1l
+Lmxlbmd0aDtuPSEhbjtmb3IoO3M8bztzKyspcj0hIXQoZVtzXSxzKSxuIT09ciYmaS5wdXNoKGVb
+c10pO3JldHVybiBpfSxtYXA6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLHMsbz1bXSx1PTAsYT1lLmxl
+bmd0aCxmPWUgaW5zdGFuY2VvZiB2fHxhIT09dCYmdHlwZW9mIGE9PSJudW1iZXIiJiYoYT4wJiZl
+WzBdJiZlW2EtMV18fGE9PT0wfHx2LmlzQXJyYXkoZSkpO2lmKGYpZm9yKDt1PGE7dSsrKWk9bihl
+W3VdLHUsciksaSE9bnVsbCYmKG9bby5sZW5ndGhdPWkpO2Vsc2UgZm9yKHMgaW4gZSlpPW4oZVtz
+XSxzLHIpLGkhPW51bGwmJihvW28ubGVuZ3RoXT1pKTtyZXR1cm4gby5jb25jYXQuYXBwbHkoW10s
+byl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihlLG4pe3ZhciByLGkscztyZXR1cm4gdHlwZW9mIG49
+PSJzdHJpbmciJiYocj1lW25dLG49ZSxlPXIpLHYuaXNGdW5jdGlvbihlKT8oaT1sLmNhbGwoYXJn
+dW1lbnRzLDIpLHM9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShuLGkuY29uY2F0KGwuY2FsbChh
+cmd1bWVudHMpKSl9LHMuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHx2Lmd1aWQrKyxzKTp0fSxhY2Nlc3M6
+ZnVuY3Rpb24oZSxuLHIsaSxzLG8sdSl7dmFyIGEsZj1yPT1udWxsLGw9MCxjPWUubGVuZ3RoO2lm
+KHImJnR5cGVvZiByPT0ib2JqZWN0Iil7Zm9yKGwgaW4gcil2LmFjY2VzcyhlLG4sbCxyW2xdLDEs
+byxpKTtzPTF9ZWxzZSBpZihpIT09dCl7YT11PT09dCYmdi5pc0Z1bmN0aW9uKGkpLGYmJihhPyhh
+PW4sbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGEuY2FsbCh2KGUpLG4pfSk6KG4uY2FsbChlLGkp
+LG49bnVsbCkpO2lmKG4pZm9yKDtsPGM7bCsrKW4oZVtsXSxyLGE/aS5jYWxsKGVbbF0sbCxuKGVb
+bF0scikpOmksdSk7cz0xfXJldHVybiBzP2U6Zj9uLmNhbGwoZSk6Yz9uKGVbMF0scik6b30sbm93
+OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9fSksdi5yZWFkeS5wcm9taXNl
+PWZ1bmN0aW9uKHQpe2lmKCFyKXtyPXYuRGVmZXJyZWQoKTtpZihpLnJlYWR5U3RhdGU9PT0iY29t
+cGxldGUiKXNldFRpbWVvdXQodi5yZWFkeSwxKTtlbHNlIGlmKGkuYWRkRXZlbnRMaXN0ZW5lcilp
+LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEEsITEpLGUuYWRkRXZlbnRMaXN0
+ZW5lcigibG9hZCIsdi5yZWFkeSwhMSk7ZWxzZXtpLmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVj
+aGFuZ2UiLEEpLGUuYXR0YWNoRXZlbnQoIm9ubG9hZCIsdi5yZWFkeSk7dmFyIG49ITE7dHJ5e249
+ZS5mcmFtZUVsZW1lbnQ9PW51bGwmJmkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKHMpe31uJiZuLmRv
+U2Nyb2xsJiZmdW5jdGlvbiBvKCl7aWYoIXYuaXNSZWFkeSl7dHJ5e24uZG9TY3JvbGwoImxlZnQi
+KX1jYXRjaChlKXtyZXR1cm4gc2V0VGltZW91dChvLDUwKX12LnJlYWR5KCl9fSgpfX1yZXR1cm4g
+ci5wcm9taXNlKHQpfSx2LmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJh
+eSBEYXRlIFJlZ0V4cCBPYmplY3QiLnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtPWyJbb2JqZWN0
+ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pLG49dihpKTt2YXIgTT17fTt2LkNhbGxiYWNrcz1m
+dW5jdGlvbihlKXtlPXR5cGVvZiBlPT0ic3RyaW5nIj9NW2VdfHxfKGUpOnYuZXh0ZW5kKHt9LGUp
+O3ZhciBuLHIsaSxzLG8sdSxhPVtdLGY9IWUub25jZSYmW10sbD1mdW5jdGlvbih0KXtuPWUubWVt
+b3J5JiZ0LHI9ITAsdT1zfHwwLHM9MCxvPWEubGVuZ3RoLGk9ITA7Zm9yKDthJiZ1PG87dSsrKWlm
+KGFbdV0uYXBwbHkodFswXSx0WzFdKT09PSExJiZlLnN0b3BPbkZhbHNlKXtuPSExO2JyZWFrfWk9
+ITEsYSYmKGY/Zi5sZW5ndGgmJmwoZi5zaGlmdCgpKTpuP2E9W106Yy5kaXNhYmxlKCkpfSxjPXth
+ZGQ6ZnVuY3Rpb24oKXtpZihhKXt2YXIgdD1hLmxlbmd0aDsoZnVuY3Rpb24gcih0KXt2LmVhY2go
+dCxmdW5jdGlvbih0LG4pe3ZhciBpPXYudHlwZShuKTtpPT09ImZ1bmN0aW9uIj8oIWUudW5pcXVl
+fHwhYy5oYXMobikpJiZhLnB1c2gobik6biYmbi5sZW5ndGgmJmkhPT0ic3RyaW5nIiYmcihuKX0p
+fSkoYXJndW1lbnRzKSxpP289YS5sZW5ndGg6biYmKHM9dCxsKG4pKX1yZXR1cm4gdGhpc30scmVt
+b3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGEmJnYuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2
+YXIgbjt3aGlsZSgobj12LmluQXJyYXkodCxhLG4pKT4tMSlhLnNwbGljZShuLDEpLGkmJihuPD1v
+JiZvLS0sbjw9dSYmdS0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gdi5pbkFycmF5
+KGUsYSk+LTF9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGE9W10sdGhpc30sZGlzYWJsZTpmdW5j
+dGlvbigpe3JldHVybiBhPWY9bj10LHRoaXN9LGRpc2FibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIWF9
+LGxvY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZj10LG58fGMuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpm
+dW5jdGlvbigpe3JldHVybiFmfSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fFtd
+LHQ9W2UsdC5zbGljZT90LnNsaWNlKCk6dF0sYSYmKCFyfHxmKSYmKGk/Zi5wdXNoKHQpOmwodCkp
+LHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyks
+dGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9fTtyZXR1cm4gY30sdi5leHRlbmQoe0Rl
+ZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciB0PVtbInJlc29sdmUiLCJkb25lIix2LkNhbGxiYWNrcygi
+b25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHYuQ2FsbGJhY2tzKCJv
+bmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLHYuQ2FsbGJhY2tz
+KCJtZW1vcnkiKV1dLG49InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG59LGFs
+d2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyks
+dGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gdi5EZWZlcnJlZChm
+dW5jdGlvbihuKXt2LmVhY2godCxmdW5jdGlvbih0LHIpe3ZhciBzPXJbMF0sbz1lW3RdO2lbclsx
+XV0odi5pc0Z1bmN0aW9uKG8pP2Z1bmN0aW9uKCl7dmFyIGU9by5hcHBseSh0aGlzLGFyZ3VtZW50
+cyk7ZSYmdi5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkuZG9uZShuLnJlc29sdmUp
+LmZhaWwobi5yZWplY3QpLnByb2dyZXNzKG4ubm90aWZ5KTpuW3MrIldpdGgiXSh0aGlzPT09aT9u
+OnRoaXMsW2VdKX06bltzXSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24o
+ZSl7cmV0dXJuIGUhPW51bGw/di5leHRlbmQoZSxyKTpyfX0saT17fTtyZXR1cm4gci5waXBlPXIu
+dGhlbix2LmVhY2godCxmdW5jdGlvbihlLHMpe3ZhciBvPXNbMl0sdT1zWzNdO3Jbc1sxXV09by5h
+ZGQsdSYmby5hZGQoZnVuY3Rpb24oKXtuPXV9LHRbZV4xXVsyXS5kaXNhYmxlLHRbMl1bMl0ubG9j
+ayksaVtzWzBdXT1vLmZpcmUsaVtzWzBdKyJXaXRoIl09by5maXJlV2l0aH0pLHIucHJvbWlzZShp
+KSxlJiZlLmNhbGwoaSxpKSxpfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1sLmNhbGwoYXJn
+dW1lbnRzKSxyPW4ubGVuZ3RoLGk9ciE9PTF8fGUmJnYuaXNGdW5jdGlvbihlLnByb21pc2UpP3I6
+MCxzPWk9PT0xP2U6di5EZWZlcnJlZCgpLG89ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlv
+bihyKXt0W2VdPXRoaXMsbltlXT1hcmd1bWVudHMubGVuZ3RoPjE/bC5jYWxsKGFyZ3VtZW50cyk6
+cixuPT09dT9zLm5vdGlmeVdpdGgodCxuKTotLWl8fHMucmVzb2x2ZVdpdGgodCxuKX19LHUsYSxm
+O2lmKHI+MSl7dT1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkociksZj1uZXcgQXJyYXkocik7Zm9y
+KDt0PHI7dCsrKW5bdF0mJnYuaXNGdW5jdGlvbihuW3RdLnByb21pc2UpP25bdF0ucHJvbWlzZSgp
+LmRvbmUobyh0LGYsbikpLmZhaWwocy5yZWplY3QpLnByb2dyZXNzKG8odCxhLHUpKTotLWl9cmV0
+dXJuIGl8fHMucmVzb2x2ZVdpdGgoZixuKSxzLnByb21pc2UoKX19KSx2LnN1cHBvcnQ9ZnVuY3Rp
+b24oKXt2YXIgdCxuLHIscyxvLHUsYSxmLGwsYyxoLHA9aS5jcmVhdGVFbGVtZW50KCJkaXYiKTtw
+LnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHAuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFi
+bGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLG49
+cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLHI9cC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIp
+WzBdO2lmKCFufHwhcnx8IW4ubGVuZ3RoKXJldHVybnt9O3M9aS5jcmVhdGVFbGVtZW50KCJzZWxl
+Y3QiKSxvPXMuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksdT1wLmdldEVs
+ZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLHIuc3R5bGUuY3NzVGV4dD0idG9wOjFweDtmbG9h
+dDpsZWZ0O29wYWNpdHk6LjUiLHQ9e2xlYWRpbmdXaGl0ZXNwYWNlOnAuZmlyc3RDaGlsZC5ub2Rl
+VHlwZT09PTMsdGJvZHk6IXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0
+bWxTZXJpYWxpemU6ISFwLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxl
+Oi90b3AvLnRlc3Qoci5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOnIuZ2V0
+QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjUvLnRlc3Qoci5zdHlsZS5vcGFj
+aXR5KSxjc3NGbG9hdDohIXIuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjp1LnZhbHVlPT09Im9uIixv
+cHRTZWxlY3RlZDpvLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpwLmNsYXNzTmFtZSE9PSJ0Iixl
+bmN0eXBlOiEhaS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmkuY3Jl
+YXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2
+PiIsYm94TW9kZWw6aS5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiLHN1Ym1pdEJ1YmJsZXM6ITAs
+Y2hhbmdlQnViYmxlczohMCxmb2N1c2luQnViYmxlczohMSxkZWxldGVFeHBhbmRvOiEwLG5vQ2xv
+bmVFdmVudDohMCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiExLHNocmlua1dyYXBCbG9ja3M6ITEs
+cmVsaWFibGVNYXJnaW5SaWdodDohMCxib3hTaXppbmdSZWxpYWJsZTohMCxwaXhlbFBvc2l0aW9u
+OiExfSx1LmNoZWNrZWQ9ITAsdC5ub0Nsb25lQ2hlY2tlZD11LmNsb25lTm9kZSghMCkuY2hlY2tl
+ZCxzLmRpc2FibGVkPSEwLHQub3B0RGlzYWJsZWQ9IW8uZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBwLnRl
+c3R9Y2F0Y2goZCl7dC5kZWxldGVFeHBhbmRvPSExfSFwLmFkZEV2ZW50TGlzdGVuZXImJnAuYXR0
+YWNoRXZlbnQmJnAuZmlyZUV2ZW50JiYocC5hdHRhY2hFdmVudCgib25jbGljayIsaD1mdW5jdGlv
+bigpe3Qubm9DbG9uZUV2ZW50PSExfSkscC5jbG9uZU5vZGUoITApLmZpcmVFdmVudCgib25jbGlj
+ayIpLHAuZGV0YWNoRXZlbnQoIm9uY2xpY2siLGgpKSx1PWkuY3JlYXRlRWxlbWVudCgiaW5wdXQi
+KSx1LnZhbHVlPSJ0Iix1LnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksdC5yYWRpb1ZhbHVl
+PXUudmFsdWU9PT0idCIsdS5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksdS5zZXRB
+dHRyaWJ1dGUoIm5hbWUiLCJ0IikscC5hcHBlbmRDaGlsZCh1KSxhPWkuY3JlYXRlRG9jdW1lbnRG
+cmFnbWVudCgpLGEuYXBwZW5kQ2hpbGQocC5sYXN0Q2hpbGQpLHQuY2hlY2tDbG9uZT1hLmNsb25l
+Tm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCx0LmFwcGVuZENoZWNrZWQ9
+dS5jaGVja2VkLGEucmVtb3ZlQ2hpbGQodSksYS5hcHBlbmRDaGlsZChwKTtpZihwLmF0dGFjaEV2
+ZW50KWZvcihsIGlue3N1Ym1pdDohMCxjaGFuZ2U6ITAsZm9jdXNpbjohMH0pZj0ib24iK2wsYz1m
+IGluIHAsY3x8KHAuc2V0QXR0cmlidXRlKGYsInJldHVybjsiKSxjPXR5cGVvZiBwW2ZdPT0iZnVu
+Y3Rpb24iKSx0W2wrIkJ1YmJsZXMiXT1jO3JldHVybiB2KGZ1bmN0aW9uKCl7dmFyIG4scixzLG8s
+dT0icGFkZGluZzowO21hcmdpbjowO2JvcmRlcjowO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlk
+ZGVuOyIsYT1pLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07aWYoIWEpcmV0dXJuO249
+aS5jcmVhdGVFbGVtZW50KCJkaXYiKSxuLnN0eWxlLmNzc1RleHQ9InZpc2liaWxpdHk6aGlkZGVu
+O2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7cG9zaXRpb246c3RhdGljO3RvcDowO21hcmdpbi10
+b3A6MXB4IixhLmluc2VydEJlZm9yZShuLGEuZmlyc3RDaGlsZCkscj1pLmNyZWF0ZUVsZW1lbnQo
+ImRpdiIpLG4uYXBwZW5kQ2hpbGQociksci5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+
+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLHM9ci5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxz
+WzBdLnN0eWxlLmNzc1RleHQ9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5v
+bmUiLGM9c1swXS5vZmZzZXRIZWlnaHQ9PT0wLHNbMF0uc3R5bGUuZGlzcGxheT0iIixzWzFdLnN0
+eWxlLmRpc3BsYXk9Im5vbmUiLHQucmVsaWFibGVIaWRkZW5PZmZzZXRzPWMmJnNbMF0ub2Zmc2V0
+SGVpZ2h0PT09MCxyLmlubmVySFRNTD0iIixyLnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Ym9y
+ZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9y
+ZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21h
+cmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElOyIsdC5ib3hTaXppbmc9ci5vZmZz
+ZXRXaWR0aD09PTQsdC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldD1hLm9mZnNldFRv
+cCE9PTEsZS5nZXRDb21wdXRlZFN0eWxlJiYodC5waXhlbFBvc2l0aW9uPShlLmdldENvbXB1dGVk
+U3R5bGUocixudWxsKXx8e30pLnRvcCE9PSIxJSIsdC5ib3hTaXppbmdSZWxpYWJsZT0oZS5nZXRD
+b21wdXRlZFN0eWxlKHIsbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoPT09IjRweCIsbz1pLmNy
+ZWF0ZUVsZW1lbnQoImRpdiIpLG8uc3R5bGUuY3NzVGV4dD1yLnN0eWxlLmNzc1RleHQ9dSxvLnN0
+eWxlLm1hcmdpblJpZ2h0PW8uc3R5bGUud2lkdGg9IjAiLHIuc3R5bGUud2lkdGg9IjFweCIsci5h
+cHBlbmRDaGlsZChvKSx0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9IXBhcnNlRmxvYXQoKGUuZ2V0Q29t
+cHV0ZWRTdHlsZShvLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpKSx0eXBlb2Ygci5zdHlsZS56b29t
+IT0idW5kZWZpbmVkIiYmKHIuaW5uZXJIVE1MPSIiLHIuc3R5bGUuY3NzVGV4dD11KyJ3aWR0aDox
+cHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxIix0LmlubGluZUJsb2NrTmVlZHNM
+YXlvdXQ9ci5vZmZzZXRXaWR0aD09PTMsci5zdHlsZS5kaXNwbGF5PSJibG9jayIsci5zdHlsZS5v
+dmVyZmxvdz0idmlzaWJsZSIsci5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IixyLmZpcnN0Q2hpbGQu
+c3R5bGUud2lkdGg9IjVweCIsdC5zaHJpbmtXcmFwQmxvY2tzPXIub2Zmc2V0V2lkdGghPT0zLG4u
+c3R5bGUuem9vbT0xKSxhLnJlbW92ZUNoaWxkKG4pLG49cj1zPW89bnVsbH0pLGEucmVtb3ZlQ2hp
+bGQocCksbj1yPXM9bz11PWE9cD1udWxsLHR9KCk7dmFyIEQ9Lyg/Olx7W1xzXFNdKlx9fFxbW1xz
+XFNdKlxdKSQvLFA9LyhbQS1aXSkvZzt2LmV4dGVuZCh7Y2FjaGU6e30sZGVsZXRlZElkczpbXSx1
+dWlkOjAsZXhwYW5kbzoialF1ZXJ5Iisodi5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFj
+ZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQt
+MTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGUpe3Jl
+dHVybiBlPWUubm9kZVR5cGU/di5jYWNoZVtlW3YuZXhwYW5kb11dOmVbdi5leHBhbmRvXSwhIWUm
+JiFCKGUpfSxkYXRhOmZ1bmN0aW9uKGUsbixyLGkpe2lmKCF2LmFjY2VwdERhdGEoZSkpcmV0dXJu
+O3ZhciBzLG8sdT12LmV4cGFuZG8sYT10eXBlb2Ygbj09InN0cmluZyIsZj1lLm5vZGVUeXBlLGw9
+Zj92LmNhY2hlOmUsYz1mP2VbdV06ZVt1XSYmdTtpZigoIWN8fCFsW2NdfHwhaSYmIWxbY10uZGF0
+YSkmJmEmJnI9PT10KXJldHVybjtjfHwoZj9lW3VdPWM9di5kZWxldGVkSWRzLnBvcCgpfHx2Lmd1
+aWQrKzpjPXUpLGxbY118fChsW2NdPXt9LGZ8fChsW2NdLnRvSlNPTj12Lm5vb3ApKTtpZih0eXBl
+b2Ygbj09Im9iamVjdCJ8fHR5cGVvZiBuPT0iZnVuY3Rpb24iKWk/bFtjXT12LmV4dGVuZChsW2Nd
+LG4pOmxbY10uZGF0YT12LmV4dGVuZChsW2NdLmRhdGEsbik7cmV0dXJuIHM9bFtjXSxpfHwocy5k
+YXRhfHwocy5kYXRhPXt9KSxzPXMuZGF0YSksciE9PXQmJihzW3YuY2FtZWxDYXNlKG4pXT1yKSxh
+PyhvPXNbbl0sbz09bnVsbCYmKG89c1t2LmNhbWVsQ2FzZShuKV0pKTpvPXMsb30scmVtb3ZlRGF0
+YTpmdW5jdGlvbihlLHQsbil7aWYoIXYuYWNjZXB0RGF0YShlKSlyZXR1cm47dmFyIHIsaSxzLG89
+ZS5ub2RlVHlwZSx1PW8/di5jYWNoZTplLGE9bz9lW3YuZXhwYW5kb106di5leHBhbmRvO2lmKCF1
+W2FdKXJldHVybjtpZih0KXtyPW4/dVthXTp1W2FdLmRhdGE7aWYocil7di5pc0FycmF5KHQpfHwo
+dCBpbiByP3Q9W3RdOih0PXYuY2FtZWxDYXNlKHQpLHQgaW4gcj90PVt0XTp0PXQuc3BsaXQoIiAi
+KSkpO2ZvcihpPTAscz10Lmxlbmd0aDtpPHM7aSsrKWRlbGV0ZSByW3RbaV1dO2lmKCEobj9COnYu
+aXNFbXB0eU9iamVjdCkocikpcmV0dXJufX1pZighbil7ZGVsZXRlIHVbYV0uZGF0YTtpZighQih1
+W2FdKSlyZXR1cm59bz92LmNsZWFuRGF0YShbZV0sITApOnYuc3VwcG9ydC5kZWxldGVFeHBhbmRv
+fHx1IT11LndpbmRvdz9kZWxldGUgdVthXTp1W2FdPW51bGx9LF9kYXRhOmZ1bmN0aW9uKGUsdCxu
+KXtyZXR1cm4gdi5kYXRhKGUsdCxuLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1l
+Lm5vZGVOYW1lJiZ2Lm5vRGF0YVtlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO3JldHVybiF0fHx0
+IT09ITAmJmUuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT10fX0pLHYuZm4uZXh0ZW5kKHtkYXRh
+OmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxzLG8sdSxhPXRoaXNbMF0sZj0wLGw9bnVsbDtpZihlPT09
+dCl7aWYodGhpcy5sZW5ndGgpe2w9di5kYXRhKGEpO2lmKGEubm9kZVR5cGU9PT0xJiYhdi5fZGF0
+YShhLCJwYXJzZWRBdHRycyIpKXtzPWEuYXR0cmlidXRlcztmb3IodT1zLmxlbmd0aDtmPHU7Zisr
+KW89c1tmXS5uYW1lLG8uaW5kZXhPZigiZGF0YS0iKXx8KG89di5jYW1lbENhc2Uoby5zdWJzdHJp
+bmcoNSkpLEgoYSxvLGxbb10pKTt2Ll9kYXRhKGEsInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBs
+fXJldHVybiB0eXBlb2YgZT09Im9iamVjdCI/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5kYXRhKHRo
+aXMsZSl9KToocj1lLnNwbGl0KCIuIiwyKSxyWzFdPXJbMV0/Ii4iK3JbMV06IiIsaT1yWzFdKyIh
+Iix2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKG4pe2lmKG49PT10KXJldHVybiBsPXRoaXMudHJpZ2dl
+ckhhbmRsZXIoImdldERhdGEiK2ksW3JbMF1dKSxsPT09dCYmYSYmKGw9di5kYXRhKGEsZSksbD1I
+KGEsZSxsKSksbD09PXQmJnJbMV0/dGhpcy5kYXRhKHJbMF0pOmw7clsxXT1uLHRoaXMuZWFjaChm
+dW5jdGlvbigpe3ZhciB0PXYodGhpcyk7dC50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIraSxyKSx2
+LmRhdGEodGhpcyxlLG4pLHQudHJpZ2dlckhhbmRsZXIoImNoYW5nZURhdGEiK2kscil9KX0sbnVs
+bCxuLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCExKSl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7
+cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3YucmVtb3ZlRGF0YSh0aGlzLGUpfSl9fSksdi5l
+eHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngi
+KSsicXVldWUiLHI9di5fZGF0YShlLHQpLG4mJighcnx8di5pc0FycmF5KG4pP3I9di5fZGF0YShl
+LHQsdi5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0
+KXt0PXR8fCJmeCI7dmFyIG49di5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCkscz12
+Ll9xdWV1ZUhvb2tzKGUsdCksbz1mdW5jdGlvbigpe3YuZGVxdWV1ZShlLHQpfTtpPT09ImlucHJv
+Z3Jlc3MiJiYoaT1uLnNoaWZ0KCksci0tKSxpJiYodD09PSJmeCImJm4udW5zaGlmdCgiaW5wcm9n
+cmVzcyIpLGRlbGV0ZSBzLnN0b3AsaS5jYWxsKGUsbyxzKSksIXImJnMmJnMuZW1wdHkuZmlyZSgp
+fSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiB2
+Ll9kYXRhKGUsbil8fHYuX2RhdGEoZSxuLHtlbXB0eTp2LkNhbGxiYWNrcygib25jZSBtZW1vcnki
+KS5hZGQoZnVuY3Rpb24oKXt2LnJlbW92ZURhdGEoZSx0KyJxdWV1ZSIsITApLHYucmVtb3ZlRGF0
+YShlLG4sITApfSl9KX19KSx2LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSxuKXt2YXIgcj0y
+O3JldHVybiB0eXBlb2YgZSE9InN0cmluZyImJihuPWUsZT0iZngiLHItLSksYXJndW1lbnRzLmxl
+bmd0aDxyP3YucXVldWUodGhpc1swXSxlKTpuPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigp
+e3ZhciB0PXYucXVldWUodGhpcyxlLG4pO3YuX3F1ZXVlSG9va3ModGhpcyxlKSxlPT09ImZ4IiYm
+dFswXSE9PSJpbnByb2dyZXNzIiYmdi5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlv
+bihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVs
+YXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT12LmZ4P3YuZnguc3BlZWRzW2VdfHxlOmUsdD10fHwi
+ZngiLHRoaXMucXVldWUodCxmdW5jdGlvbih0LG4pe3ZhciByPXNldFRpbWVvdXQodCxlKTtuLnN0
+b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocil9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7
+cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSxuKXt2YXIg
+cixpPTEscz12LkRlZmVycmVkKCksbz10aGlzLHU9dGhpcy5sZW5ndGgsYT1mdW5jdGlvbigpey0t
+aXx8cy5yZXNvbHZlV2l0aChvLFtvXSl9O3R5cGVvZiBlIT0ic3RyaW5nIiYmKG49ZSxlPXQpLGU9
+ZXx8ImZ4Ijt3aGlsZSh1LS0pcj12Ll9kYXRhKG9bdV0sZSsicXVldWVIb29rcyIpLHImJnIuZW1w
+dHkmJihpKyssci5lbXB0eS5hZGQoYSkpO3JldHVybiBhKCkscy5wcm9taXNlKG4pfX0pO3ZhciBq
+LEYsSSxxPS9bXHRcclxuXS9nLFI9L1xyL2csVT0vXig/OmJ1dHRvbnxpbnB1dCkkL2ksej0vXig/
+OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSxXPS9eYSg/OnJlYXwpJC9p
+LFg9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxk
+aXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3Bl
+ZHxzZWxlY3RlZCkkL2ksVj12LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlO3YuZm4uZXh0ZW5kKHth
+dHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYuYWNjZXNzKHRoaXMsdi5hdHRyLGUsdCxhcmd1bWVu
+dHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVu
+Y3Rpb24oKXt2LnJlbW92ZUF0dHIodGhpcyxlKX0pfSxwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJu
+IHYuYWNjZXNzKHRoaXMsdi5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9w
+OmZ1bmN0aW9uKGUpe3JldHVybiBlPXYucHJvcEZpeFtlXXx8ZSx0aGlzLmVhY2goZnVuY3Rpb24o
+KXt0cnl7dGhpc1tlXT10LGRlbGV0ZSB0aGlzW2VdfWNhdGNoKG4pe319KX0sYWRkQ2xhc3M6ZnVu
+Y3Rpb24oZSl7dmFyIHQsbixyLGkscyxvLHU7aWYodi5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlz
+LmVhY2goZnVuY3Rpb24odCl7dih0aGlzKS5hZGRDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xh
+c3NOYW1lKSl9KTtpZihlJiZ0eXBlb2YgZT09InN0cmluZyIpe3Q9ZS5zcGxpdCh5KTtmb3Iobj0w
+LHI9dGhpcy5sZW5ndGg7bjxyO24rKyl7aT10aGlzW25dO2lmKGkubm9kZVR5cGU9PT0xKWlmKCFp
+LmNsYXNzTmFtZSYmdC5sZW5ndGg9PT0xKWkuY2xhc3NOYW1lPWU7ZWxzZXtzPSIgIitpLmNsYXNz
+TmFtZSsiICI7Zm9yKG89MCx1PXQubGVuZ3RoO288dTtvKyspcy5pbmRleE9mKCIgIit0W29dKyIg
+Iik8MCYmKHMrPXRbb10rIiAiKTtpLmNsYXNzTmFtZT12LnRyaW0ocyl9fX1yZXR1cm4gdGhpc30s
+cmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIG4scixpLHMsbyx1LGE7aWYodi5pc0Z1bmN0aW9u
+KGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dih0aGlzKS5yZW1vdmVDbGFzcyhlLmNh
+bGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZihlJiZ0eXBlb2YgZT09InN0cmluZyJ8fGU9
+PT10KXtuPShlfHwiIikuc3BsaXQoeSk7Zm9yKHU9MCxhPXRoaXMubGVuZ3RoO3U8YTt1Kyspe2k9
+dGhpc1t1XTtpZihpLm5vZGVUeXBlPT09MSYmaS5jbGFzc05hbWUpe3I9KCIgIitpLmNsYXNzTmFt
+ZSsiICIpLnJlcGxhY2UocSwiICIpO2ZvcihzPTAsbz1uLmxlbmd0aDtzPG87cysrKXdoaWxlKHIu
+aW5kZXhPZigiICIrbltzXSsiICIpPj0wKXI9ci5yZXBsYWNlKCIgIituW3NdKyIgIiwiICIpO2ku
+Y2xhc3NOYW1lPWU/di50cmltKHIpOiIifX19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0
+aW9uKGUsdCl7dmFyIG49dHlwZW9mIGUscj10eXBlb2YgdD09ImJvb2xlYW4iO3JldHVybiB2Lmlz
+RnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3YodGhpcykudG9nZ2xlQ2xhc3MoZS5j
+YWxsKHRoaXMsbix0aGlzLmNsYXNzTmFtZSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2lm
+KG49PT0ic3RyaW5nIil7dmFyIGkscz0wLG89dih0aGlzKSx1PXQsYT1lLnNwbGl0KHkpO3doaWxl
+KGk9YVtzKytdKXU9cj91OiFvLmhhc0NsYXNzKGkpLG9bdT8iYWRkQ2xhc3MiOiJyZW1vdmVDbGFz
+cyJdKGkpfWVsc2UgaWYobj09PSJ1bmRlZmluZWQifHxuPT09ImJvb2xlYW4iKXRoaXMuY2xhc3NO
+YW1lJiZ2Ll9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNs
+YXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8ZT09PSExPyIiOnYuX2RhdGEodGhpcywiX19jbGFzc05h
+bWVfXyIpfHwiIn0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdD0iICIrZSsiICIsbj0wLHI9
+dGhpcy5sZW5ndGg7Zm9yKDtuPHI7bisrKWlmKHRoaXNbbl0ubm9kZVR5cGU9PT0xJiYoIiAiK3Ro
+aXNbbl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShxLCIgIikuaW5kZXhPZih0KT49MClyZXR1cm4h
+MDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxzPXRoaXNbMF07aWYoIWFyZ3Vt
+ZW50cy5sZW5ndGgpe2lmKHMpcmV0dXJuIG49di52YWxIb29rc1tzLnR5cGVdfHx2LnZhbEhvb2tz
+W3Mubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0sbiYmImdldCJpbiBuJiYocj1uLmdldChzLCJ2YWx1
+ZSIpKSE9PXQ/cjoocj1zLnZhbHVlLHR5cGVvZiByPT0ic3RyaW5nIj9yLnJlcGxhY2UoUiwiIik6
+cj09bnVsbD8iIjpyKTtyZXR1cm59cmV0dXJuIGk9di5pc0Z1bmN0aW9uKGUpLHRoaXMuZWFjaChm
+dW5jdGlvbihyKXt2YXIgcyxvPXYodGhpcyk7aWYodGhpcy5ub2RlVHlwZSE9PTEpcmV0dXJuO2k/
+cz1lLmNhbGwodGhpcyxyLG8udmFsKCkpOnM9ZSxzPT1udWxsP3M9IiI6dHlwZW9mIHM9PSJudW1i
+ZXIiP3MrPSIiOnYuaXNBcnJheShzKSYmKHM9di5tYXAocyxmdW5jdGlvbihlKXtyZXR1cm4gZT09
+bnVsbD8iIjplKyIifSkpLG49di52YWxIb29rc1t0aGlzLnR5cGVdfHx2LnZhbEhvb2tzW3RoaXMu
+bm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoIW58fCEoInNldCJpbiBuKXx8bi5zZXQodGhpcyxz
+LCJ2YWx1ZSIpPT09dCl0aGlzLnZhbHVlPXN9KX19KSx2LmV4dGVuZCh7dmFsSG9va3M6e29wdGlv
+bjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hdHx8dC5z
+cGVjaWZpZWQ/ZS52YWx1ZTplLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxu
+LHI9ZS5vcHRpb25zLGk9ZS5zZWxlY3RlZEluZGV4LHM9ZS50eXBlPT09InNlbGVjdC1vbmUifHxp
+PDAsbz1zP251bGw6W10sdT1zP2krMTpyLmxlbmd0aCxhPWk8MD91OnM/aTowO2Zvcig7YTx1O2Er
+Kyl7bj1yW2FdO2lmKChuLnNlbGVjdGVkfHxhPT09aSkmJih2LnN1cHBvcnQub3B0RGlzYWJsZWQ/
+IW4uZGlzYWJsZWQ6bi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFuLnBhcmVu
+dE5vZGUuZGlzYWJsZWR8fCF2Lm5vZGVOYW1lKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe3Q9
+dihuKS52YWwoKTtpZihzKXJldHVybiB0O28ucHVzaCh0KX19cmV0dXJuIG99LHNldDpmdW5jdGlv
+bihlLHQpe3ZhciBuPXYubWFrZUFycmF5KHQpO3JldHVybiB2KGUpLmZpbmQoIm9wdGlvbiIpLmVh
+Y2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPXYuaW5BcnJheSh2KHRoaXMpLnZhbCgpLG4pPj0w
+fSksbi5sZW5ndGh8fChlLnNlbGVjdGVkSW5kZXg9LTEpLG59fX0sYXR0ckZuOnt9LGF0dHI6ZnVu
+Y3Rpb24oZSxuLHIsaSl7dmFyIHMsbyx1LGE9ZS5ub2RlVHlwZTtpZighZXx8YT09PTN8fGE9PT04
+fHxhPT09MilyZXR1cm47aWYoaSYmdi5pc0Z1bmN0aW9uKHYuZm5bbl0pKXJldHVybiB2KGUpW25d
+KHIpO2lmKHR5cGVvZiBlLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIHYucHJvcChl
+LG4scik7dT1hIT09MXx8IXYuaXNYTUxEb2MoZSksdSYmKG49bi50b0xvd2VyQ2FzZSgpLG89di5h
+dHRySG9va3Nbbl18fChYLnRlc3Qobik/RjpqKSk7aWYociE9PXQpe2lmKHI9PT1udWxsKXt2LnJl
+bW92ZUF0dHIoZSxuKTtyZXR1cm59cmV0dXJuIG8mJiJzZXQiaW4gbyYmdSYmKHM9by5zZXQoZSxy
+LG4pKSE9PXQ/czooZS5zZXRBdHRyaWJ1dGUobixyKyIiKSxyKX1yZXR1cm4gbyYmImdldCJpbiBv
+JiZ1JiYocz1vLmdldChlLG4pKSE9PW51bGw/czoocz1lLmdldEF0dHJpYnV0ZShuKSxzPT09bnVs
+bD90OnMpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHMsbz0wO2lmKHQmJmUu
+bm9kZVR5cGU9PT0xKXtyPXQuc3BsaXQoeSk7Zm9yKDtvPHIubGVuZ3RoO28rKylpPXJbb10saSYm
+KG49di5wcm9wRml4W2ldfHxpLHM9WC50ZXN0KGkpLHN8fHYuYXR0cihlLGksIiIpLGUucmVtb3Zl
+QXR0cmlidXRlKFY/aTpuKSxzJiZuIGluIGUmJihlW25dPSExKSl9fSxhdHRySG9va3M6e3R5cGU6
+e3NldDpmdW5jdGlvbihlLHQpe2lmKFUudGVzdChlLm5vZGVOYW1lKSYmZS5wYXJlbnROb2RlKXYu
+ZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2Vsc2UgaWYoIXYuc3VwcG9y
+dC5yYWRpb1ZhbHVlJiZ0PT09InJhZGlvIiYmdi5ub2RlTmFtZShlLCJpbnB1dCIpKXt2YXIgbj1l
+LnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19
+fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGomJnYubm9kZU5hbWUoZSwiYnV0dG9u
+Iik/ai5nZXQoZSx0KTp0IGluIGU/ZS52YWx1ZTpudWxsfSxzZXQ6ZnVuY3Rpb24oZSx0LG4pe2lm
+KGomJnYubm9kZU5hbWUoZSwiYnV0dG9uIikpcmV0dXJuIGouc2V0KGUsdCxuKTtlLnZhbHVlPXR9
+fX0scHJvcEZpeDp7dGFiaW5kZXg6InRhYkluZGV4IixyZWFkb25seToicmVhZE9ubHkiLCJmb3Ii
+OiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLG1heGxlbmd0aDoibWF4TGVuZ3RoIixjZWxs
+c3BhY2luZzoiY2VsbFNwYWNpbmciLGNlbGxwYWRkaW5nOiJjZWxsUGFkZGluZyIscm93c3Bhbjoi
+cm93U3BhbiIsY29sc3BhbjoiY29sU3BhbiIsdXNlbWFwOiJ1c2VNYXAiLGZyYW1lYm9yZGVyOiJm
+cmFtZUJvcmRlciIsY29udGVudGVkaXRhYmxlOiJjb250ZW50RWRpdGFibGUifSxwcm9wOmZ1bmN0
+aW9uKGUsbixyKXt2YXIgaSxzLG8sdT1lLm5vZGVUeXBlO2lmKCFlfHx1PT09M3x8dT09PTh8fHU9
+PT0yKXJldHVybjtyZXR1cm4gbz11IT09MXx8IXYuaXNYTUxEb2MoZSksbyYmKG49di5wcm9wRml4
+W25dfHxuLHM9di5wcm9wSG9va3Nbbl0pLHIhPT10P3MmJiJzZXQiaW4gcyYmKGk9cy5zZXQoZSxy
+LG4pKSE9PXQ/aTplW25dPXI6cyYmImdldCJpbiBzJiYoaT1zLmdldChlLG4pKSE9PW51bGw/aTpl
+W25dfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIG49ZS5nZXRBdHRy
+aWJ1dGVOb2RlKCJ0YWJpbmRleCIpO3JldHVybiBuJiZuLnNwZWNpZmllZD9wYXJzZUludChuLnZh
+bHVlLDEwKTp6LnRlc3QoZS5ub2RlTmFtZSl8fFcudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6
+dH19fX0pLEY9e2dldDpmdW5jdGlvbihlLG4pe3ZhciByLGk9di5wcm9wKGUsbik7cmV0dXJuIGk9
+PT0hMHx8dHlwZW9mIGkhPSJib29sZWFuIiYmKHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pKSYmci5u
+b2RlVmFsdWUhPT0hMT9uLnRvTG93ZXJDYXNlKCk6dH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIg
+cjtyZXR1cm4gdD09PSExP3YucmVtb3ZlQXR0cihlLG4pOihyPXYucHJvcEZpeFtuXXx8bixyIGlu
+IGUmJihlW3JdPSEwKSxlLnNldEF0dHJpYnV0ZShuLG4udG9Mb3dlckNhc2UoKSkpLG59fSxWfHwo
+ST17bmFtZTohMCxpZDohMCxjb29yZHM6ITB9LGo9di52YWxIb29rcy5idXR0b249e2dldDpmdW5j
+dGlvbihlLG4pe3ZhciByO3JldHVybiByPWUuZ2V0QXR0cmlidXRlTm9kZShuKSxyJiYoSVtuXT9y
+LnZhbHVlIT09IiI6ci5zcGVjaWZpZWQpP3IudmFsdWU6dH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2
+YXIgcj1lLmdldEF0dHJpYnV0ZU5vZGUobik7cmV0dXJuIHJ8fChyPWkuY3JlYXRlQXR0cmlidXRl
+KG4pLGUuc2V0QXR0cmlidXRlTm9kZShyKSksci52YWx1ZT10KyIifX0sdi5lYWNoKFsid2lkdGgi
+LCJoZWlnaHQiXSxmdW5jdGlvbihlLHQpe3YuYXR0ckhvb2tzW3RdPXYuZXh0ZW5kKHYuYXR0ckhv
+b2tzW3RdLHtzZXQ6ZnVuY3Rpb24oZSxuKXtpZihuPT09IiIpcmV0dXJuIGUuc2V0QXR0cmlidXRl
+KHQsImF1dG8iKSxufX0pfSksdi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6ai5nZXQs
+c2V0OmZ1bmN0aW9uKGUsdCxuKXt0PT09IiImJih0PSJmYWxzZSIpLGouc2V0KGUsdCxuKX19KSx2
+LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fHYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhl
+aWdodCJdLGZ1bmN0aW9uKGUsbil7di5hdHRySG9va3Nbbl09di5leHRlbmQodi5hdHRySG9va3Nb
+bl0se2dldDpmdW5jdGlvbihlKXt2YXIgcj1lLmdldEF0dHJpYnV0ZShuLDIpO3JldHVybiByPT09
+bnVsbD90OnJ9fSl9KSx2LnN1cHBvcnQuc3R5bGV8fCh2LmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1
+bmN0aW9uKGUpe3JldHVybiBlLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8dH0sc2V0OmZ1
+bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3R5bGUuY3NzVGV4dD10KyIifX0pLHYuc3VwcG9ydC5vcHRT
+ZWxlY3RlZHx8KHYucHJvcEhvb2tzLnNlbGVjdGVkPXYuZXh0ZW5kKHYucHJvcEhvb2tzLnNlbGVj
+dGVkLHtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYodC5zZWxl
+Y3RlZEluZGV4LHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9
+fSkpLHYuc3VwcG9ydC5lbmN0eXBlfHwodi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksdi5z
+dXBwb3J0LmNoZWNrT258fHYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe3Yu
+dmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoInZh
+bHVlIik9PT1udWxsPyJvbiI6ZS52YWx1ZX19fSksdi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJd
+LGZ1bmN0aW9uKCl7di52YWxIb29rc1t0aGlzXT12LmV4dGVuZCh2LnZhbEhvb2tzW3RoaXNdLHtz
+ZXQ6ZnVuY3Rpb24oZSx0KXtpZih2LmlzQXJyYXkodCkpcmV0dXJuIGUuY2hlY2tlZD12LmluQXJy
+YXkodihlKS52YWwoKSx0KT49MH19KX0pO3ZhciAkPS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0
+KSQvaSxKPS9eKFteXC5dKnwpKD86XC4oLispfCkkLyxLPS8oPzpefFxzKWhvdmVyKFwuXFMrfClc
+Yi8sUT0vXmtleS8sRz0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sWT0vXig/OmZvY3Vz
+aW5mb2N1c3xmb2N1c291dGJsdXIpJC8sWj1mdW5jdGlvbihlKXtyZXR1cm4gdi5ldmVudC5zcGVj
+aWFsLmhvdmVyP2U6ZS5yZXBsYWNlKEssIm1vdXNlZW50ZXIkMSBtb3VzZWxlYXZlJDEiKX07di5l
+dmVudD17YWRkOmZ1bmN0aW9uKGUsbixyLGkscyl7dmFyIG8sdSxhLGYsbCxjLGgscCxkLG0sZztp
+ZihlLm5vZGVUeXBlPT09M3x8ZS5ub2RlVHlwZT09PTh8fCFufHwhcnx8IShvPXYuX2RhdGEoZSkp
+KXJldHVybjtyLmhhbmRsZXImJihkPXIscj1kLmhhbmRsZXIscz1kLnNlbGVjdG9yKSxyLmd1aWR8
+fChyLmd1aWQ9di5ndWlkKyspLGE9by5ldmVudHMsYXx8KG8uZXZlbnRzPWE9e30pLHU9by5oYW5k
+bGUsdXx8KG8uaGFuZGxlPXU9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiB2PT0idW5kZWZpbmVk
+Inx8ISFlJiZ2LmV2ZW50LnRyaWdnZXJlZD09PWUudHlwZT90OnYuZXZlbnQuZGlzcGF0Y2guYXBw
+bHkodS5lbGVtLGFyZ3VtZW50cyl9LHUuZWxlbT1lKSxuPXYudHJpbShaKG4pKS5zcGxpdCgiICIp
+O2ZvcihmPTA7ZjxuLmxlbmd0aDtmKyspe2w9Si5leGVjKG5bZl0pfHxbXSxjPWxbMV0saD0obFsy
+XXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGc9di5ldmVudC5zcGVjaWFsW2NdfHx7fSxjPShzP2cu
+ZGVsZWdhdGVUeXBlOmcuYmluZFR5cGUpfHxjLGc9di5ldmVudC5zcGVjaWFsW2NdfHx7fSxwPXYu
+ZXh0ZW5kKHt0eXBlOmMsb3JpZ1R5cGU6bFsxXSxkYXRhOmksaGFuZGxlcjpyLGd1aWQ6ci5ndWlk
+LHNlbGVjdG9yOnMsbmVlZHNDb250ZXh0OnMmJnYuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVz
+dChzKSxuYW1lc3BhY2U6aC5qb2luKCIuIil9LGQpLG09YVtjXTtpZighbSl7bT1hW2NdPVtdLG0u
+ZGVsZWdhdGVDb3VudD0wO2lmKCFnLnNldHVwfHxnLnNldHVwLmNhbGwoZSxpLGgsdSk9PT0hMSll
+LmFkZEV2ZW50TGlzdGVuZXI/ZS5hZGRFdmVudExpc3RlbmVyKGMsdSwhMSk6ZS5hdHRhY2hFdmVu
+dCYmZS5hdHRhY2hFdmVudCgib24iK2MsdSl9Zy5hZGQmJihnLmFkZC5jYWxsKGUscCkscC5oYW5k
+bGVyLmd1aWR8fChwLmhhbmRsZXIuZ3VpZD1yLmd1aWQpKSxzP20uc3BsaWNlKG0uZGVsZWdhdGVD
+b3VudCsrLDAscCk6bS5wdXNoKHApLHYuZXZlbnQuZ2xvYmFsW2NdPSEwfWU9bnVsbH0sZ2xvYmFs
+Ont9LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzLG8sdSxhLGYsbCxjLGgscCxkLG0s
+Zz12Lmhhc0RhdGEoZSkmJnYuX2RhdGEoZSk7aWYoIWd8fCEoaD1nLmV2ZW50cykpcmV0dXJuO3Q9
+di50cmltKFoodHx8IiIpKS5zcGxpdCgiICIpO2ZvcihzPTA7czx0Lmxlbmd0aDtzKyspe289Si5l
+eGVjKHRbc10pfHxbXSx1PWE9b1sxXSxmPW9bMl07aWYoIXUpe2Zvcih1IGluIGgpdi5ldmVudC5y
+ZW1vdmUoZSx1K3Rbc10sbixyLCEwKTtjb250aW51ZX1wPXYuZXZlbnQuc3BlY2lhbFt1XXx8e30s
+dT0ocj9wLmRlbGVnYXRlVHlwZTpwLmJpbmRUeXBlKXx8dSxkPWhbdV18fFtdLGw9ZC5sZW5ndGgs
+Zj1mP25ldyBSZWdFeHAoIihefFxcLikiK2Yuc3BsaXQoIi4iKS5zb3J0KCkuam9pbigiXFwuKD86
+LipcXC58KSIpKyIoXFwufCQpIik6bnVsbDtmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKW09ZFtjXSwo
+aXx8YT09PW0ub3JpZ1R5cGUpJiYoIW58fG4uZ3VpZD09PW0uZ3VpZCkmJighZnx8Zi50ZXN0KG0u
+bmFtZXNwYWNlKSkmJighcnx8cj09PW0uc2VsZWN0b3J8fHI9PT0iKioiJiZtLnNlbGVjdG9yKSYm
+KGQuc3BsaWNlKGMtLSwxKSxtLnNlbGVjdG9yJiZkLmRlbGVnYXRlQ291bnQtLSxwLnJlbW92ZSYm
+cC5yZW1vdmUuY2FsbChlLG0pKTtkLmxlbmd0aD09PTAmJmwhPT1kLmxlbmd0aCYmKCghcC50ZWFy
+ZG93bnx8cC50ZWFyZG93bi5jYWxsKGUsZixnLmhhbmRsZSk9PT0hMSkmJnYucmVtb3ZlRXZlbnQo
+ZSx1LGcuaGFuZGxlKSxkZWxldGUgaFt1XSl9di5pc0VtcHR5T2JqZWN0KGgpJiYoZGVsZXRlIGcu
+aGFuZGxlLHYucmVtb3ZlRGF0YShlLCJldmVudHMiLCEwKSl9LGN1c3RvbUV2ZW50OntnZXREYXRh
+OiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihuLHIscyxvKXtp
+Zighc3x8cy5ub2RlVHlwZSE9PTMmJnMubm9kZVR5cGUhPT04KXt2YXIgdSxhLGYsbCxjLGgscCxk
+LG0sZyx5PW4udHlwZXx8bixiPVtdO2lmKFkudGVzdCh5K3YuZXZlbnQudHJpZ2dlcmVkKSlyZXR1
+cm47eS5pbmRleE9mKCIhIik+PTAmJih5PXkuc2xpY2UoMCwtMSksYT0hMCkseS5pbmRleE9mKCIu
+Iik+PTAmJihiPXkuc3BsaXQoIi4iKSx5PWIuc2hpZnQoKSxiLnNvcnQoKSk7aWYoKCFzfHx2LmV2
+ZW50LmN1c3RvbUV2ZW50W3ldKSYmIXYuZXZlbnQuZ2xvYmFsW3ldKXJldHVybjtuPXR5cGVvZiBu
+PT0ib2JqZWN0Ij9uW3YuZXhwYW5kb10/bjpuZXcgdi5FdmVudCh5LG4pOm5ldyB2LkV2ZW50KHkp
+LG4udHlwZT15LG4uaXNUcmlnZ2VyPSEwLG4uZXhjbHVzaXZlPWEsbi5uYW1lc3BhY2U9Yi5qb2lu
+KCIuIiksbi5uYW1lc3BhY2VfcmU9bi5uYW1lc3BhY2U/bmV3IFJlZ0V4cCgiKF58XFwuKSIrYi5q
+b2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGg9eS5pbmRleE9mKCI6Iik8MD8i
+b24iK3k6IiI7aWYoIXMpe3U9di5jYWNoZTtmb3IoZiBpbiB1KXVbZl0uZXZlbnRzJiZ1W2ZdLmV2
+ZW50c1t5XSYmdi5ldmVudC50cmlnZ2VyKG4scix1W2ZdLmhhbmRsZS5lbGVtLCEwKTtyZXR1cm59
+bi5yZXN1bHQ9dCxuLnRhcmdldHx8KG4udGFyZ2V0PXMpLHI9ciE9bnVsbD92Lm1ha2VBcnJheShy
+KTpbXSxyLnVuc2hpZnQobikscD12LmV2ZW50LnNwZWNpYWxbeV18fHt9O2lmKHAudHJpZ2dlciYm
+cC50cmlnZ2VyLmFwcGx5KHMscik9PT0hMSlyZXR1cm47bT1bW3MscC5iaW5kVHlwZXx8eV1dO2lm
+KCFvJiYhcC5ub0J1YmJsZSYmIXYuaXNXaW5kb3cocykpe2c9cC5kZWxlZ2F0ZVR5cGV8fHksbD1Z
+LnRlc3QoZyt5KT9zOnMucGFyZW50Tm9kZTtmb3IoYz1zO2w7bD1sLnBhcmVudE5vZGUpbS5wdXNo
+KFtsLGddKSxjPWw7Yz09PShzLm93bmVyRG9jdW1lbnR8fGkpJiZtLnB1c2goW2MuZGVmYXVsdFZp
+ZXd8fGMucGFyZW50V2luZG93fHxlLGddKX1mb3IoZj0wO2Y8bS5sZW5ndGgmJiFuLmlzUHJvcGFn
+YXRpb25TdG9wcGVkKCk7ZisrKWw9bVtmXVswXSxuLnR5cGU9bVtmXVsxXSxkPSh2Ll9kYXRhKGws
+ImV2ZW50cyIpfHx7fSlbbi50eXBlXSYmdi5fZGF0YShsLCJoYW5kbGUiKSxkJiZkLmFwcGx5KGws
+ciksZD1oJiZsW2hdLGQmJnYuYWNjZXB0RGF0YShsKSYmZC5hcHBseSYmZC5hcHBseShsLHIpPT09
+ITEmJm4ucHJldmVudERlZmF1bHQoKTtyZXR1cm4gbi50eXBlPXksIW8mJiFuLmlzRGVmYXVsdFBy
+ZXZlbnRlZCgpJiYoIXAuX2RlZmF1bHR8fHAuX2RlZmF1bHQuYXBwbHkocy5vd25lckRvY3VtZW50
+LHIpPT09ITEpJiYoeSE9PSJjbGljayJ8fCF2Lm5vZGVOYW1lKHMsImEiKSkmJnYuYWNjZXB0RGF0
+YShzKSYmaCYmc1t5XSYmKHkhPT0iZm9jdXMiJiZ5IT09ImJsdXIifHxuLnRhcmdldC5vZmZzZXRX
+aWR0aCE9PTApJiYhdi5pc1dpbmRvdyhzKSYmKGM9c1toXSxjJiYoc1toXT1udWxsKSx2LmV2ZW50
+LnRyaWdnZXJlZD15LHNbeV0oKSx2LmV2ZW50LnRyaWdnZXJlZD10LGMmJihzW2hdPWMpKSxuLnJl
+c3VsdH1yZXR1cm59LGRpc3BhdGNoOmZ1bmN0aW9uKG4pe249di5ldmVudC5maXgobnx8ZS5ldmVu
+dCk7dmFyIHIsaSxzLG8sdSxhLGYsYyxoLHAsZD0odi5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30p
+W24udHlwZV18fFtdLG09ZC5kZWxlZ2F0ZUNvdW50LGc9bC5jYWxsKGFyZ3VtZW50cykseT0hbi5l
+eGNsdXNpdmUmJiFuLm5hbWVzcGFjZSxiPXYuZXZlbnQuc3BlY2lhbFtuLnR5cGVdfHx7fSx3PVtd
+O2dbMF09bixuLmRlbGVnYXRlVGFyZ2V0PXRoaXM7aWYoYi5wcmVEaXNwYXRjaCYmYi5wcmVEaXNw
+YXRjaC5jYWxsKHRoaXMsbik9PT0hMSlyZXR1cm47aWYobSYmKCFuLmJ1dHRvbnx8bi50eXBlIT09
+ImNsaWNrIikpZm9yKHM9bi50YXJnZXQ7cyE9dGhpcztzPXMucGFyZW50Tm9kZXx8dGhpcylpZihz
+LmRpc2FibGVkIT09ITB8fG4udHlwZSE9PSJjbGljayIpe3U9e30sZj1bXTtmb3Iocj0wO3I8bTty
+KyspYz1kW3JdLGg9Yy5zZWxlY3Rvcix1W2hdPT09dCYmKHVbaF09Yy5uZWVkc0NvbnRleHQ/diho
+LHRoaXMpLmluZGV4KHMpPj0wOnYuZmluZChoLHRoaXMsbnVsbCxbc10pLmxlbmd0aCksdVtoXSYm
+Zi5wdXNoKGMpO2YubGVuZ3RoJiZ3LnB1c2goe2VsZW06cyxtYXRjaGVzOmZ9KX1kLmxlbmd0aD5t
+JiZ3LnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UobSl9KTtmb3Iocj0wO3I8dy5sZW5n
+dGgmJiFuLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7cisrKXthPXdbcl0sbi5jdXJyZW50VGFyZ2V0
+PWEuZWxlbTtmb3IoaT0wO2k8YS5tYXRjaGVzLmxlbmd0aCYmIW4uaXNJbW1lZGlhdGVQcm9wYWdh
+dGlvblN0b3BwZWQoKTtpKyspe2M9YS5tYXRjaGVzW2ldO2lmKHl8fCFuLm5hbWVzcGFjZSYmIWMu
+bmFtZXNwYWNlfHxuLm5hbWVzcGFjZV9yZSYmbi5uYW1lc3BhY2VfcmUudGVzdChjLm5hbWVzcGFj
+ZSkpbi5kYXRhPWMuZGF0YSxuLmhhbmRsZU9iaj1jLG89KCh2LmV2ZW50LnNwZWNpYWxbYy5vcmln
+VHlwZV18fHt9KS5oYW5kbGV8fGMuaGFuZGxlcikuYXBwbHkoYS5lbGVtLGcpLG8hPT10JiYobi5y
+ZXN1bHQ9byxvPT09ITEmJihuLnByZXZlbnREZWZhdWx0KCksbi5zdG9wUHJvcGFnYXRpb24oKSkp
+fX1yZXR1cm4gYi5wb3N0RGlzcGF0Y2gmJmIucG9zdERpc3BhdGNoLmNhbGwodGhpcyxuKSxuLnJl
+c3VsdH0scHJvcHM6ImF0dHJDaGFuZ2UgYXR0ck5hbWUgcmVsYXRlZE5vZGUgc3JjRWxlbWVudCBh
+bHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNl
+IG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hp
+Y2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2Rl
+IGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBlLndo
+aWNoPT1udWxsJiYoZS53aGljaD10LmNoYXJDb2RlIT1udWxsP3QuY2hhckNvZGU6dC5rZXlDb2Rl
+KSxlfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBm
+cm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRv
+RWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSxuKXt2YXIgcixzLG8sdT1uLmJ1
+dHRvbixhPW4uZnJvbUVsZW1lbnQ7cmV0dXJuIGUucGFnZVg9PW51bGwmJm4uY2xpZW50WCE9bnVs
+bCYmKHI9ZS50YXJnZXQub3duZXJEb2N1bWVudHx8aSxzPXIuZG9jdW1lbnRFbGVtZW50LG89ci5i
+b2R5LGUucGFnZVg9bi5jbGllbnRYKyhzJiZzLnNjcm9sbExlZnR8fG8mJm8uc2Nyb2xsTGVmdHx8
+MCktKHMmJnMuY2xpZW50TGVmdHx8byYmby5jbGllbnRMZWZ0fHwwKSxlLnBhZ2VZPW4uY2xpZW50
+WSsocyYmcy5zY3JvbGxUb3B8fG8mJm8uc2Nyb2xsVG9wfHwwKS0ocyYmcy5jbGllbnRUb3B8fG8m
+Jm8uY2xpZW50VG9wfHwwKSksIWUucmVsYXRlZFRhcmdldCYmYSYmKGUucmVsYXRlZFRhcmdldD1h
+PT09ZS50YXJnZXQ/bi50b0VsZW1lbnQ6YSksIWUud2hpY2gmJnUhPT10JiYoZS53aGljaD11JjE/
+MTp1JjI/Mzp1JjQ/MjowKSxlfX0sZml4OmZ1bmN0aW9uKGUpe2lmKGVbdi5leHBhbmRvXSlyZXR1
+cm4gZTt2YXIgdCxuLHI9ZSxzPXYuZXZlbnQuZml4SG9va3NbZS50eXBlXXx8e30sbz1zLnByb3Bz
+P3RoaXMucHJvcHMuY29uY2F0KHMucHJvcHMpOnRoaXMucHJvcHM7ZT12LkV2ZW50KHIpO2Zvcih0
+PW8ubGVuZ3RoO3Q7KW49b1stLXRdLGVbbl09cltuXTtyZXR1cm4gZS50YXJnZXR8fChlLnRhcmdl
+dD1yLnNyY0VsZW1lbnR8fGkpLGUudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGUudGFyZ2V0PWUudGFy
+Z2V0LnBhcmVudE5vZGUpLGUubWV0YUtleT0hIWUubWV0YUtleSxzLmZpbHRlcj9zLmZpbHRlcihl
+LHIpOmV9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJm
+b2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0
+dXA6ZnVuY3Rpb24oZSx0LG4pe3YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2Fk
+PW4pfSx0ZWFyZG93bjpmdW5jdGlvbihlLHQpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT10JiYodGhp
+cy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIg
+aT12LmV4dGVuZChuZXcgdi5FdmVudCxuLHt0eXBlOmUsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxF
+dmVudDp7fX0pO3I/di5ldmVudC50cmlnZ2VyKGksbnVsbCx0KTp2LmV2ZW50LmRpc3BhdGNoLmNh
+bGwodCxpKSxpLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZuLnByZXZlbnREZWZhdWx0KCl9fSx2LmV2
+ZW50LmhhbmRsZT12LmV2ZW50LmRpc3BhdGNoLHYucmVtb3ZlRXZlbnQ9aS5yZW1vdmVFdmVudExp
+c3RlbmVyP2Z1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZl
+bnRMaXN0ZW5lcih0LG4sITEpfTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Im9uIit0O2UuZGV0YWNo
+RXZlbnQmJih0eXBlb2YgZVtyXT09InVuZGVmaW5lZCImJihlW3JdPW51bGwpLGUuZGV0YWNoRXZl
+bnQocixuKSl9LHYuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiB2LkV2
+ZW50KSlyZXR1cm4gbmV3IHYuRXZlbnQoZSx0KTtlJiZlLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVu
+dD1lLHRoaXMudHlwZT1lLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9ZS5kZWZhdWx0UHJl
+dmVudGVkfHxlLnJldHVyblZhbHVlPT09ITF8fGUuZ2V0UHJldmVudERlZmF1bHQmJmUuZ2V0UHJl
+dmVudERlZmF1bHQoKT90dDpldCk6dGhpcy50eXBlPWUsdCYmdi5leHRlbmQodGhpcyx0KSx0aGlz
+LnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8di5ub3coKSx0aGlzW3YuZXhwYW5kb109ITB9LHYu
+RXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0
+UHJldmVudGVkPXR0O3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDtpZighZSlyZXR1cm47ZS5wcmV2
+ZW50RGVmYXVsdD9lLnByZXZlbnREZWZhdWx0KCk6ZS5yZXR1cm5WYWx1ZT0hMX0sc3RvcFByb3Bh
+Z2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD10dDt2YXIgZT10aGlz
+Lm9yaWdpbmFsRXZlbnQ7aWYoIWUpcmV0dXJuO2Uuc3RvcFByb3BhZ2F0aW9uJiZlLnN0b3BQcm9w
+YWdhdGlvbigpLGUuY2FuY2VsQnViYmxlPSEwfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVu
+Y3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPXR0LHRoaXMuc3RvcFBy
+b3BhZ2F0aW9uKCl9LGlzRGVmYXVsdFByZXZlbnRlZDpldCxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpl
+dCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpldH0sdi5lYWNoKHttb3VzZWVudGVyOiJt
+b3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oZSx0KXt2LmV2ZW50LnNw
+ZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3Zh
+ciBuLHI9dGhpcyxpPWUucmVsYXRlZFRhcmdldCxzPWUuaGFuZGxlT2JqLG89cy5zZWxlY3Rvcjtp
+ZighaXx8aSE9PXImJiF2LmNvbnRhaW5zKHIsaSkpZS50eXBlPXMub3JpZ1R5cGUsbj1zLmhhbmRs
+ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10O3JldHVybiBufX19KSx2LnN1cHBvcnQu
+c3VibWl0QnViYmxlc3x8KHYuZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7
+aWYodi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7di5ldmVudC5hZGQodGhpcywiY2xp
+Y2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihlKXt2YXIgbj1lLnRhcmdldCxy
+PXYubm9kZU5hbWUobiwiaW5wdXQiKXx8di5ub2RlTmFtZShuLCJidXR0b24iKT9uLmZvcm06dDty
+JiYhdi5fZGF0YShyLCJfc3VibWl0X2F0dGFjaGVkIikmJih2LmV2ZW50LmFkZChyLCJzdWJtaXQu
+X3N1Ym1pdCIsZnVuY3Rpb24oZSl7ZS5fc3VibWl0X2J1YmJsZT0hMH0pLHYuX2RhdGEociwiX3N1
+Ym1pdF9hdHRhY2hlZCIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7ZS5fc3VibWl0
+X2J1YmJsZSYmKGRlbGV0ZSBlLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWUuaXNU
+cmlnZ2VyJiZ2LmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxlLCEwKSl9
+LHRlYXJkb3duOmZ1bmN0aW9uKCl7aWYodi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpcmV0dXJuITE7
+di5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSx2LnN1cHBvcnQuY2hhbmdlQnViYmxl
+c3x8KHYuZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7aWYoJC50ZXN0KHRo
+aXMubm9kZU5hbWUpKXtpZih0aGlzLnR5cGU9PT0iY2hlY2tib3gifHx0aGlzLnR5cGU9PT0icmFk
+aW8iKXYuZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUp
+e2Uub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWU9PT0iY2hlY2tlZCImJih0aGlzLl9qdXN0X2No
+YW5nZWQ9ITApfSksdi5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oZSl7
+dGhpcy5fanVzdF9jaGFuZ2VkJiYhZS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEp
+LHYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxlLCEwKX0pO3JldHVybiExfXYuZXZlbnQu
+YWRkKHRoaXMsImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFy
+Z2V0OyQudGVzdCh0Lm5vZGVOYW1lKSYmIXYuX2RhdGEodCwiX2NoYW5nZV9hdHRhY2hlZCIpJiYo
+di5ldmVudC5hZGQodCwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9k
+ZSYmIWUuaXNTaW11bGF0ZWQmJiFlLmlzVHJpZ2dlciYmdi5ldmVudC5zaW11bGF0ZSgiY2hhbmdl
+Iix0aGlzLnBhcmVudE5vZGUsZSwhMCl9KSx2Ll9kYXRhKHQsIl9jaGFuZ2VfYXR0YWNoZWQiLCEw
+KSl9KX0saGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O2lmKHRoaXMhPT10fHxlLmlz
+U2ltdWxhdGVkfHxlLmlzVHJpZ2dlcnx8dC50eXBlIT09InJhZGlvIiYmdC50eXBlIT09ImNoZWNr
+Ym94IilyZXR1cm4gZS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRl
+YXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIHYuZXZlbnQucmVtb3ZlKHRoaXMsIi5fY2hhbmdlIiks
+ISQudGVzdCh0aGlzLm5vZGVOYW1lKX19KSx2LnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8fHYuZWFj
+aCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj0w
+LHI9ZnVuY3Rpb24oZSl7di5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LHYuZXZlbnQuZml4KGUp
+LCEwKX07di5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpe24rKz09PTAmJmkuYWRk
+RXZlbnRMaXN0ZW5lcihlLHIsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tbj09PTAmJmkucmVt
+b3ZlRXZlbnRMaXN0ZW5lcihlLHIsITApfX19KSx2LmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oZSxu
+LHIsaSxzKXt2YXIgbyx1O2lmKHR5cGVvZiBlPT0ib2JqZWN0Iil7dHlwZW9mIG4hPSJzdHJpbmci
+JiYocj1yfHxuLG49dCk7Zm9yKHUgaW4gZSl0aGlzLm9uKHUsbixyLGVbdV0scyk7cmV0dXJuIHRo
+aXN9cj09bnVsbCYmaT09bnVsbD8oaT1uLHI9bj10KTppPT1udWxsJiYodHlwZW9mIG49PSJzdHJp
+bmciPyhpPXIscj10KTooaT1yLHI9bixuPXQpKTtpZihpPT09ITEpaT1ldDtlbHNlIGlmKCFpKXJl
+dHVybiB0aGlzO3JldHVybiBzPT09MSYmKG89aSxpPWZ1bmN0aW9uKGUpe3JldHVybiB2KCkub2Zm
+KGUpLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpLmd1aWQ9by5ndWlkfHwoby5ndWlkPXYuZ3Vp
+ZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7di5ldmVudC5hZGQodGhpcyxlLGkscixuKX0pfSxv
+bmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4sciwxKX0sb2ZmOmZ1bmN0
+aW9uKGUsbixyKXt2YXIgaSxzO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJl
+dHVybiBpPWUuaGFuZGxlT2JqLHYoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGkubmFtZXNwYWNlP2ku
+b3JpZ1R5cGUrIi4iK2kubmFtZXNwYWNlOmkub3JpZ1R5cGUsaS5zZWxlY3RvcixpLmhhbmRsZXIp
+LHRoaXM7aWYodHlwZW9mIGU9PSJvYmplY3QiKXtmb3IocyBpbiBlKXRoaXMub2ZmKHMsbixlW3Nd
+KTtyZXR1cm4gdGhpc31pZihuPT09ITF8fHR5cGVvZiBuPT0iZnVuY3Rpb24iKXI9bixuPXQ7cmV0
+dXJuIHI9PT0hMSYmKHI9ZXQpLHRoaXMuZWFjaChmdW5jdGlvbigpe3YuZXZlbnQucmVtb3ZlKHRo
+aXMsZSxyLG4pfSl9LGJpbmQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLm9uKGUsbnVsbCx0
+LG4pfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vZmYoZSxudWxsLHQpfSxsaXZl
+OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdih0aGlzLmNvbnRleHQpLm9uKGUsdGhpcy5zZWxlY3Rv
+cix0LG4pLHRoaXN9LGRpZTpmdW5jdGlvbihlLHQpe3JldHVybiB2KHRoaXMuY29udGV4dCkub2Zm
+KGUsdGhpcy5zZWxlY3Rvcnx8IioqIix0KSx0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixy
+KXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0
+dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwi
+KioiLG4pfSx0cmlnZ2VyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigp
+e3YuZXZlbnQudHJpZ2dlcihlLHQsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oZSx0
+KXtpZih0aGlzWzBdKXJldHVybiB2LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXNbMF0sITApfSx0b2dn
+bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLG49ZS5ndWlkfHx2Lmd1aWQrKyxyPTAsaT1m
+dW5jdGlvbihuKXt2YXIgaT0odi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIitlLmd1aWQpfHwwKSVy
+O3JldHVybiB2Ll9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2UuZ3VpZCxpKzEpLG4ucHJldmVudERl
+ZmF1bHQoKSx0W2ldLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8ITF9O2kuZ3VpZD1uO3doaWxlKHI8
+dC5sZW5ndGgpdFtyKytdLmd1aWQ9bjtyZXR1cm4gdGhpcy5jbGljayhpKX0saG92ZXI6ZnVuY3Rp
+b24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksdi5l
+YWNoKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9h
+ZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1v
+dXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3du
+IGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGUs
+dCl7di5mblt0XT1mdW5jdGlvbihlLG4pe3JldHVybiBuPT1udWxsJiYobj1lLGU9bnVsbCksYXJn
+dW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfSxRLnRl
+c3QodCkmJih2LmV2ZW50LmZpeEhvb2tzW3RdPXYuZXZlbnQua2V5SG9va3MpLEcudGVzdCh0KSYm
+KHYuZXZlbnQuZml4SG9va3NbdF09di5ldmVudC5tb3VzZUhvb2tzKX0pLGZ1bmN0aW9uKGUsdCl7
+ZnVuY3Rpb24gbnQoZSx0LG4scil7bj1ufHxbXSx0PXR8fGc7dmFyIGkscyxhLGYsbD10Lm5vZGVU
+eXBlO2lmKCFlfHx0eXBlb2YgZSE9InN0cmluZyIpcmV0dXJuIG47aWYobCE9PTEmJmwhPT05KXJl
+dHVybltdO2E9byh0KTtpZighYSYmIXIpaWYoaT1SLmV4ZWMoZSkpaWYoZj1pWzFdKXtpZihsPT09
+OSl7cz10LmdldEVsZW1lbnRCeUlkKGYpO2lmKCFzfHwhcy5wYXJlbnROb2RlKXJldHVybiBuO2lm
+KHMuaWQ9PT1mKXJldHVybiBuLnB1c2gocyksbn1lbHNlIGlmKHQub3duZXJEb2N1bWVudCYmKHM9
+dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGYpKSYmdSh0LHMpJiZzLmlkPT09ZilyZXR1
+cm4gbi5wdXNoKHMpLG59ZWxzZXtpZihpWzJdKXJldHVybiBTLmFwcGx5KG4seC5jYWxsKHQuZ2V0
+RWxlbWVudHNCeVRhZ05hbWUoZSksMCkpLG47aWYoKGY9aVszXSkmJlomJnQuZ2V0RWxlbWVudHNC
+eUNsYXNzTmFtZSlyZXR1cm4gUy5hcHBseShuLHguY2FsbCh0LmdldEVsZW1lbnRzQnlDbGFzc05h
+bWUoZiksMCkpLG59cmV0dXJuIHZ0KGUucmVwbGFjZShqLCIkMSIpLHQsbixyLGEpfWZ1bmN0aW9u
+IHJ0KGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7
+cmV0dXJuIG49PT0iaW5wdXQiJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBpdChlKXtyZXR1cm4gZnVu
+Y3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihuPT09ImlucHV0
+Inx8bj09PSJidXR0b24iKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gc3QoZSl7cmV0dXJuIE4oZnVu
+Y3Rpb24odCl7cmV0dXJuIHQ9K3QsTihmdW5jdGlvbihuLHIpe3ZhciBpLHM9ZShbXSxuLmxlbmd0
+aCx0KSxvPXMubGVuZ3RoO3doaWxlKG8tLSluW2k9c1tvXV0mJihuW2ldPSEocltpXT1uW2ldKSl9
+KX0pfWZ1bmN0aW9uIG90KGUsdCxuKXtpZihlPT09dClyZXR1cm4gbjt2YXIgcj1lLm5leHRTaWJs
+aW5nO3doaWxlKHIpe2lmKHI9PT10KXJldHVybi0xO3I9ci5uZXh0U2libGluZ31yZXR1cm4gMX1m
+dW5jdGlvbiB1dChlLHQpe3ZhciBuLHIscyxvLHUsYSxmLGw9TFtkXVtlKyIgIl07aWYobClyZXR1
+cm4gdD8wOmwuc2xpY2UoMCk7dT1lLGE9W10sZj1pLnByZUZpbHRlcjt3aGlsZSh1KXtpZighbnx8
+KHI9Ri5leGVjKHUpKSlyJiYodT11LnNsaWNlKHJbMF0ubGVuZ3RoKXx8dSksYS5wdXNoKHM9W10p
+O249ITE7aWYocj1JLmV4ZWModSkpcy5wdXNoKG49bmV3IG0oci5zaGlmdCgpKSksdT11LnNsaWNl
+KG4ubGVuZ3RoKSxuLnR5cGU9clswXS5yZXBsYWNlKGosIiAiKTtmb3IobyBpbiBpLmZpbHRlciko
+cj1KW29dLmV4ZWModSkpJiYoIWZbb118fChyPWZbb10ocikpKSYmKHMucHVzaChuPW5ldyBtKHIu
+c2hpZnQoKSkpLHU9dS5zbGljZShuLmxlbmd0aCksbi50eXBlPW8sbi5tYXRjaGVzPXIpO2lmKCFu
+KWJyZWFrfXJldHVybiB0P3UubGVuZ3RoOnU/bnQuZXJyb3IoZSk6TChlLGEpLnNsaWNlKDApfWZ1
+bmN0aW9uIGF0KGUsdCxyKXt2YXIgaT10LmRpcixzPXImJnQuZGlyPT09InBhcmVudE5vZGUiLG89
+dysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixyKXt3aGlsZSh0PXRbaV0paWYoc3x8dC5u
+b2RlVHlwZT09PTEpcmV0dXJuIGUodCxuLHIpfTpmdW5jdGlvbih0LHIsdSl7aWYoIXUpe3ZhciBh
+LGY9YisiICIrbysiICIsbD1mK247d2hpbGUodD10W2ldKWlmKHN8fHQubm9kZVR5cGU9PT0xKXtp
+ZigoYT10W2RdKT09PWwpcmV0dXJuIHQuc2l6c2V0O2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmYS5p
+bmRleE9mKGYpPT09MCl7aWYodC5zaXpzZXQpcmV0dXJuIHR9ZWxzZXt0W2RdPWw7aWYoZSh0LHIs
+dSkpcmV0dXJuIHQuc2l6c2V0PSEwLHQ7dC5zaXpzZXQ9ITF9fX1lbHNlIHdoaWxlKHQ9dFtpXSlp
+ZihzfHx0Lm5vZGVUeXBlPT09MSlpZihlKHQscix1KSlyZXR1cm4gdH19ZnVuY3Rpb24gZnQoZSl7
+cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGkt
+LSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24gbHQoZSx0
+LG4scixpKXt2YXIgcyxvPVtdLHU9MCxhPWUubGVuZ3RoLGY9dCE9bnVsbDtmb3IoO3U8YTt1Kysp
+aWYocz1lW3VdKWlmKCFufHxuKHMscixpKSlvLnB1c2gocyksZiYmdC5wdXNoKHUpO3JldHVybiBv
+fWZ1bmN0aW9uIGN0KGUsdCxuLHIsaSxzKXtyZXR1cm4gciYmIXJbZF0mJihyPWN0KHIpKSxpJiYh
+aVtkXSYmKGk9Y3QoaSxzKSksTihmdW5jdGlvbihzLG8sdSxhKXt2YXIgZixsLGMsaD1bXSxwPVtd
+LGQ9by5sZW5ndGgsdj1zfHxkdCh0fHwiKiIsdS5ub2RlVHlwZT9bdV06dSxbXSksbT1lJiYoc3x8
+IXQpP2x0KHYsaCxlLHUsYSk6dixnPW4/aXx8KHM/ZTpkfHxyKT9bXTpvOm07biYmbihtLGcsdSxh
+KTtpZihyKXtmPWx0KGcscCkscihmLFtdLHUsYSksbD1mLmxlbmd0aDt3aGlsZShsLS0paWYoYz1m
+W2xdKWdbcFtsXV09IShtW3BbbF1dPWMpfWlmKHMpe2lmKGl8fGUpe2lmKGkpe2Y9W10sbD1nLmxl
+bmd0aDt3aGlsZShsLS0pKGM9Z1tsXSkmJmYucHVzaChtW2xdPWMpO2kobnVsbCxnPVtdLGYsYSl9
+bD1nLmxlbmd0aDt3aGlsZShsLS0pKGM9Z1tsXSkmJihmPWk/VC5jYWxsKHMsYyk6aFtsXSk+LTEm
+JihzW2ZdPSEob1tmXT1jKSl9fWVsc2UgZz1sdChnPT09bz9nLnNwbGljZShkLGcubGVuZ3RoKTpn
+KSxpP2kobnVsbCxvLGcsYSk6Uy5hcHBseShvLGcpfSl9ZnVuY3Rpb24gaHQoZSl7dmFyIHQsbixy
+LHM9ZS5sZW5ndGgsbz1pLnJlbGF0aXZlW2VbMF0udHlwZV0sdT1vfHxpLnJlbGF0aXZlWyIgIl0s
+YT1vPzE6MCxmPWF0KGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0sdSwhMCksbD1hdChmdW5jdGlv
+bihlKXtyZXR1cm4gVC5jYWxsKHQsZSk+LTF9LHUsITApLGg9W2Z1bmN0aW9uKGUsbixyKXtyZXR1
+cm4hbyYmKHJ8fG4hPT1jKXx8KCh0PW4pLm5vZGVUeXBlP2YoZSxuLHIpOmwoZSxuLHIpKX1dO2Zv
+cig7YTxzO2ErKylpZihuPWkucmVsYXRpdmVbZVthXS50eXBlXSloPVthdChmdChoKSxuKV07ZWxz
+ZXtuPWkuZmlsdGVyW2VbYV0udHlwZV0uYXBwbHkobnVsbCxlW2FdLm1hdGNoZXMpO2lmKG5bZF0p
+e3I9KythO2Zvcig7cjxzO3IrKylpZihpLnJlbGF0aXZlW2Vbcl0udHlwZV0pYnJlYWs7cmV0dXJu
+IGN0KGE+MSYmZnQoaCksYT4xJiZlLnNsaWNlKDAsYS0xKS5qb2luKCIiKS5yZXBsYWNlKGosIiQx
+IiksbixhPHImJmh0KGUuc2xpY2UoYSxyKSkscjxzJiZodChlPWUuc2xpY2UocikpLHI8cyYmZS5q
+b2luKCIiKSl9aC5wdXNoKG4pfXJldHVybiBmdChoKX1mdW5jdGlvbiBwdChlLHQpe3ZhciByPXQu
+bGVuZ3RoPjAscz1lLmxlbmd0aD4wLG89ZnVuY3Rpb24odSxhLGYsbCxoKXt2YXIgcCxkLHYsbT1b
+XSx5PTAsdz0iMCIseD11JiZbXSxUPWghPW51bGwsTj1jLEM9dXx8cyYmaS5maW5kLlRBRygiKiIs
+aCYmYS5wYXJlbnROb2RlfHxhKSxrPWIrPU49PW51bGw/MTpNYXRoLkU7VCYmKGM9YSE9PWcmJmEs
+bj1vLmVsKTtmb3IoOyhwPUNbd10pIT1udWxsO3crKyl7aWYocyYmcCl7Zm9yKGQ9MDt2PWVbZF07
+ZCsrKWlmKHYocCxhLGYpKXtsLnB1c2gocCk7YnJlYWt9VCYmKGI9ayxuPSsrby5lbCl9ciYmKChw
+PSF2JiZwKSYmeS0tLHUmJngucHVzaChwKSl9eSs9dztpZihyJiZ3IT09eSl7Zm9yKGQ9MDt2PXRb
+ZF07ZCsrKXYoeCxtLGEsZik7aWYodSl7aWYoeT4wKXdoaWxlKHctLSkheFt3XSYmIW1bd10mJiht
+W3ddPUUuY2FsbChsKSk7bT1sdChtKX1TLmFwcGx5KGwsbSksVCYmIXUmJm0ubGVuZ3RoPjAmJnkr
+dC5sZW5ndGg+MSYmbnQudW5pcXVlU29ydChsKX1yZXR1cm4gVCYmKGI9ayxjPU4pLHh9O3JldHVy
+biBvLmVsPTAscj9OKG8pOm99ZnVuY3Rpb24gZHQoZSx0LG4pe3ZhciByPTAsaT10Lmxlbmd0aDtm
+b3IoO3I8aTtyKyspbnQoZSx0W3JdLG4pO3JldHVybiBufWZ1bmN0aW9uIHZ0KGUsdCxuLHIscyl7
+dmFyIG8sdSxmLGwsYyxoPXV0KGUpLHA9aC5sZW5ndGg7aWYoIXImJmgubGVuZ3RoPT09MSl7dT1o
+WzBdPWhbMF0uc2xpY2UoMCk7aWYodS5sZW5ndGg+MiYmKGY9dVswXSkudHlwZT09PSJJRCImJnQu
+bm9kZVR5cGU9PT05JiYhcyYmaS5yZWxhdGl2ZVt1WzFdLnR5cGVdKXt0PWkuZmluZC5JRChmLm1h
+dGNoZXNbMF0ucmVwbGFjZSgkLCIiKSx0LHMpWzBdO2lmKCF0KXJldHVybiBuO2U9ZS5zbGljZSh1
+LnNoaWZ0KCkubGVuZ3RoKX1mb3Iobz1KLlBPUy50ZXN0KGUpPy0xOnUubGVuZ3RoLTE7bz49MDtv
+LS0pe2Y9dVtvXTtpZihpLnJlbGF0aXZlW2w9Zi50eXBlXSlicmVhaztpZihjPWkuZmluZFtsXSlp
+ZihyPWMoZi5tYXRjaGVzWzBdLnJlcGxhY2UoJCwiIiksei50ZXN0KHVbMF0udHlwZSkmJnQucGFy
+ZW50Tm9kZXx8dCxzKSl7dS5zcGxpY2UobywxKSxlPXIubGVuZ3RoJiZ1LmpvaW4oIiIpO2lmKCFl
+KXJldHVybiBTLmFwcGx5KG4seC5jYWxsKHIsMCkpLG47YnJlYWt9fX1yZXR1cm4gYShlLGgpKHIs
+dCxzLG4sei50ZXN0KGUpKSxufWZ1bmN0aW9uIG10KCl7fXZhciBuLHIsaSxzLG8sdSxhLGYsbCxj
+LGg9ITAscD0idW5kZWZpbmVkIixkPSgic2l6Y2FjaGUiK01hdGgucmFuZG9tKCkpLnJlcGxhY2Uo
+Ii4iLCIiKSxtPVN0cmluZyxnPWUuZG9jdW1lbnQseT1nLmRvY3VtZW50RWxlbWVudCxiPTAsdz0w
+LEU9W10ucG9wLFM9W10ucHVzaCx4PVtdLnNsaWNlLFQ9W10uaW5kZXhPZnx8ZnVuY3Rpb24oZSl7
+dmFyIHQ9MCxuPXRoaXMubGVuZ3RoO2Zvcig7dDxuO3QrKylpZih0aGlzW3RdPT09ZSlyZXR1cm4g
+dDtyZXR1cm4tMX0sTj1mdW5jdGlvbihlLHQpe3JldHVybiBlW2RdPXQ9PW51bGx8fHQsZX0sQz1m
+dW5jdGlvbigpe3ZhciBlPXt9LHQ9W107cmV0dXJuIE4oZnVuY3Rpb24obixyKXtyZXR1cm4gdC5w
+dXNoKG4pPmkuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Quc2hpZnQoKV0sZVtuKyIgIl09cn0sZSl9
+LGs9QygpLEw9QygpLEE9QygpLE89IltcXHgyMFxcdFxcclxcblxcZl0iLE09Iig/OlxcXFwufFst
+XFx3XXxbXlxceDAwLVxceGEwXSkrIixfPU0ucmVwbGFjZSgidyIsIncjIiksRD0iKFsqXiR8IX5d
+Pz0pIixQPSJcXFsiK08rIiooIitNKyIpIitPKyIqKD86IitEK08rIiooPzooWydcIl0pKCg/Olxc
+XFwufFteXFxcXF0pKj8pXFwzfCgiK18rIil8KXwpIitPKyIqXFxdIixIPSI6KCIrTSsiKSg/Olxc
+KCg/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDJ8KFteKClbXFxdXSp8KD86KD86IitQ
+KyIpfFteOl18XFxcXC4pKnwuKikpXFwpfCkiLEI9IjooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZp
+cnN0fGxhc3QpKD86XFwoIitPKyIqKCg/Oi1cXGQpP1xcZCopIitPKyIqXFwpfCkoPz1bXi1dfCQp
+IixqPW5ldyBSZWdFeHAoIl4iK08rIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTysiKyQi
+LCJnIiksRj1uZXcgUmVnRXhwKCJeIitPKyIqLCIrTysiKiIpLEk9bmV3IFJlZ0V4cCgiXiIrTysi
+KihbXFx4MjBcXHRcXHJcXG5cXGY+K35dKSIrTysiKiIpLHE9bmV3IFJlZ0V4cChIKSxSPS9eKD86
+IyhbXHdcLV0rKXwoXHcrKXxcLihbXHdcLV0rKSkkLyxVPS9eOm5vdC8sej0vW1x4MjBcdFxyXG5c
+Zl0qWyt+XS8sVz0vOm5vdFwoJC8sWD0vaFxkL2ksVj0vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1
+dHRvbi9pLCQ9L1xcKD8hXFwpL2csSj17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6
+bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxOQU1FOm5ldyBSZWdFeHAoIl5cXFtuYW1lPVsnXCJd
+PygiK00rIilbJ1wiXT9cXF0iKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncq
+IikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK1ApLFBTRVVETzpuZXcgUmVnRXhwKCJeIitIKSxQ
+T1M6bmV3IFJlZ0V4cChCLCJpIiksQ0hJTEQ6bmV3IFJlZ0V4cCgiXjoob25seXxudGh8Zmlyc3R8
+bGFzdCktY2hpbGQoPzpcXCgiK08rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK08rIioo
+PzooWystXXwpIitPKyIqKFxcZCspfCkpIitPKyIqXFwpfCkiLCJpIiksbmVlZHNDb250ZXh0Om5l
+dyBSZWdFeHAoIl4iK08rIipbPit+XXwiK0IsImkiKX0sSz1mdW5jdGlvbihlKXt2YXIgdD1nLmNy
+ZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4gZSh0KX1jYXRjaChuKXtyZXR1cm4hMX1maW5h
+bGx5e3Q9bnVsbH19LFE9SyhmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChnLmNyZWF0
+ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLEc9Syhm
+dW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGUuZmlyc3RD
+aGlsZCYmdHlwZW9mIGUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPT1wJiZlLmZpcnN0Q2hpbGQu
+Z2V0QXR0cmlidXRlKCJocmVmIik9PT0iIyJ9KSxZPUsoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9
+IjxzZWxlY3Q+PC9zZWxlY3Q+Ijt2YXIgdD10eXBlb2YgZS5sYXN0Q2hpbGQuZ2V0QXR0cmlidXRl
+KCJtdWx0aXBsZSIpO3JldHVybiB0IT09ImJvb2xlYW4iJiZ0IT09InN0cmluZyJ9KSxaPUsoZnVu
+Y3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSdoaWRkZW4gZSc+PC9kaXY+
+PGRpdiBjbGFzcz0naGlkZGVuJz48L2Rpdj4iLCFlLmdldEVsZW1lbnRzQnlDbGFzc05hbWV8fCFl
+LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg/ITE6KGUubGFzdENoaWxkLmNsYXNz
+TmFtZT0iZSIsZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09Mil9KSxldD1L
+KGZ1bmN0aW9uKGUpe2UuaWQ9ZCswLGUuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIic+PC9hPjxk
+aXYgbmFtZT0nIitkKyInPjwvZGl2PiIseS5pbnNlcnRCZWZvcmUoZSx5LmZpcnN0Q2hpbGQpO3Zh
+ciB0PWcuZ2V0RWxlbWVudHNCeU5hbWUmJmcuZ2V0RWxlbWVudHNCeU5hbWUoZCkubGVuZ3RoPT09
+MitnLmdldEVsZW1lbnRzQnlOYW1lKGQrMCkubGVuZ3RoO3JldHVybiByPSFnLmdldEVsZW1lbnRC
+eUlkKGQpLHkucmVtb3ZlQ2hpbGQoZSksdH0pO3RyeXt4LmNhbGwoeS5jaGlsZE5vZGVzLDApWzBd
+Lm5vZGVUeXBlfWNhdGNoKHR0KXt4PWZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKDt0PXRoaXNb
+ZV07ZSsrKW4ucHVzaCh0KTtyZXR1cm4gbn19bnQubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVy
+biBudChlLG51bGwsbnVsbCx0KX0sbnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7cmV0
+dXJuIG50KHQsbnVsbCxudWxsLFtlXSkubGVuZ3RoPjB9LHM9bnQuZ2V0VGV4dD1mdW5jdGlvbihl
+KXt2YXIgdCxuPSIiLHI9MCxpPWUubm9kZVR5cGU7aWYoaSl7aWYoaT09PTF8fGk9PT05fHxpPT09
+MTEpe2lmKHR5cGVvZiBlLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gZS50ZXh0Q29udGVu
+dDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9cyhlKX1lbHNlIGlmKGk9
+PT0zfHxpPT09NClyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSBmb3IoO3Q9ZVtyXTtyKyspbis9cyh0
+KTtyZXR1cm4gbn0sbz1udC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3Vt
+ZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/dC5ub2RlTmFtZSE9PSJIVE1MIjohMX0s
+dT1udC5jb250YWlucz15LmNvbnRhaW5zP2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS5ub2RlVHlwZT09
+PTk/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEh
+KHImJnIubm9kZVR5cGU9PT0xJiZuLmNvbnRhaW5zJiZuLmNvbnRhaW5zKHIpKX06eS5jb21wYXJl
+RG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3JldHVybiB0JiYhIShlLmNvbXBhcmVEb2N1
+bWVudFBvc2l0aW9uKHQpJjE2KX06ZnVuY3Rpb24oZSx0KXt3aGlsZSh0PXQucGFyZW50Tm9kZSlp
+Zih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sbnQuYXR0cj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9
+byhlKTtyZXR1cm4gcnx8KHQ9dC50b0xvd2VyQ2FzZSgpKSwobj1pLmF0dHJIYW5kbGVbdF0pP24o
+ZSk6cnx8WT9lLmdldEF0dHJpYnV0ZSh0KToobj1lLmdldEF0dHJpYnV0ZU5vZGUodCksbj90eXBl
+b2YgZVt0XT09ImJvb2xlYW4iP2VbdF0/dDpudWxsOm4uc3BlY2lmaWVkP24udmFsdWU6bnVsbDpu
+dWxsKX0saT1udC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpOLG1hdGNo
+OkosYXR0ckhhbmRsZTpHP3t9OntocmVmOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0
+ZSgiaHJlZiIsMil9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJ0eXBl
+Iil9fSxmaW5kOntJRDpyP2Z1bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdC5nZXRFbGVtZW50QnlJ
+ZCE9PXAmJiFuKXt2YXIgcj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiByJiZyLnBhcmVudE5v
+ZGU/W3JdOltdfX06ZnVuY3Rpb24oZSxuLHIpe2lmKHR5cGVvZiBuLmdldEVsZW1lbnRCeUlkIT09
+cCYmIXIpe3ZhciBpPW4uZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIGk/aS5pZD09PWV8fHR5cGVv
+ZiBpLmdldEF0dHJpYnV0ZU5vZGUhPT1wJiZpLmdldEF0dHJpYnV0ZU5vZGUoImlkIikudmFsdWU9
+PT1lP1tpXTp0OltdfX0sVEFHOlE/ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50
+c0J5VGFnTmFtZSE9PXApcmV0dXJuIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSl9OmZ1bmN0aW9u
+KGUsdCl7dmFyIG49dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTtpZihlPT09IioiKXt2YXIgcixp
+PVtdLHM9MDtmb3IoO3I9bltzXTtzKyspci5ub2RlVHlwZT09PTEmJmkucHVzaChyKTtyZXR1cm4g
+aX1yZXR1cm4gbn0sTkFNRTpldCYmZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdC5nZXRFbGVtZW50
+c0J5TmFtZSE9PXApcmV0dXJuIHQuZ2V0RWxlbWVudHNCeU5hbWUobmFtZSl9LENMQVNTOlomJmZ1
+bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09cCYmIW4p
+cmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX19LHJlbGF0aXZlOnsiPiI6e2Rpcjoi
+cGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InBy
+ZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJl
+RmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZSgkLCIiKSxl
+WzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZSgkLCIiKSxlWzJdPT09In49IiYmKGVbM109IiAi
+K2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVb
+MV0udG9Mb3dlckNhc2UoKSxlWzFdPT09Im50aCI/KGVbMl18fG50LmVycm9yKGVbMF0pLGVbM109
+KyhlWzNdP2VbNF0rKGVbNV18fDEpOjIqKGVbMl09PT0iZXZlbiJ8fGVbMl09PT0ib2RkIikpLGVb
+NF09KyhlWzZdK2VbN118fGVbMl09PT0ib2RkIikpOmVbMl0mJm50LmVycm9yKGVbMF0pLGV9LFBT
+RVVETzpmdW5jdGlvbihlKXt2YXIgdCxuO2lmKEouQ0hJTEQudGVzdChlWzBdKSlyZXR1cm4gbnVs
+bDtpZihlWzNdKWVbMl09ZVszXTtlbHNlIGlmKHQ9ZVs0XSlxLnRlc3QodCkmJihuPXV0KHQsITAp
+KSYmKG49dC5pbmRleE9mKCIpIix0Lmxlbmd0aC1uKS10Lmxlbmd0aCkmJih0PXQuc2xpY2UoMCxu
+KSxlWzBdPWVbMF0uc2xpY2UoMCxuKSksZVsyXT10O3JldHVybiBlLnNsaWNlKDAsMyl9fSxmaWx0
+ZXI6e0lEOnI/ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKCQsIiIpLGZ1bmN0aW9uKHQp
+e3JldHVybiB0LmdldEF0dHJpYnV0ZSgiaWQiKT09PWV9fTpmdW5jdGlvbihlKXtyZXR1cm4gZT1l
+LnJlcGxhY2UoJCwiIiksZnVuY3Rpb24odCl7dmFyIG49dHlwZW9mIHQuZ2V0QXR0cmlidXRlTm9k
+ZSE9PXAmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxU
+QUc6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0iKiI/ZnVuY3Rpb24oKXtyZXR1cm4hMH06KGU9ZS5y
+ZXBsYWNlKCQsIiIpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZU5hbWUm
+JnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWV9KX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9
+a1tkXVtlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrTysiKSIrZSsiKCIrTysi
+fCQpIikpJiZrKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdChlLmNsYXNzTmFtZXx8dHlwZW9m
+IGUuZ2V0QXR0cmlidXRlIT09cCYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRS
+OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocixpKXt2YXIgcz1udC5hdHRyKHIsZSk7
+cmV0dXJuIHM9PW51bGw/dD09PSIhPSI6dD8ocys9IiIsdD09PSI9Ij9zPT09bjp0PT09IiE9Ij9z
+IT09bjp0PT09Il49Ij9uJiZzLmluZGV4T2Yobik9PT0wOnQ9PT0iKj0iP24mJnMuaW5kZXhPZihu
+KT4tMTp0PT09IiQ9Ij9uJiZzLnN1YnN0cihzLmxlbmd0aC1uLmxlbmd0aCk9PT1uOnQ9PT0ifj0i
+PygiICIrcysiICIpLmluZGV4T2Yobik+LTE6dD09PSJ8PSI/cz09PW58fHMuc3Vic3RyKDAsbi5s
+ZW5ndGgrMSk9PT1uKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4g
+ZT09PSJudGgiP2Z1bmN0aW9uKGUpe3ZhciB0LGkscz1lLnBhcmVudE5vZGU7aWYobj09PTEmJnI9
+PT0wKXJldHVybiEwO2lmKHMpe2k9MDtmb3IodD1zLmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxp
+bmcpaWYodC5ub2RlVHlwZT09PTEpe2krKztpZihlPT09dClicmVha319cmV0dXJuIGktPXIsaT09
+PW58fGklbj09PTAmJmkvbj49MH06ZnVuY3Rpb24odCl7dmFyIG49dDtzd2l0Y2goZSl7Y2FzZSJv
+bmx5IjpjYXNlImZpcnN0Ijp3aGlsZShuPW4ucHJldmlvdXNTaWJsaW5nKWlmKG4ubm9kZVR5cGU9
+PT0xKXJldHVybiExO2lmKGU9PT0iZmlyc3QiKXJldHVybiEwO249dDtjYXNlImxhc3QiOndoaWxl
+KG49bi5uZXh0U2libGluZylpZihuLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMH19fSxQ
+U0VVRE86ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWkucHNldWRvc1tlXXx8aS5zZXRGaWx0ZXJzW2Uu
+dG9Mb3dlckNhc2UoKV18fG50LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJu
+IHJbZF0/cih0KTpyLmxlbmd0aD4xPyhuPVtlLGUsIiIsdF0saS5zZXRGaWx0ZXJzLmhhc093blBy
+b3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/TihmdW5jdGlvbihlLG4pe3ZhciBpLHM9cihlLHQpLG89
+cy5sZW5ndGg7d2hpbGUoby0tKWk9VC5jYWxsKGUsc1tvXSksZVtpXT0hKG5baV09c1tvXSl9KTpm
+dW5jdGlvbihlKXtyZXR1cm4gcihlLDAsbil9KTpyfX0scHNldWRvczp7bm90Ok4oZnVuY3Rpb24o
+ZSl7dmFyIHQ9W10sbj1bXSxyPWEoZS5yZXBsYWNlKGosIiQxIikpO3JldHVybiByW2RdP04oZnVu
+Y3Rpb24oZSx0LG4saSl7dmFyIHMsbz1yKGUsbnVsbCxpLFtdKSx1PWUubGVuZ3RoO3doaWxlKHUt
+LSlpZihzPW9bdV0pZVt1XT0hKHRbdV09cyl9KTpmdW5jdGlvbihlLGkscyl7cmV0dXJuIHRbMF09
+ZSxyKHQsbnVsbCxzLG4pLCFuLnBvcCgpfX0pLGhhczpOKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5j
+dGlvbih0KXtyZXR1cm4gbnQoZSx0KS5sZW5ndGg+MH19KSxjb250YWluczpOKGZ1bmN0aW9uKGUp
+e3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fHMo
+dCkpLmluZGV4T2YoZSk+LTF9fSksZW5hYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxl
+ZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSEwfSxjaGVj
+a2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdD09
+PSJpbnB1dCImJiEhZS5jaGVja2VkfHx0PT09Im9wdGlvbiImJiEhZS5zZWxlY3RlZH0sc2VsZWN0
+ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVk
+SW5kZXgsZS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIWkucHNldWRv
+cy5lbXB0eShlKX0sZW1wdHk6ZnVuY3Rpb24oZSl7dmFyIHQ7ZT1lLmZpcnN0Q2hpbGQ7d2hpbGUo
+ZSl7aWYoZS5ub2RlTmFtZT4iQCJ8fCh0PWUubm9kZVR5cGUpPT09M3x8dD09PTQpcmV0dXJuITE7
+ZT1lLm5leHRTaWJsaW5nfXJldHVybiEwfSxoZWFkZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIFgudGVz
+dChlLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiBlLm5vZGVOYW1l
+LnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYodD1lLnR5cGUpPT09InRleHQiJiYoKG49ZS5nZXRB
+dHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fG4udG9Mb3dlckNhc2UoKT09PXQpfSxyYWRpbzpydCgi
+cmFkaW8iKSxjaGVja2JveDpydCgiY2hlY2tib3giKSxmaWxlOnJ0KCJmaWxlIikscGFzc3dvcmQ6
+cnQoInBhc3N3b3JkIiksaW1hZ2U6cnQoImltYWdlIiksc3VibWl0Oml0KCJzdWJtaXQiKSxyZXNl
+dDppdCgicmVzZXQiKSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZS50b0xvd2Vy
+Q2FzZSgpO3JldHVybiB0PT09ImlucHV0IiYmZS50eXBlPT09ImJ1dHRvbiJ8fHQ9PT0iYnV0dG9u
+In0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFYudGVzdChlLm5vZGVOYW1lKX0sZm9jdXM6ZnVu
+Y3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50O3JldHVybiBlPT09dC5hY3RpdmVFbGVtZW50
+JiYoIXQuaGFzRm9jdXN8fHQuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJ
+bmRleCl9LGFjdGl2ZTpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWUub3duZXJEb2N1bWVudC5hY3Rp
+dmVFbGVtZW50fSxmaXJzdDpzdChmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6c3QoZnVuY3Rp
+b24oZSx0KXtyZXR1cm5bdC0xXX0pLGVxOnN0KGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm5bbjwwP24r
+dDpuXX0pLGV2ZW46c3QoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2go
+bik7cmV0dXJuIGV9KSxvZGQ6c3QoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MTtuPHQ7bis9Mill
+LnB1c2gobik7cmV0dXJuIGV9KSxsdDpzdChmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9u
+K3Q6bjstLXI+PTA7KWUucHVzaChyKTtyZXR1cm4gZX0pLGd0OnN0KGZ1bmN0aW9uKGUsdCxuKXtm
+b3IodmFyIHI9bjwwP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19LGY9eS5jb21w
+YXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dD8obD0hMCwwKToo
+IWUuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Uu
+Y29tcGFyZURvY3VtZW50UG9zaXRpb246ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSY0KT8t
+MToxfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBsPSEwLDA7aWYoZS5zb3VyY2VJbmRl
+eCYmdC5zb3VyY2VJbmRleClyZXR1cm4gZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O3ZhciBu
+LHIsaT1bXSxzPVtdLG89ZS5wYXJlbnROb2RlLHU9dC5wYXJlbnROb2RlLGE9bztpZihvPT09dSly
+ZXR1cm4gb3QoZSx0KTtpZighbylyZXR1cm4tMTtpZighdSlyZXR1cm4gMTt3aGlsZShhKWkudW5z
+aGlmdChhKSxhPWEucGFyZW50Tm9kZTthPXU7d2hpbGUoYSlzLnVuc2hpZnQoYSksYT1hLnBhcmVu
+dE5vZGU7bj1pLmxlbmd0aCxyPXMubGVuZ3RoO2Zvcih2YXIgZj0wO2Y8biYmZjxyO2YrKylpZihp
+W2ZdIT09c1tmXSlyZXR1cm4gb3QoaVtmXSxzW2ZdKTtyZXR1cm4gZj09PW4/b3QoZSxzW2ZdLC0x
+KTpvdChpW2ZdLHQsMSl9LFswLDBdLnNvcnQoZiksaD0hbCxudC51bmlxdWVTb3J0PWZ1bmN0aW9u
+KGUpe3ZhciB0LG49W10scj0xLGk9MDtsPWgsZS5zb3J0KGYpO2lmKGwpe2Zvcig7dD1lW3JdO3Ir
+Kyl0PT09ZVtyLTFdJiYoaT1uLnB1c2gocikpO3doaWxlKGktLSllLnNwbGljZShuW2ldLDEpfXJl
+dHVybiBlfSxudC5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJv
+ciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LGE9bnQuY29tcGlsZT1mdW5jdGlvbihl
+LHQpe3ZhciBuLHI9W10saT1bXSxzPUFbZF1bZSsiICJdO2lmKCFzKXt0fHwodD11dChlKSksbj10
+Lmxlbmd0aDt3aGlsZShuLS0pcz1odCh0W25dKSxzW2RdP3IucHVzaChzKTppLnB1c2gocyk7cz1B
+KGUscHQoaSxyKSl9cmV0dXJuIHN9LGcucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIg
+ZSx0PXZ0LG49Lyd8XFwvZyxyPS9cPVtceDIwXHRcclxuXGZdKihbXiciXF1dKilbXHgyMFx0XHJc
+blxmXSpcXS9nLGk9WyI6Zm9jdXMiXSxzPVsiOmFjdGl2ZSJdLHU9eS5tYXRjaGVzU2VsZWN0b3J8
+fHkubW96TWF0Y2hlc1NlbGVjdG9yfHx5LndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8eS5vTWF0Y2hl
+c1NlbGVjdG9yfHx5Lm1zTWF0Y2hlc1NlbGVjdG9yO0soZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9
+IjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlT
+ZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8aS5wdXNoKCJcXFsiK08rIiooPzpjaGVj
+a2VkfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfHJlYWRvbmx5fHNlbGVjdGVkfHZhbHVlKSIpLGUu
+cXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fGkucHVzaCgiOmNoZWNrZWQiKX0p
+LEsoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxwIHRlc3Q9Jyc+PC9wPiIsZS5xdWVyeVNlbGVj
+dG9yQWxsKCJbdGVzdF49JyddIikubGVuZ3RoJiZpLnB1c2goIlsqXiRdPSIrTysiKig/OlwiXCJ8
+JycpIiksZS5pbm5lckhUTUw9IjxpbnB1dCB0eXBlPSdoaWRkZW4nLz4iLGUucXVlcnlTZWxlY3Rv
+ckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGkucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKX0p
+LGk9bmV3IFJlZ0V4cChpLmpvaW4oInwiKSksdnQ9ZnVuY3Rpb24oZSxyLHMsbyx1KXtpZighbyYm
+IXUmJiFpLnRlc3QoZSkpe3ZhciBhLGYsbD0hMCxjPWQsaD1yLHA9ci5ub2RlVHlwZT09PTkmJmU7
+aWYoci5ub2RlVHlwZT09PTEmJnIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXth
+PXV0KGUpLChsPXIuZ2V0QXR0cmlidXRlKCJpZCIpKT9jPWwucmVwbGFjZShuLCJcXCQmIik6ci5z
+ZXRBdHRyaWJ1dGUoImlkIixjKSxjPSJbaWQ9JyIrYysiJ10gIixmPWEubGVuZ3RoO3doaWxlKGYt
+LSlhW2ZdPWMrYVtmXS5qb2luKCIiKTtoPXoudGVzdChlKSYmci5wYXJlbnROb2RlfHxyLHA9YS5q
+b2luKCIsIil9aWYocCl0cnl7cmV0dXJuIFMuYXBwbHkocyx4LmNhbGwoaC5xdWVyeVNlbGVjdG9y
+QWxsKHApLDApKSxzfWNhdGNoKHYpe31maW5hbGx5e2x8fHIucmVtb3ZlQXR0cmlidXRlKCJpZCIp
+fX1yZXR1cm4gdChlLHIscyxvLHUpfSx1JiYoSyhmdW5jdGlvbih0KXtlPXUuY2FsbCh0LCJkaXYi
+KTt0cnl7dS5jYWxsKHQsIlt0ZXN0IT0nJ106c2l6emxlIikscy5wdXNoKCIhPSIsSCl9Y2F0Y2go
+bil7fX0pLHM9bmV3IFJlZ0V4cChzLmpvaW4oInwiKSksbnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0
+aW9uKHQsbil7bj1uLnJlcGxhY2UociwiPSckMSddIik7aWYoIW8odCkmJiFzLnRlc3QobikmJiFp
+LnRlc3QobikpdHJ5e3ZhciBhPXUuY2FsbCh0LG4pO2lmKGF8fGV8fHQuZG9jdW1lbnQmJnQuZG9j
+dW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gYX1jYXRjaChmKXt9cmV0dXJuIG50KG4sbnVsbCxu
+dWxsLFt0XSkubGVuZ3RoPjB9KX0oKSxpLnBzZXVkb3MubnRoPWkucHNldWRvcy5lcSxpLmZpbHRl
+cnM9bXQucHJvdG90eXBlPWkucHNldWRvcyxpLnNldEZpbHRlcnM9bmV3IG10LG50LmF0dHI9di5h
+dHRyLHYuZmluZD1udCx2LmV4cHI9bnQuc2VsZWN0b3JzLHYuZXhwclsiOiJdPXYuZXhwci5wc2V1
+ZG9zLHYudW5pcXVlPW50LnVuaXF1ZVNvcnQsdi50ZXh0PW50LmdldFRleHQsdi5pc1hNTERvYz1u
+dC5pc1hNTCx2LmNvbnRhaW5zPW50LmNvbnRhaW5zfShlKTt2YXIgbnQ9L1VudGlsJC8scnQ9L14o
+PzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8saXQ9L14uW146I1xbXC4sXSokLyxzdD12LmV4
+cHIubWF0Y2gubmVlZHNDb250ZXh0LG90PXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEw
+LHByZXY6ITB9O3YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLHMsbyx1
+PXRoaXM7aWYodHlwZW9mIGUhPSJzdHJpbmciKXJldHVybiB2KGUpLmZpbHRlcihmdW5jdGlvbigp
+e2Zvcih0PTAsbj11Lmxlbmd0aDt0PG47dCsrKWlmKHYuY29udGFpbnModVt0XSx0aGlzKSlyZXR1
+cm4hMH0pO289dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGUpO2Zvcih0PTAsbj10aGlzLmxlbmd0
+aDt0PG47dCsrKXtyPW8ubGVuZ3RoLHYuZmluZChlLHRoaXNbdF0sbyk7aWYodD4wKWZvcihpPXI7
+aTxvLmxlbmd0aDtpKyspZm9yKHM9MDtzPHI7cysrKWlmKG9bc109PT1vW2ldKXtvLnNwbGljZShp
+LS0sMSk7YnJlYWt9fXJldHVybiBvfSxoYXM6ZnVuY3Rpb24oZSl7dmFyIHQsbj12KGUsdGhpcyks
+cj1uLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0Kysp
+aWYodi5jb250YWlucyh0aGlzLG5bdF0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1
+cm4gdGhpcy5wdXNoU3RhY2soZnQodGhpcyxlLCExKSwibm90IixlKX0sZmlsdGVyOmZ1bmN0aW9u
+KGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGUsITApLCJmaWx0ZXIiLGUpfSxpczpm
+dW5jdGlvbihlKXtyZXR1cm4hIWUmJih0eXBlb2YgZT09InN0cmluZyI/c3QudGVzdChlKT92KGUs
+dGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDp2LmZpbHRlcihlLHRoaXMpLmxlbmd0aD4w
+OnRoaXMuZmlsdGVyKGUpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9
+MCxpPXRoaXMubGVuZ3RoLHM9W10sbz1zdC50ZXN0KGUpfHx0eXBlb2YgZSE9InN0cmluZyI/dihl
+LHR8fHRoaXMuY29udGV4dCk6MDtmb3IoO3I8aTtyKyspe249dGhpc1tyXTt3aGlsZShuJiZuLm93
+bmVyRG9jdW1lbnQmJm4hPT10JiZuLm5vZGVUeXBlIT09MTEpe2lmKG8/by5pbmRleChuKT4tMTp2
+LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpe3MucHVzaChuKTticmVha31uPW4ucGFyZW50Tm9k
+ZX19cmV0dXJuIHM9cy5sZW5ndGg+MT92LnVuaXF1ZShzKTpzLHRoaXMucHVzaFN0YWNrKHMsImNs
+b3Nlc3QiLGUpfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT90eXBlb2YgZT09InN0cmluZyI/
+di5pbkFycmF5KHRoaXNbMF0sdihlKSk6di5pbkFycmF5KGUuanF1ZXJ5P2VbMF06ZSx0aGlzKTp0
+aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6
+ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZT09InN0cmluZyI/dihlLHQpOnYubWFrZUFycmF5
+KGUmJmUubm9kZVR5cGU/W2VdOmUpLHI9di5tZXJnZSh0aGlzLmdldCgpLG4pO3JldHVybiB0aGlz
+LnB1c2hTdGFjayh1dChuWzBdKXx8dXQoclswXSk/cjp2LnVuaXF1ZShyKSl9LGFkZEJhY2s6ZnVu
+Y3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKGU9PW51bGw/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJl
+dk9iamVjdC5maWx0ZXIoZSkpfX0pLHYuZm4uYW5kU2VsZj12LmZuLmFkZEJhY2ssdi5lYWNoKHtw
+YXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0Lm5vZGVUeXBl
+IT09MTE/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB2LmRpcihlLCJwYXJlbnRO
+b2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuZGlyKGUsInBhcmVu
+dE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBhdChlLCJuZXh0U2libGluZyIpfSxw
+cmV2OmZ1bmN0aW9uKGUpe3JldHVybiBhdChlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpm
+dW5jdGlvbihlKXtyZXR1cm4gdi5kaXIoZSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlv
+bihlKXtyZXR1cm4gdi5kaXIoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlv
+bihlLHQsbil7cmV0dXJuIHYuZGlyKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0
+aW9uKGUsdCxuKXtyZXR1cm4gdi5kaXIoZSwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6
+ZnVuY3Rpb24oZSl7cmV0dXJuIHYuc2libGluZygoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGls
+ZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIHYuc2libGluZyhlLmZpcnN0Q2hpbGQp
+fSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gdi5ub2RlTmFtZShlLCJpZnJhbWUiKT9lLmNv
+bnRlbnREb2N1bWVudHx8ZS5jb250ZW50V2luZG93LmRvY3VtZW50OnYubWVyZ2UoW10sZS5jaGls
+ZE5vZGVzKX19LGZ1bmN0aW9uKGUsdCl7di5mbltlXT1mdW5jdGlvbihuLHIpe3ZhciBpPXYubWFw
+KHRoaXMsdCxuKTtyZXR1cm4gbnQudGVzdChlKXx8KHI9biksciYmdHlwZW9mIHI9PSJzdHJpbmci
+JiYoaT12LmZpbHRlcihyLGkpKSxpPXRoaXMubGVuZ3RoPjEmJiFvdFtlXT92LnVuaXF1ZShpKTpp
+LHRoaXMubGVuZ3RoPjEmJnJ0LnRlc3QoZSkmJihpPWkucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFj
+ayhpLGUsbC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSx2LmV4dGVuZCh7ZmlsdGVyOmZ1
+bmN0aW9uKGUsdCxuKXtyZXR1cm4gbiYmKGU9Ijpub3QoIitlKyIpIiksdC5sZW5ndGg9PT0xP3Yu
+ZmluZC5tYXRjaGVzU2VsZWN0b3IodFswXSxlKT9bdFswXV06W106di5maW5kLm1hdGNoZXMoZSx0
+KX0sZGlyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1bXSxzPWVbbl07d2hpbGUocyYmcy5ub2RlVHlw
+ZSE9PTkmJihyPT09dHx8cy5ub2RlVHlwZSE9PTF8fCF2KHMpLmlzKHIpKSlzLm5vZGVUeXBlPT09
+MSYmaS5wdXNoKHMpLHM9c1tuXTtyZXR1cm4gaX0sc2libGluZzpmdW5jdGlvbihlLHQpe3ZhciBu
+PVtdO2Zvcig7ZTtlPWUubmV4dFNpYmxpbmcpZS5ub2RlVHlwZT09PTEmJmUhPT10JiZuLnB1c2go
+ZSk7cmV0dXJuIG59fSk7dmFyIGN0PSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZh
+c3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxo
+Z3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1l
+fHZpZGVvIixodD0vIGpRdWVyeVxkKz0iKD86bnVsbHxcZCspIi9nLHB0PS9eXHMrLyxkdD0vPCg/
+IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSsp
+W14+XSopXC8+L2dpLHZ0PS88KFtcdzpdKykvLG10PS88dGJvZHkvaSxndD0vPHwmIz9cdys7Lyx5
+dD0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLGJ0PS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxv
+cHRpb258c3R5bGUpL2ksd3Q9bmV3IFJlZ0V4cCgiPCg/OiIrY3QrIilbXFxzLz5dIiwiaSIpLEV0
+PS9eKD86Y2hlY2tib3h8cmFkaW8pJC8sU3Q9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tl
+ZC4pL2kseHQ9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxUdD0vXlxzKjwhKD86XFtDREFUQVxbfFwt
+XC0pfFtcXVwtXXsyfT5ccyokL2csTnQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVs
+dGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+
+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIs
+IjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Ri
+b2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIs
+IjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0
+OlswLCIiLCIiXX0sQ3Q9bHQoaSksa3Q9Q3QuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJk
+aXYiKSk7TnQub3B0Z3JvdXA9TnQub3B0aW9uLE50LnRib2R5PU50LnRmb290PU50LmNvbGdyb3Vw
+PU50LmNhcHRpb249TnQudGhlYWQsTnQudGg9TnQudGQsdi5zdXBwb3J0Lmh0bWxTZXJpYWxpemV8
+fChOdC5fZGVmYXVsdD1bMSwiWDxkaXY+IiwiPC9kaXY+Il0pLHYuZm4uZXh0ZW5kKHt0ZXh0OmZ1
+bmN0aW9uKGUpe3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD92
+LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRv
+Y3VtZW50fHxpKS5jcmVhdGVUZXh0Tm9kZShlKSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0s
+d3JhcEFsbDpmdW5jdGlvbihlKXtpZih2LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChm
+dW5jdGlvbih0KXt2KHRoaXMpLndyYXBBbGwoZS5jYWxsKHRoaXMsdCkpfSk7aWYodGhpc1swXSl7
+dmFyIHQ9dihlLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApO3RoaXNbMF0u
+cGFyZW50Tm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpc1swXSksdC5tYXAoZnVuY3Rpb24oKXt2YXIg
+ZT10aGlzO3doaWxlKGUuZmlyc3RDaGlsZCYmZS5maXJzdENoaWxkLm5vZGVUeXBlPT09MSllPWUu
+Zmlyc3RDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVy
+OmZ1bmN0aW9uKGUpe3JldHVybiB2LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQp
+e3YodGhpcykud3JhcElubmVyKGUuY2FsbCh0aGlzLHQpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigp
+e3ZhciB0PXYodGhpcyksbj10LmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKGUpOnQuYXBw
+ZW5kKGUpfSl9LHdyYXA6ZnVuY3Rpb24oZSl7dmFyIHQ9di5pc0Z1bmN0aW9uKGUpO3JldHVybiB0
+aGlzLmVhY2goZnVuY3Rpb24obil7dih0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9
+KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigp
+e3Yubm9kZU5hbWUodGhpcywiYm9keSIpfHx2KHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGRO
+b2Rlcyl9KS5lbmQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJn
+dW1lbnRzLCEwLGZ1bmN0aW9uKGUpeyh0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09
+PTExKSYmdGhpcy5hcHBlbmRDaGlsZChlKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRo
+aXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGUpeyh0aGlzLm5vZGVUeXBlPT09MXx8
+dGhpcy5ub2RlVHlwZT09PTExKSYmdGhpcy5pbnNlcnRCZWZvcmUoZSx0aGlzLmZpcnN0Q2hpbGQp
+fSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKCF1dCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5p
+cChhcmd1bWVudHMsITEsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShl
+LHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9di5jbGVhbihhcmd1bWVudHMpO3Jl
+dHVybiB0aGlzLnB1c2hTdGFjayh2Lm1lcmdlKGUsdGhpcyksImJlZm9yZSIsdGhpcy5zZWxlY3Rv
+cil9fSxhZnRlcjpmdW5jdGlvbigpe2lmKCF1dCh0aGlzWzBdKSlyZXR1cm4gdGhpcy5kb21NYW5p
+cChhcmd1bWVudHMsITEsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShl
+LHRoaXMubmV4dFNpYmxpbmcpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGU9di5jbGVhbihh
+cmd1bWVudHMpO3JldHVybiB0aGlzLnB1c2hTdGFjayh2Lm1lcmdlKHRoaXMsZSksImFmdGVyIix0
+aGlzLnNlbGVjdG9yKX19LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtmb3IoOyhuPXRo
+aXNbcl0pIT1udWxsO3IrKylpZighZXx8di5maWx0ZXIoZSxbbl0pLmxlbmd0aCkhdCYmbi5ub2Rl
+VHlwZT09PTEmJih2LmNsZWFuRGF0YShuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLHYuY2xl
+YW5EYXRhKFtuXSkpLG4ucGFyZW50Tm9kZSYmbi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pO3Jl
+dHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe3ZhciBlLHQ9MDtmb3IoOyhlPXRoaXNbdF0pIT1u
+dWxsO3QrKyl7ZS5ub2RlVHlwZT09PTEmJnYuY2xlYW5EYXRhKGUuZ2V0RWxlbWVudHNCeVRhZ05h
+bWUoIioiKSk7d2hpbGUoZS5maXJzdENoaWxkKWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKX1y
+ZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPT1udWxsPyExOmUsdD10
+PT1udWxsP2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB2LmNsb25lKHRoaXMsZSx0KX0p
+fSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciBu
+PXRoaXNbMF18fHt9LHI9MCxpPXRoaXMubGVuZ3RoO2lmKGU9PT10KXJldHVybiBuLm5vZGVUeXBl
+PT09MT9uLmlubmVySFRNTC5yZXBsYWNlKGh0LCIiKTp0O2lmKHR5cGVvZiBlPT0ic3RyaW5nIiYm
+IXl0LnRlc3QoZSkmJih2LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8IXd0LnRlc3QoZSkpJiYodi5z
+dXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlfHwhcHQudGVzdChlKSkmJiFOdFsodnQuZXhlYyhlKXx8
+WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9ZS5yZXBsYWNlKGR0LCI8JDE+PC8kMj4iKTt0
+cnl7Zm9yKDtyPGk7cisrKW49dGhpc1tyXXx8e30sbi5ub2RlVHlwZT09PTEmJih2LmNsZWFuRGF0
+YShuLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLG4uaW5uZXJIVE1MPWUpO249MH1jYXRjaChz
+KXt9fW4mJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0s
+cmVwbGFjZVdpdGg6ZnVuY3Rpb24oZSl7cmV0dXJuIHV0KHRoaXNbMF0pP3RoaXMubGVuZ3RoP3Ro
+aXMucHVzaFN0YWNrKHYodi5pc0Z1bmN0aW9uKGUpP2UoKTplKSwicmVwbGFjZVdpdGgiLGUpOnRo
+aXM6di5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXt2YXIgbj12KHRoaXMpLHI9
+bi5odG1sKCk7bi5yZXBsYWNlV2l0aChlLmNhbGwodGhpcyx0LHIpKX0pOih0eXBlb2YgZSE9InN0
+cmluZyImJihlPXYoZSkuZGV0YWNoKCkpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXMu
+bmV4dFNpYmxpbmcsbj10aGlzLnBhcmVudE5vZGU7dih0aGlzKS5yZW1vdmUoKSx0P3YodCkuYmVm
+b3JlKGUpOnYobikuYXBwZW5kKGUpfSkpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMu
+cmVtb3ZlKGUsITApfSxkb21NYW5pcDpmdW5jdGlvbihlLG4scil7ZT1bXS5jb25jYXQuYXBwbHko
+W10sZSk7dmFyIGkscyxvLHUsYT0wLGY9ZVswXSxsPVtdLGM9dGhpcy5sZW5ndGg7aWYoIXYuc3Vw
+cG9ydC5jaGVja0Nsb25lJiZjPjEmJnR5cGVvZiBmPT0ic3RyaW5nIiYmU3QudGVzdChmKSlyZXR1
+cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dih0aGlzKS5kb21NYW5pcChlLG4scil9KTtpZih2Lmlz
+RnVuY3Rpb24oZikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXt2YXIgcz12KHRoaXMpO2Vb
+MF09Zi5jYWxsKHRoaXMsaSxuP3MuaHRtbCgpOnQpLHMuZG9tTWFuaXAoZSxuLHIpfSk7aWYodGhp
+c1swXSl7aT12LmJ1aWxkRnJhZ21lbnQoZSx0aGlzLGwpLG89aS5mcmFnbWVudCxzPW8uZmlyc3RD
+aGlsZCxvLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmKG89cyk7aWYocyl7bj1uJiZ2Lm5vZGVOYW1l
+KHMsInRyIik7Zm9yKHU9aS5jYWNoZWFibGV8fGMtMTthPGM7YSsrKXIuY2FsbChuJiZ2Lm5vZGVO
+YW1lKHRoaXNbYV0sInRhYmxlIik/THQodGhpc1thXSwidGJvZHkiKTp0aGlzW2FdLGE9PT11P286
+di5jbG9uZShvLCEwLCEwKSl9bz1zPW51bGwsbC5sZW5ndGgmJnYuZWFjaChsLGZ1bmN0aW9uKGUs
+dCl7dC5zcmM/di5hamF4P3YuYWpheCh7dXJsOnQuc3JjLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNj
+cmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSk6di5lcnJvcigibm8gYWpheCIp
+OnYuZ2xvYmFsRXZhbCgodC50ZXh0fHx0LnRleHRDb250ZW50fHx0LmlubmVySFRNTHx8IiIpLnJl
+cGxhY2UoVHQsIiIpKSx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX0p
+fXJldHVybiB0aGlzfX0pLHYuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihlLG4scil7dmFyIHMsbyx1
+LGE9ZVswXTtyZXR1cm4gbj1ufHxpLG49IW4ubm9kZVR5cGUmJm5bMF18fG4sbj1uLm93bmVyRG9j
+dW1lbnR8fG4sZS5sZW5ndGg9PT0xJiZ0eXBlb2YgYT09InN0cmluZyImJmEubGVuZ3RoPDUxMiYm
+bj09PWkmJmEuY2hhckF0KDApPT09IjwiJiYhYnQudGVzdChhKSYmKHYuc3VwcG9ydC5jaGVja0Ns
+b25lfHwhU3QudGVzdChhKSkmJih2LnN1cHBvcnQuaHRtbDVDbG9uZXx8IXd0LnRlc3QoYSkpJiYo
+bz0hMCxzPXYuZnJhZ21lbnRzW2FdLHU9cyE9PXQpLHN8fChzPW4uY3JlYXRlRG9jdW1lbnRGcmFn
+bWVudCgpLHYuY2xlYW4oZSxuLHMsciksbyYmKHYuZnJhZ21lbnRzW2FdPXUmJnMpKSx7ZnJhZ21l
+bnQ6cyxjYWNoZWFibGU6b319LHYuZnJhZ21lbnRzPXt9LHYuZWFjaCh7YXBwZW5kVG86ImFwcGVu
+ZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6
+ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsdCl7di5mbltlXT1m
+dW5jdGlvbihuKXt2YXIgcixpPTAscz1bXSxvPXYobiksdT1vLmxlbmd0aCxhPXRoaXMubGVuZ3Ro
+PT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKChhPT1udWxsfHxhJiZhLm5vZGVUeXBlPT09MTEm
+JmEuY2hpbGROb2Rlcy5sZW5ndGg9PT0xKSYmdT09PTEpcmV0dXJuIG9bdF0odGhpc1swXSksdGhp
+cztmb3IoO2k8dTtpKyspcj0oaT4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpLHYob1tpXSlb
+dF0ocikscz1zLmNvbmNhdChyKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socyxlLG8uc2VsZWN0b3Ip
+fX0pLHYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxzLG87di5zdXBwb3J0
+Lmh0bWw1Q2xvbmV8fHYuaXNYTUxEb2MoZSl8fCF3dC50ZXN0KCI8IitlLm5vZGVOYW1lKyI+Iik/
+bz1lLmNsb25lTm9kZSghMCk6KGt0LmlubmVySFRNTD1lLm91dGVySFRNTCxrdC5yZW1vdmVDaGls
+ZChvPWt0LmZpcnN0Q2hpbGQpKTtpZigoIXYuc3VwcG9ydC5ub0Nsb25lRXZlbnR8fCF2LnN1cHBv
+cnQubm9DbG9uZUNoZWNrZWQpJiYoZS5ub2RlVHlwZT09PTF8fGUubm9kZVR5cGU9PT0xMSkmJiF2
+LmlzWE1MRG9jKGUpKXtPdChlLG8pLHI9TXQoZSksaT1NdChvKTtmb3Iocz0wO3Jbc107KytzKWlb
+c10mJk90KHJbc10saVtzXSl9aWYodCl7QXQoZSxvKTtpZihuKXtyPU10KGUpLGk9TXQobyk7Zm9y
+KHM9MDtyW3NdOysrcylBdChyW3NdLGlbc10pfX1yZXR1cm4gcj1pPW51bGwsb30sY2xlYW46ZnVu
+Y3Rpb24oZSx0LG4scil7dmFyIHMsbyx1LGEsZixsLGMsaCxwLGQsbSxnLHk9dD09PWkmJkN0LGI9
+W107aWYoIXR8fHR5cGVvZiB0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9PSJ1bmRlZmluZWQiKXQ9
+aTtmb3Iocz0wOyh1PWVbc10pIT1udWxsO3MrKyl7dHlwZW9mIHU9PSJudW1iZXIiJiYodSs9IiIp
+O2lmKCF1KWNvbnRpbnVlO2lmKHR5cGVvZiB1PT0ic3RyaW5nIilpZighZ3QudGVzdCh1KSl1PXQu
+Y3JlYXRlVGV4dE5vZGUodSk7ZWxzZXt5PXl8fGx0KHQpLGM9dC5jcmVhdGVFbGVtZW50KCJkaXYi
+KSx5LmFwcGVuZENoaWxkKGMpLHU9dS5yZXBsYWNlKGR0LCI8JDE+PC8kMj4iKSxhPSh2dC5leGVj
+KHUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGY9TnRbYV18fE50Ll9kZWZhdWx0LGw9Zlsw
+XSxjLmlubmVySFRNTD1mWzFdK3UrZlsyXTt3aGlsZShsLS0pYz1jLmxhc3RDaGlsZDtpZighdi5z
+dXBwb3J0LnRib2R5KXtoPW10LnRlc3QodSkscD1hPT09InRhYmxlIiYmIWg/Yy5maXJzdENoaWxk
+JiZjLmZpcnN0Q2hpbGQuY2hpbGROb2RlczpmWzFdPT09Ijx0YWJsZT4iJiYhaD9jLmNoaWxkTm9k
+ZXM6W107Zm9yKG89cC5sZW5ndGgtMTtvPj0wOy0tbyl2Lm5vZGVOYW1lKHBbb10sInRib2R5Iikm
+JiFwW29dLmNoaWxkTm9kZXMubGVuZ3RoJiZwW29dLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocFtv
+XSl9IXYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmcHQudGVzdCh1KSYmYy5pbnNlcnRCZWZv
+cmUodC5jcmVhdGVUZXh0Tm9kZShwdC5leGVjKHUpWzBdKSxjLmZpcnN0Q2hpbGQpLHU9Yy5jaGls
+ZE5vZGVzLGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX11Lm5vZGVUeXBlP2IucHVzaCh1KTp2
+Lm1lcmdlKGIsdSl9YyYmKHU9Yz15PW51bGwpO2lmKCF2LnN1cHBvcnQuYXBwZW5kQ2hlY2tlZClm
+b3Iocz0wOyh1PWJbc10pIT1udWxsO3MrKyl2Lm5vZGVOYW1lKHUsImlucHV0Iik/X3QodSk6dHlw
+ZW9mIHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZ2LmdyZXAodS5nZXRFbGVt
+ZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxfdCk7aWYobil7bT1mdW5jdGlvbihlKXtpZighZS50eXBl
+fHx4dC50ZXN0KGUudHlwZSkpcmV0dXJuIHI/ci5wdXNoKGUucGFyZW50Tm9kZT9lLnBhcmVudE5v
+ZGUucmVtb3ZlQ2hpbGQoZSk6ZSk6bi5hcHBlbmRDaGlsZChlKX07Zm9yKHM9MDsodT1iW3NdKSE9
+bnVsbDtzKyspaWYoIXYubm9kZU5hbWUodSwic2NyaXB0Iil8fCFtKHUpKW4uYXBwZW5kQ2hpbGQo
+dSksdHlwZW9mIHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiYoZz12LmdyZXAo
+di5tZXJnZShbXSx1LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSksbSksYi5zcGxpY2Uu
+YXBwbHkoYixbcysxLDBdLmNvbmNhdChnKSkscys9Zy5sZW5ndGgpfXJldHVybiBifSxjbGVhbkRh
+dGE6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGkscyxvPTAsdT12LmV4cGFuZG8sYT12LmNhY2hlLGY9
+di5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8sbD12LmV2ZW50LnNwZWNpYWw7Zm9yKDsoaT1lW29dKSE9
+bnVsbDtvKyspaWYodHx8di5hY2NlcHREYXRhKGkpKXtyPWlbdV0sbj1yJiZhW3JdO2lmKG4pe2lm
+KG4uZXZlbnRzKWZvcihzIGluIG4uZXZlbnRzKWxbc10/di5ldmVudC5yZW1vdmUoaSxzKTp2LnJl
+bW92ZUV2ZW50KGkscyxuLmhhbmRsZSk7YVtyXSYmKGRlbGV0ZSBhW3JdLGY/ZGVsZXRlIGlbdV06
+aS5yZW1vdmVBdHRyaWJ1dGU/aS5yZW1vdmVBdHRyaWJ1dGUodSk6aVt1XT1udWxsLHYuZGVsZXRl
+ZElkcy5wdXNoKHIpKX19fX0pLGZ1bmN0aW9uKCl7dmFyIGUsdDt2LnVhTWF0Y2g9ZnVuY3Rpb24o
+ZSl7ZT1lLnRvTG93ZXJDYXNlKCk7dmFyIHQ9LyhjaHJvbWUpWyBcL10oW1x3Ll0rKS8uZXhlYyhl
+KXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8LyhvcGVyYSkoPzouKnZlcnNpb258
+KVsgXC9dKFtcdy5dKykvLmV4ZWMoZSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoZSl8fGUuaW5k
+ZXhPZigiY29tcGF0aWJsZSIpPDAmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhl
+YyhlKXx8W107cmV0dXJue2Jyb3dzZXI6dFsxXXx8IiIsdmVyc2lvbjp0WzJdfHwiMCJ9fSxlPXYu
+dWFNYXRjaChvLnVzZXJBZ2VudCksdD17fSxlLmJyb3dzZXImJih0W2UuYnJvd3Nlcl09ITAsdC52
+ZXJzaW9uPWUudmVyc2lvbiksdC5jaHJvbWU/dC53ZWJraXQ9ITA6dC53ZWJraXQmJih0LnNhZmFy
+aT0hMCksdi5icm93c2VyPXQsdi5zdWI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7cmV0dXJu
+IG5ldyBlLmZuLmluaXQodCxuKX12LmV4dGVuZCghMCxlLHRoaXMpLGUuc3VwZXJjbGFzcz10aGlz
+LGUuZm49ZS5wcm90b3R5cGU9dGhpcygpLGUuZm4uY29uc3RydWN0b3I9ZSxlLnN1Yj10aGlzLnN1
+YixlLmZuLmluaXQ9ZnVuY3Rpb24ocixpKXtyZXR1cm4gaSYmaSBpbnN0YW5jZW9mIHYmJiEoaSBp
+bnN0YW5jZW9mIGUpJiYoaT1lKGkpKSx2LmZuLmluaXQuY2FsbCh0aGlzLHIsaSx0KX0sZS5mbi5p
+bml0LnByb3RvdHlwZT1lLmZuO3ZhciB0PWUoaSk7cmV0dXJuIGV9fSgpO3ZhciBEdCxQdCxIdCxC
+dD0vYWxwaGFcKFteKV0qXCkvaSxqdD0vb3BhY2l0eT0oW14pXSopLyxGdD0vXih0b3B8cmlnaHR8
+Ym90dG9tfGxlZnQpJC8sSXQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLHF0PS9ebWFyZ2lu
+LyxSdD1uZXcgUmVnRXhwKCJeKCIrbSsiKSguKikkIiwiaSIpLFV0PW5ldyBSZWdFeHAoIl4oIitt
+KyIpKD8hcHgpW2EteiVdKyQiLCJpIiksenQ9bmV3IFJlZ0V4cCgiXihbLStdKT0oIittKyIpIiwi
+aSIpLFd0PXtCT0RZOiJibG9jayJ9LFh0PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6
+ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxWdD17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6
+NDAwfSwkdD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLEp0PVsiV2Via2l0IiwiTyIs
+Ik1veiIsIm1zIl0sS3Q9di5mbi50b2dnbGU7di5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLG4p
+e3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gciE9PXQ/di5zdHls
+ZShlLG4scik6di5jc3MoZSxuKX0sZSxuLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rp
+b24oKXtyZXR1cm4gWXQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gWXQodGhpcyl9
+LHRvZ2dsZTpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlPT0iYm9vbGVhbiI7cmV0dXJuIHYu
+aXNGdW5jdGlvbihlKSYmdi5pc0Z1bmN0aW9uKHQpP0t0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0
+aGlzLmVhY2goZnVuY3Rpb24oKXsobj9lOkd0KHRoaXMpKT92KHRoaXMpLnNob3coKTp2KHRoaXMp
+LmhpZGUoKX0pfX0pLHYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGUs
+dCl7aWYodCl7dmFyIG49RHQoZSwib3BhY2l0eSIpO3JldHVybiBuPT09IiI/IjEiOm59fX19LGNz
+c051bWJlcjp7ZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNp
+dHk6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsi
+ZmxvYXQiOnYuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6
+ZnVuY3Rpb24oZSxuLHIsaSl7aWYoIWV8fGUubm9kZVR5cGU9PT0zfHxlLm5vZGVUeXBlPT09OHx8
+IWUuc3R5bGUpcmV0dXJuO3ZhciBzLG8sdSxhPXYuY2FtZWxDYXNlKG4pLGY9ZS5zdHlsZTtuPXYu
+Y3NzUHJvcHNbYV18fCh2LmNzc1Byb3BzW2FdPVF0KGYsYSkpLHU9di5jc3NIb29rc1tuXXx8di5j
+c3NIb29rc1thXTtpZihyPT09dClyZXR1cm4gdSYmImdldCJpbiB1JiYocz11LmdldChlLCExLGkp
+KSE9PXQ/czpmW25dO289dHlwZW9mIHIsbz09PSJzdHJpbmciJiYocz16dC5leGVjKHIpKSYmKHI9
+KHNbMV0rMSkqc1syXStwYXJzZUZsb2F0KHYuY3NzKGUsbikpLG89Im51bWJlciIpO2lmKHI9PW51
+bGx8fG89PT0ibnVtYmVyIiYmaXNOYU4ocikpcmV0dXJuO289PT0ibnVtYmVyIiYmIXYuY3NzTnVt
+YmVyW2FdJiYocis9InB4Iik7aWYoIXV8fCEoInNldCJpbiB1KXx8KHI9dS5zZXQoZSxyLGkpKSE9
+PXQpdHJ5e2Zbbl09cn1jYXRjaChsKXt9fSxjc3M6ZnVuY3Rpb24oZSxuLHIsaSl7dmFyIHMsbyx1
+LGE9di5jYW1lbENhc2Uobik7cmV0dXJuIG49di5jc3NQcm9wc1thXXx8KHYuY3NzUHJvcHNbYV09
+UXQoZS5zdHlsZSxhKSksdT12LmNzc0hvb2tzW25dfHx2LmNzc0hvb2tzW2FdLHUmJiJnZXQiaW4g
+dSYmKHM9dS5nZXQoZSwhMCxpKSkscz09PXQmJihzPUR0KGUsbikpLHM9PT0ibm9ybWFsIiYmbiBp
+biBWdCYmKHM9VnRbbl0pLHJ8fGkhPT10PyhvPXBhcnNlRmxvYXQocykscnx8di5pc051bWVyaWMo
+byk/b3x8MDpzKTpzfSxzd2FwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLHM9e307Zm9yKGkgaW4g
+dClzW2ldPWUuc3R5bGVbaV0sZS5zdHlsZVtpXT10W2ldO3I9bi5jYWxsKGUpO2ZvcihpIGluIHQp
+ZS5zdHlsZVtpXT1zW2ldO3JldHVybiByfX0pLGUuZ2V0Q29tcHV0ZWRTdHlsZT9EdD1mdW5jdGlv
+bih0LG4pe3ZhciByLGkscyxvLHU9ZS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCksYT10LnN0eWxl
+O3JldHVybiB1JiYocj11LmdldFByb3BlcnR5VmFsdWUobil8fHVbbl0scj09PSIiJiYhdi5jb250
+YWlucyh0Lm93bmVyRG9jdW1lbnQsdCkmJihyPXYuc3R5bGUodCxuKSksVXQudGVzdChyKSYmcXQu
+dGVzdChuKSYmKGk9YS53aWR0aCxzPWEubWluV2lkdGgsbz1hLm1heFdpZHRoLGEubWluV2lkdGg9
+YS5tYXhXaWR0aD1hLndpZHRoPXIscj11LndpZHRoLGEud2lkdGg9aSxhLm1pbldpZHRoPXMsYS5t
+YXhXaWR0aD1vKSkscn06aS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoRHQ9ZnVuY3Rp
+b24oZSx0KXt2YXIgbixyLGk9ZS5jdXJyZW50U3R5bGUmJmUuY3VycmVudFN0eWxlW3RdLHM9ZS5z
+dHlsZTtyZXR1cm4gaT09bnVsbCYmcyYmc1t0XSYmKGk9c1t0XSksVXQudGVzdChpKSYmIUZ0LnRl
+c3QodCkmJihuPXMubGVmdCxyPWUucnVudGltZVN0eWxlJiZlLnJ1bnRpbWVTdHlsZS5sZWZ0LHIm
+JihlLnJ1bnRpbWVTdHlsZS5sZWZ0PWUuY3VycmVudFN0eWxlLmxlZnQpLHMubGVmdD10PT09ImZv
+bnRTaXplIj8iMWVtIjppLGk9cy5waXhlbExlZnQrInB4IixzLmxlZnQ9bixyJiYoZS5ydW50aW1l
+U3R5bGUubGVmdD1yKSksaT09PSIiPyJhdXRvIjppfSksdi5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgi
+XSxmdW5jdGlvbihlLHQpe3YuY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7aWYobily
+ZXR1cm4gZS5vZmZzZXRXaWR0aD09PTAmJkl0LnRlc3QoRHQoZSwiZGlzcGxheSIpKT92LnN3YXAo
+ZSxYdCxmdW5jdGlvbigpe3JldHVybiB0bihlLHQscil9KTp0bihlLHQscil9LHNldDpmdW5jdGlv
+bihlLG4scil7cmV0dXJuIFp0KGUsbixyP2VuKGUsdCxyLHYuc3VwcG9ydC5ib3hTaXppbmcmJnYu
+Y3NzKGUsImJveFNpemluZyIpPT09ImJvcmRlci1ib3giKTowKX19fSksdi5zdXBwb3J0Lm9wYWNp
+dHl8fCh2LmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihlLHQpe3JldHVybiBqdC50ZXN0
+KCh0JiZlLmN1cnJlbnRTdHlsZT9lLmN1cnJlbnRTdHlsZS5maWx0ZXI6ZS5zdHlsZS5maWx0ZXIp
+fHwiIik/LjAxKnBhcnNlRmxvYXQoUmVnRXhwLiQxKSsiIjp0PyIxIjoiIn0sc2V0OmZ1bmN0aW9u
+KGUsdCl7dmFyIG49ZS5zdHlsZSxyPWUuY3VycmVudFN0eWxlLGk9di5pc051bWVyaWModCk/ImFs
+cGhhKG9wYWNpdHk9Iit0KjEwMCsiKSI6IiIscz1yJiZyLmZpbHRlcnx8bi5maWx0ZXJ8fCIiO24u
+em9vbT0xO2lmKHQ+PTEmJnYudHJpbShzLnJlcGxhY2UoQnQsIiIpKT09PSIiJiZuLnJlbW92ZUF0
+dHJpYnV0ZSl7bi5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpO2lmKHImJiFyLmZpbHRlcilyZXR1
+cm59bi5maWx0ZXI9QnQudGVzdChzKT9zLnJlcGxhY2UoQnQsaSk6cysiICIraX19KSx2KGZ1bmN0
+aW9uKCl7di5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fCh2LmNzc0hvb2tzLm1hcmdpblJp
+Z2h0PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdi5zd2FwKGUse2Rpc3BsYXk6ImlubGluZS1i
+bG9jayJ9LGZ1bmN0aW9uKCl7aWYodClyZXR1cm4gRHQoZSwibWFyZ2luUmlnaHQiKX0pfX0pLCF2
+LnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmdi5mbi5wb3NpdGlvbiYmdi5lYWNoKFsidG9wIiwibGVm
+dCJdLGZ1bmN0aW9uKGUsdCl7di5jc3NIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUsbil7aWYobil7
+dmFyIHI9RHQoZSx0KTtyZXR1cm4gVXQudGVzdChyKT92KGUpLnBvc2l0aW9uKClbdF0rInB4Ijpy
+fX19fSl9KSx2LmV4cHImJnYuZXhwci5maWx0ZXJzJiYodi5leHByLmZpbHRlcnMuaGlkZGVuPWZ1
+bmN0aW9uKGUpe3JldHVybiBlLm9mZnNldFdpZHRoPT09MCYmZS5vZmZzZXRIZWlnaHQ9PT0wfHwh
+di5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmKGUuc3R5bGUmJmUuc3R5bGUuZGlzcGxh
+eXx8RHQoZSwiZGlzcGxheSIpKT09PSJub25lIn0sdi5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5j
+dGlvbihlKXtyZXR1cm4hdi5leHByLmZpbHRlcnMuaGlkZGVuKGUpfSksdi5lYWNoKHttYXJnaW46
+IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXt2LmNzc0hvb2tzW2Ur
+dF09e2V4cGFuZDpmdW5jdGlvbihuKXt2YXIgcixpPXR5cGVvZiBuPT0ic3RyaW5nIj9uLnNwbGl0
+KCIgIik6W25dLHM9e307Zm9yKHI9MDtyPDQ7cisrKXNbZSskdFtyXSt0XT1pW3JdfHxpW3ItMl18
+fGlbMF07cmV0dXJuIHN9fSxxdC50ZXN0KGUpfHwodi5jc3NIb29rc1tlK3RdLnNldD1adCl9KTt2
+YXIgcm49LyUyMC9nLHNuPS9cW1xdJC8sb249L1xyP1xuL2csdW49L14oPzpjb2xvcnxkYXRlfGRh
+dGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8
+cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGFuPS9eKD86c2VsZWN0fHRl
+eHRhcmVhKS9pO3YuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdi5wYXJh
+bSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVy
+biB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP3YubWFrZUFycmF5KHRo
+aXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYh
+dGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8YW4udGVzdCh0aGlzLm5vZGVOYW1lKXx8dW4u
+dGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPXYodGhpcykudmFsKCk7
+cmV0dXJuIG49PW51bGw/bnVsbDp2LmlzQXJyYXkobik/di5tYXAobixmdW5jdGlvbihlLG4pe3Jl
+dHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2Uob24sIlxyXG4iKX19KTp7bmFtZTp0Lm5h
+bWUsdmFsdWU6bi5yZXBsYWNlKG9uLCJcclxuIil9fSkuZ2V0KCl9fSksdi5wYXJhbT1mdW5jdGlv
+bihlLG4pe3ZhciByLGk9W10scz1mdW5jdGlvbihlLHQpe3Q9di5pc0Z1bmN0aW9uKHQpP3QoKTp0
+PT1udWxsPyIiOnQsaVtpLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVV
+UklDb21wb25lbnQodCl9O249PT10JiYobj12LmFqYXhTZXR0aW5ncyYmdi5hamF4U2V0dGluZ3Mu
+dHJhZGl0aW9uYWwpO2lmKHYuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF2LmlzUGxhaW5PYmplY3Qo
+ZSkpdi5lYWNoKGUsZnVuY3Rpb24oKXtzKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9y
+KHIgaW4gZSlmbihyLGVbcl0sbixzKTtyZXR1cm4gaS5qb2luKCImIikucmVwbGFjZShybiwiKyIp
+fTt2YXIgbG4sY24saG49LyMuKiQvLHBuPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcs
+ZG49L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lk
+Z2V0KTokLyx2bj0vXig/OkdFVHxIRUFEKSQvLG1uPS9eXC9cLy8sZ249L1w/Lyx5bj0vPHNjcmlw
+dFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxibj0vKFs/Jl0p
+Xz1bXiZdKi8sd249L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKXwp
+fCkvLEVuPXYuZm4ubG9hZCxTbj17fSx4bj17fSxUbj1bIiovIl0rWyIqIl07dHJ5e2NuPXMuaHJl
+Zn1jYXRjaChObil7Y249aS5jcmVhdGVFbGVtZW50KCJhIiksY24uaHJlZj0iIixjbj1jbi5ocmVm
+fWxuPXduLmV4ZWMoY24udG9Mb3dlckNhc2UoKSl8fFtdLHYuZm4ubG9hZD1mdW5jdGlvbihlLG4s
+cil7aWYodHlwZW9mIGUhPSJzdHJpbmciJiZFbilyZXR1cm4gRW4uYXBwbHkodGhpcyxhcmd1bWVu
+dHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgaSxzLG8sdT10aGlzLGE9ZS5pbmRl
+eE9mKCIgIik7cmV0dXJuIGE+PTAmJihpPWUuc2xpY2UoYSxlLmxlbmd0aCksZT1lLnNsaWNlKDAs
+YSkpLHYuaXNGdW5jdGlvbihuKT8ocj1uLG49dCk6biYmdHlwZW9mIG49PSJvYmplY3QiJiYocz0i
+UE9TVCIpLHYuYWpheCh7dXJsOmUsdHlwZTpzLGRhdGFUeXBlOiJodG1sIixkYXRhOm4sY29tcGxl
+dGU6ZnVuY3Rpb24oZSx0KXtyJiZ1LmVhY2gocixvfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9fSku
+ZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyx1Lmh0bWwoaT92KCI8ZGl2PiIpLmFwcGVuZChl
+LnJlcGxhY2UoeW4sIiIpKS5maW5kKGkpOmUpfSksdGhpc30sdi5lYWNoKCJhamF4U3RhcnQgYWph
+eFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQo
+IiAiKSxmdW5jdGlvbihlLHQpe3YuZm5bdF09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub24odCxl
+KX19KSx2LmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSxuKXt2W25dPWZ1bmN0aW9uKGUs
+cixpLHMpe3JldHVybiB2LmlzRnVuY3Rpb24ocikmJihzPXN8fGksaT1yLHI9dCksdi5hamF4KHt0
+eXBlOm4sdXJsOmUsZGF0YTpyLHN1Y2Nlc3M6aSxkYXRhVHlwZTpzfSl9fSksdi5leHRlbmQoe2dl
+dFNjcmlwdDpmdW5jdGlvbihlLG4pe3JldHVybiB2LmdldChlLHQsbiwic2NyaXB0Iil9LGdldEpT
+T046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2LmdldChlLHQsbiwianNvbiIpfSxhamF4U2V0dXA6
+ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9MbihlLHYuYWpheFNldHRpbmdzKToodD1lLGU9di5hamF4
+U2V0dGluZ3MpLExuKGUsdCksZX0sYWpheFNldHRpbmdzOnt1cmw6Y24saXNMb2NhbDpkbi50ZXN0
+KGxuWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13
+d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04Iixwcm9jZXNzRGF0YTohMCxhc3luYzoh
+MCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRt
+bCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2Ny
+aXB0IiwiKiI6VG59LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99
+LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxj
+b252ZXJ0ZXJzOnsiKiB0ZXh0IjplLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjp2
+LnBhcnNlSlNPTiwidGV4dCB4bWwiOnYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEw
+LHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Q24oU24pLGFqYXhUcmFuc3BvcnQ6Q24oeG4pLGFqYXg6
+ZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBUKGUsbixzLGEpe3ZhciBsLHksYix3LFMsVD1uO2lmKEU9
+PT0yKXJldHVybjtFPTIsdSYmY2xlYXJUaW1lb3V0KHUpLG89dCxpPWF8fCIiLHgucmVhZHlTdGF0
+ZT1lPjA/NDowLHMmJih3PUFuKGMseCxzKSk7aWYoZT49MjAwJiZlPDMwMHx8ZT09PTMwNCljLmlm
+TW9kaWZpZWQmJihTPXguZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxTJiYodi5s
+YXN0TW9kaWZpZWRbcl09UyksUz14LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIiksUyYmKHYuZXRh
+Z1tyXT1TKSksZT09PTMwND8oVD0ibm90bW9kaWZpZWQiLGw9ITApOihsPU9uKGMsdyksVD1sLnN0
+YXRlLHk9bC5kYXRhLGI9bC5lcnJvcixsPSFiKTtlbHNle2I9VDtpZighVHx8ZSlUPSJlcnJvciIs
+ZTwwJiYoZT0wKX14LnN0YXR1cz1lLHguc3RhdHVzVGV4dD0obnx8VCkrIiIsbD9kLnJlc29sdmVX
+aXRoKGgsW3ksVCx4XSk6ZC5yZWplY3RXaXRoKGgsW3gsVCxiXSkseC5zdGF0dXNDb2RlKGcpLGc9
+dCxmJiZwLnRyaWdnZXIoImFqYXgiKyhsPyJTdWNjZXNzIjoiRXJyb3IiKSxbeCxjLGw/eTpiXSks
+bS5maXJlV2l0aChoLFt4LFRdKSxmJiYocC50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt4LGNdKSwt
+LXYuYWN0aXZlfHx2LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfXR5cGVvZiBlPT0ib2JqZWN0
+IiYmKG49ZSxlPXQpLG49bnx8e307dmFyIHIsaSxzLG8sdSxhLGYsbCxjPXYuYWpheFNldHVwKHt9
+LG4pLGg9Yy5jb250ZXh0fHxjLHA9aCE9PWMmJihoLm5vZGVUeXBlfHxoIGluc3RhbmNlb2Ygdik/
+dihoKTp2LmV2ZW50LGQ9di5EZWZlcnJlZCgpLG09di5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiks
+Zz1jLnN0YXR1c0NvZGV8fHt9LGI9e30sdz17fSxFPTAsUz0iY2FuY2VsZWQiLHg9e3JlYWR5U3Rh
+dGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7aWYoIUUpe3ZhciBuPWUudG9Mb3dl
+ckNhc2UoKTtlPXdbbl09d1tuXXx8ZSxiW2VdPXR9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNl
+SGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBFPT09Mj9pOm51bGx9LGdldFJlc3BvbnNlSGVhZGVy
+OmZ1bmN0aW9uKGUpe3ZhciBuO2lmKEU9PT0yKXtpZighcyl7cz17fTt3aGlsZShuPXBuLmV4ZWMo
+aSkpc1tuWzFdLnRvTG93ZXJDYXNlKCldPW5bMl19bj1zW2UudG9Mb3dlckNhc2UoKV19cmV0dXJu
+IG49PT10P251bGw6bn0sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gRXx8KGMu
+bWltZVR5cGU9ZSksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZXx8UyxvJiZvLmFi
+b3J0KGUpLFQoMCxlKSx0aGlzfX07ZC5wcm9taXNlKHgpLHguc3VjY2Vzcz14LmRvbmUseC5lcnJv
+cj14LmZhaWwseC5jb21wbGV0ZT1tLmFkZCx4LnN0YXR1c0NvZGU9ZnVuY3Rpb24oZSl7aWYoZSl7
+dmFyIHQ7aWYoRTwyKWZvcih0IGluIGUpZ1t0XT1bZ1t0XSxlW3RdXTtlbHNlIHQ9ZVt4LnN0YXR1
+c10seC5hbHdheXModCl9cmV0dXJuIHRoaXN9LGMudXJsPSgoZXx8Yy51cmwpKyIiKS5yZXBsYWNl
+KGhuLCIiKS5yZXBsYWNlKG1uLGxuWzFdKyIvLyIpLGMuZGF0YVR5cGVzPXYudHJpbShjLmRhdGFU
+eXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoeSksYy5jcm9zc0RvbWFpbj09bnVsbCYmKGE9
+d24uZXhlYyhjLnVybC50b0xvd2VyQ2FzZSgpKSxjLmNyb3NzRG9tYWluPSEoIWF8fGFbMV09PT1s
+blsxXSYmYVsyXT09PWxuWzJdJiYoYVszXXx8KGFbMV09PT0iaHR0cDoiPzgwOjQ0MykpPT0obG5b
+M118fChsblsxXT09PSJodHRwOiI/ODA6NDQzKSkpKSxjLmRhdGEmJmMucHJvY2Vzc0RhdGEmJnR5
+cGVvZiBjLmRhdGEhPSJzdHJpbmciJiYoYy5kYXRhPXYucGFyYW0oYy5kYXRhLGMudHJhZGl0aW9u
+YWwpKSxrbihTbixjLG4seCk7aWYoRT09PTIpcmV0dXJuIHg7Zj1jLmdsb2JhbCxjLnR5cGU9Yy50
+eXBlLnRvVXBwZXJDYXNlKCksYy5oYXNDb250ZW50PSF2bi50ZXN0KGMudHlwZSksZiYmdi5hY3Rp
+dmUrKz09PTAmJnYuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iik7aWYoIWMuaGFzQ29udGVudCl7
+Yy5kYXRhJiYoYy51cmwrPShnbi50ZXN0KGMudXJsKT8iJiI6Ij8iKStjLmRhdGEsZGVsZXRlIGMu
+ZGF0YSkscj1jLnVybDtpZihjLmNhY2hlPT09ITEpe3ZhciBOPXYubm93KCksQz1jLnVybC5yZXBs
+YWNlKGJuLCIkMV89IitOKTtjLnVybD1DKyhDPT09Yy51cmw/KGduLnRlc3QoYy51cmwpPyImIjoi
+PyIpKyJfPSIrTjoiIil9fShjLmRhdGEmJmMuaGFzQ29udGVudCYmYy5jb250ZW50VHlwZSE9PSEx
+fHxuLmNvbnRlbnRUeXBlKSYmeC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGMuY29u
+dGVudFR5cGUpLGMuaWZNb2RpZmllZCYmKHI9cnx8Yy51cmwsdi5sYXN0TW9kaWZpZWRbcl0mJngu
+c2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHYubGFzdE1vZGlmaWVkW3JdKSx2
+LmV0YWdbcl0mJnguc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsdi5ldGFnW3JdKSks
+eC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGMuZGF0YVR5cGVzWzBdJiZjLmFjY2VwdHNbYy5k
+YXRhVHlwZXNbMF1dP2MuYWNjZXB0c1tjLmRhdGFUeXBlc1swXV0rKGMuZGF0YVR5cGVzWzBdIT09
+IioiPyIsICIrVG4rIjsgcT0wLjAxIjoiIik6Yy5hY2NlcHRzWyIqIl0pO2ZvcihsIGluIGMuaGVh
+ZGVycyl4LnNldFJlcXVlc3RIZWFkZXIobCxjLmhlYWRlcnNbbF0pO2lmKCFjLmJlZm9yZVNlbmR8
+fGMuYmVmb3JlU2VuZC5jYWxsKGgseCxjKSE9PSExJiZFIT09Mil7Uz0iYWJvcnQiO2ZvcihsIGlu
+e3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXhbbF0oY1tsXSk7bz1rbih4bixjLG4seCk7
+aWYoIW8pVCgtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt4LnJlYWR5U3RhdGU9MSxmJiZwLnRyaWdn
+ZXIoImFqYXhTZW5kIixbeCxjXSksYy5hc3luYyYmYy50aW1lb3V0PjAmJih1PXNldFRpbWVvdXQo
+ZnVuY3Rpb24oKXt4LmFib3J0KCJ0aW1lb3V0Iil9LGMudGltZW91dCkpO3RyeXtFPTEsby5zZW5k
+KGIsVCl9Y2F0Y2goayl7aWYoIShFPDIpKXRocm93IGs7VCgtMSxrKX19cmV0dXJuIHh9cmV0dXJu
+IHguYWJvcnQoKX0sYWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgTW49W10s
+X249L1w/LyxEbj0vKD0pXD8oPz0mfCQpfFw/XD8vLFBuPXYubm93KCk7di5hamF4U2V0dXAoe2pz
+b25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPU1uLnBvcCgpfHx2
+LmV4cGFuZG8rIl8iK1BuKys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx2LmFqYXhQcmVmaWx0ZXIo
+Impzb24ganNvbnAiLGZ1bmN0aW9uKG4scixpKXt2YXIgcyxvLHUsYT1uLmRhdGEsZj1uLnVybCxs
+PW4uanNvbnAhPT0hMSxjPWwmJkRuLnRlc3QoZiksaD1sJiYhYyYmdHlwZW9mIGE9PSJzdHJpbmci
+JiYhKG4uY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVy
+bGVuY29kZWQiKSYmRG4udGVzdChhKTtpZihuLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGN8fGgp
+cmV0dXJuIHM9bi5qc29ucENhbGxiYWNrPXYuaXNGdW5jdGlvbihuLmpzb25wQ2FsbGJhY2spP24u
+anNvbnBDYWxsYmFjaygpOm4uanNvbnBDYWxsYmFjayxvPWVbc10sYz9uLnVybD1mLnJlcGxhY2Uo
+RG4sIiQxIitzKTpoP24uZGF0YT1hLnJlcGxhY2UoRG4sIiQxIitzKTpsJiYobi51cmwrPShfbi50
+ZXN0KGYpPyImIjoiPyIpK24uanNvbnArIj0iK3MpLG4uY29udmVydGVyc1sic2NyaXB0IGpzb24i
+XT1mdW5jdGlvbigpe3JldHVybiB1fHx2LmVycm9yKHMrIiB3YXMgbm90IGNhbGxlZCIpLHVbMF19
+LG4uZGF0YVR5cGVzWzBdPSJqc29uIixlW3NdPWZ1bmN0aW9uKCl7dT1hcmd1bWVudHN9LGkuYWx3
+YXlzKGZ1bmN0aW9uKCl7ZVtzXT1vLG5bc10mJihuLmpzb25wQ2FsbGJhY2s9ci5qc29ucENhbGxi
+YWNrLE1uLnB1c2gocykpLHUmJnYuaXNGdW5jdGlvbihvKSYmbyh1WzBdKSx1PW89dH0pLCJzY3Jp
+cHQifSksdi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBs
+aWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94
+LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxj
+b252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB2Lmdsb2JhbEV2YWwo
+ZSksZX19fSksdi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT10
+JiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIixlLmdsb2JhbD0hMSl9
+KSx2LmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oZSl7aWYoZS5jcm9zc0RvbWFpbil7
+dmFyIG4scj1pLmhlYWR8fGkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8aS5kb2N1
+bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24ocyxvKXtuPWkuY3JlYXRlRWxlbWVudCgi
+c2NyaXB0Iiksbi5hc3luYz0iYXN5bmMiLGUuc2NyaXB0Q2hhcnNldCYmKG4uY2hhcnNldD1lLnNj
+cmlwdENoYXJzZXQpLG4uc3JjPWUudXJsLG4ub25sb2FkPW4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1
+bmN0aW9uKGUsaSl7aWYoaXx8IW4ucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChu
+LnJlYWR5U3RhdGUpKW4ub25sb2FkPW4ub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsciYmbi5wYXJl
+bnROb2RlJiZyLnJlbW92ZUNoaWxkKG4pLG49dCxpfHxvKDIwMCwic3VjY2VzcyIpfSxyLmluc2Vy
+dEJlZm9yZShuLHIuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbi5vbmxvYWQoMCwx
+KX19fX0pO3ZhciBIbixCbj1lLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4g
+SG4pSG5bZV0oMCwxKX06ITEsam49MDt2LmFqYXhTZXR0aW5ncy54aHI9ZS5BY3RpdmVYT2JqZWN0
+P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmRm4oKXx8SW4oKX06Rm4sZnVuY3Rpb24o
+ZSl7di5leHRlbmQodi5zdXBwb3J0LHthamF4OiEhZSxjb3JzOiEhZSYmIndpdGhDcmVkZW50aWFs
+cyJpbiBlfSl9KHYuYWpheFNldHRpbmdzLnhocigpKSx2LnN1cHBvcnQuYWpheCYmdi5hamF4VHJh
+bnNwb3J0KGZ1bmN0aW9uKG4pe2lmKCFuLmNyb3NzRG9tYWlufHx2LnN1cHBvcnQuY29ycyl7dmFy
+IHI7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxzKXt2YXIgbyx1LGE9bi54aHIoKTtuLnVzZXJuYW1l
+P2Eub3BlbihuLnR5cGUsbi51cmwsbi5hc3luYyxuLnVzZXJuYW1lLG4ucGFzc3dvcmQpOmEub3Bl
+bihuLnR5cGUsbi51cmwsbi5hc3luYyk7aWYobi54aHJGaWVsZHMpZm9yKHUgaW4gbi54aHJGaWVs
+ZHMpYVt1XT1uLnhockZpZWxkc1t1XTtuLm1pbWVUeXBlJiZhLm92ZXJyaWRlTWltZVR5cGUmJmEu
+b3ZlcnJpZGVNaW1lVHlwZShuLm1pbWVUeXBlKSwhbi5jcm9zc0RvbWFpbiYmIWlbIlgtUmVxdWVz
+dGVkLVdpdGgiXSYmKGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7
+Zm9yKHUgaW4gaSlhLnNldFJlcXVlc3RIZWFkZXIodSxpW3VdKX1jYXRjaChmKXt9YS5zZW5kKG4u
+aGFzQ29udGVudCYmbi5kYXRhfHxudWxsKSxyPWZ1bmN0aW9uKGUsaSl7dmFyIHUsZixsLGMsaDt0
+cnl7aWYociYmKGl8fGEucmVhZHlTdGF0ZT09PTQpKXtyPXQsbyYmKGEub25yZWFkeXN0YXRlY2hh
+bmdlPXYubm9vcCxCbiYmZGVsZXRlIEhuW29dKTtpZihpKWEucmVhZHlTdGF0ZSE9PTQmJmEuYWJv
+cnQoKTtlbHNle3U9YS5zdGF0dXMsbD1hLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLGM9e30saD1h
+LnJlc3BvbnNlWE1MLGgmJmguZG9jdW1lbnRFbGVtZW50JiYoYy54bWw9aCk7dHJ5e2MudGV4dD1h
+LnJlc3BvbnNlVGV4dH1jYXRjaChwKXt9dHJ5e2Y9YS5zdGF0dXNUZXh0fWNhdGNoKHApe2Y9IiJ9
+IXUmJm4uaXNMb2NhbCYmIW4uY3Jvc3NEb21haW4/dT1jLnRleHQ/MjAwOjQwNDp1PT09MTIyMyYm
+KHU9MjA0KX19fWNhdGNoKGQpe2l8fHMoLTEsZCl9YyYmcyh1LGYsYyxsKX0sbi5hc3luYz9hLnJl
+YWR5U3RhdGU9PT00P3NldFRpbWVvdXQociwwKToobz0rK2puLEJuJiYoSG58fChIbj17fSx2KGUp
+LnVubG9hZChCbikpLEhuW29dPXIpLGEub25yZWFkeXN0YXRlY2hhbmdlPXIpOnIoKX0sYWJvcnQ6
+ZnVuY3Rpb24oKXtyJiZyKDAsMSl9fX19KTt2YXIgcW4sUm4sVW49L14oPzp0b2dnbGV8c2hvd3xo
+aWRlKSQvLHpuPW5ldyBSZWdFeHAoIl4oPzooWy0rXSk9fCkoIittKyIpKFthLXolXSopJCIsImki
+KSxXbj0vcXVldWVIb29rcyQvLFhuPVtHbl0sVm49eyIqIjpbZnVuY3Rpb24oZSx0KXt2YXIgbixy
+LGk9dGhpcy5jcmVhdGVUd2VlbihlLHQpLHM9em4uZXhlYyh0KSxvPWkuY3VyKCksdT0rb3x8MCxh
+PTEsZj0yMDtpZihzKXtuPStzWzJdLHI9c1szXXx8KHYuY3NzTnVtYmVyW2VdPyIiOiJweCIpO2lm
+KHIhPT0icHgiJiZ1KXt1PXYuY3NzKGkuZWxlbSxlLCEwKXx8bnx8MTtkbyBhPWF8fCIuNSIsdS89
+YSx2LnN0eWxlKGkuZWxlbSxlLHUrcik7d2hpbGUoYSE9PShhPWkuY3VyKCkvbykmJmEhPT0xJiYt
+LWYpfWkudW5pdD1yLGkuc3RhcnQ9dSxpLmVuZD1zWzFdP3UrKHNbMV0rMSkqbjpufXJldHVybiBp
+fV19O3YuQW5pbWF0aW9uPXYuZXh0ZW5kKEtuLHt0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7di5pc0Z1
+bmN0aW9uKGUpPyh0PWUsZT1bIioiXSk6ZT1lLnNwbGl0KCIgIik7dmFyIG4scj0wLGk9ZS5sZW5n
+dGg7Zm9yKDtyPGk7cisrKW49ZVtyXSxWbltuXT1WbltuXXx8W10sVm5bbl0udW5zaGlmdCh0KX0s
+cHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9Ybi51bnNoaWZ0KGUpOlhuLnB1c2goZSl9fSksdi5U
+d2Vlbj1ZbixZbi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlluLGluaXQ6ZnVuY3Rpb24oZSx0LG4s
+cixpLHMpe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fCJzd2luZyIsdGhp
+cy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhp
+cy51bml0PXN8fCh2LmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGU9
+WW4ucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOlluLnBy
+b3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihlKXt2YXIgdCxuPVluLnBy
+b3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9
+dD12LmVhc2luZ1t0aGlzLmVhc2luZ10oZSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qZSwwLDEsdGhp
+cy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz10PWUsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMu
+c3RhcnQpKnQrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAu
+Y2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6WW4ucHJv
+cEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWW4ucHJvdG90eXBlLmluaXQucHJvdG90
+eXBlPVluLnByb3RvdHlwZSxZbi5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oZSl7
+dmFyIHQ7cmV0dXJuIGUuZWxlbVtlLnByb3BdPT1udWxsfHwhIWUuZWxlbS5zdHlsZSYmZS5lbGVt
+LnN0eWxlW2UucHJvcF0hPW51bGw/KHQ9di5jc3MoZS5lbGVtLGUucHJvcCwhMSwiIiksIXR8fHQ9
+PT0iYXV0byI/MDp0KTplLmVsZW1bZS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGUpe3YuZnguc3RlcFtl
+LnByb3BdP3YuZnguc3RlcFtlLnByb3BdKGUpOmUuZWxlbS5zdHlsZSYmKGUuZWxlbS5zdHlsZVt2
+LmNzc1Byb3BzW2UucHJvcF1dIT1udWxsfHx2LmNzc0hvb2tzW2UucHJvcF0pP3Yuc3R5bGUoZS5l
+bGVtLGUucHJvcCxlLm5vdytlLnVuaXQpOmUuZWxlbVtlLnByb3BdPWUubm93fX19LFluLnByb3BI
+b29rcy5zY3JvbGxUb3A9WW4ucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtl
+LmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cp
+fX0sdi5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPXYu
+Zm5bdF07di5mblt0XT1mdW5jdGlvbihyLGkscyl7cmV0dXJuIHI9PW51bGx8fHR5cGVvZiByPT0i
+Ym9vbGVhbiJ8fCFlJiZ2LmlzRnVuY3Rpb24ocikmJnYuaXNGdW5jdGlvbihpKT9uLmFwcGx5KHRo
+aXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoWm4odCwhMCkscixpLHMpfX0pLHYuZm4uZXh0ZW5k
+KHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKEd0KS5jc3MoIm9w
+YWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0
+ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT12LmlzRW1wdHlPYmplY3QoZSkscz12LnNwZWVkKHQs
+bixyKSxvPWZ1bmN0aW9uKCl7dmFyIHQ9S24odGhpcyx2LmV4dGVuZCh7fSxlKSxzKTtpJiZ0LnN0
+b3AoITApfTtyZXR1cm4gaXx8cy5xdWV1ZT09PSExP3RoaXMuZWFjaChvKTp0aGlzLnF1ZXVlKHMu
+cXVldWUsbyl9LHN0b3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciB0PWUu
+c3RvcDtkZWxldGUgZS5zdG9wLHQocil9O3JldHVybiB0eXBlb2YgZSE9InN0cmluZyImJihyPW4s
+bj1lLGU9dCksbiYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5j
+dGlvbigpe3ZhciB0PSEwLG49ZSE9bnVsbCYmZSsicXVldWVIb29rcyIscz12LnRpbWVycyxvPXYu
+X2RhdGEodGhpcyk7aWYobilvW25dJiZvW25dLnN0b3AmJmkob1tuXSk7ZWxzZSBmb3IobiBpbiBv
+KW9bbl0mJm9bbl0uc3RvcCYmV24udGVzdChuKSYmaShvW25dKTtmb3Iobj1zLmxlbmd0aDtuLS07
+KXNbbl0uZWxlbT09PXRoaXMmJihlPT1udWxsfHxzW25dLnF1ZXVlPT09ZSkmJihzW25dLmFuaW0u
+c3RvcChyKSx0PSExLHMuc3BsaWNlKG4sMSkpOyh0fHwhcikmJnYuZGVxdWV1ZSh0aGlzLGUpfSl9
+fSksdi5lYWNoKHtzbGlkZURvd246Wm4oInNob3ciKSxzbGlkZVVwOlpuKCJoaWRlIiksc2xpZGVU
+b2dnbGU6Wm4oInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNp
+dHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSx0KXt2
+LmZuW2VdPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKHQsZSxuLHIpfX0pLHYu
+c3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJnR5cGVvZiBlPT0ib2JqZWN0Ij92LmV4dGVu
+ZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fHYuaXNGdW5jdGlvbihlKSYmZSxkdXJhdGlvbjpl
+LGVhc2luZzpuJiZ0fHx0JiYhdi5pc0Z1bmN0aW9uKHQpJiZ0fTtyLmR1cmF0aW9uPXYuZngub2Zm
+PzA6dHlwZW9mIHIuZHVyYXRpb249PSJudW1iZXIiP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiB2
+LmZ4LnNwZWVkcz92LmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTp2LmZ4LnNwZWVkcy5fZGVmYXVsdDtp
+ZihyLnF1ZXVlPT1udWxsfHxyLnF1ZXVlPT09ITApci5xdWV1ZT0iZngiO3JldHVybiByLm9sZD1y
+LmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXt2LmlzRnVuY3Rpb24oci5vbGQpJiZyLm9s
+ZC5jYWxsKHRoaXMpLHIucXVldWUmJnYuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSx2LmVhc2lu
+Zz17bGluZWFyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxzd2luZzpmdW5jdGlvbihlKXtyZXR1cm4u
+NS1NYXRoLmNvcyhlKk1hdGguUEkpLzJ9fSx2LnRpbWVycz1bXSx2LmZ4PVluLnByb3RvdHlwZS5p
+bml0LHYuZngudGljaz1mdW5jdGlvbigpe3ZhciBlLG49di50aW1lcnMscj0wO3FuPXYubm93KCk7
+Zm9yKDtyPG4ubGVuZ3RoO3IrKyllPW5bcl0sIWUoKSYmbltyXT09PWUmJm4uc3BsaWNlKHItLSwx
+KTtuLmxlbmd0aHx8di5meC5zdG9wKCkscW49dH0sdi5meC50aW1lcj1mdW5jdGlvbihlKXtlKCkm
+JnYudGltZXJzLnB1c2goZSkmJiFSbiYmKFJuPXNldEludGVydmFsKHYuZngudGljayx2LmZ4Lmlu
+dGVydmFsKSl9LHYuZnguaW50ZXJ2YWw9MTMsdi5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRl
+cnZhbChSbiksUm49bnVsbH0sdi5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0
+OjQwMH0sdi5meC5zdGVwPXt9LHYuZXhwciYmdi5leHByLmZpbHRlcnMmJih2LmV4cHIuZmlsdGVy
+cy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gdi5ncmVwKHYudGltZXJzLGZ1bmN0aW9uKHQp
+e3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSk7dmFyIGVyPS9eKD86Ym9keXxodG1sKSQvaTt2
+LmZuLm9mZnNldD1mdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT09dD90
+aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt2Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7
+dmFyIG4scixpLHMsbyx1LGEsZj17dG9wOjAsbGVmdDowfSxsPXRoaXNbMF0sYz1sJiZsLm93bmVy
+RG9jdW1lbnQ7aWYoIWMpcmV0dXJuO3JldHVybihyPWMuYm9keSk9PT1sP3Yub2Zmc2V0LmJvZHlP
+ZmZzZXQobCk6KG49Yy5kb2N1bWVudEVsZW1lbnQsdi5jb250YWlucyhuLGwpPyh0eXBlb2YgbC5n
+ZXRCb3VuZGluZ0NsaWVudFJlY3QhPSJ1bmRlZmluZWQiJiYoZj1sLmdldEJvdW5kaW5nQ2xpZW50
+UmVjdCgpKSxpPXRyKGMpLHM9bi5jbGllbnRUb3B8fHIuY2xpZW50VG9wfHwwLG89bi5jbGllbnRM
+ZWZ0fHxyLmNsaWVudExlZnR8fDAsdT1pLnBhZ2VZT2Zmc2V0fHxuLnNjcm9sbFRvcCxhPWkucGFn
+ZVhPZmZzZXR8fG4uc2Nyb2xsTGVmdCx7dG9wOmYudG9wK3UtcyxsZWZ0OmYubGVmdCthLW99KTpm
+KX0sdi5vZmZzZXQ9e2JvZHlPZmZzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vZmZzZXRUb3Asbj1l
+Lm9mZnNldExlZnQ7cmV0dXJuIHYuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9m
+ZnNldCYmKHQrPXBhcnNlRmxvYXQodi5jc3MoZSwibWFyZ2luVG9wIikpfHwwLG4rPXBhcnNlRmxv
+YXQodi5jc3MoZSwibWFyZ2luTGVmdCIpKXx8MCkse3RvcDp0LGxlZnQ6bn19LHNldE9mZnNldDpm
+dW5jdGlvbihlLHQsbil7dmFyIHI9di5jc3MoZSwicG9zaXRpb24iKTtyPT09InN0YXRpYyImJihl
+LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBpPXYoZSkscz1pLm9mZnNldCgpLG89di5j
+c3MoZSwidG9wIiksdT12LmNzcyhlLCJsZWZ0IiksYT0ocj09PSJhYnNvbHV0ZSJ8fHI9PT0iZml4
+ZWQiKSYmdi5pbkFycmF5KCJhdXRvIixbbyx1XSk+LTEsZj17fSxsPXt9LGMsaDthPyhsPWkucG9z
+aXRpb24oKSxjPWwudG9wLGg9bC5sZWZ0KTooYz1wYXJzZUZsb2F0KG8pfHwwLGg9cGFyc2VGbG9h
+dCh1KXx8MCksdi5pc0Z1bmN0aW9uKHQpJiYodD10LmNhbGwoZSxuLHMpKSx0LnRvcCE9bnVsbCYm
+KGYudG9wPXQudG9wLXMudG9wK2MpLHQubGVmdCE9bnVsbCYmKGYubGVmdD10LmxlZnQtcy5sZWZ0
+K2gpLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLGYpOmkuY3NzKGYpfX0sdi5mbi5leHRlbmQo
+e3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuO3ZhciBlPXRoaXNbMF0sdD10
+aGlzLm9mZnNldFBhcmVudCgpLG49dGhpcy5vZmZzZXQoKSxyPWVyLnRlc3QodFswXS5ub2RlTmFt
+ZSk/e3RvcDowLGxlZnQ6MH06dC5vZmZzZXQoKTtyZXR1cm4gbi50b3AtPXBhcnNlRmxvYXQodi5j
+c3MoZSwibWFyZ2luVG9wIikpfHwwLG4ubGVmdC09cGFyc2VGbG9hdCh2LmNzcyhlLCJtYXJnaW5M
+ZWZ0IikpfHwwLHIudG9wKz1wYXJzZUZsb2F0KHYuY3NzKHRbMF0sImJvcmRlclRvcFdpZHRoIikp
+fHwwLHIubGVmdCs9cGFyc2VGbG9hdCh2LmNzcyh0WzBdLCJib3JkZXJMZWZ0V2lkdGgiKSl8fDAs
+e3RvcDpuLnRvcC1yLnRvcCxsZWZ0Om4ubGVmdC1yLmxlZnR9fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rp
+b24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9mZnNldFBhcmVudHx8
+aS5ib2R5O3doaWxlKGUmJiFlci50ZXN0KGUubm9kZU5hbWUpJiZ2LmNzcyhlLCJwb3NpdGlvbiIp
+PT09InN0YXRpYyIpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8aS5ib2R5fSl9fSksdi5lYWNo
+KHtzY3JvbGxMZWZ0OiJwYWdlWE9mZnNldCIsc2Nyb2xsVG9wOiJwYWdlWU9mZnNldCJ9LGZ1bmN0
+aW9uKGUsbil7dmFyIHI9L1kvLnRlc3Qobik7di5mbltlXT1mdW5jdGlvbihpKXtyZXR1cm4gdi5h
+Y2Nlc3ModGhpcyxmdW5jdGlvbihlLGkscyl7dmFyIG89dHIoZSk7aWYocz09PXQpcmV0dXJuIG8/
+biBpbiBvP29bbl06by5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbaV06ZVtpXTtvP28uc2Nyb2xs
+VG8ocj92KG8pLnNjcm9sbExlZnQoKTpzLHI/czp2KG8pLnNjcm9sbFRvcCgpKTplW2ldPXN9LGUs
+aSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLHYuZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRo
+OiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsbil7di5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50
+Om4sIiI6Im91dGVyIitlfSxmdW5jdGlvbihyLGkpe3YuZm5baV09ZnVuY3Rpb24oaSxzKXt2YXIg
+bz1hcmd1bWVudHMubGVuZ3RoJiYocnx8dHlwZW9mIGkhPSJib29sZWFuIiksdT1yfHwoaT09PSEw
+fHxzPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB2LmFjY2Vzcyh0aGlzLGZ1bmN0aW9u
+KG4scixpKXt2YXIgcztyZXR1cm4gdi5pc1dpbmRvdyhuKT9uLmRvY3VtZW50LmRvY3VtZW50RWxl
+bWVudFsiY2xpZW50IitlXTpuLm5vZGVUeXBlPT09OT8ocz1uLmRvY3VtZW50RWxlbWVudCxNYXRo
+Lm1heChuLmJvZHlbInNjcm9sbCIrZV0sc1sic2Nyb2xsIitlXSxuLmJvZHlbIm9mZnNldCIrZV0s
+c1sib2Zmc2V0IitlXSxzWyJjbGllbnQiK2VdKSk6aT09PXQ/di5jc3MobixyLGksdSk6di5zdHls
+ZShuLHIsaSx1KX0sbixvP2k6dCxvLG51bGwpfX0pfSksZS5qUXVlcnk9ZS4kPXYsdHlwZW9mIGRl
+ZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZCYmZGVmaW5lLmFtZC5qUXVlcnkmJmRlZmluZSgi
+anF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB2fSl9KSh3aW5kb3cpOw==
+`
+)