Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
wps-office / opt / kingsoft / wps-office / office6 / addons / cef / cef_200_percent.pak
Size: Mime:
!<2œ	=2¦>2?2DN@2YYA28iB2
sC2G¥D2›¨E2ALF2(RG2KXH2[I2_J2'bK2qkL20oM2VŽN2žO2c®P2zµQ2¿R2\ÉS2ÍT2ðÒU2ÏÕV2ÕØW2)âX2òY2‡Z2ø[2¡\2‡"]2.1^2O5_2?`2Fa2ƒNb2¸Qc2lXd2;[u2kv2ÃÔw2=¶x2‰dy2¹˜z2«{2۳|2¿}2Ê~2½Ò2ssŒ2t“2/”0Cp•1C^›2C+¦3Cð«4C/¯5C‹°6CJ·7Cš¾8C‡Ã9C"Í:CLÔBCDÜCCiÞGCzàHCñJC“òKCãõLCöMC‚_;ƒ_öI„_Ïd…_]eÔbHfÕb=jÖbgm×b[pØb`sÙbuÚb§vœc}zcžcΟcQ c¦‚¡c™ƒ¢c;„d݄d¹ádä	dp	i_#	i(	iD1	iM3	i”6	iÍ;	iFE	iþF	iïM	itS	 ièX	!iÜ_	"i¦a	#i@f	%i+j	'iWm	)iKq	*i£{	0iê	1iЁ	2i…Š	3iT“	4i'•	5iG˜	6ihœ	7i£	:i™¤	;iz©	<ií¬	=i԰	>iŸ¶	?iž·	@i‹º	Bi³½	DiÛÀ	FiÄ	Gi Ë	Li
Ï	Ni;ö	Oi2÷	Piü	Qi
Ri/
SiI
TiM
Ui‚
Vi
Wi±
Xi1	
Yi·

Zi$
[i¼
\it
]iò
^i›
_i~
`iÝ
ai:
bi˜
ciõ
diT
ei²
fiz
gig!
hi/%
iiŒ&
jiì'
kiK)
lij‘
miº’
ni	”
oiX•
pis™
qiuœ
uiêž
viNŸ
wi 
xi—¡
yi£
zi-§
{i}¨
|iȩ
}i«
~i‘«
iZ¬
€i"­
iê­
‚ià®
ƒi°
„i'±
…iH²
†i<³
‡i2´
ˆiUµ
‰iy¶
Šiš·
‹iޏ
Œifº
i¼
iĽ
’i™Ê
:kžÚ
;köÚ
<kYÛ
=k»Û
>kÜ
?k#Ý
@k$Þ
Ak ß
Bk֧
Ck4á
Dkˆá
EkÊâ
Fkã
Gkçã
Hk²ä
Ikyå
Jkæ
Kkaç
Lkè
Mk§é
Nkˆê
Okbë
PkBì
QkAí
Rk¤î
Skíï
Tkñ
Ukcò
Vkžó
Wk½ô
Xk™õ
Yky÷
Zkøø
[køú
\kåü
]k„ý
^k¼þ
_kŠ`kak<bkµck¼	dk­
ekƒfkTgkd
hkBik jkþkkYlkÚmk\nkáokEqk§rkísk3tkyukÉvkwkjxk±zkø{k‘|k)}kÁ~kko€kÁkI‚kσkQ„k¨…kÿ†kV‡kʈk=‰k­ŠkŒkhkÔŽk?k¦kO‘kô’kž“k˜k™kÜšk3 žkŽ ŸkZ! k$"¡kô"¢kX#£k¼#¤k$¥kÐ$¦k€%§k'&¨kŠ&©kì&ªkO'«kä'¬kt(­kû(®kf)°kÍ)±k#*²k‚*³ká*´k5+µk‰+¶k¥0·k@5¸k`;¹kV?ºk@»kñ@¼k®A½kQB¾k$C¿kÉCÀkáFÁkîJÂk NÃk^RÄkìVÅkFYÆk“\ÇkÙ`Èk•eÉk:jÊk	nËk›qÌkètÍkexÎk,yÏk%zÐk÷zÑkV{Òk|Ók¿|Ôk}ÕkÚ}Ök›~×kð~Øk™Ùk@€Úk“€Ûk!Ük³Ýk	‚ÞkŠ‚ßkƒàkTƒákëƒâk‚„ãkބäkK…åk²…æk†çkZ†èk¹†ék;‡êk³‡ëk'ˆìkьíkˆ‘îkñ‘ïkW’ðkƒñk –òk÷šókgŸôk!£õk§ökª÷kתøk¥«ùkm¬úk,ûk­ük_­ýkõ­þkŽ®ÿkT°l»±l$³´ibib$il&im(in+im,in-im.il/ib8iu9iuAiCi€EiHi€IiJi€KiMiui~‘i_pkôykü‹k
”k•kú–kû—kü›kœkkü¯k)<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no">
    
      <script>
        function setMessage(msg) {
          document.getElementById('message').textContent = msg;
        }
        function notifyDidFinishLoading() {
          if (plugin.didFinishLoading)
            plugin.didFinishLoading();

          if (plugin.didFinishIconRepositionForTesting)
            plugin.didFinishIconRepositionForTesting();
        }
      </script>
    
    
    <style>/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

html, body {
  -webkit-user-select: none;
  font-family: sans-serif;
  height: 100%;
  margin: 0;
  overflow: hidden;
  text-align: center;
  width: 100%;
}

h1 {
  display: none;
  font-size: 10pt;
  font-weight: normal;
  padding: 0pt 10pt;
}

p {
  font-size: 8pt;
  padding: 0pt 14pt;
}

#t {
  background-color: #f7f7f7;
  color: #646464;
}

#outer {
  align-items: center;
  box-sizing: border-box;
  display: flex;
  height: 100%;
  justify-content: center;
  position: absolute;
  width: 100%;
  flex-direction: column;
}

.icon {
  max-height: 100%;
  max-width: 100%;
  opacity: .3;
}

@media (orientation: landscape) and (min-height: 2em) and (min-width: 14em) {
  #outer {
    flex-direction: row;
  }
  .icon {
    max-height: 100%;
    max-width: 50%;
  }
  h1 {
    display: block;
  }
}

@media (min-height: 7em) and (min-width: 6em) {
  #outer {
    flex-direction: column;
  }
  .icon {
    max-height: 50%;
    max-width: 100%;
  }
  h1 {
    display: block;
  }
}
</style>
  </head>
  <body id="t" onload="notifyDidFinishLoading();">
    <div i18n-values="title:name" id="outer">
      <img class="icon"
           src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzYyNjI2MiI+CiAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNNDEgMjJoLTN2LThjMC0yLjIxLTEuNzktNC00LTRoLThWN2MwLTIuNzYtMi4yNC01LTUtNXMtNSAyLjI0LTUgNXYzSDhjLTIuMjEgMC0zLjk4IDEuNzktMy45OCA0bC0uMDEgNy42SDdjMi45OCAwIDUuNCAyLjQyIDUuNCA1LjRTOS45OCAzMi40IDcgMzIuNEg0LjAxTDQgNDBjMCAyLjIxIDEuNzkgNCA0IDRoNy42di0zYzAtMi45OCAyLjQyLTUuNCA1LjQtNS40IDIuOTggMCA1LjQgMi40MiA1LjQgNS40djNIMzRjMi4yMSAwIDQtMS43OSA0LTR2LThoM2MyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXoiLz4KPC9zdmc+Cg==">
      <h1 id="message">$i18n{message}</h1>
    </div>
  </body>
</html>
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=no">
    <style>/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

html, body {
  -webkit-user-select: none;
  font-family: sans-serif;
  height: 100%;
  margin: 0;
  overflow: hidden;
  text-align: center;
  width: 100%;
}

h1 {
  display: none;
  font-size: 10pt;
  font-weight: normal;
  padding: 0pt 10pt;
}

p {
  font-size: 8pt;
  padding: 0pt 14pt;
}

#t {
  background-color: #f7f7f7;
  color: #646464;
}

#outer {
  align-items: center;
  box-sizing: border-box;
  display: flex;
  height: 100%;
  justify-content: center;
  position: absolute;
  width: 100%;
  flex-direction: column;
}

.icon {
  max-height: 100%;
  max-width: 100%;
  opacity: .3;
}

@media (orientation: landscape) and (min-height: 2em) and (min-width: 14em) {
  #outer {
    flex-direction: row;
  }
  .icon {
    max-height: 100%;
    max-width: 50%;
  }
  h1 {
    display: block;
  }
}

@media (min-height: 7em) and (min-width: 6em) {
  #outer {
    flex-direction: column;
  }
  .icon {
    max-height: 50%;
    max-width: 100%;
  }
  h1 {
    display: block;
  }
}
</style>
  </head>
  <body id="t" onLoad="insertLink()">
    <div i18n-values="title:name" id="outer">
      <img class="icon"
           src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzYyNjI2MiI+CiAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNNDEgMjJoLTN2LThjMC0yLjIxLTEuNzktNC00LTRoLThWN2MwLTIuNzYtMi4yNC01LTUtNXMtNSAyLjI0LTUgNXYzSDhjLTIuMjEgMC0zLjk4IDEuNzktMy45OCA0bC0uMDEgNy42SDdjMi45OCAwIDUuNCAyLjQyIDUuNCA1LjRTOS45OCAzMi40IDcgMzIuNEg0LjAxTDQgNDBjMCAyLjIxIDEuNzkgNCA0IDRoNy42di0zYzAtMi45OCAyLjQyLTUuNCA1LjQtNS40IDIuOTggMCA1LjQgMi40MiA1LjQgNS40djNIMzRjMi4yMSAwIDQtMS43OSA0LTR2LThoM2MyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXoiLz4KPC9zdmc+Cg==">
      <h1 id="message">$i18n{message}</h1>
    </div>
  </body>
</html>
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport"
      content="initial-scale=1, minimum-scale=1, width=device-width">
    <script>
      window.onkeydown = function(e) {
        if (e.key == 'Enter' || e.key == ' ') {
          plugin.openPDF();
          e.preventDefault();
        }
      };
    </script>
    <style>/* Copyright 2017 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

a {
  color: rgb(88, 88, 88);
}

body {
  background-color: #fff;
  color: rgb(100, 100, 100);
  word-wrap: break-word;
}

#details-button {
  background: inherit;
  border: 0;
  float: none;
  margin: 0;
  padding: 10px 0;
  text-transform: uppercase;
}

.hidden {
  display: none;
}

html {
  -webkit-text-size-adjust: 100%;
  font-size: 125%;
}

.icon {
  background-repeat: no-repeat;
  background-size: 100%;
}</style>
    <style>/* Copyright 2014 The Chromium Authors. All rights reserved.
   Use of this source code is governed by a BSD-style license that can be
   found in the LICENSE file. */

button {
  border: 0;
  border-radius: 2px;
  box-sizing: border-box;
  color: #fff;
  cursor: pointer;
  float: right;
  font-size: .875em;
  margin: 0;
  padding: 10px 24px;
  transition: box-shadow 200ms cubic-bezier(0.4, 0, 0.2, 1);
  user-select: none;
}

[dir='rtl'] button {
  float: left;
}

.bad-clock button,
.captive-portal button,
.main-frame-blocked button,
.neterror button,
.offline button,
.pdf button,
.ssl button {
  background: rgb(66, 133, 244);
}

button:active {
  background: rgb(50, 102, 213);
  outline: 0;
}

button:hover {
  box-shadow: 0 1px 3px rgba(0, 0, 0, .50);
}

#debugging {
  display: inline;
  overflow: auto;
}

.debugging-content {
  line-height: 1em;
  margin-bottom: 0;
  margin-top: 1em;
}

.debugging-content-fixed-width {
  display: block;
  font-family: monospace;
  font-size: 1.2em;
  margin-top: 0.5em;
}

.debugging-title {
  font-weight: bold;
}

#details {
  color: #696969;
  margin: 0 0 50px;
}

#details p:not(:first-of-type) {
  margin-top: 20px;
}

#details-button:hover {
  box-shadow: inherit;
  text-decoration: underline;
}

.error-code {
  color: #646464;
  font-size: .86667em;
  text-transform: uppercase;
}

#error-debugging-info {
  font-size: 0.8em;
}

h1 {
  color: #333;
  font-size: 1.6em;
  font-weight: normal;
  line-height: 1.25em;
  margin-bottom: 16px;
}

h2 {
  font-size: 1.2em;
  font-weight: normal;
}

.icon {
  height: 72px;
  margin: 0 0 40px;
  width: 72px;
}

input[type=checkbox] {
  opacity: 0;
}

input[type=checkbox]:focus ~ .checkbox {
  outline: -webkit-focus-ring-color auto 5px;
}

.interstitial-wrapper {
  box-sizing: border-box;
  font-size: 1em;
  line-height: 1.6em;
  margin: 14vh auto 0;
  max-width: 600px;
  width: 100%;
}

#main-message > p {
  display: inline;
}

#extended-reporting-opt-in {
  font-size: .875em;
  margin-top: 39px;
}

#extended-reporting-opt-in label {
  position: relative;
  display: flex;
  align-items: flex-start;
}

.nav-wrapper {
  margin-top: 51px;
}

.nav-wrapper::after {
  clear: both;
  content: '';
  display: table;
  width: 100%;
}

.small-link {
  color: #696969;
  font-size: .875em;
}

.checkboxes {
  flex: 0 0 24px;
}

.checkbox {
  background: transparent;
  border: 1px solid white;
  border-radius: 2px;
  display: block;
  height: 14px;
  left: 0;
  position: absolute;
  right: 0;
  top: 3px;
  width: 14px;
}

.checkbox::before {
  background: transparent;
  border: 2px solid white;
  border-right-width: 0;
  border-top-width: 0;
  content: '';
  height: 4px;
  left: 2px;
  opacity: 0;
  position: absolute;
  top: 3px;
  transform: rotate(-45deg);
  width: 9px;
}

input[type=checkbox]:checked ~ .checkbox::before {
  opacity: 1;
}

#recurrent-error-message {
  background: #ededed;
  border-radius: 4px;
  padding: 12px 16px;
  margin-top: 12px;
  margin-bottom: 16px;
}

.showing-recurrent-error-message #extended-reporting-opt-in {
  margin-top: 16px;
}

@media (max-width: 700px) {
  .interstitial-wrapper {
    padding: 0 10%;
  }

  #error-debugging-info {
    overflow: auto;
  }
}

@media (max-height: 600px) {
  .error-code {
    margin-top: 10px;
  }
}

@media (max-width: 420px) {
  button,
  [dir='rtl'] button,
  .small-link {
    float: none;
    font-size: .825em;
    font-weight: 400;
    margin: 0;
    text-transform: uppercase;
    width: 100%;
  }

  #details {
    margin: 20px 0 20px 0;
  }

  #details p:not(:first-of-type) {
    margin-top: 10px;
  }

  #details-button {
    display: block;
    margin-top: 20px;
    text-align: center;
    width: 100%;
  }

  .interstitial-wrapper {
    padding: 0 5%;
  }

  #extended-reporting-opt-in {
    margin-top: 24px;
  }

  .nav-wrapper {
    margin-top: 30px;
  }
}

/**
 * Mobile specific styling.
 * Navigation buttons are anchored to the bottom of the screen.
 * Details message replaces the top content in its own scrollable area.
 */

@media (max-width: 420px) {
  #details-button {
    border: 0;
    margin: 8px 0 0;
  }

  .secondary-button {
    -webkit-margin-end: 0;
    margin-top: 16px;
  }
}

/* Fixed nav. */
@media (min-width: 240px) and (max-width: 420px) and
       (min-height: 401px),
       (min-width: 421px) and (min-height: 240px) and
       (max-height: 560px) {
  body .nav-wrapper {
    background: #fff;
    bottom: 0;
    box-shadow: 0 -22px 40px #fff;
    left: 0;
    margin: 0 auto;
    max-width: 736px;
    padding-left: 24px;
    padding-right: 24px;
    position: fixed;
    right: 0;
    width: 100%;
    z-index: 2;
  }

  .interstitial-wrapper {
    max-width: 736px;
  }

  #details,
  #main-content {
    padding-bottom: 40px;
  }

  #details {
    padding-top: 5.5vh;
  }

  #details-button:hover {
    box-shadow: none;
  }
}

@media (max-width: 420px) and (orientation: portrait),
       (max-height: 560px) {
  body {
    margin: 0 auto;
  }

  button,
  [dir='rtl'] button,
  button.small-link {
    font-family: Roboto-Regular,Helvetica;
    font-size: .933em;
    font-weight: 600;
    margin: 6px 0;
    text-transform: uppercase;
    transform: translatez(0);
  }

  .nav-wrapper {
    box-sizing: border-box;
    padding-bottom: 8px;
    width: 100%;
  }

  .error-code {
    margin-top: 0;
  }

  #details {
    box-sizing: border-box;
    height: auto;
    margin: 0;
    opacity: 1;
    transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
  }

  #details.hidden,
  #main-content.hidden {
    display: block;
    height: 0;
    opacity: 0;
    overflow: hidden;
    padding-bottom: 0;
    transition: none;
  }

  #details-button {
    padding-bottom: 16px;
    padding-top: 16px;
  }

  h1 {
    font-size: 1.5em;
    margin-bottom: 8px;
  }

  .icon {
    margin-bottom: 5.69vh;
  }

  .interstitial-wrapper {
    box-sizing: border-box;
    margin: 7vh auto 12px;
    padding: 0 24px;
    position: relative;
  }

  .interstitial-wrapper p {
    font-size: .95em;
    line-height: 1.61em;
    margin-top: 8px;
  }

  #main-content {
    margin: 0;
    transition: opacity 100ms cubic-bezier(0.4, 0, 0.2, 1);
  }

  .small-link {
    border: 0;
  }

  .suggested-left > #control-buttons,
  .suggested-right > #control-buttons {
    float: none;
    margin: 0;
  }
}

@media (min-width: 421px) and (min-height: 500px) and (max-height: 560px) {
  .interstitial-wrapper {
    margin-top: 10vh;
  }
}

@media (min-height: 400px) and (orientation:portrait) {
  .interstitial-wrapper {
    margin-bottom: 145px;
  }
}

@media (min-height: 299px) {
  .nav-wrapper {
    padding-bottom: 16px;
  }
}

@media (min-height: 500px) and (max-height: 650px) and (max-width: 414px) and
       (orientation: portrait) {
  .interstitial-wrapper {
    margin-top: 7vh;
  }
}

@media (min-height: 650px) and (max-width: 414px) and (orientation: portrait) {
  .interstitial-wrapper {
    margin-top: 10vh;
  }
}

/* Small mobile screens. No fixed nav. */
@media (max-height: 400px) and (orientation: portrait),
       (max-height: 239px) and (orientation: landscape),
       (max-width: 419px) and (max-height: 399px) {
  .interstitial-wrapper {
    display: flex;
    flex-direction: column;
    margin-bottom: 0;
  }

  #details {
    flex: 1 1 auto;
    order: 0;
  }

  #main-content {
    flex: 1 1 auto;
    order: 0;
  }

  .nav-wrapper {
    flex: 0 1 auto;
    margin-top: 8px;
    order: 1;
    padding-left: 0;
    padding-right: 0;
    position: relative;
    width: 100%;
  }
}

@media (max-width: 239px) and (orientation: portrait) {
  .nav-wrapper {
    padding-left: 0;
    padding-right: 0;
  }
}
</style>
    <style>/* Copyright 2017 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

body {
  background-color: rgb(247, 247, 247);
  margin: 0;
}

#details {
  box-sizing: border-box;
  color: rgba(0, 0, 0, .54);
  font-family: Roboto-Regular, sans-serif;
  font-size: 0.93333em;
  height: auto;
  line-height: 1.48em;
  margin: 0;
  opacity: 1;
  transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1);
}

#details.hidden {
  display: block;
  height: 0;
  opacity: 0;
  overflow: hidden;
  padding-bottom: 0;
  transition: none;
}

#details-link {
  color: rgba(0, 0, 0, .38);
  text-decoration: underline;
  text-transform: none;
}

h1 {
  color: rgba(0, 0, 0, .38);
  font-family: Roboto-Regular, sans-serif;
  font-size: 0.93333em;
  font-weight: normal;
  line-height: 1.4em;
  margin: 8px 0 8px;
}

.giant .icon {
  bottom: 0;
  left: 0;
  margin: auto;
  position: fixed;
  right: 0;
  top: 0;
}

.giant #details,
.giant #main-message {
  display: none;
}

.icon {
  background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjBweCIgaGVpZ2h0PSIxNnB4IiB2aWV3Qm94PSIwIDAgMjAgMTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgPGcgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMi4wMDAwMDAsIC00LjAwMDAwMCkiPgogICAgICA8Zz4KICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz0iMCAwIDI0IDAgMjQgMjQgMCAyNCI+PC9wb2x5Z29uPgogICAgICAgICAgPHBhdGggZD0iTTIwLDQgQzIxLDQgMjIsNSAyMiw2IEwyMiwxOCBDMjIsMTkgMjEsMjAgMjAsMjAgTDQsMjAgQzIuOSwyMCAyLDE5LjEgMiwxOCBMMiw2IEMyLDUgMyw0IDQsNCBMMjAsNCBaIE0xNC4zOTIzMDMzLDE1LjQ1OTgyNzggTDE1LjQ5NDk3NDIsMTQuMzU4MTA2MiBMMTMuMTIwNzYzOSwxMS45ODU5Mzk3IEwxNS41LDkuNjA3NzQ3NDkgTDE0LjM5NzMyOTEsOC41MDYwMjU4MiBMMTIuMDE3MDg3OSwxMC44ODQyMTgxIEw5LjYzMTgyMDc5LDguNSBMOC41MjkxNDk5MSw5LjYwMTcyMTY2IEwxMC45MTU0MjIyLDExLjk4NTkzOTcgTDguNSwxNC4zOTgyNzgzIEw5LjYwMjY3MDg4LDE1LjUgTDEyLjAxNzA4NzksMTMuMDg2NjU3MSBMMTQuMzkyMzAzMywxNS40NTk4Mjc4IFoiIGZpbGwtb3BhY2l0eT0iMC4yIiBmaWxsPSIjMDAwMDAwIj48L3BhdGg+CiAgICAgIDwvZz4KICAgIDwvZz4KICA8L2c+Cjwvc3ZnPg==);
  background-position: center;
  height: 20vh;
  margin: 0 auto;
  max-height: 48px;
  max-width: 48px;
  min-height: 18px;
  min-width: 18px;
  opacity: .54;
  width: 20vh;
}

.interstitial-wrapper {
  align-items: center;
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  height: 100vh;
  justify-content: center;
  line-height: 1.6em;
  margin: 0 auto;
  max-width: 480px;
  padding: 16px;
  width: 100%;
}

#main-content {
  align-self: auto;
  flex: 0 1 auto;
  text-align: center;
}

@media (max-height:2em), (max-width:2em) {
  .icon {
    display: none;
  }
}

@media (min-height:25em) and (min-width:37.5em),
       (min-height:37.5em) and (min-width:25em) {
  .interstitial-wrapper {
    padding: 48px;
  }
}

/* Views that don't fit the details text. */
@media (max-height:11.25em) and (max-width:18.75em),
       (max-height:18.75em) and (max-width:11.25em),
       (max-height:5em), (max-width:5em) {
  .icon {
    max-height: 24px;
    max-width: 24px;
  }

  #details,
  #main-message {
    display: none;
  }
}
</style>
    <style>
      path {
        fill-opacity: 0.2;
      }

      .icon {
        background-image: none;
      }

      button,
      [dir='rtl'] button {
        float: none;
      }
    </style>
  </head>
  <body class="pdf">
    <div class="interstitial-wrapper">
      <div id="main-content">
        <div class="icon">
          <!-- Material Design PDF icon -->
          <svg viewBox="0 0 24 24">
            <path d="M7 11.5h1v-1H7v1zM19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9.5 8.5c0 .83-.67 1.5-1.5 1.5H7v2H5.5V9H8c.83 0 1.5.67 1.5 1.5v1zm10-1H17v1h1.5V13H17v2h-1.5V9h4v1.5zm-5 3c0 .83-.67 1.5-1.5 1.5h-2.5V9H13c.83 0 1.5.67 1.5 1.5v3zm-2.5 0h1v-3h-1v3z"></path>
          </svg>
        </div>
        <div id="main-message">
          <h1>$i18n{fileName}</h1>
        </div>
        <button onclick="plugin.openPDF()">$i18n{open}</a>
      </div>
    </div>
  </body>
</html>
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, user-scalable=no">
  <script>
    function setMessage(msg) {
      document.getElementById('message').textContent = msg;
    }
    function notifyDidFinishLoading() {
      if (plugin.didFinishLoading)
        plugin.didFinishLoading();

      if (plugin.didFinishIconRepositionForTesting)
        plugin.didFinishIconRepositionForTesting();
    }
  </script>
  <style>/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

html, body {
  -webkit-user-select: none;
  font-family: sans-serif;
  height: 100%;
  margin: 0;
  overflow: hidden;
  text-align: center;
  width: 100%;
}

h1 {
  display: none;
  font-size: 10pt;
  font-weight: normal;
  padding: 0pt 10pt;
}

p {
  font-size: 8pt;
  padding: 0pt 14pt;
}

#t {
  background-color: #f7f7f7;
  color: #646464;
}

#outer {
  align-items: center;
  box-sizing: border-box;
  display: flex;
  height: 100%;
  justify-content: center;
  position: absolute;
  width: 100%;
  flex-direction: column;
}

.icon {
  max-height: 100%;
  max-width: 100%;
  opacity: .3;
}

@media (orientation: landscape) and (min-height: 2em) and (min-width: 14em) {
  #outer {
    flex-direction: row;
  }
  .icon {
    max-height: 100%;
    max-width: 50%;
  }
  h1 {
    display: block;
  }
}

@media (min-height: 7em) and (min-width: 6em) {
  #outer {
    flex-direction: column;
  }
  .icon {
    max-height: 50%;
    max-width: 100%;
  }
  h1 {
    display: block;
  }
}
</style>
  <style>
  #outer {
    cursor: pointer;
  }
  </style>
</head>
<body id="t" onload="notifyDidFinishLoading();">
  <div i18n-values="title:name" id="outer">
    <img class="icon"
         src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzYyNjI2MiI+CiAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNNDEgMjJoLTN2LThjMC0yLjIxLTEuNzktNC00LTRoLThWN2MwLTIuNzYtMi4yNC01LTUtNXMtNSAyLjI0LTUgNXYzSDhjLTIuMjEgMC0zLjk4IDEuNzktMy45OCA0bC0uMDEgNy42SDdjMi45OCAwIDUuNCAyLjQyIDUuNCA1LjRTOS45OCAzMi40IDcgMzIuNEg0LjAxTDQgNDBjMCAyLjIxIDEuNzkgNCA0IDRoNy42di0zYzAtMi45OCAyLjQyLTUuNCA1LjQtNS40IDIuOTggMCA1LjQgMi40MiA1LjQgNS40djNIMzRjMi4yMSAwIDQtMS43OSA0LTR2LThoM2MyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXoiLz4KPC9zdmc+Cg==">
    <h1 id="message">$i18n{message}</h1>
  </div>
  <script>
    window.onkeydown = function(e) {
      if (e.key == 'Enter' || e.key == ' ') {
        plugin.showPermissionBubble();
        e.preventDefault();
      }
    };

    document.getElementById('outer').onclick = function() {
      plugin.showPermissionBubble();
    };
  </script>
</body>
</html>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no">
<script>
  window.onload = function() {
    if (plugin.didFinishLoading)
      plugin.didFinishLoading();
  };

  window.onkeydown = function(e) {
    if (e.key == 'Enter' || e.key == ' ') {
      plugin.load();
      e.preventDefault();
    }
  };
</script>
<style>/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file. */

html, body {
  -webkit-user-select: none;
  font-family: sans-serif;
  height: 100%;
  margin: 0;
  overflow: hidden;
  text-align: center;
  width: 100%;
}

h1 {
  display: none;
  font-size: 10pt;
  font-weight: normal;
  padding: 0pt 10pt;
}

p {
  font-size: 8pt;
  padding: 0pt 14pt;
}

#t {
  background-color: #f7f7f7;
  color: #646464;
}

#outer {
  align-items: center;
  box-sizing: border-box;
  display: flex;
  height: 100%;
  justify-content: center;
  position: absolute;
  width: 100%;
  flex-direction: column;
}

.icon {
  max-height: 100%;
  max-width: 100%;
  opacity: .3;
}

@media (orientation: landscape) and (min-height: 2em) and (min-width: 14em) {
  #outer {
    flex-direction: row;
  }
  .icon {
    max-height: 100%;
    max-width: 50%;
  }
  h1 {
    display: block;
  }
}

@media (min-height: 7em) and (min-width: 6em) {
  #outer {
    flex-direction: column;
  }
  .icon {
    max-height: 50%;
    max-width: 100%;
  }
  h1 {
    display: block;
  }
}
</style>
<style>
#outer {
  border: none;
  flex-direction: row;
  cursor: pointer;
}

#shielding {
  background-color: rgba(0, 0, 0, 0.5);
  height: 100%;
  left: 0px;
  position: absolute;
  top: 0px;
  width: 100%;
  z-index: 2;
}

#plugin-icon {
  opacity: 0.8;
  max-height: 100%;
  max-width: 100%;
  min-width: 0;
  min-height: 0;
}

#plugin-icon:hover {
  opacity: 0.95;
}

#poster {
  height: 100%;
  object-fit: contain;
  width: 100%;
  z-index: 1;
}

#inner-container {
  align-items: center;
  display: flex;
  height: 100%;
  justify-content: center;
  left: 0px;
  max-height: 100%;
  max-width: 100%;
  position: absolute;
  top: 0px;
  width: 100%;
  z-index: 2;
}
</style>
<base i18n-values="href:baseurl">
</head>

<body>
  <div i18n-values="title:name" id="outer">
    <img id="poster" i18n-values="srcset:poster">
    <div id="shielding"></div>
    <div id="inner-container"
         i18n-values=".style.width:visibleWidth;.style.height:visibleHeight">
      <img id="plugin-icon" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAQAAAC0NkA6AAAB4ElEQVR42r2YsWrCYBDHL9WYSMTJLCVj+hRCniIP4BAcBKl9AfeOydo3kBYc8w5uwS10EwcNFJFEPoRck5LSSrXJGbn/N2X6cf+77/LdQUU1QYE2aNApjpZ9KdCEm0gCGdrD3spOXOGnIUYoshOlofATd2UPexlMBqkOQPWMrSPmGOMlxWK+dTwD1OtArbG+n+IOq2i3n451aNEADbMbjdI1EpSuo5HZhUblGGbmcYFX6LiYmdXiUQPrNAZaPIEFahmivRngAevosBlA+98oMsQNlGHUi7kIrCKKujoE1vncNGZmSS5IuZmZZyrN7JZUFLnSzO4fq6IR3ljR6NQyaayXW0W3bKz/bjbqflqayxcUVMx++lNlkmeU96hlf9lP34mUnWd8xyJvHcRyCCjP9+KNRtk6IBe3XMwrQe6yo308UWwT8+L2D3sYV4TkUkm2xcMeZGqubEQCBECm2LayoQmgJC4RAl+2TarZlrig5BnxqRCKbcLPs6KlIRVCsS0NQQPoYESFkGyLoJNDBBVCsk0wQerb9VhuF0viWUqY5TKytBWWBklv9RNqq2f5abH8fhkeEixPIobHHcMzleXBzTA6MAxB7OMc/2BaqPX6UGfEZlgWMKw9eBc4/KsolqXaJzX9KQtjij5PAAAAAElFTkSuQmCC" />
    </div>
  </div>
  <script>
    document.getElementById('poster').onerror = function() {
      this.hidden = true;
    };

    document.getElementById('outer').onclick = function() {
      plugin.load();
    };

    window.resizePoster = function(marginLeft, marginTop, width, height) {
      var container = document.getElementById('inner-container');
      container.style.marginLeft = marginLeft;
      container.style.marginTop = marginTop;
      container.style.width = width;
      container.style.height = height;

      if (plugin.didFinishIconRepositionForTesting) {
        // Defer until reflow complete.
        window.setTimeout(function() {
          plugin.didFinishIconRepositionForTesting();
        });
      }
    };
  </script>
</body>
</html>
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the app API.

var appNatives = requireNative('app');
var process = requireNative('process');
var extensionId = process.GetExtensionId();
var logActivity = requireNative('activityLogger');

function wrapForLogging(fun) {
  if (!extensionId)
    return fun;  // nothing interesting to log without an extension

  return function() {
    // TODO(ataly): We need to make sure we use the right prototype for
    // fun.apply. Array slice can either be rewritten or similarly defined.
    logActivity.LogAPICall(extensionId, "app." + fun.name,
        $Array.slice(arguments));
    return $Function.apply(fun, this, arguments);
  };
}

// This becomes chrome.app
var app = {
  getIsInstalled: wrapForLogging(appNatives.GetIsInstalled),
  getDetails: wrapForLogging(appNatives.GetDetails),
  runningState: wrapForLogging(appNatives.GetRunningState)
};

// Tricky; "getIsInstalled" is actually exposed as the getter "isInstalled",
// but we don't have a way to express this in the schema JSON (nor is it
// worth it for this one special case).
//
// So, define it manually, and let the getIsInstalled function act as its
// documentation.
var isInstalled = wrapForLogging(appNatives.GetIsInstalled);
$Object.defineProperty(
    app, 'isInstalled',
    {
      __proto__: null,
      configurable: true,
      enumerable: true,
      get: function() { return isInstalled(); },
    });

// Called by app_bindings.cc.
function onInstallStateResponse(state, callbackId) {
  var callback = callbacks[callbackId];
  delete callbacks[callbackId];
  if (typeof callback == 'function') {
    try {
      callback(state);
    } catch (e) {
      console.error('Exception in chrome.app.installState response handler: ' +
                    e.stack);
    }
  }
}

// TODO(kalman): move this stuff to its own custom bindings.
var callbacks = { __proto__: null };
var nextCallbackId = 1;

function getInstallState(callback) {
  var callbackId = nextCallbackId++;
  callbacks[callbackId] = callback;
  appNatives.GetInstallState(callbackId);
}

$Object.defineProperty(
    app, 'installState',
    {
      __proto__: null,
      configurable: true,
      enumerable: true,
      value: wrapForLogging(getInstallState),
      writable: true,
    });

exports.$set('binding', app);
exports.$set('onInstallStateResponse', onInstallStateResponse);
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom bindings for the automation API.
var AutomationNode = require('automationNode').AutomationNode;
var AutomationRootNode = require('automationNode').AutomationRootNode;
var automation = apiBridge || require('binding').Binding.create('automation');
var automationInternal =
    getInternalApi ?
        getInternalApi('automationInternal') :
        require('binding').Binding.create('automationInternal').generate();
var exceptionHandler = require('uncaught_exception_handler');
var logging = requireNative('logging');
var nativeAutomationInternal = requireNative('automationInternal');
var DestroyAccessibilityTree =
    nativeAutomationInternal.DestroyAccessibilityTree;
var GetIntAttribute = nativeAutomationInternal.GetIntAttribute;
var StartCachingAccessibilityTrees =
    nativeAutomationInternal.StartCachingAccessibilityTrees;
var AddTreeChangeObserver = nativeAutomationInternal.AddTreeChangeObserver;
var RemoveTreeChangeObserver =
    nativeAutomationInternal.RemoveTreeChangeObserver;
var GetFocusNative = nativeAutomationInternal.GetFocus;

var jsLastError = bindingUtil ? undefined : require('lastError');
function hasLastError() {
  return bindingUtil ?
      bindingUtil.hasLastError() : jsLastError.hasError(chrome);
}

/**
 * A namespace to export utility functions to other files in automation.
 */
window.automationUtil = function() {};

// TODO(aboxhall): Look into using WeakMap
var idToCallback = {};

var DESKTOP_TREE_ID = 0;

automationUtil.storeTreeCallback = function(id, callback) {
  if (!callback)
    return;

  var targetTree = AutomationRootNode.get(id);
  if (!targetTree) {
    // If we haven't cached the tree, hold the callback until the tree is
    // populated by the initial onAccessibilityEvent call.
    if (id in idToCallback)
      idToCallback[id].push(callback);
    else
      idToCallback[id] = [callback];
  } else {
    callback(targetTree);
  }
};

/**
 * Global list of tree change observers.
 * @type {Object<number, TreeChangeObserver>}
 */
automationUtil.treeChangeObserverMap = {};

/**
 * The id of the next tree change observer.
 * @type {number}
 */
automationUtil.nextTreeChangeObserverId = 1;

/**
 * @type {AutomationNode} The current focused node. This is only updated
 *   when calling automationUtil.updateFocusedNode.
 */
automationUtil.focusedNode = null;

/**
 * Gets the currently focused AutomationNode.
 * @return {AutomationNode}
 */
automationUtil.getFocus = function() {
  var focusedNodeInfo = GetFocusNative(DESKTOP_TREE_ID);
  if (!focusedNodeInfo)
    return null;
  var tree = AutomationRootNode.getOrCreate(focusedNodeInfo.treeId);
  if (tree)
    return privates(tree).impl.get(focusedNodeInfo.nodeId);
};

/**
 * Update automationUtil.focusedNode to be the node that currently has focus.
 */
automationUtil.updateFocusedNode = function() {
  automationUtil.focusedNode = automationUtil.getFocus();
};

/**
 * Updates the focus on blur.
 */
automationUtil.updateFocusedNodeOnBlur = function() {
  var focus = automationUtil.getFocus();
  automationUtil.focusedNode = focus ? focus.root : null;
};

automation.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  // TODO(aboxhall, dtseng): Make this return the speced AutomationRootNode obj.
  apiFunctions.setHandleRequest('getTree', function getTree(tabID, callback) {
    StartCachingAccessibilityTrees();

    // enableTab() ensures the renderer for the active or specified tab has
    // accessibility enabled, and fetches its ax tree id to use as
    // a key in the idToAutomationRootNode map. The callback to
    // enableTab is bound to the callback passed in to getTree(), so that once
    // the tree is available (either due to having been cached earlier, or after
    // an accessibility event occurs which causes the tree to be populated), the
    // callback can be called.
    var params = { tabID: tabID };
    automationInternal.enableTab(params,
        function onEnable(id) {
          if (hasLastError()) {
            callback();
            return;
          }
          automationUtil.storeTreeCallback(id, callback);
        });
  });

  var desktopTree = null;
  apiFunctions.setHandleRequest('getDesktop', function(callback) {
    StartCachingAccessibilityTrees();
    desktopTree = AutomationRootNode.get(DESKTOP_TREE_ID);
    if (!desktopTree) {
      if (DESKTOP_TREE_ID in idToCallback)
        idToCallback[DESKTOP_TREE_ID].push(callback);
      else
        idToCallback[DESKTOP_TREE_ID] = [callback];

      // TODO(dtseng): Disable desktop tree once desktop object goes out of
      // scope.
      automationInternal.enableDesktop(function() {
        if (hasLastError()) {
          AutomationRootNode.destroy(DESKTOP_TREE_ID);
          callback();
          return;
        }
      });
    } else {
      callback(desktopTree);
    }
  });

  apiFunctions.setHandleRequest('getFocus', function(callback) {
    callback(automationUtil.getFocus());
  });

  function removeTreeChangeObserver(observer) {
    for (var id in automationUtil.treeChangeObserverMap) {
      if (automationUtil.treeChangeObserverMap[id] == observer) {
        RemoveTreeChangeObserver(id);
        delete automationUtil.treeChangeObserverMap[id];
        return;
      }
    }
  }
  apiFunctions.setHandleRequest('removeTreeChangeObserver', function(observer) {
    removeTreeChangeObserver(observer);
  });

  function addTreeChangeObserver(filter, observer) {
    removeTreeChangeObserver(observer);
    var id = automationUtil.nextTreeChangeObserverId++;
    AddTreeChangeObserver(id, filter);
    automationUtil.treeChangeObserverMap[id] = observer;
  }
  apiFunctions.setHandleRequest('addTreeChangeObserver',
      function(filter, observer) {
    addTreeChangeObserver(filter, observer);
  });

  apiFunctions.setHandleRequest('setDocumentSelection', function(params) {
    var anchorNodeImpl = privates(params.anchorObject).impl;
    var focusNodeImpl = privates(params.focusObject).impl;
    if (anchorNodeImpl.treeID !== focusNodeImpl.treeID)
      throw new Error('Selection anchor and focus must be in the same tree.');
    if (anchorNodeImpl.treeID === DESKTOP_TREE_ID) {
      throw new Error('Use AutomationNode.setSelection to set the selection ' +
          'in the desktop tree.');
    }
    automationInternal.performAction({ treeID: anchorNodeImpl.treeID,
                                       automationNodeID: anchorNodeImpl.id,
                                       actionType: 'setSelection'},
                                     { focusNodeID: focusNodeImpl.id,
                                       anchorOffset: params.anchorOffset,
                                       focusOffset: params.focusOffset });
  });

});

automationInternal.onChildTreeID.addListener(function(treeID,
                                                      nodeID) {
  var tree = AutomationRootNode.getOrCreate(treeID);
  if (!tree)
    return;

  var node = privates(tree).impl.get(nodeID);
  if (!node)
    return;

  // A WebView in the desktop tree has a different AX tree as its child.
  // When we encounter a WebView with a child AX tree id that we don't
  // currently have cached, explicitly request that AX tree from the
  // browser process and set up a callback when it loads to attach that
  // tree as a child of this node and fire appropriate events.
  var childTreeID = GetIntAttribute(treeID, nodeID, 'childTreeId');
  if (!childTreeID)
    return;

  var subroot = AutomationRootNode.get(childTreeID);
  if (!subroot || subroot.role == 'unknown') {
    automationUtil.storeTreeCallback(childTreeID, function(root) {
      // Return early if the root has already been attached.
      if (root.parent)
        return;

      privates(root).impl.setHostNode(node);

      if (root.docLoaded) {
        privates(root).impl.dispatchEvent('loadComplete', 'page');
      }

      privates(node).impl.dispatchEvent('childrenChanged', 'none');
    });

    automationInternal.enableFrame(childTreeID);
  } else {
    privates(subroot).impl.setHostNode(node);
  }
});

automationInternal.onTreeChange.addListener(function(observerID,
                                                     treeID,
                                                     nodeID,
                                                     changeType) {
  var tree = AutomationRootNode.getOrCreate(treeID);
  if (!tree)
    return;

  var node = privates(tree).impl.get(nodeID);
  if (!node)
    return;

  var observer = automationUtil.treeChangeObserverMap[observerID];
  if (!observer)
    return;

  try {
    observer({target: node, type: changeType});
  } catch (e) {
    exceptionHandler.handle('Error in tree change observer for ' +
        treeChange.type, e);
  }
});

automationInternal.onNodesRemoved.addListener(function(treeID, nodeIDs) {
  var tree = AutomationRootNode.getOrCreate(treeID);
  if (!tree)
    return;

  for (var i = 0; i < nodeIDs.length; i++) {
    privates(tree).impl.remove(nodeIDs[i]);
  }
});

/**
 * Dispatch accessibility events fired on individual nodes to its
 * corresponding AutomationNode. Handle focus events specially
 * (see below).
 */
automationInternal.onAccessibilityEvent.addListener(function(eventParams) {
  var id = eventParams.treeID;
  var targetTree = AutomationRootNode.getOrCreate(id);
  if (eventParams.eventType == 'blur') {
    // Work around an issue where Chrome sends us 'blur' events on the
    // root node when nothing has focus, we need to treat those as focus
    // events but otherwise not handle blur events specially.
    var node = privates(targetTree).impl.get(eventParams.targetID);
    if (node == node.root)
      automationUtil.updateFocusedNodeOnBlur();
  } else if (eventParams.eventType == 'mediaStartedPlaying' ||
      eventParams.eventType == 'mediaStoppedPlaying') {
    // These events are global to the tree.
    eventParams.targetID = privates(targetTree).impl.id;
  } else {
    var previousFocusedNode = automationUtil.focusedNode;
    automationUtil.updateFocusedNode();

    // Fire focus events if necessary.
    if (automationUtil.focusedNode &&
        automationUtil.focusedNode != previousFocusedNode) {
      var eventParamsCopy = {};
      for (var key in eventParams)
        eventParamsCopy[key] = eventParams[key];
      eventParamsCopy['eventType'] = 'focus';
      eventParamsCopy['treeID'] =
          privates(automationUtil.focusedNode.root).impl.treeID;
      eventParamsCopy['targetID'] =
          privates(automationUtil.focusedNode).impl.id;
      privates(automationUtil.focusedNode.root)
          .impl.onAccessibilityEvent(eventParamsCopy);
    }
  }

  // Note that focus type events have already been handled above if there was a
  // focused node. All other events, even non-focus events that triggered a
  // focus dispatch, still need to have their original event fired.
  if ((!automationUtil.focusedNode || eventParams.eventType != 'focus') &&
      !privates(targetTree).impl.onAccessibilityEvent(eventParams))
    return;

  // If we're not waiting on a callback to getTree(), we can early out here.
  if (!(id in idToCallback))
    return;

  // We usually get a 'placeholder' tree first, which doesn't have any url
  // attribute or child nodes. If we've got that, wait for the full tree before
  // calling the callback.
  // TODO(dmazzoni): Don't send down placeholder (crbug.com/397553)
  if (id != DESKTOP_TREE_ID && !targetTree.url &&
      targetTree.children.length == 0)
    return;

  // If the tree wasn't available when getTree() was called, the callback will
  // have been cached in idToCallback, so call and delete it now that we
  // have the complete tree.
  for (var i = 0; i < idToCallback[id].length; i++) {
    var callback = idToCallback[id][i];
    callback(targetTree);
  }
  delete idToCallback[id];
});

automationInternal.onAccessibilityTreeDestroyed.addListener(function(id) {
  // Destroy the AutomationRootNode.
  var targetTree = AutomationRootNode.get(id);
  if (targetTree) {
    privates(targetTree).impl.destroy();
    AutomationRootNode.destroy(id);
  } else {
    logging.WARNING('no targetTree to destroy');
  }

  // Destroy the native cache of the accessibility tree.
  DestroyAccessibilityTree(id);
});

automationInternal.onAccessibilityTreeSerializationError.addListener(
    function(id) {
  automationInternal.enableFrame(id);
});

automationInternal.onActionResult.addListener(
    function(treeID, requestID, result) {
  var targetTree = AutomationRootNode.get(treeID);
  if (!targetTree)
    return;

  privates(targetTree).impl.onActionResult(requestID, result);
    });

if (!apiBridge)
  exports.$set('binding', automation.generate());
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var utils = require('utils');

function AutomationEventImpl(type, target, eventFrom) {
  this.propagationStopped = false;
  this.type = type;
  this.target = target;
  this.eventPhase = Event.NONE;
  this.eventFrom = eventFrom;
}

AutomationEventImpl.prototype = {
  __proto__: null,
  stopPropagation: function() {
    this.propagationStopped = true;
  },
};

function AutomationEvent() {
  privates(AutomationEvent).constructPrivate(this, arguments);
}
utils.expose(AutomationEvent, AutomationEventImpl, {
  functions: [
    'stopPropagation',
  ],
  readonly: [
    'type',
    'target',
    'eventPhase',
    'eventFrom',
  ],
});

exports.$set('AutomationEvent', AutomationEvent);
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var AutomationEvent = require('automationEvent').AutomationEvent;
var automationInternal =
    getInternalApi ?
        getInternalApi('automationInternal') :
        require('binding').Binding.create('automationInternal').generate();
var exceptionHandler = require('uncaught_exception_handler');

var natives = requireNative('automationInternal');

var IsInteractPermitted = natives.IsInteractPermitted;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?number} The id of the root node.
 */
var GetRootID = natives.GetRootID;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?string} The title of the document.
 */
var GetDocTitle = natives.GetDocTitle;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?string} The url of the document.
 */
var GetDocURL = natives.GetDocURL;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?boolean} True if the document has finished loading.
 */
var GetDocLoaded = natives.GetDocLoaded;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?number} The loading progress, from 0.0 to 1.0 (fully loaded).
 */
var GetDocLoadingProgress =
    natives.GetDocLoadingProgress;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?number} The ID of the selection anchor object.
 */
var GetAnchorObjectID = natives.GetAnchorObjectID;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?number} The selection anchor offset.
 */
var GetAnchorOffset = natives.GetAnchorOffset;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?string} The selection anchor affinity.
 */
var GetAnchorAffinity = natives.GetAnchorAffinity;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?number} The ID of the selection focus object.
 */
var GetFocusObjectID = natives.GetFocusObjectID;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?number} The selection focus offset.
 */
var GetFocusOffset = natives.GetFocusOffset;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @return {?string} The selection focus affinity.
 */
var GetFocusAffinity = natives.GetFocusAffinity;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?number} The id of the node's parent, or undefined if it's the
 *    root of its tree or if the tree or node wasn't found.
 */
var GetParentID = natives.GetParentID;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?number} The number of children of the node, or undefined if
 *     the tree or node wasn't found.
 */
var GetChildCount = natives.GetChildCount;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {number} childIndex An index of a child of this node.
 * @return {?number} The id of the child at the given index, or undefined
 *     if the tree or node or child at that index wasn't found.
 */
var GetChildIDAtIndex = natives.GetChildIDAtIndex;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?number} The ids of the children of the node, or undefined
 *     if the tree or node wasn't found.
 */
var GetChildIds = natives.GetChildIDs;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?Object} An object mapping html attributes to values.
 */
var GetHtmlAttributes = natives.GetHtmlAttributes;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?number} The index of this node in its parent, or undefined if
 *     the tree or node or node parent wasn't found.
 */
var GetIndexInParent = natives.GetIndexInParent;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?Object} An object with a string key for every state flag set,
 *     or undefined if the tree or node or node parent wasn't found.
 */
var GetState = natives.GetState;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {string} The restriction, one of
 * "disabled", "readOnly" or undefined if enabled or other object not disabled
 */
var GetRestriction = natives.GetRestriction;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {string} The checked state, as undefined, "true", "false" or "mixed".
 */
var GetChecked = natives.GetChecked;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {string} The role of the node, or undefined if the tree or
 *     node wasn't found.
 */
var GetRole = natives.GetRole;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?automation.Rect} The location of the node, or undefined if
 *     the tree or node wasn't found.
 */
var GetLocation = natives.GetLocation;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {number} startIndex The start index of the range.
 * @param {number} endIndex The end index of the range.
 * @return {?automation.Rect} The bounding box of the subrange of this node,
 *     or the location if there are no subranges, or undefined if
 *     the tree or node wasn't found.
 */
var GetBoundsForRange = natives.GetBoundsForRange;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?automation.Rect} The unclipped location of the node, or
 * undefined if the tree or node wasn't found.
 */
var GetUnclippedLocation = natives.GetUnclippedLocation;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {!Array<number>} The text offset where each line starts, or an empty
 *     array if this node has no text content, or undefined if the tree or node
 *     was not found.
 */
var GetLineStartOffsets = requireNative(
    'automationInternal').GetLineStartOffsets;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {string} attr The name of a string attribute.
 * @return {?string} The value of this attribute, or undefined if the tree,
 *     node, or attribute wasn't found.
 */
var GetStringAttribute = natives.GetStringAttribute;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {string} attr The name of an attribute.
 * @return {?boolean} The value of this attribute, or undefined if the tree,
 *     node, or attribute wasn't found.
 */
var GetBoolAttribute = natives.GetBoolAttribute;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {string} attr The name of an attribute.
 * @return {?number} The value of this attribute, or undefined if the tree,
 *     node, or attribute wasn't found.
 */
var GetIntAttribute = natives.GetIntAttribute;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {string} attr The name of an attribute.
 * @return {?Array<number>} The ids of nodes who have a relationship pointing
 *     to |nodeID| (a reverse relationship).
 */
var GetIntAttributeReverseRelations =
    natives.GetIntAttributeReverseRelations;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {string} attr The name of an attribute.
 * @return {?number} The value of this attribute, or undefined if the tree,
 *     node, or attribute wasn't found.
 */
var GetFloatAttribute = natives.GetFloatAttribute;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {string} attr The name of an attribute.
 * @return {?Array<number>} The value of this attribute, or undefined
 *     if the tree, node, or attribute wasn't found.
 */
var GetIntListAttribute =
    natives.GetIntListAttribute;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {string} attr The name of an attribute.
 * @return {?Array<number>} The ids of nodes who have a relationship pointing
 *     to |nodeID| (a reverse relationship).
 */
var GetIntListAttributeReverseRelations =
    natives.GetIntListAttributeReverseRelations;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @param {string} attr The name of an HTML attribute.
 * @return {?string} The value of this attribute, or undefined if the tree,
 *     node, or attribute wasn't found.
 */
var GetHtmlAttribute = natives.GetHtmlAttribute;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {automation.NameFromType} The source of the node's name.
 */
var GetNameFrom = natives.GetNameFrom;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {boolean}
 */
var GetBold = natives.GetBold;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {boolean}
 */
var GetItalic = natives.GetItalic;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {boolean}
 */
var GetUnderline = natives.GetUnderline;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {boolean}
 */
var GetLineThrough = natives.GetLineThrough;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?Array<automation.CustomAction>} List of custom actions of the
 *     node.
 */
var GetCustomActions = natives.GetCustomActions;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {?Array<string>} List of standard actions of the node.
 */
var GetStandardActions = natives.GetStandardActions;

/**
 * @param {number} axTreeID The id of the accessibility tree.
 * @param {number} nodeID The id of a node.
 * @return {automation.NameFromType} The source of the node's name.
 */
var GetDefaultActionVerb = natives.GetDefaultActionVerb;

var logging = requireNative('logging');
var utils = require('utils');

/**
 * A single node in the Automation tree.
 * @param {AutomationRootNodeImpl} root The root of the tree.
 * @constructor
 */
function AutomationNodeImpl(root) {
  this.rootImpl = root;
  this.hostNode_ = null;
  this.listeners = {__proto__: null};
}

AutomationNodeImpl.prototype = {
  __proto__: null,
  treeID: -1,
  id: -1,
  isRootNode: false,

  detach: function() {
    this.rootImpl = null;
    this.hostNode_ = null;
    this.listeners = {__proto__: null};
  },

  get root() {
    return this.rootImpl && this.rootImpl.wrapper;
  },

  get parent() {
    if (!this.rootImpl)
      return undefined;
    if (this.hostNode_)
      return this.hostNode_;
    var parentID = GetParentID(this.treeID, this.id);
    return this.rootImpl.get(parentID);
  },

  get htmlAttributes() {
    return GetHtmlAttributes(this.treeID, this.id) || {};
  },

  get state() {
    return GetState(this.treeID, this.id) || {};
  },

  get role() {
    return GetRole(this.treeID, this.id);
  },

  get restriction() {
    return GetRestriction(this.treeID, this.id);
  },

  get checked() {
    return GetChecked(this.treeID, this.id);
  },

  get location() {
    return GetLocation(this.treeID, this.id);
  },

  boundsForRange: function(startIndex, endIndex) {
    return GetBoundsForRange(this.treeID, this.id, startIndex, endIndex);
  },

  get unclippedLocation() {
    var result = GetUnclippedLocation(this.treeID, this.id);
    if (result === undefined)
      result = GetLocation(this.treeID, this.id);
    return result;
  },

  get indexInParent() {
    return GetIndexInParent(this.treeID, this.id);
  },

  get lineStartOffsets() {
    return GetLineStartOffsets(this.treeID, this.id);
  },

  get childTree() {
    var childTreeID = GetIntAttribute(this.treeID, this.id, 'childTreeId');
    if (childTreeID)
      return AutomationRootNodeImpl.get(childTreeID);
  },

  get firstChild() {
    if (!this.rootImpl)
      return undefined;
    if (this.childTree)
      return this.childTree;
    if (!GetChildCount(this.treeID, this.id))
      return undefined;
    var firstChildID = GetChildIDAtIndex(this.treeID, this.id, 0);
    return this.rootImpl.get(firstChildID);
  },

  get lastChild() {
    if (!this.rootImpl)
      return undefined;
    if (this.childTree)
      return this.childTree;
    var count = GetChildCount(this.treeID, this.id);
    if (!count)
      return undefined;
    var lastChildID = GetChildIDAtIndex(this.treeID, this.id, count - 1);
    return this.rootImpl.get(lastChildID);
  },

  get children() {
    if (!this.rootImpl)
      return [];

    if (this.childTree)
      return [this.childTree];

    var children = [];
    var childIds = GetChildIds(this.treeID, this.id);
    for (var i = 0; i < childIds.length; ++i) {
      var childID = childIds[i];
      var child = this.rootImpl.get(childID);
      $Array.push(children, child);
    }
    return children;
  },

  get previousSibling() {
    var parent = this.parent;
    if (!parent)
      return undefined;
    parent = privates(parent).impl;
    var indexInParent = GetIndexInParent(this.treeID, this.id);
    return this.rootImpl.get(
        GetChildIDAtIndex(parent.treeID, parent.id, indexInParent - 1));
  },

  get nextSibling() {
    var parent = this.parent;
    if (!parent)
      return undefined;
    parent = privates(parent).impl;
    var indexInParent = GetIndexInParent(this.treeID, this.id);
    return this.rootImpl.get(
        GetChildIDAtIndex(parent.treeID, parent.id, indexInParent + 1));
  },

  get nameFrom() {
    return GetNameFrom(this.treeID, this.id);
  },

  get bold() {
    return GetBold(this.treeID, this.id);
  },

  get italic() {
    return GetItalic(this.treeID, this.id);
  },

  get underline() {
    return GetUnderline(this.treeID, this.id);
  },

  get lineThrough() {
    return GetLineThrough(this.treeID, this.id);
  },

  get customActions() {
    return GetCustomActions(this.treeID, this.id);
  },

  get standardActions() {
    return GetStandardActions(this.treeID, this.id);
  },

  get defaultActionVerb() {
    return GetDefaultActionVerb(this.treeID, this.id);
  },

  doDefault: function() {
    this.performAction_('doDefault');
  },

  focus: function() {
    this.performAction_('focus');
  },

  getImageData: function(maxWidth, maxHeight) {
    this.performAction_('getImageData',
                        { maxWidth: maxWidth,
                          maxHeight: maxHeight });
  },

  hitTest: function(x, y, eventToFire) {
    this.hitTestInternal(x, y, eventToFire);
  },

  hitTestWithReply: function(x, y, opt_callback) {
    this.hitTestInternal(x, y, 'hitTestResult', opt_callback);
  },

  hitTestInternal: function(x, y, eventToFire, opt_callback) {
    // Convert from global to tree-relative coordinates.
    var location = GetLocation(this.treeID, GetRootID(this.treeID));
    this.performAction_('hitTest',
                        { x: Math.floor(x - location.left),
                          y: Math.floor(y - location.top),
                          eventToFire: eventToFire },
                        opt_callback);
  },

  makeVisible: function() {
    this.performAction_('scrollToMakeVisible');
  },

  performCustomAction: function(customActionId) {
    this.performAction_('customAction', { customActionID: customActionId });
  },

  performStandardAction: function(action) {
    var standardActions = GetStandardActions(this.treeID, this.id);
    if (!standardActions ||
        !standardActions.find(item => action == item)) {
      throw 'Inapplicable action for node: ' + action;
    }
    this.performAction_(action);
  },

  replaceSelectedText: function(value) {
    if (this.state.editable) {
      this.performAction_('replaceSelectedText', { value: value});
    }
  },

  resumeMedia: function() {
    this.performAction_('resumeMedia');
  },

  scrollBackward: function(opt_callback) {
    this.performAction_('scrollBackward', {}, opt_callback);
  },

  scrollForward: function(opt_callback) {
    this.performAction_('scrollForward', {}, opt_callback);
  },

  scrollUp: function(opt_callback) {
    this.performAction_('scrollUp', {}, opt_callback);
  },

  scrollDown: function(opt_callback) {
    this.performAction_('scrollDown', {}, opt_callback);
  },

  scrollLeft: function(opt_callback) {
    this.performAction_('scrollLeft', {}, opt_callback);
  },

  scrollRight: function(opt_callback) {
    this.performAction_('scrollRight', {}, opt_callback);
  },

  setSelection: function(startIndex, endIndex) {
    if (this.state.editable) {
      this.performAction_('setSelection',
                          { focusNodeID: this.id,
                            anchorOffset: startIndex,
                            focusOffset: endIndex });
    }
  },

  setSequentialFocusNavigationStartingPoint: function() {
    this.performAction_('setSequentialFocusNavigationStartingPoint');
  },

  setValue: function(value) {
    if (this.state.editable) {
      this.performAction_('setValue', { value: value});
    }
  },

  showContextMenu: function() {
    this.performAction_('showContextMenu');
  },

  startDuckingMedia: function() {
    this.performAction_('startDuckingMedia');
  },

  stopDuckingMedia: function() {
    this.performAction_('stopDuckingMedia');
  },

  suspendMedia: function() {
    this.performAction_('suspendMedia');
  },

  domQuerySelector: function(selector, callback) {
    if (!this.rootImpl)
      callback();
    automationInternal.querySelector(
      { treeID: this.rootImpl.treeID,
        automationNodeID: this.id,
        selector: selector },
      $Function.bind(this.domQuerySelectorCallback_, this, callback));
  },

  find: function(params) {
    return this.findInternal_(params);
  },

  findAll: function(params) {
    return this.findInternal_(params, []);
  },

  matches: function(params) {
    return this.matchInternal_(params);
  },

  addEventListener: function(eventType, callback, capture) {
    this.removeEventListener(eventType, callback);
    if (!this.listeners[eventType])
      this.listeners[eventType] = [];
    $Array.push(this.listeners[eventType], {
      __proto__: null,
      callback: callback,
      capture: !!capture,
    });
  },

  // TODO(dtseng/aboxhall): Check this impl against spec.
  removeEventListener: function(eventType, callback) {
    if (this.listeners[eventType]) {
      var listeners = this.listeners[eventType];
      for (var i = 0; i < listeners.length; i++) {
        if (callback === listeners[i].callback)
          $Array.splice(listeners, i, 1);
      }
    }
  },

  toJSON: function() {
    return { treeID: this.treeID,
             id: this.id,
             role: this.role,
             attributes: this.attributes };
  },

  dispatchEvent: function(eventType, eventFrom, mouseX, mouseY) {
    var path = [];
    var parent = this.parent;
    while (parent) {
      $Array.push(path, parent);
      parent = parent.parent;
    }
    var event = new AutomationEvent(eventType, this.wrapper, eventFrom);
    event.mouseX = mouseX;
    event.mouseY = mouseY;

    // Dispatch the event through the propagation path in three phases:
    // - capturing: starting from the root and going down to the target's parent
    // - targeting: dispatching the event on the target itself
    // - bubbling: starting from the target's parent, going back up to the root.
    // At any stage, a listener may call stopPropagation() on the event, which
    // will immediately stop event propagation through this path.
    if (this.dispatchEventAtCapturing_(event, path)) {
      if (this.dispatchEventAtTargeting_(event, path))
        this.dispatchEventAtBubbling_(event, path);
    }
  },

  toString: function() {
    var parentID = GetParentID(this.treeID, this.id);
    var childTreeID = GetIntAttribute(this.treeID, this.id, 'childTreeId');
    var count = GetChildCount(this.treeID, this.id);
    var childIDs = [];
    for (var i = 0; i < count; ++i) {
      var childID = GetChildIDAtIndex(this.treeID, this.id, i);
      $Array.push(childIDs, childID);
    }

    var result = 'node id=' + this.id +
        ' role=' + this.role +
        ' state=' + $JSON.stringify(this.state) +
        ' parentID=' + parentID +
        ' childIds=' + $JSON.stringify(childIDs);
    if (this.hostNode_) {
      var hostNodeImpl = privates(this.hostNode_).impl;
      result += ' host treeID=' + hostNodeImpl.treeID +
          ' host nodeID=' + hostNodeImpl.id;
    }
    if (childTreeID)
      result += ' childTreeID=' + childTreeID;
    return result;
  },

  dispatchEventAtCapturing_: function(event, path) {
    privates(event).impl.eventPhase = Event.CAPTURING_PHASE;
    for (var i = path.length - 1; i >= 0; i--) {
      this.fireEventListeners_(path[i], event);
      if (privates(event).impl.propagationStopped)
        return false;
    }
    return true;
  },

  dispatchEventAtTargeting_: function(event) {
    privates(event).impl.eventPhase = Event.AT_TARGET;
    this.fireEventListeners_(this.wrapper, event);
    return !privates(event).impl.propagationStopped;
  },

  dispatchEventAtBubbling_: function(event, path) {
    privates(event).impl.eventPhase = Event.BUBBLING_PHASE;
    for (var i = 0; i < path.length; i++) {
      this.fireEventListeners_(path[i], event);
      if (privates(event).impl.propagationStopped)
        return false;
    }
    return true;
  },

  fireEventListeners_: function(node, event) {
    var nodeImpl = privates(node).impl;
    if (!nodeImpl.rootImpl)
      return;

    var listeners = nodeImpl.listeners[event.type];
    if (!listeners)
      return;
    var eventPhase = event.eventPhase;
    for (var i = 0; i < listeners.length; i++) {
      if (eventPhase == Event.CAPTURING_PHASE && !listeners[i].capture)
        continue;
      if (eventPhase == Event.BUBBLING_PHASE && listeners[i].capture)
        continue;

      try {
        listeners[i].callback(event);
      } catch (e) {
        exceptionHandler.handle('Error in event handler for ' + event.type +
            ' during phase ' + eventPhase, e);
      }
    }
  },

  performAction_: function(actionType, opt_args, opt_callback) {
    if (!this.rootImpl)
      return;

    // Not yet initialized.
    if (this.rootImpl.treeID === undefined ||
        this.id === undefined) {
      return;
    }

    // Check permissions.
    if (!IsInteractPermitted()) {
      throw new Error(actionType + ' requires {"desktop": true} or' +
          ' {"interact": true} in the "automation" manifest key.');
    }
    var requestID = -1;
    if (opt_callback) {
      requestID = this.rootImpl.addActionResultCallback(opt_callback);
    }

    automationInternal.performAction({ treeID: this.rootImpl.treeID,
                                       automationNodeID: this.id,
                                       actionType: actionType,
                                       requestID: requestID},
                                     opt_args || {});
  },

  domQuerySelectorCallback_: function(userCallback, resultAutomationNodeID) {
    // resultAutomationNodeID could be zero or undefined or (unlikely) null;
    // they all amount to the same thing here, which is that no node was
    // returned.
    if (!resultAutomationNodeID || !this.rootImpl) {
      userCallback(null);
      return;
    }
    var resultNode = this.rootImpl.get(resultAutomationNodeID);
    if (!resultNode) {
      logging.WARNING('Query selector result not in tree: ' +
                      resultAutomationNodeID);
      userCallback(null);
    }
    userCallback(resultNode);
  },

  findInternal_: function(params, opt_results) {
    var result = null;
    this.forAllDescendants_(function(node) {
      if (privates(node).impl.matchInternal_(params)) {
        if (opt_results)
          $Array.push(opt_results, node);
        else
          result = node;
        return !opt_results;
      }
    });
    if (opt_results)
      return opt_results;
    return result;
  },

  /**
   * Executes a closure for all of this node's descendants, in pre-order.
   * Early-outs if the closure returns true.
   * @param {Function(AutomationNode):boolean} closure Closure to be executed
   *     for each node. Return true to early-out the traversal.
   */
  forAllDescendants_: function(closure) {
    var stack = $Array.reverse(this.wrapper.children);
    while (stack.length > 0) {
      var node = $Array.pop(stack);
      if (closure(node))
        return;

      var children = node.children;
      for (var i = children.length - 1; i >= 0; i--)
        $Array.push(stack, children[i]);
    }
  },

  matchInternal_: function(params) {
    if ($Object.keys(params).length === 0)
      return false;

    if ('role' in params && this.role != params.role)
        return false;

    if ('state' in params) {
      for (var state in params.state) {
        if (params.state[state] != (state in this.state))
          return false;
      }
    }
    if ('attributes' in params) {
      for (var attribute in params.attributes) {
        var attrValue = params.attributes[attribute];
        if (typeof attrValue != 'object') {
          if (this[attribute] !== attrValue)
            return false;
        } else if (attrValue instanceof $RegExp.self) {
          if (typeof this[attribute] != 'string')
            return false;
          if (!attrValue.test(this[attribute]))
            return false;
        } else {
          // TODO(aboxhall): handle intlist case.
          return false;
        }
      }
    }
    return true;
  }
};

var stringAttributes = [
    'accessKey',
    'ariaInvalidValue',
    'autoComplete',
    'className',
    'containerLiveRelevant',
    'containerLiveStatus',
    'description',
    'display',
    'htmlTag',
    'imageDataUrl',
    'language',
    'liveRelevant',
    'liveStatus',
    'name',
    'placeholder',
    'roleDescription',
    'textInputType',
    'url',
    'value'];

var boolAttributes = [
    'busy',
    'clickable',
    'containerLiveAtomic',
    'containerLiveBusy',
    'liveAtomic',
    'modal',
    'scrollable',
    'selected'
];

var intAttributes = [
    'backgroundColor',
    'color',
    'colorValue',
    'hierarchicalLevel',
    'posInSet',
    'scrollX',
    'scrollXMax',
    'scrollXMin',
    'scrollY',
    'scrollYMax',
    'scrollYMin',
    'setSize',
    'tableCellColumnIndex',
    'ariaCellColumnIndex',
    'tableCellColumnSpan',
    'tableCellRowIndex',
    'ariaCellRowIndex',
    'tableCellRowSpan',
    'tableColumnCount',
    'ariaColumnCount',
    'tableColumnIndex',
    'tableRowCount',
    'ariaRowCount',
    'tableRowIndex',
    'textSelEnd',
    'textSelStart'];

// Int attribute, relation property to expose, reverse relation to expose.
var nodeRefAttributes = [
    ['activedescendantId', 'activeDescendant', null],
    ['detailsId', 'details', 'detailsFor'],
    ['errorMessageId', 'errorMessage', 'errorMessageFor'],
    ['inPageLinkTargetId', 'inPageLinkTarget', null],
    ['nextFocusId', 'nextFocus', null],
    ['nextOnLineId', 'nextOnLine', null],
    ['previousFocusId', 'previousFocus', null],
    ['previousOnLineId', 'previousOnLine', null],
    ['tableColumnHeaderId', 'tableColumnHeader', null],
    ['tableHeaderId', 'tableHeader', null],
    ['tableRowHeaderId', 'tableRowHeader', null]];

var intListAttributes = [
    'lineBreaks',
    'markerEnds',
    'markerStarts',
    'markerTypes',
    'wordEnds',
    'wordStarts'];

// Intlist attribute, relation property to expose, reverse relation to expose.
var nodeRefListAttributes = [
    ['controlsIds', 'controls', 'controlledBy'],
    ['describedbyIds', 'describedBy', 'descriptionFor'],
    ['flowtoIds', 'flowTo', 'flowFrom'],
    ['labelledbyIds', 'labelledBy', 'labelFor']];

var floatAttributes = [
    'valueForRange',
    'minValueForRange',
    'maxValueForRange'];

var htmlAttributes = [
    ['type', 'inputType']];

var publicAttributes = [];

$Array.forEach(stringAttributes, function(attributeName) {
  $Array.push(publicAttributes, attributeName);
  $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, {
    __proto__: null,
    get: function() {
      return GetStringAttribute(this.treeID, this.id, attributeName);
    }
  });
});

$Array.forEach(boolAttributes, function(attributeName) {
  $Array.push(publicAttributes, attributeName);
  $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, {
    __proto__: null,
    get: function() {
      return GetBoolAttribute(this.treeID, this.id, attributeName);
    }
  });
});

$Array.forEach(intAttributes, function(attributeName) {
  $Array.push(publicAttributes, attributeName);
  $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, {
    __proto__: null,
    get: function() {
      return GetIntAttribute(this.treeID, this.id, attributeName);
    }
  });
});

$Array.forEach(nodeRefAttributes, function(params) {
  var srcAttributeName = params[0];
  var dstAttributeName = params[1];
  var dstReverseAttributeName = params[2];
  $Array.push(publicAttributes, dstAttributeName);
  $Object.defineProperty(AutomationNodeImpl.prototype, dstAttributeName, {
    __proto__: null,
    get: function() {
      var id = GetIntAttribute(this.treeID, this.id, srcAttributeName);
      if (id && this.rootImpl)
        return this.rootImpl.get(id);
      else
        return undefined;
    }
  });
  if (dstReverseAttributeName) {
    $Array.push(publicAttributes, dstReverseAttributeName);
    $Object.defineProperty(AutomationNodeImpl.prototype,
                           dstReverseAttributeName, {
      __proto__: null,
      get: function() {
        var ids = GetIntAttributeReverseRelations(
            this.treeID, this.id, srcAttributeName);
        if (!ids || !this.rootImpl)
          return undefined;
        var result = [];
        for (var i = 0; i < ids.length; ++i) {
          var node = this.rootImpl.get(ids[i]);
          if (node)
          $Array.push(result, node);
        }
        return result;
      }
    });
  }
});

$Array.forEach(intListAttributes, function(attributeName) {
  $Array.push(publicAttributes, attributeName);
  $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, {
    __proto__: null,
    get: function() {
      return GetIntListAttribute(this.treeID, this.id, attributeName);
    }
  });
});

$Array.forEach(nodeRefListAttributes, function(params) {
  var srcAttributeName = params[0];
  var dstAttributeName = params[1];
  var dstReverseAttributeName = params[2];
  $Array.push(publicAttributes, dstAttributeName);
  $Object.defineProperty(AutomationNodeImpl.prototype, dstAttributeName, {
    __proto__: null,
    get: function() {
      var ids = GetIntListAttribute(this.treeID, this.id, srcAttributeName);
      if (!ids || !this.rootImpl)
        return undefined;
      var result = [];
      for (var i = 0; i < ids.length; ++i) {
        var node = this.rootImpl.get(ids[i]);
        if (node)
          $Array.push(result, node);
      }
      return result;
    }
  });
  if (dstReverseAttributeName) {
    $Array.push(publicAttributes, dstReverseAttributeName);
    $Object.defineProperty(AutomationNodeImpl.prototype,
                           dstReverseAttributeName, {
      __proto__: null,
      get: function() {
        var ids = GetIntListAttributeReverseRelations(
            this.treeID, this.id, srcAttributeName);
        if (!ids || !this.rootImpl)
          return undefined;
        var result = [];
        for (var i = 0; i < ids.length; ++i) {
          var node = this.rootImpl.get(ids[i]);
          if (node)
          $Array.push(result, node);
        }
        return result;
      }
    });
  }
});

$Array.forEach(floatAttributes, function(attributeName) {
  $Array.push(publicAttributes, attributeName);
  $Object.defineProperty(AutomationNodeImpl.prototype, attributeName, {
    __proto__: null,
    get: function() {
      return GetFloatAttribute(this.treeID, this.id, attributeName);
    }
  });
});

$Array.forEach(htmlAttributes, function(params) {
  var srcAttributeName = params[0];
  var dstAttributeName = params[1];
  $Array.push(publicAttributes, dstAttributeName);
  $Object.defineProperty(AutomationNodeImpl.prototype, dstAttributeName, {
    __proto__: null,
    get: function() {
      return GetHtmlAttribute(this.treeID, this.id, srcAttributeName);
    }
  });
});

/**
 * AutomationRootNode.
 *
 * An AutomationRootNode is the javascript end of an AXTree living in the
 * browser. AutomationRootNode handles unserializing incremental updates from
 * the source AXTree. Each update contains node data that form a complete tree
 * after applying the update.
 *
 * A brief note about ids used through this class. The source AXTree assigns
 * unique ids per node and we use these ids to build a hash to the actual
 * AutomationNode object.
 * Thus, tree traversals amount to a lookup in our hash.
 *
 * The tree itself is identified by the accessibility tree id of the
 * renderer widget host.
 * @constructor
 */
function AutomationRootNodeImpl(treeID) {
  $Function.call(AutomationNodeImpl, this, this);
  this.treeID = treeID;
  this.axNodeDataCache_ = {__proto__: null};
  this.actionRequestIDToCallback_ = {__proto__: null};
}

utils.defineProperty(AutomationRootNodeImpl, 'idToAutomationRootNode_',
    {__proto__: null});

utils.defineProperty(AutomationRootNodeImpl, 'get', function(treeID) {
  var result = AutomationRootNodeImpl.idToAutomationRootNode_[treeID];
  return result || undefined;
});

utils.defineProperty(AutomationRootNodeImpl, 'getOrCreate', function(treeID) {
  if (AutomationRootNodeImpl.idToAutomationRootNode_[treeID])
    return AutomationRootNodeImpl.idToAutomationRootNode_[treeID];
  var result = new AutomationRootNode(treeID);
  AutomationRootNodeImpl.idToAutomationRootNode_[treeID] = result;
  return result;
});

utils.defineProperty(AutomationRootNodeImpl, 'destroy', function(treeID) {
  delete AutomationRootNodeImpl.idToAutomationRootNode_[treeID];
});

AutomationRootNodeImpl.prototype = {
  __proto__: AutomationNodeImpl.prototype,

  /**
   * @type {boolean}
   */
  isRootNode: true,

  /**
   * @type {number}
   */
  treeID: -1,

  /**
   * The parent of this node from a different tree.
   * @type {?AutomationNode}
   * @private
   */
  hostNode_: null,

  /**
   * A map from id to AutomationNode.
   * @type {Object.<number, AutomationNode>}
   * @private
   */
  axNodeDataCache_: null,

  actionRequestCounter_: 0,

  actionRequestIDToCallback_: null,

  get id() {
    var result = GetRootID(this.treeID);

    // Don't return undefined, because the id is often passed directly
    // as an argument to a native binding that expects only a valid number.
    if (result === undefined)
      return -1;

    return result;
  },

  get chromeChannel() {
    return GetStringAttribute(this.treeID, this.id, 'chromeChannel');
  },

  get docUrl() {
    return GetDocURL(this.treeID);
  },

  get docTitle() {
    return GetDocTitle(this.treeID);
  },

  get docLoaded() {
    return GetDocLoaded(this.treeID);
  },

  get docLoadingProgress() {
    return GetDocLoadingProgress(this.treeID);
  },

  get anchorObject() {
    var id = GetAnchorObjectID(this.treeID);
    if (id && id != -1)
      return this.get(id);
    else
      return undefined;
  },

  get anchorOffset() {
    var id = GetAnchorObjectID(this.treeID);
    if (id && id != -1)
      return GetAnchorOffset(this.treeID);
  },

  get anchorAffinity() {
    var id = GetAnchorObjectID(this.treeID);
    if (id && id != -1)
      return GetAnchorAffinity(this.treeID);
  },

  get focusObject() {
    var id = GetFocusObjectID(this.treeID);
    if (id && id != -1)
      return this.get(id);
    else
      return undefined;
  },

  get focusOffset() {
    var id = GetFocusObjectID(this.treeID);
    if (id && id != -1)
      return GetFocusOffset(this.treeID);
  },

  get focusAffinity() {
    var id = GetFocusObjectID(this.treeID);
    if (id && id != -1)
      return GetFocusAffinity(this.treeID);
  },

  get: function(id) {
    if (id == undefined)
      return undefined;

    if (id == this.id)
      return this.wrapper;

    var obj = this.axNodeDataCache_[id];
    if (obj)
      return obj;

    // Validate the backing AXTree has the specified node.
    if (!GetRole(this.treeID, id))
      return;

    obj = new AutomationNode(this);
    privates(obj).impl.treeID = this.treeID;
    privates(obj).impl.id = id;
    this.axNodeDataCache_[id] = obj;

    return obj;
  },

  remove: function(id) {
    if (this.axNodeDataCache_[id])
      privates(this.axNodeDataCache_[id]).impl.detach();
    delete this.axNodeDataCache_[id];
  },

  destroy: function() {
    this.dispatchEvent('destroyed', 'none');
    for (var id in this.axNodeDataCache_)
      this.remove(id);
    this.detach();
  },

  setHostNode(hostNode) {
    this.hostNode_ = hostNode;
  },

  onAccessibilityEvent: function(eventParams) {
    var targetNode = this.get(eventParams.targetID);
    if (targetNode) {
      var targetNodeImpl = privates(targetNode).impl;
      targetNodeImpl.dispatchEvent(
          eventParams.eventType, eventParams.eventFrom,
          eventParams.mouseX, eventParams.mouseY);

      if (eventParams.actionRequestID != -1) {
        this.onActionResult(eventParams.actionRequestID, targetNode);
      }
    } else {
      logging.WARNING('Got ' + eventParams.eventType +
                      ' event on unknown node: ' + eventParams.targetID +
                      '; this: ' + this.id);
    }
    return true;
  },

  addActionResultCallback: function(callback) {
    this.actionRequestIDToCallback_[++this.actionRequestCounter_] = callback;
    return this.actionRequestCounter_;
  },

  onActionResult: function(requestID, result) {
    if (requestID in this.actionRequestIDToCallback_) {
      this.actionRequestIDToCallback_[requestID](result);
      delete this.actionRequestIDToCallback_[requestID];
    }
  },

  toString: function() {
    function toStringInternal(nodeImpl, indent) {
      if (!nodeImpl)
        return '';
      var output = '';
      if (nodeImpl.isRootNode)
        output += indent + 'tree id=' + nodeImpl.treeID + '\n';
      output += indent +
        $Function.call(AutomationNodeImpl.prototype.toString, nodeImpl) + '\n';
      indent += '  ';
      var children = nodeImpl.children;
      for (var i = 0; i < children.length; ++i)
        output += toStringInternal(privates(children[i]).impl, indent);
      return output;
    }
    return toStringInternal(this, '');
  },
};

function AutomationNode() {
  privates(AutomationNode).constructPrivate(this, arguments);
}
utils.expose(AutomationNode, AutomationNodeImpl, {
  functions: [
    'doDefault',
    'find',
    'findAll',
    'focus',
    'getImageData',
    'hitTest',
    'hitTestWithReply',
    'makeVisible',
    'matches',
    'performCustomAction',
    'performStandardAction',
    'replaceSelectedText',
    'resumeMedia',
    'scrollBackward',
    'scrollForward',
    'scrollUp',
    'scrollDown',
    'scrollLeft',
    'scrollRight',
    'setSelection',
    'setSequentialFocusNavigationStartingPoint',
    'setValue',
    'showContextMenu',
    'startDuckingMedia',
    'stopDuckingMedia',
    'suspendMedia',
    'addEventListener',
    'removeEventListener',
    'domQuerySelector',
    'toString',
    'boundsForRange',
  ],
  readonly: $Array.concat(publicAttributes, [
      'parent',
      'firstChild',
      'lastChild',
      'children',
      'previousSibling',
      'nextSibling',
      'isRootNode',
      'role',
      'checked',
      'defaultActionVerb',
      'restriction',
      'state',
      'location',
      'indexInParent',
      'lineStartOffsets',
      'root',
      'htmlAttributes',
      'nameFrom',
      'bold',
      'italic',
      'underline',
      'lineThrough',
      'customActions',
      'standardActions',
      'unclippedLocation',
  ]),
});

function AutomationRootNode() {
  privates(AutomationRootNode).constructPrivate(this, arguments);
}
utils.expose(AutomationRootNode, AutomationRootNodeImpl, {
  superclass: AutomationNode,
  readonly: [
    'chromeChannel',
    'docTitle',
    'docUrl',
    'docLoaded',
    'docLoadingProgress',
    'anchorObject',
    'anchorOffset',
    'anchorAffinity',
    'focusObject',
    'focusOffset',
    'focusAffinity',
  ],
});

utils.defineProperty(AutomationRootNode, 'get', function(treeID) {
  return AutomationRootNodeImpl.get(treeID);
});

utils.defineProperty(AutomationRootNode, 'getOrCreate', function(treeID) {
  return AutomationRootNodeImpl.getOrCreate(treeID);
});

utils.defineProperty(AutomationRootNode, 'destroy', function(treeID) {
  AutomationRootNodeImpl.destroy(treeID);
});

exports.$set('AutomationNode', AutomationNode);
exports.$set('AutomationRootNode', AutomationRootNode);
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the browserAction API.

var binding = apiBridge || require('binding').Binding.create('browserAction');

var setIcon = require('setIcon').setIcon;
var getExtensionViews = requireNative('runtime').GetExtensionViews;
var sendRequest = bindingUtil ?
    $Function.bind(bindingUtil.sendRequest, bindingUtil) :
    require('sendRequest').sendRequest;

var jsLastError = bindingUtil ? undefined : require('lastError');
function hasLastError() {
  return bindingUtil ?
      bindingUtil.hasLastError() : jsLastError.hasError(chrome);
}

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  apiFunctions.setHandleRequest('setIcon', function(details, callback) {
    setIcon(details, function(args) {
      sendRequest('browserAction.setIcon',
                  [args, callback],
                  apiBridge ? undefined : this.definition.parameters,
                  undefined);
    }.bind(this));
  });

  apiFunctions.setCustomCallback('openPopup',
      function(name, request, callback, response) {
    if (!callback)
      return;

    if (hasLastError()) {
      callback();
    } else {
      var views = getExtensionViews(-1, -1, 'POPUP');
      callback(views.length > 0 ? views[0] : null);
    }
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the Cast Streaming RtpStream API.

var binding = apiBridge ||
              require('binding').Binding.create('cast.streaming.rtpStream');
var natives = requireNative('cast_streaming_natives');

binding.registerCustomHook(function(bindingsAPI, extensionId) {
  var apiFunctions = bindingsAPI.apiFunctions;

  apiFunctions.setHandleRequest('destroy',
      function(transportId) {
        natives.DestroyCastRtpStream(transportId);
  });
  apiFunctions.setHandleRequest('getSupportedParams',
      function(transportId) {
        return natives.GetSupportedParamsCastRtpStream(transportId);
  });
  apiFunctions.setHandleRequest('start',
      function(transportId, params) {
        natives.StartCastRtpStream(transportId, params);
  });
  apiFunctions.setHandleRequest('stop',
      function(transportId) {
        natives.StopCastRtpStream(transportId);
  });
  apiFunctions.setHandleRequest('toggleLogging',
      function(transportId, enable) {
        natives.ToggleLogging(transportId, enable);
  });
  apiFunctions.setHandleRequest('getRawEvents',
      function(transportId, extraData, callback) {
        natives.GetRawEvents(transportId, extraData, callback);
  });
  apiFunctions.setHandleRequest('getStats',
      function(transportId, callback) {
        natives.GetStats(transportId, callback);
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the Cast Streaming Session API.

var binding = apiBridge ||
              require('binding').Binding.create('cast.streaming.session');
var natives = requireNative('cast_streaming_natives');

binding.registerCustomHook(function(bindingsAPI, extensionId) {
  var apiFunctions = bindingsAPI.apiFunctions;
  apiFunctions.setHandleRequest('create',
      function(audioTrack, videoTrack, callback) {
        natives.CreateSession(audioTrack, videoTrack, callback);
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the Cast Streaming UdpTransport API.

var binding = apiBridge ||
              require('binding').Binding.create('cast.streaming.udpTransport');
var natives = requireNative('cast_streaming_natives');

binding.registerCustomHook(function(bindingsAPI, extensionId) {
  var apiFunctions = bindingsAPI.apiFunctions;

  apiFunctions.setHandleRequest('destroy', function(transportId) {
    natives.DestroyCastUdpTransport(transportId);
  });
  apiFunctions.setHandleRequest('setDestination',
    function(transportId, destination) {
      natives.SetDestinationCastUdpTransport(transportId, destination);
  });
  apiFunctions.setHandleRequest('setOptions',
    function(transportId, options) {
      natives.SetOptionsCastUdpTransport(transportId, options);
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the Cast Streaming Session API.

var binding =
    apiBridge ||
    require('binding').Binding.create('cast.streaming.receiverSession');
var natives = requireNative('cast_streaming_natives');

binding.registerCustomHook(function(bindingsAPI, extensionId) {
  var apiFunctions = bindingsAPI.apiFunctions;
  apiFunctions.setHandleRequest(
      'createAndBind',
      function(ap, vp, local, weidgth, height, fr, url, cb, op) {
        natives.StartCastRtpReceiver(
            ap, vp, local, weidgth, height, fr, url, cb, op);
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var Event = require('event_bindings').Event;
var sendRequest = require('sendRequest').sendRequest;
var validate = require('schemaUtils').validate;

function extendSchema(schema) {
  var extendedSchema = $Array.slice(schema);
  $Array.unshift(extendedSchema, {'type': 'string'});
  return extendedSchema;
}

// TODO(devlin): Maybe find a way to combine this and ContentSetting.
function ChromeSetting(prefKey, valueSchema, schema) {
  var getFunctionParameters = function(name) {
    var f = $Array.filter(
                schema.functions, function(f) { return f.name === name; })[0];
    return f.parameters;
  };
  this.get = function(details, callback) {
    var getSchema = getFunctionParameters('get');
    validate([details, callback], getSchema);
    return sendRequest('types.ChromeSetting.get',
                       [prefKey, details, callback],
                       extendSchema(getSchema));
  };
  this.set = function(details, callback) {
    // The set schema included in the Schema object is generic, since it varies
    // per-setting. However, this is only ever for a single setting, so we can
    // enforce the types more thoroughly.
    var rawSetSchema = getFunctionParameters('set');
    var rawSettingParam = rawSetSchema[0];
    var props = $Object.assign({}, rawSettingParam.properties);
    props.value = valueSchema;
    var modSettingParam = {
      name: rawSettingParam.name,
      type: rawSettingParam.type,
      properties: props,
    };
    var modSetSchema = $Array.slice(rawSetSchema);
    modSetSchema[0] = modSettingParam;
    validate([details, callback], modSetSchema);
    return sendRequest('types.ChromeSetting.set',
                       [prefKey, details, callback],
                       extendSchema(modSetSchema));
  };
  this.clear = function(details, callback) {
    var clearSchema = getFunctionParameters('clear');
    validate([details, callback], clearSchema);
    return sendRequest('types.ChromeSetting.clear',
                       [prefKey, details, callback],
                       extendSchema(clearSchema));
  };
  this.onChange = new Event('types.ChromeSetting.' + prefKey + '.onChange');
};

exports.$set('ChromeSetting', ChromeSetting);
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var binding = apiBridge ||
              require('binding').Binding.create('chromeWebViewInternal');
var contextMenusHandlers = require('contextMenusHandlers');

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  var handlers = contextMenusHandlers.create(true /* isWebview */);

  apiFunctions.setHandleRequest(
      'contextMenusCreate', handlers.requestHandlers.create);

  apiFunctions.setHandleRequest(
      'contextMenusUpdate', handlers.requestHandlers.update);

  apiFunctions.setHandleRequest(
      'contextMenusRemove', handlers.requestHandlers.remove);

  apiFunctions.setHandleRequest(
      'contextMenusRemoveAll', handlers.requestHandlers.removeAll);
});

if (!apiBridge)
  exports.$set('ChromeWebView', binding.generate());
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This module implements chrome-specific <webview> API.
// See web_view_api_methods.js for details.

var ChromeWebView = getInternalApi ?
    getInternalApi('chromeWebViewInternal') :
    require('chromeWebViewInternal').ChromeWebView;
var ChromeWebViewSchema =
    requireNative('schema_registry').GetSchema('chromeWebViewInternal');
var CreateEvent = require('guestViewEvents').CreateEvent;
var GuestViewInternalNatives = requireNative('guest_view_internal');
var idGeneratorNatives = requireNative('id_generator');
var utils = require('utils');
var WebViewImpl = require('webView').WebViewImpl;

// This is the only "webViewInternal.onClicked" named event for this renderer.
//
// Since we need an event per <webview>, we define events with suffix
// (subEventName) in each of the <webview>. Behind the scenes, this event is
// registered as a ContextMenusEvent, with filter set to the webview's
// |viewInstanceId|. Any time a ContextMenusEvent is dispatched, we re-dispatch
// it to the subEvent's listeners. This way
// <webview>.contextMenus.onClicked behave as a regular chrome Event type.
var ContextMenusEvent = CreateEvent('chromeWebViewInternal.onClicked');
// See comment above.
var ContextMenusHandlerEvent =
    CreateEvent('chromeWebViewInternal.onContextMenuShow');

var jsEvent;
function createCustomEvent(name, schema, options, webviewId) {
  if (bindingUtil)
    return bindingUtil.createCustomEvent(name, undefined, false, false);
  if (!jsEvent)
    jsEvent = require('event_bindings').Event;
  return new jsEvent(name, schema, options, webviewId);
}

// This event is exposed as <webview>.contextMenus.onClicked.
function createContextMenusOnClickedEvent(webViewInstanceId,
                                          opt_eventName,
                                          opt_argSchemas,
                                          opt_eventOptions) {
  var subEventName = GetUniqueSubEventName(opt_eventName);
  var newEvent = createCustomEvent(subEventName, opt_argSchemas,
                                   opt_eventOptions, webViewInstanceId);

  var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId);
  if (view) {
    view.events.addScopedListener(
        ContextMenusEvent,
        $Function.bind(function() {
          // Re-dispatch to subEvent's listeners.
          $Function.apply(newEvent.dispatch, newEvent, $Array.slice(arguments));
        }, newEvent),
        {instanceId: webViewInstanceId});
  }
  return newEvent;
}

// This event is exposed as <webview>.contextMenus.onShow.
function createContextMenusOnContextMenuEvent(webViewInstanceId,
                                              opt_eventName,
                                              opt_argSchemas,
                                              opt_eventOptions) {
  var subEventName = GetUniqueSubEventName(opt_eventName);
  var newEvent = createCustomEvent(subEventName, opt_argSchemas,
                                   opt_eventOptions, webViewInstanceId);

  var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId);
  if (view) {
    view.events.addScopedListener(
        ContextMenusHandlerEvent,
        $Function.bind(function(e) {
          var defaultPrevented = false;
          var event = {
            preventDefault: function() { defaultPrevented = true; }
          };

          // Re-dispatch to subEvent's listeners.
          $Function.apply(newEvent.dispatch, newEvent, [event]);

          if (!defaultPrevented) {
          // TODO(lazyboy): Remove |items| parameter completely from
          // ChromeWebView.showContextMenu as we don't do anything useful with
          // it currently.
          var items = [];
          var guestInstanceId = GuestViewInternalNatives.
              GetViewFromID(webViewInstanceId).guest.getId();
          ChromeWebView.showContextMenu(guestInstanceId, e.requestId, items);
        }
      }, newEvent),
      {instanceId: webViewInstanceId});
  }

  return newEvent;
}

// -----------------------------------------------------------------------------
// WebViewContextMenusImpl object.

// An instance of this class is exposed as <webview>.contextMenus.
function WebViewContextMenusImpl(viewInstanceId) {
  this.viewInstanceId_ = viewInstanceId;
}
$Object.setPrototypeOf(WebViewContextMenusImpl.prototype, null);

WebViewContextMenusImpl.prototype.create = function() {
  var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments));
  return $Function.apply(ChromeWebView.contextMenusCreate, null, args);
};

WebViewContextMenusImpl.prototype.remove = function() {
  var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments));
  return $Function.apply(ChromeWebView.contextMenusRemove, null, args);
};

WebViewContextMenusImpl.prototype.removeAll = function() {
  var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments));
  return $Function.apply(ChromeWebView.contextMenusRemoveAll, null, args);
};

WebViewContextMenusImpl.prototype.update = function() {
  var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments));
  return $Function.apply(ChromeWebView.contextMenusUpdate, null, args);
};

function WebViewContextMenus() {
  privates(WebViewContextMenus).constructPrivate(this, arguments);
}
utils.expose(WebViewContextMenus, WebViewContextMenusImpl, {
  functions: [
    'create',
    'remove',
    'removeAll',
    'update',
  ],
});

// -----------------------------------------------------------------------------

WebViewImpl.prototype.maybeSetupContextMenus = function() {
  if (!this.contextMenusOnContextMenuEvent_) {
    var eventName = 'chromeWebViewInternal.onContextMenuShow';
    var eventSchema =
        utils.lookup(ChromeWebViewSchema.events, 'name', 'onShow');
    var eventOptions = {supportsListeners: true, supportsLazyListeners: false};
    this.contextMenusOnContextMenuEvent_ = createContextMenusOnContextMenuEvent(
        this.viewInstanceId, eventName, eventSchema, eventOptions);
  }

  var createContextMenus = $Function.bind(function() {
    return this.weakWrapper(function() {
      if (this.contextMenus_) {
        return this.contextMenus_;
      }

      this.contextMenus_ = new WebViewContextMenus(this.viewInstanceId);

      // Define 'onClicked' event property on |this.contextMenus_|.
      var getOnClickedEvent = $Function.bind(function() {
        return this.weakWrapper(function() {
          if (!this.contextMenusOnClickedEvent_) {
            var eventName = 'chromeWebViewInternal.onClicked';
            var eventSchema =
                utils.lookup(ChromeWebViewSchema.events, 'name', 'onClicked');
            var eventOptions =
                {supportsListeners: true, supportsLazyListeners: false};
            var onClickedEvent = createContextMenusOnClickedEvent(
                this.viewInstanceId, eventName, eventSchema, eventOptions);
            this.contextMenusOnClickedEvent_ = onClickedEvent;
            return onClickedEvent;
          }
          return this.contextMenusOnClickedEvent_;
        });
      }, this);
      $Object.defineProperty(
          this.contextMenus_,
          'onClicked',
          {get: getOnClickedEvent(), enumerable: true});
      $Object.defineProperty(
          this.contextMenus_,
          'onShow',
          {
            get: this.weakWrapper(function() {
              return this.contextMenusOnContextMenuEvent_;
            }),
            enumerable: true
          });
      return this.contextMenus_;
    });
  }, this);

  // Expose <webview>.contextMenus object.
  $Object.defineProperty(
      this.element,
      'contextMenus',
      {
        get: createContextMenus(),
        enumerable: true
      });
};

function GetUniqueSubEventName(eventName) {
  return eventName + '/' + idGeneratorNatives.GetNextId();
}
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the contentSettings API.

var sendRequest = require('sendRequest').sendRequest;
var validate = require('schemaUtils').validate;

// Some content types have been removed and no longer correspond to a real
// content setting. Instead, these always return a fixed dummy value, and issue
// a warning when accessed. This maps the content type name to the dummy value.
var DEPRECATED_CONTENT_TYPES = {
  __proto__: null,

  fullscreen: 'allow',
  mouselock: 'allow',
};

function extendSchema(schema) {
  var extendedSchema = $Array.slice(schema);
  $Array.unshift(extendedSchema, {'type': 'string'});
  return extendedSchema;
}

function ContentSetting(contentType, settingSchema, schema) {
  var getFunctionParameters = function(name) {
    var f = $Array.filter(
                schema.functions, function(f) { return f.name === name; })[0];
    return f.parameters;
  };
  this.get = function(details, callback) {
    var getSchema = getFunctionParameters('get');
    validate([details, callback], getSchema);

    var dummySetting = DEPRECATED_CONTENT_TYPES[contentType];
    if (dummySetting !== undefined) {
      console.warn('contentSettings.' + contentType + ' is deprecated; it will '
                   + 'always return \'' + dummySetting + '\'.');
      $Function.apply(callback, undefined, [{setting: dummySetting}]);
      return;
    }

    return sendRequest('contentSettings.get',
                       [contentType, details, callback],
                       extendSchema(getSchema));
  };

  this.set = function(details, callback) {
    // We check if the setting is deprecated first, since the validation will
    // fail for deprecated types.
    if ($Object.hasOwnProperty(DEPRECATED_CONTENT_TYPES, contentType)) {
      console.warn('contentSettings.' + contentType + ' is deprecated; setting '
                   + 'it has no effect.');
      $Function.apply(callback, undefined, []);
      return;
    }

    // The set schema included in the Schema object is generic, since it varies
    // per-setting. However, this is only ever for a single setting, so we can
    // enforce the types more thoroughly.
    var rawSetSchema = getFunctionParameters('set');
    var rawSettingParam = rawSetSchema[0];
    var props = $Object.assign({}, rawSettingParam.properties);
    props.setting = settingSchema;
    var modSettingParam = {
      name: rawSettingParam.name,
      type: rawSettingParam.type,
      properties: props,
    };
    var modSetSchema = $Array.slice(rawSetSchema);
    modSetSchema[0] = modSettingParam;
    validate([details, callback], modSetSchema);

    return sendRequest('contentSettings.set',
                       [contentType, details, callback],
                       extendSchema(modSetSchema));
  };

  this.clear = function(details, callback) {
    var clearSchema = getFunctionParameters('clear');
    validate([details, callback], clearSchema);

    if ($Object.hasOwnProperty(DEPRECATED_CONTENT_TYPES, contentType)) {
      console.warn('contentSettings.' + contentType + ' is deprecated; '
                   + 'clearing it has no effect.');
      $Function.apply(callback, undefined, []);
      return;
    }

    return sendRequest('contentSettings.clear',
                       [contentType, details, callback],
                       extendSchema(clearSchema));
  };

  this.getResourceIdentifiers = function(callback) {
    var schema = getFunctionParameters('getResourceIdentifiers');
    validate([callback], schema);

    if ($Object.hasOwnProperty(DEPRECATED_CONTENT_TYPES, contentType)) {
      $Function.apply(callback, undefined, []);
      return;
    }

    return sendRequest(
        'contentSettings.getResourceIdentifiers',
        [contentType, callback],
        extendSchema(schema));
  };
}

exports.$set('ContentSetting', ContentSetting);
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the declarativeContent API.

var binding =
    apiBridge || require('binding').Binding.create('declarativeContent');

if (!apiBridge) {
  var utils = require('utils');
  var validate = require('schemaUtils').validate;
  var canonicalizeCompoundSelector =
      requireNative('css_natives').CanonicalizeCompoundSelector;
}

var setIcon = require('setIcon').setIcon;

binding.registerCustomHook(function(api) {
  var declarativeContent = api.compiledApi;

  if (apiBridge) {
    // Validation for most types is done in the native C++ with native bindings,
    // but setIcon is funny (and sadly broken). Ideally, we can move this
    // validation entirely into the native code, and this whole file can go
    // away.
    var nativeSetIcon = declarativeContent.SetIcon;
    declarativeContent.SetIcon = function(parameters) {
      // TODO(devlin): This is very, very wrong. setIcon() is potentially
      // asynchronous (in the case of a path being specified), which means this
      // becomes an "asynchronous constructor". Errors can be thrown *after* the
      // `new declarativeContent.SetIcon(...)` call, and in the async cases,
      // this wouldn't work when we immediately add the action via an API call
      // (e.g.,
      //   chrome.declarativeContent.onPageChange.addRules(
      //       [{conditions: ..., actions: [ new SetIcon(...) ]}]);
      // ). Some of this is tracked in http://crbug.com/415315.
      setIcon(parameters, $Function.bind(function(data) {
        // Fake calling the original function as a constructor.
        $Object.setPrototypeOf(this, nativeSetIcon.prototype);
        $Function.apply(nativeSetIcon, this, [data]);
      }, this));
    };
    return;
  }

  // Returns the schema definition of type |typeId| defined in |namespace|.
  function getSchema(typeId) {
    return utils.lookup(api.schema.types,
                        'id',
                        'declarativeContent.' + typeId);
  }

  // Helper function for the constructor of concrete datatypes of the
  // declarative content API.
  // Makes sure that |this| contains the union of parameters and
  // {'instanceType': 'declarativeContent.' + typeId} and validates the
  // generated union dictionary against the schema for |typeId|.
  function setupInstance(instance, parameters, typeId) {
    for (var key in parameters) {
      if ($Object.hasOwnProperty(parameters, key)) {
        instance[key] = parameters[key];
      }
    }
    instance.instanceType = 'declarativeContent.' + typeId;
    var schema = getSchema(typeId);
    validate([instance], [schema]);
  }

  function canonicalizeCssSelectors(selectors) {
    for (var i = 0; i < selectors.length; i++) {
      var canonicalizedSelector = canonicalizeCompoundSelector(selectors[i]);
      if (canonicalizedSelector == '') {
        throw new Error(
            'Element of \'css\' array must be a ' +
            'list of valid compound selectors: ' +
            selectors[i]);
      }
      selectors[i] = canonicalizedSelector;
    }
  }

  // Setup all data types for the declarative content API.
  declarativeContent.PageStateMatcher = function(parameters) {
    setupInstance(this, parameters, 'PageStateMatcher');
    if ($Object.hasOwnProperty(this, 'css')) {
      canonicalizeCssSelectors(this.css);
    }
  };
  declarativeContent.ShowPageAction = function(parameters) {
    setupInstance(this, parameters, 'ShowPageAction');
  };
  declarativeContent.RequestContentScript = function(parameters) {
    setupInstance(this, parameters, 'RequestContentScript');
  };
  // TODO(rockot): Do not expose this in M39 stable. Making this restriction
  // possible will take some extra work. See http://crbug.com/415315
  // Note: See also the SetIcon wrapper above for more issues.
  declarativeContent.SetIcon = function(parameters) {
    setIcon(parameters, $Function.bind(function(data) {
      setupInstance(this, data, 'SetIcon');
    }, this));
  };
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the desktopCapture API.

var binding = apiBridge || require('binding').Binding.create('desktopCapture');
var sendRequest = bindingUtil ?
    $Function.bind(bindingUtil.sendRequest, bindingUtil) :
    require('sendRequest').sendRequest;
var idGenerator = requireNative('id_generator');

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  var pendingRequests = {};

  function onRequestResult(id, result, options) {
    if (id in pendingRequests) {
      var callback = pendingRequests[id];
      delete pendingRequests[id];
      callback(result, options);
    }
  }

  apiFunctions.setHandleRequest('chooseDesktopMedia',
                                function(sources, target_tab, callback) {
    // |target_tab| is an optional parameter.
    if (callback === undefined) {
      callback = target_tab;
      target_tab = undefined;
    }
    var id = idGenerator.GetNextId();
    pendingRequests[id] = callback;
    sendRequest('desktopCapture.chooseDesktopMedia',
                [id, sources, target_tab,
                 $Function.bind(onRequestResult, null, id)],
                apiBridge ? undefined : this.definition.parameters,
                undefined);
    return id;
  });

  apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) {
    if (id in pendingRequests) {
      delete pendingRequests[id];
      sendRequest('desktopCapture.cancelChooseDesktopMedia',
                  [id], apiBridge ? undefined : this.definition.parameters,
                  undefined);
    }
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the developerPrivate API.

var binding =
    apiBridge || require('binding').Binding.create('developerPrivate');

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  // Converts the argument of |functionName| from DirectoryEntry to URL.
  function bindFileSystemFunction(functionName) {
    apiFunctions.setUpdateArgumentsPostValidate(
        functionName, function(directoryEntry, callback) {
          var fileSystemName = directoryEntry.filesystem.name;
          var relativePath = $String.slice(directoryEntry.fullPath, 1);
          var url = directoryEntry.toURL();
          return [fileSystemName, relativePath, url, callback];
    });
  }

  bindFileSystemFunction('loadDirectory');

  // developerPrivate.enable is the same as chrome.management.setEnabled.
  // TODO(devlin): Migrate callers off developerPrivate.enable.
  bindingsAPI.compiledApi.enable = chrome.management.setEnabled;

  apiFunctions.setHandleRequest('allowFileAccess',
                                function(id, allow, callback) {
    chrome.developerPrivate.updateExtensionConfiguration(
        {extensionId: id, fileAccess: allow}, callback);
  });

  apiFunctions.setHandleRequest('allowIncognito',
                                function(id, allow, callback) {
    chrome.developerPrivate.updateExtensionConfiguration(
        {extensionId: id, incognitoAccess: allow}, callback);
  });

  apiFunctions.setHandleRequest('inspect', function(options, callback) {
    var renderViewId = options.render_view_id;
    if (typeof renderViewId == 'string') {
      renderViewId = parseInt(renderViewId);
      if (isNaN(renderViewId))
        throw new Error('Invalid value for render_view_id');
    }
    var renderProcessId = options.render_process_id;
    if (typeof renderProcessId == 'string') {
      renderProcessId = parseInt(renderProcessId);
      if (isNaN(renderProcessId))
        throw new Error('Invalid value for render_process_id');
    }
    chrome.developerPrivate.openDevTools({
        extensionId: options.extension_id,
        renderProcessId: renderProcessId,
        renderViewId: renderViewId,
        incognito: options.incognito
    }, callback);
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom bindings for the downloads API.

var binding = apiBridge || require('binding').Binding.create('downloads');
var downloadsInternal =
    getInternalApi ?
        getInternalApi('downloadsInternal') :
        require('binding').Binding.create('downloadsInternal').generate();
var registerArgumentMassager = bindingUtil ?
    $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
    require('event_bindings').registerArgumentMassager;

registerArgumentMassager('downloads.onDeterminingFilename',
                         function(args, dispatch) {
  var downloadItem = args[0];
  // Copy the id so that extensions can't change it.
  var downloadId = downloadItem.id;
  var suggestable = true;
  function isValidResult(result) {
    if (result === undefined)
      return false;
    if (typeof(result) != 'object') {
      console.error('Error: Invocation of form suggest(' + typeof(result) +
                    ') doesn\'t match definition suggest({filename: string, ' +
                    'conflictAction: string})');
      return false;
    } else if ((typeof(result.filename) != 'string') ||
               (result.filename.length == 0)) {
      console.error('Error: "filename" parameter to suggest() must be a ' +
                    'non-empty string');
      return false;
    } else if ([undefined, 'uniquify', 'overwrite', 'prompt'].indexOf(
                 result.conflictAction) < 0) {
      console.error('Error: "conflictAction" parameter to suggest() must be ' +
                    'one of undefined, "uniquify", "overwrite", "prompt"');
      return false;
    }
    return true;
  }
  function suggestCallback(result) {
    if (!suggestable) {
      console.error('suggestCallback may not be called more than once.');
      return;
    }
    suggestable = false;
    if (isValidResult(result)) {
      downloadsInternal.determineFilename(
          downloadId, result.filename, result.conflictAction || "");
    } else {
      downloadsInternal.determineFilename(downloadId, "", "");
    }
  }
  try {
    var results = dispatch([downloadItem, suggestCallback]);
    var async = (results &&
                 results.results &&
                 (results.results.length != 0) &&
                 (results.results[0] === true));
    if (suggestable && !async)
      suggestCallback();
  } catch (e) {
    suggestCallback();
    throw e;
  }
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var Event = require('event_bindings').Event;

// The EasyUnlockProximityRequired object is just a stub that has an onChange
// event, which is never triggered.
// TODO(devlin): Remove this once the preferencesPrivate API is fully removed.
// https://crbug.com/593166
function EasyUnlockProximityRequired(prefKey, valueSchema, schema) {
  // Note: technically, extensions could intercept this through a setter on
  // Object.prototype(). We don't really care, because a) this is only for a
  // private API, so we shouldn't have to worry about untrusted code, and b)
  // this is an anonymous event, which exposes no attack surface and will be
  // exposed to the extension anyway.
  this.onChange = new Event();
};

exports.$set('EasyUnlockProximityRequired', EasyUnlockProximityRequired);
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the GCM API.

var binding = apiBridge || require('binding').Binding.create('gcm');
var forEach = require('utils').forEach;

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;
  var gcm = bindingsAPI.compiledApi;

  apiFunctions.setUpdateArgumentsPostValidate(
    'send', function(message, callback) {
      // Validate message.data.
      var payloadSize = 0;
      forEach(message.data, function(property, value) {
        if (property.length == 0)
          throw new Error("One of data keys is empty.");

        var lowerCasedProperty = property.toLowerCase();
        // Issue an error for forbidden prefixes of property names.
        if (lowerCasedProperty.startsWith("goog.") ||
            lowerCasedProperty.startsWith("google") ||
            property.startsWith("collapse_key")) {
          throw new Error("Invalid data key: " + property);
        }

        payloadSize += property.length + value.length;
      });

      if (payloadSize > gcm.MAX_MESSAGE_SIZE)
        throw new Error("Payload exceeded allowed size limit. Payload size is: "
            + payloadSize);

      if (payloadSize == 0)
        throw new Error("No data to send.");

      return arguments;
    });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the Identity API.

var binding = apiBridge || require('binding').Binding.create('identity');

binding.registerCustomHook(function(binding, id, contextType) {
  var apiFunctions = binding.apiFunctions;

  apiFunctions.setHandleRequest('getRedirectURL', function(path) {
    if (path === null || path === undefined)
      path = '/';
    else
      path = String(path);
    if (path[0] != '/')
      path = '/' + path;
    return 'https://' + id + '.chromiumapp.org' + path;
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the image writer private API.

var binding =
    apiBridge || require('binding').Binding.create('imageWriterPrivate');

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  apiFunctions.setUpdateArgumentsPostValidate(
      'writeFromFile', function(device, fileEntry, options, callback) {
    var fileSystemName = fileEntry.filesystem.name;
    var relativePath = $String.slice(fileEntry.fullPath, 1);
    return [device, fileSystemName, relativePath, callback];
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the input ime API. Only injected into the
// v8 contexts for extensions which have permission for the API.

var binding = apiBridge || require('binding').Binding.create('input.ime');
var appWindowNatives = requireNative('app_window_natives');
var registerArgumentMassager = bindingUtil ?
    $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
    require('event_bindings').registerArgumentMassager;

// TODO(crbug.com/733825): These bindings have some issues.

var inputIme;
registerArgumentMassager('input.ime.onKeyEvent',
                         function(args, dispatch) {
  var keyData = args[1];
  var result = false;
  try {
    // dispatch() is weird - it returns an object {results: array<results>} iff
    // there is at least one result value that !== undefined. Since onKeyEvent
    // has a maximum of one listener, we know that any result we find is the one
    // we're interested in.
    var dispatchResult = dispatch(args);
    if (dispatchResult && dispatchResult.results)
      result = dispatchResult.results[0];
  } catch (e) {
    console.error('Error in event handler for onKeyEvent: ' + e.stack);
  }
  if (!inputIme.onKeyEvent.async)
    inputIme.keyEventHandled(keyData.requestId, result);
});

binding.registerCustomHook(function(api) {
 inputIme = api.compiledApi;

  var originalAddListener = inputIme.onKeyEvent.addListener;
  inputIme.onKeyEvent.addListener = function(cb, opt_extraInfo) {
    inputIme.onKeyEvent.async = false;
    if (opt_extraInfo instanceof Array) {
      for (var i = 0; i < opt_extraInfo.length; ++i) {
        if (opt_extraInfo[i] == 'async') {
          inputIme.onKeyEvent.async = true;
        }
      }
    }
    $Function.call(originalAddListener, this, cb);
  };

  api.apiFunctions.setCustomCallback('createWindow',
      function(name, request, callback, windowParams) {
    if (!callback) {
      return;
    }
    var view;
    if (windowParams && windowParams.frameId) {
      view = appWindowNatives.GetFrame(
          windowParams.frameId, false /* notifyBrowser */);
      view.id = windowParams.frameId;
    }
    callback(view);
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the Media Gallery API.

var binding = apiBridge || require('binding').Binding.create('mediaGalleries');
var blobNatives = requireNative('blob_natives');
var mediaGalleriesNatives = requireNative('mediaGalleries');
var sendRequest = bindingUtil ?
    $Function.bind(bindingUtil.sendRequest, bindingUtil) :
    require('sendRequest').sendRequest;

var blobsAwaitingMetadata = {};
var mediaGalleriesMetadata = {};

function createFileSystemObjectsAndUpdateMetadata(response) {
  var result = [];
  mediaGalleriesMetadata = {};  // Clear any previous metadata.
  if (response) {
    for (var i = 0; i < response.length; i++) {
      var filesystem = mediaGalleriesNatives.GetMediaFileSystemObject(
          response[i].fsid);
      $Array.push(result, filesystem);
      var metadata = response[i];
      delete metadata.fsid;
      mediaGalleriesMetadata[filesystem.name] = metadata;
    }
  }
  return result;
}

binding.registerCustomHook(function(bindingsAPI, extensionId) {
  var apiFunctions = bindingsAPI.apiFunctions;

  // getMediaFileSystems and addUserSelectedFolder use a custom callback so that
  // they can instantiate and return an array of file system objects.
  apiFunctions.setCustomCallback('getMediaFileSystems',
                                 function(name, request, callback, response) {
    var result = createFileSystemObjectsAndUpdateMetadata(response);
    if (callback)
      callback(result);
  });

  apiFunctions.setCustomCallback('addUserSelectedFolder',
      function(name, request, callback, response) {
    var fileSystems = [];
    var selectedFileSystemName = "";
    if (response && 'mediaFileSystems' in response &&
        'selectedFileSystemIndex' in response) {
      fileSystems = createFileSystemObjectsAndUpdateMetadata(
          response['mediaFileSystems']);
      var selectedFileSystemIndex = response['selectedFileSystemIndex'];
      if (selectedFileSystemIndex >= 0) {
        selectedFileSystemName = fileSystems[selectedFileSystemIndex].name;
      }
    }
    if (callback)
      callback(fileSystems, selectedFileSystemName);
  });

  apiFunctions.setHandleRequest('getMediaFileSystemMetadata',
                                function(filesystem) {
    if (filesystem && filesystem.name &&
        filesystem.name in mediaGalleriesMetadata) {
      return mediaGalleriesMetadata[filesystem.name];
    }
    return {
      'name': '',
      'galleryId': '',
      'isRemovable': false,
      'isMediaDevice': false,
      'isAvailable': false,
    };
  });

  function getMetadataCallback(uuid, name, request, callback, response) {
    if (response && response.attachedImagesBlobInfo) {
      for (var i = 0; i < response.attachedImagesBlobInfo.length; i++) {
        var blobInfo = response.attachedImagesBlobInfo[i];
        var blob = blobNatives.TakeBrowserProcessBlob(
            blobInfo.blobUUID, blobInfo.type, blobInfo.size);
        response.metadata.attachedImages.push(blob);
      }
    }

    if (callback)
      callback(response ? response.metadata : null);

    delete blobsAwaitingMetadata[uuid];
  }

  apiFunctions.setHandleRequest('getMetadata',
                                function(mediaFile, options, callback) {
    var blobUuid = blobNatives.GetBlobUuid(mediaFile)
    // Store the blob in a global object to keep its refcount nonzero -- this
    // prevents the object from being garbage collected before any metadata
    // parsing gets to occur (see crbug.com/415792).
    blobsAwaitingMetadata[blobUuid] = mediaFile;

    var optArgs = {
      __proto__: null,
      customCallback: $Function.bind(getMetadataCallback, null, blobUuid),
    };

    sendRequest('mediaGalleries.getMetadata', [blobUuid, options, callback],
                bindingUtil ? undefined : this.definition.parameters, optArgs);
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom bindings for the notifications API.
//
var binding = apiBridge || require('binding').Binding.create('notifications');

var sendRequest = bindingUtil ?
    $Function.bind(bindingUtil.sendRequest, bindingUtil) :
    require('sendRequest').sendRequest;
var exceptionHandler = require('uncaught_exception_handler');
var imageUtil = require('imageUtil');
var notificationsPrivate = requireNative('notifications_private');

var jsLastError = bindingUtil ? undefined : require('lastError');
function runCallbackWithLastError(name, message, stack, callback, args) {
  if (bindingUtil) {
    bindingUtil.runCallbackWithLastError(message, function() {
      $Function.apply(callback, null, args);
    });
  } else {
    jsLastError.run(name, message, stack, callback, args);
  }
}

function imageDataSetter(context, key) {
  var f = function(val) {
    this[key] = val;
  };
  return $Function.bind(f, context);
}

// A URL Spec is an object with the following keys:
//  path: The resource to be downloaded.
//  width: (optional) The maximum width of the image to be downloaded in device
//         pixels.
//  height: (optional) The maximum height of the image to be downloaded in
//          device pixels.
//  callback: A function to be called when the URL is complete. It
//    should accept an ImageData object and set the appropriate
//    field in |notificationDetails|.
function getUrlSpecs(imageSizes, notificationDetails) {
  var urlSpecs = [];

  // |iconUrl| might be optional for notification updates.
  if (notificationDetails.iconUrl) {
    $Array.push(urlSpecs, {
      path: notificationDetails.iconUrl,
      width: imageSizes.icon.width * imageSizes.scaleFactor,
      height: imageSizes.icon.height * imageSizes.scaleFactor,
      callback: imageDataSetter(notificationDetails, 'iconBitmap')
    });
  }

  // |appIconMaskUrl| is optional.
  if (notificationDetails.appIconMaskUrl) {
    $Array.push(urlSpecs, {
      path: notificationDetails.appIconMaskUrl,
      width: imageSizes.appIconMask.width * imageSizes.scaleFactor,
      height: imageSizes.appIconMask.height * imageSizes.scaleFactor,
      callback: imageDataSetter(notificationDetails, 'appIconMaskBitmap')
    });
  }

  // |imageUrl| is optional.
  if (notificationDetails.imageUrl) {
    $Array.push(urlSpecs, {
      path: notificationDetails.imageUrl,
      width: imageSizes.image.width * imageSizes.scaleFactor,
      height: imageSizes.image.height * imageSizes.scaleFactor,
      callback: imageDataSetter(notificationDetails, 'imageBitmap')
    });
  }

  // Each button has an optional icon.
  var buttonList = notificationDetails.buttons;
  if (buttonList && typeof buttonList.length === 'number') {
    var numButtons = buttonList.length;
    for (var i = 0; i < numButtons; i++) {
      if (buttonList[i].iconUrl) {
        $Array.push(urlSpecs, {
          path: buttonList[i].iconUrl,
          width: imageSizes.buttonIcon.width * imageSizes.scaleFactor,
          height: imageSizes.buttonIcon.height * imageSizes.scaleFactor,
          callback: imageDataSetter(buttonList[i], 'iconBitmap')
        });
      }
    }
  }

  return urlSpecs;
}

function replaceNotificationOptionURLs(notification_details, callback) {
  var imageSizes = notificationsPrivate.GetNotificationImageSizes();
  var url_specs = getUrlSpecs(imageSizes, notification_details);
  if (!url_specs.length) {
    callback(true);
    return;
  }

  var errors = 0;

  imageUtil.loadAllImages(url_specs, {
    onerror: function(index) {
      errors++;
    },
    oncomplete: function(imageData) {
      if (errors > 0) {
        callback(false);
        return;
      }
      for (var index = 0; index < url_specs.length; index++) {
        var url_spec = url_specs[index];
        url_spec.callback(imageData[index]);
      }
      callback(true);
    }
  });
}

function genHandle(name, failure_function) {
  return function(id, input_notification_details, callback) {
    // TODO(dewittj): Remove this hack. This is used as a way to deep
    // copy a complex JSON object.
    var notification_details = $JSON.parse(
        $JSON.stringify(input_notification_details));
    var that = this;
    var stack = exceptionHandler.getExtensionStackTrace();
    replaceNotificationOptionURLs(notification_details, function(success) {
      if (success) {
        sendRequest(
            name, [id, notification_details, callback],
            bindingUtil ? undefined : that.definition.parameters,
            bindingUtil ? undefined : {__proto__: null, stack: stack});
        return;
      }
      runCallbackWithLastError(
          name, 'Unable to download all specified images.',
          stack, failure_function, [callback || function() {}, id]);
    });
  };
}

var handleCreate = genHandle('notifications.create',
                             function(callback, id) { callback(id); });
var handleUpdate = genHandle('notifications.update',
                             function(callback, id) { callback(false); });

var notificationsCustomHook = function(bindingsAPI, extensionId) {
  var apiFunctions = bindingsAPI.apiFunctions;
  apiFunctions.setHandleRequest('create', handleCreate);
  apiFunctions.setHandleRequest('update', handleUpdate);
};

binding.registerCustomHook(notificationsCustomHook);

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the omnibox API. Only injected into the v8 contexts
// for extensions which have permission for the omnibox API.

var binding = apiBridge || require('binding').Binding.create('omnibox');

var registerArgumentMassager = bindingUtil ?
    $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
    require('event_bindings').registerArgumentMassager;

var sendRequest = bindingUtil ?
    $Function.bind(bindingUtil.sendRequest, bindingUtil) :
    require('sendRequest').sendRequest;

// Remove invalid characters from |text| so that it is suitable to use
// for |AutocompleteMatch::contents|.
function sanitizeString(text, shouldTrim) {
  // NOTE: This logic mirrors |AutocompleteMatch::SanitizeString()|.
  // 0x2028 = line separator; 0x2029 = paragraph separator.
  var kRemoveChars = /(\r|\n|\t|\u2028|\u2029)/gm;
  if (shouldTrim)
    text = text.trimLeft();
  return text.replace(kRemoveChars, '');
}

// Parses the xml syntax supported by omnibox suggestion results. Returns an
// object with two properties: 'description', which is just the text content,
// and 'descriptionStyles', which is an array of style objects in a format
// understood by the C++ backend.
function parseOmniboxDescription(input) {
  var domParser = new DOMParser();

  // The XML parser requires a single top-level element, but we want to
  // support things like 'hello, <match>world</match>!'. So we wrap the
  // provided text in generated root level element.
  var root = domParser.parseFromString(
      '<fragment>' + input + '</fragment>', 'text/xml');

  // DOMParser has a terrible error reporting facility. Errors come out nested
  // inside the returned document.
  var error = root.querySelector('parsererror div');
  if (error) {
    throw new Error(error.textContent);
  }

  // Otherwise, it's valid, so build up the result.
  var result = {
    description: '',
    descriptionStyles: []
  };

  // Recursively walk the tree.
  function walk(node) {
    for (var i = 0, child; child = node.childNodes[i]; i++) {
      // Append text nodes to our description.
      if (child.nodeType == Node.TEXT_NODE) {
        var shouldTrim = result.description.length == 0;
        result.description += sanitizeString(child.nodeValue, shouldTrim);
        continue;
      }

      // Process and descend into a subset of recognized tags.
      if (child.nodeType == Node.ELEMENT_NODE &&
          (child.nodeName == 'dim' || child.nodeName == 'match' ||
           child.nodeName == 'url')) {
        var style = {
          'type': child.nodeName,
          'offset': result.description.length
        };
        $Array.push(result.descriptionStyles, style);
        walk(child);
        style.length = result.description.length - style.offset;
        continue;
      }

      // Descend into all other nodes, even if they are unrecognized, for
      // forward compat.
      walk(child);
    }
  };
  walk(root);

  return result;
}

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  apiFunctions.setUpdateArgumentsPreValidate('setDefaultSuggestion',
                                             function(suggestResult) {
    if (suggestResult.content != undefined) {  // null, etc.
      throw new Error(
          'setDefaultSuggestion cannot contain the "content" field');
    }
    return [suggestResult];
  });

  apiFunctions.setHandleRequest('setDefaultSuggestion', function(details) {
    var parseResult = parseOmniboxDescription(details.description);
    sendRequest('omnibox.setDefaultSuggestion', [parseResult],
                bindingUtil ? undefined : this.definition.parameters,
                undefined);
  });

  apiFunctions.setUpdateArgumentsPostValidate(
      'sendSuggestions', function(requestId, userSuggestions) {
    var suggestions = [];
    for (var i = 0; i < userSuggestions.length; i++) {
      var parseResult = parseOmniboxDescription(
          userSuggestions[i].description);
      parseResult.content = userSuggestions[i].content;
      parseResult.deletable = userSuggestions[i].deletable;
      $Array.push(suggestions, parseResult);
    }
    return [requestId, suggestions];
  });
});

registerArgumentMassager('omnibox.onInputChanged', function(args, dispatch) {
  var text = args[0];
  var requestId = args[1];
  var suggestCallback = function(suggestions) {
    chrome.omnibox.sendSuggestions(requestId, suggestions);
  };
  dispatch([text, suggestCallback]);
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the pageAction API.

var binding = apiBridge || require('binding').Binding.create('pageAction');
var setIcon = require('setIcon').setIcon;
var sendRequest = bindingUtil ?
    $Function.bind(bindingUtil.sendRequest, bindingUtil) :
    require('sendRequest').sendRequest;

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  apiFunctions.setHandleRequest('setIcon', function(details, callback) {
    setIcon(details, $Function.bind(function(args) {
      sendRequest('pageAction.setIcon', [args, callback],
                  bindingUtil ? undefined : this.definition.parameters,
                  undefined);
    }, this));
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the pageCapture API.

var binding = apiBridge || require('binding').Binding.create('pageCapture');

var handleUncaughtException = require('uncaught_exception_handler').handle;
var pageCaptureNatives = requireNative('page_capture');
var CreateBlob = pageCaptureNatives.CreateBlob;
var SendResponseAck = pageCaptureNatives.SendResponseAck;

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  apiFunctions.setCustomCallback('saveAsMHTML',
      function(name, request, callback, response) {
    if (response)
      response = CreateBlob(response.mhtmlFilePath, response.mhtmlFileLength);

    try {
      callback(response);
    } catch (e) {
      handleUncaughtException(
          'Error in chrome.pageCapture.saveAsMHTML callback', e, request.stack);
    } finally {
      // Notify the browser. Now that the blob is referenced from JavaScript,
      // the browser can drop its reference to it.
      SendResponseAck(request.id);
    }
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the syncFileSystem API.

var binding =
    apiBridge || require('binding').Binding.create('syncFileSystem');

var registerArgumentMassager = bindingUtil ?
    $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
    require('event_bindings').registerArgumentMassager;

var fileSystemNatives = requireNative('file_system_natives');
var syncFileSystemNatives = requireNative('sync_file_system');

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  // Functions which take in an [instanceOf=FileEntry].
  function bindFileEntryFunction(functionName) {
    apiFunctions.setUpdateArgumentsPostValidate(
        functionName, function(entry, callback) {
      var fileSystemUrl = entry.toURL();
      return [fileSystemUrl, callback];
    });
  }
  $Array.forEach(['getFileStatus'], bindFileEntryFunction);

  // Functions which take in a FileEntry array.
  function bindFileEntryArrayFunction(functionName) {
    apiFunctions.setUpdateArgumentsPostValidate(
        functionName, function(entries, callback) {
      var fileSystemUrlArray = [];
      for (var i=0; i < entries.length; i++) {
        $Array.push(fileSystemUrlArray, entries[i].toURL());
      }
      return [fileSystemUrlArray, callback];
    });
  }
  $Array.forEach(['getFileStatuses'], bindFileEntryArrayFunction);

  // Functions which take in an [instanceOf=DOMFileSystem].
  function bindFileSystemFunction(functionName) {
    apiFunctions.setUpdateArgumentsPostValidate(
        functionName, function(filesystem, callback) {
      var fileSystemUrl = filesystem.root.toURL();
      return [fileSystemUrl, callback];
    });
  }
  $Array.forEach(['getUsageAndQuota'], bindFileSystemFunction);

  // Functions which return an [instanceOf=DOMFileSystem].
  apiFunctions.setCustomCallback('requestFileSystem',
      function(name, request, callback, response) {
    var result = null;
    if (response) {
      result = syncFileSystemNatives.GetSyncFileSystemObject(
          response.name, response.root);
    }
    if (callback)
      callback(result);
  });

  // Functions which return an array of FileStatusInfo object
  // which has [instanceOf=FileEntry].
  apiFunctions.setCustomCallback('getFileStatuses',
      function(name, request, callback, response) {
    var results = [];
    if (response) {
      for (var i = 0; i < response.length; i++) {
        var result = {};
        var entry = response[i].entry;
        result.fileEntry = fileSystemNatives.GetFileEntry(
            entry.fileSystemType,
            entry.fileSystemName,
            entry.rootUrl,
            entry.filePath,
            entry.isDirectory);
        result.status = response[i].status;
        result.error = response[i].error;
        $Array.push(results, result);
      }
    }
    if (callback)
      callback(results);
  });
});

registerArgumentMassager('syncFileSystem.onFileStatusChanged',
                         function(args, dispatch) {
  // Make FileEntry object using all the base string fields.
  var fileEntry = fileSystemNatives.GetFileEntry(
      args[0].fileSystemType,
      args[0].fileSystemName,
      args[0].rootUrl,
      args[0].filePath,
      args[0].isDirectory);

  // Combine into a single dictionary.
  var fileInfo = new Object();
  fileInfo.fileEntry = fileEntry;
  fileInfo.status = args[1];
  if (fileInfo.status == "synced") {
    fileInfo.action = args[2];
    fileInfo.direction = args[3];
  }
  dispatch([fileInfo]);
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the systemIndicator API.
// TODO(dewittj) Refactor custom binding to reduce redundancy between the
// extension action APIs.

var binding =
    apiBridge || require('binding').Binding.create('systemIndicator');

var setIcon = require('setIcon').setIcon;
var sendRequest = bindingUtil ?
    $Function.bind(bindingUtil.sendRequest, bindingUtil) :
    require('sendRequest').sendRequest;

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  apiFunctions.setHandleRequest('setIcon', function(details, callback) {
    setIcon(details, $Function.bind(function(args) {
      sendRequest('systemIndicator.setIcon', [args, callback],
                  bindingUtil ? undefined : this.definition.parameters,
                  undefined);
    }, this));
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the Tab Capture API.

var binding = apiBridge || require('binding').Binding.create('tabCapture');

var jsLastError = bindingUtil ? undefined : require('lastError');
function runCallbackWithLastError(name, message, stack, callback, args) {
  if (bindingUtil) {
    bindingUtil.runCallbackWithLastError(message, function() {
      $Function.apply(callback, null, args);
    });
  } else {
    jsLastError.run(name, message, stack, callback, args);
  }
}

binding.registerCustomHook(function(bindingsAPI, extensionId) {
  var apiFunctions = bindingsAPI.apiFunctions;

  function proxyToGetUserMedia(name, request, callback, response) {
    if (!callback)
      return;

    if (!response) {
      // When the response is missing, runtime.lastError has already been set.
      // See chrome/browser/extensions/api/tab_capture/tab_capture_api.cc.
      callback(null);
      return;
    }

    // Convenience function for processing webkitGetUserMedia() error objects to
    // provide runtime.lastError messages for the tab capture API.
    function getErrorMessage(error, fallbackMessage) {
      if (!error || (typeof error.message != 'string'))
        return fallbackMessage;
      return error.message.replace(/(navigator\.)?(webkit)?GetUserMedia/gi,
                                   name);
    }

    var options = {};
    if (response.audioConstraints)
      options.audio = response.audioConstraints;
    if (response.videoConstraints)
      options.video = response.videoConstraints;
    try {
      navigator.webkitGetUserMedia(
          options,
          function onSuccess(media_stream) {
            callback(media_stream);
          },
          function onError(error) {
            runCallbackWithLastError(
                name,
                getErrorMessage(error, "Failed to start MediaStream."),
                request.stack,
                function() { callback(null); });
          });
    } catch (error) {
      runCallbackWithLastError(
          name, getErrorMessage(error, "Invalid argument(s)."), request.stack,
          function() { callback(null); });
    }
  }

  apiFunctions.setCustomCallback('capture', proxyToGetUserMedia);
  apiFunctions.setCustomCallback('captureOffscreenTab', proxyToGetUserMedia);
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the tabs API.

var binding = apiBridge || require('binding').Binding.create('tabs');

var messaging = require('messaging');
var OpenChannelToTab = requireNative('messaging_natives').OpenChannelToTab;
var sendRequestIsDisabled = requireNative('process').IsSendRequestDisabled();
var forEach = require('utils').forEach;

binding.registerCustomHook(function(bindingsAPI, extensionId) {
  var apiFunctions = bindingsAPI.apiFunctions;
  var tabs = bindingsAPI.compiledApi;

  apiFunctions.setHandleRequest('connect', function(tabId, connectInfo) {
    var name = '';
    var frameId = -1;
    if (connectInfo) {
      name = connectInfo.name || name;
      frameId = connectInfo.frameId;
      if (typeof frameId == 'undefined' || frameId === null || frameId < 0)
        frameId = -1;
    }
    var portId = OpenChannelToTab(tabId, frameId, extensionId, name);
    return messaging.createPort(portId, name);
  });

  apiFunctions.setHandleRequest('sendRequest',
                                function(tabId, request, responseCallback) {
    if (sendRequestIsDisabled)
      throw new Error(sendRequestIsDisabled);
    var port = tabs.connect(tabId, {name: messaging.kRequestChannel});
    messaging.sendMessageImpl(port, request, responseCallback);
  });

  apiFunctions.setHandleRequest('sendMessage',
      function(tabId, message, options, responseCallback) {
    var connectInfo = {
      name: messaging.kMessageChannel
    };
    if (options) {
      forEach(options, function(k, v) {
        connectInfo[k] = v;
      });
    }

    var port = tabs.connect(tabId, connectInfo);
    messaging.sendMessageImpl(port, message, responseCallback);
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the tts API.

var binding = apiBridge || require('binding').Binding.create('tts');

var idGenerator = requireNative('id_generator');
var sendRequest = bindingUtil ?
    $Function.bind(bindingUtil.sendRequest, bindingUtil) :
    require('sendRequest').sendRequest;
var lazyBG = requireNative('lazy_background_page');

binding.registerCustomHook(function(api) {
  var apiFunctions = api.apiFunctions;
  var tts = api.compiledApi;
  var handlers = {};

  function ttsEventListener(event) {
    var eventHandler = handlers[event.srcId];
    if (eventHandler) {
      eventHandler({
                     type: event.type,
                     charIndex: event.charIndex,
                     errorMessage: event.errorMessage
                   });
      if (event.isFinalEvent) {
        delete handlers[event.srcId];
        // Balanced in 'speak' handler.
        lazyBG.DecrementKeepaliveCount();
      }
    }
  }

  // This file will get run if an extension needs the ttsEngine permission, but
  // it doesn't necessarily have the tts permission. If it doesn't, trying to
  // add a listener to chrome.tts.onEvent will fail.
  // See http://crbug.com/122474.
  try {
    tts.onEvent.addListener(ttsEventListener);
  } catch (e) {}

  apiFunctions.setHandleRequest('speak', function() {
    var args = $Array.from(arguments);
    if (args.length > 1 && args[1] && args[1].onEvent) {
      var id = idGenerator.GetNextId();
      args[1].srcId = id;
      handlers[id] = args[1].onEvent;
      // Keep the page alive until the event finishes.
      // Balanced in eventHandler.
      lazyBG.IncrementKeepaliveCount();
    }
    sendRequest('tts.speak', args,
                bindingUtil ? undefined : this.definition.parameters,
                undefined);
    return id;
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the ttsEngine API.

var binding = apiBridge || require('binding').Binding.create('ttsEngine');
var registerArgumentMassager = bindingUtil ?
    $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
    require('event_bindings').registerArgumentMassager;

registerArgumentMassager('ttsEngine.onSpeak', function(args, dispatch) {
  var text = args[0];
  var options = args[1];
  var requestId = args[2];
  var sendTtsEvent = function(event) {
    chrome.ttsEngine.sendTtsEvent(requestId, event);
  };
  dispatch([text, options, sendTtsEvent]);
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the webrtcDesktopCapturePrivate API.

var binding = apiBridge ||
              require('binding').Binding.create('webrtcDesktopCapturePrivate');
var sendRequest = bindingUtil ?
    $Function.bind(bindingUtil.sendRequest, bindingUtil) :
    require('sendRequest').sendRequest;
var idGenerator = requireNative('id_generator');

binding.registerCustomHook(function(bindingsAPI) {
  var apiFunctions = bindingsAPI.apiFunctions;

  var pendingRequests = {};

  function onRequestResult(id, result) {
    if (id in pendingRequests) {
      var callback = pendingRequests[id];
      delete pendingRequests[id];
      callback(result);
    }
  }

  apiFunctions.setHandleRequest('chooseDesktopMedia',
                                function(sources, request, callback) {
    var id = idGenerator.GetNextId();
    pendingRequests[id] = callback;
    sendRequest('webrtcDesktopCapturePrivate.chooseDesktopMedia',
                [id, sources, request,
                 $Function.bind(onRequestResult, null, id)],
                bindingUtil ? undefined : this.definition.parameters,
                undefined);
    return id;
  });

  apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) {
    if (id in pendingRequests) {
      delete pendingRequests[id];
      sendRequest('webrtcDesktopCapturePrivate.cancelChooseDesktopMedia', [id],
                  bindingUtil ? undefined : this.definition.parameters,
                  undefined);
    }
  });
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the webrtcLoggingPrivate API.

var binding = apiBridge ||
              require('binding').Binding.create('webrtcLoggingPrivate');

var getBindDirectoryEntryCallback =
    require('fileEntryBindingUtil').getBindDirectoryEntryCallback;

binding.registerCustomHook(function(binding, id, contextType) {
  var apiFunctions = binding.apiFunctions;
  apiFunctions.setCustomCallback('getLogsDirectory',
                                 getBindDirectoryEntryCallback());
});

if (!apiBridge)
  exports.$set('binding', binding.generate());
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Custom binding for the webstore API.

var webstoreNatives = requireNative('webstore');

var onInstallStageChanged;
var onDownloadProgress;

function Installer() {
  this._pendingInstall = null;
}

Installer.prototype.install = function(url, onSuccess, onFailure) {
  if (this._pendingInstall)
    throw new Error('A Chrome Web Store installation is already pending.');

  // With native bindings, these calls go through argument validation, which
  // sets optional/missing arguments to null. The native webstore bindings
  // expect either present or undefined, so transform null to undefined.
  if (url === null)
    url = undefined;
  if (onSuccess === null)
    onSuccess = undefined;
  if (onFailure === null)
    onFailure = undefined;

  if (url !== undefined && typeof url !== 'string') {
    throw new Error(
        'The Chrome Web Store item link URL parameter must be a string.');
  }
  if (onSuccess !== undefined && typeof onSuccess !== 'function') {
    throw new Error('The success callback parameter must be a function.');
  }
  if (onFailure !== undefined && typeof onFailure !== 'function') {
    throw new Error('The failure callback parameter must be a function.');
  }

  // Since we call Install() with a bool for if we have listeners, listeners
  // must be set prior to the inline installation starting (this is also
  // noted in the Event documentation in
  // chrome/common/extensions/api/webstore.json).
  var installId = webstoreNatives.Install(
      onInstallStageChanged.hasListeners(),
      onDownloadProgress.hasListeners(),
      url,
      onSuccess,
      onFailure);
  if (installId !== undefined) {
    this._pendingInstall = {
      installId: installId,
      onSuccess: onSuccess,
      onFailure: onFailure
    };
  }
};

Installer.prototype.onInstallResponse =
    function(installId, success, error, resultCode) {
  var pendingInstall = this._pendingInstall;
  if (!pendingInstall || pendingInstall.installId != installId) {
    // TODO(kalman): should this be an error?
    return;
  }

  try {
    if (success && pendingInstall.onSuccess)
      pendingInstall.onSuccess();
    else if (!success && pendingInstall.onFailure)
      pendingInstall.onFailure(error, resultCode);
  } catch (e) {
    console.error('Exception in chrome.webstore.install response handler: ' +
                  e.stack);
  } finally {
    this._pendingInstall = null;
  }
};

Installer.prototype.onInstallStageChanged = function(installStage) {
  onInstallStageChanged.dispatch(installStage);
};

Installer.prototype.onDownloadProgress = function(progress) {
  onDownloadProgress.dispatch(progress);
};

var installer = new Installer();


if (apiBridge) {
  apiBridge.registerCustomHook(function(api) {
    api.apiFunctions.setHandleRequest('install',
                                      function(url, onSuccess, onFailure) {
      installer.install(url, onSuccess, onFailure);
    });

    onInstallStageChanged = api.compiledApi.onInstallStageChanged;
    onDownloadProgress = api.compiledApi.onDownloadProgress;
  });
} else {
  var Event = require('event_bindings').Event;
  onInstallStageChanged =
      new Event(null, [{name: 'stage', type: 'string'}], {unmanaged: true});
  onDownloadProgress =
      new Event(null, [{name: 'progress', type: 'number'}], {unmanaged: true});

  var chromeWebstore = {
    install: function (url, onSuccess, onFailure) {
      installer.install(url, onSuccess, onFailure);
    },
    onInstallStageChanged: onInstallStageChanged,
    onDownloadProgress: onDownloadProgress,
  };
  exports.$set('binding', chromeWebstore);
}

// Called by webstore_bindings.cc.
exports.$set('onInstallResponse',
             $Function.bind(Installer.prototype.onInstallResponse, installer));
exports.$set('onInstallStageChanged',
             $Function.bind(Installer.prototype.onInstallStageChanged,
                            installer));
exports.$set('onDownloadProgress',
             $Function.bind(Installer.prototype.onDownloadProgress, installer));
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'chrome/common/media_router/mojo/media_controller.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('mediaRouter.mojom');
  var media_status$ =
      mojo.internal.exposeNamespace('mediaRouter.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'chrome/common/media_router/mojo/media_status.mojom', 'media_status.mojom.js');
  }
  var time$ =
      mojo.internal.exposeNamespace('mojoBase.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'mojo/public/mojom/base/time.mojom', '../../../../mojo/public/mojom/base/time.mojom.js');
  }



  function MediaController_Play_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaController_Play_Params.prototype.initDefaults_ = function() {
  };
  MediaController_Play_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaController_Play_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 8}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaController_Play_Params.encodedSize = codec.kStructHeaderSize + 0;

  MediaController_Play_Params.decode = function(decoder) {
    var packed;
    var val = new MediaController_Play_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    return val;
  };

  MediaController_Play_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaController_Play_Params.encodedSize);
    encoder.writeUint32(0);
  };
  function MediaController_Pause_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaController_Pause_Params.prototype.initDefaults_ = function() {
  };
  MediaController_Pause_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaController_Pause_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 8}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaController_Pause_Params.encodedSize = codec.kStructHeaderSize + 0;

  MediaController_Pause_Params.decode = function(decoder) {
    var packed;
    var val = new MediaController_Pause_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    return val;
  };

  MediaController_Pause_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaController_Pause_Params.encodedSize);
    encoder.writeUint32(0);
  };
  function MediaController_SetMute_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaController_SetMute_Params.prototype.initDefaults_ = function() {
    this.mute = false;
  };
  MediaController_SetMute_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaController_SetMute_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  MediaController_SetMute_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaController_SetMute_Params.decode = function(decoder) {
    var packed;
    var val = new MediaController_SetMute_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    packed = decoder.readUint8();
    val.mute = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaController_SetMute_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaController_SetMute_Params.encodedSize);
    encoder.writeUint32(0);
    packed = 0;
    packed |= (val.mute & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaController_SetVolume_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaController_SetVolume_Params.prototype.initDefaults_ = function() {
    this.volume = 0;
  };
  MediaController_SetVolume_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaController_SetVolume_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  MediaController_SetVolume_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaController_SetVolume_Params.decode = function(decoder) {
    var packed;
    var val = new MediaController_SetVolume_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.volume = decoder.decodeStruct(codec.Float);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaController_SetVolume_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaController_SetVolume_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Float, val.volume);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaController_Seek_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaController_Seek_Params.prototype.initDefaults_ = function() {
    this.time = null;
  };
  MediaController_Seek_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaController_Seek_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaController_Seek_Params.time
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, time$.TimeDelta, false);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaController_Seek_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaController_Seek_Params.decode = function(decoder) {
    var packed;
    var val = new MediaController_Seek_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.time = decoder.decodeStructPointer(time$.TimeDelta);
    return val;
  };

  MediaController_Seek_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaController_Seek_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(time$.TimeDelta, val.time);
  };
  function MediaController_ConnectHangoutsMediaRouteController_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaController_ConnectHangoutsMediaRouteController_Params.prototype.initDefaults_ = function() {
    this.controllerRequest = new bindings.InterfaceRequest();
  };
  MediaController_ConnectHangoutsMediaRouteController_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaController_ConnectHangoutsMediaRouteController_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaController_ConnectHangoutsMediaRouteController_Params.controllerRequest
    err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaController_ConnectHangoutsMediaRouteController_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaController_ConnectHangoutsMediaRouteController_Params.decode = function(decoder) {
    var packed;
    var val = new MediaController_ConnectHangoutsMediaRouteController_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.controllerRequest = decoder.decodeStruct(codec.InterfaceRequest);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaController_ConnectHangoutsMediaRouteController_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaController_ConnectHangoutsMediaRouteController_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.InterfaceRequest, val.controllerRequest);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function HangoutsMediaRouteController_SetLocalPresent_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  HangoutsMediaRouteController_SetLocalPresent_Params.prototype.initDefaults_ = function() {
    this.localPresent = false;
  };
  HangoutsMediaRouteController_SetLocalPresent_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  HangoutsMediaRouteController_SetLocalPresent_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  HangoutsMediaRouteController_SetLocalPresent_Params.encodedSize = codec.kStructHeaderSize + 8;

  HangoutsMediaRouteController_SetLocalPresent_Params.decode = function(decoder) {
    var packed;
    var val = new HangoutsMediaRouteController_SetLocalPresent_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    packed = decoder.readUint8();
    val.localPresent = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  HangoutsMediaRouteController_SetLocalPresent_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(HangoutsMediaRouteController_SetLocalPresent_Params.encodedSize);
    encoder.writeUint32(0);
    packed = 0;
    packed |= (val.localPresent & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  var kMediaController_Play_Name = 333355201;
  var kMediaController_Pause_Name = 480051560;
  var kMediaController_SetMute_Name = 1612742323;
  var kMediaController_SetVolume_Name = 1304638165;
  var kMediaController_Seek_Name = 843189145;
  var kMediaController_ConnectHangoutsMediaRouteController_Name = 1243415274;

  function MediaControllerPtr(handleOrPtrInfo) {
    this.ptr = new bindings.InterfacePtrController(MediaController,
                                                   handleOrPtrInfo);
  }

  function MediaControllerAssociatedPtr(associatedInterfacePtrInfo) {
    this.ptr = new associatedBindings.AssociatedInterfacePtrController(
        MediaController, associatedInterfacePtrInfo);
  }

  MediaControllerAssociatedPtr.prototype =
      Object.create(MediaControllerPtr.prototype);
  MediaControllerAssociatedPtr.prototype.constructor =
      MediaControllerAssociatedPtr;

  function MediaControllerProxy(receiver) {
    this.receiver_ = receiver;
  }
  MediaControllerPtr.prototype.play = function() {
    return MediaControllerProxy.prototype.play
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaControllerProxy.prototype.play = function() {
    var params_ = new MediaController_Play_Params();
    var builder = new codec.MessageV0Builder(
        kMediaController_Play_Name,
        codec.align(MediaController_Play_Params.encodedSize));
    builder.encodeStruct(MediaController_Play_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaControllerPtr.prototype.pause = function() {
    return MediaControllerProxy.prototype.pause
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaControllerProxy.prototype.pause = function() {
    var params_ = new MediaController_Pause_Params();
    var builder = new codec.MessageV0Builder(
        kMediaController_Pause_Name,
        codec.align(MediaController_Pause_Params.encodedSize));
    builder.encodeStruct(MediaController_Pause_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaControllerPtr.prototype.setMute = function() {
    return MediaControllerProxy.prototype.setMute
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaControllerProxy.prototype.setMute = function(mute) {
    var params_ = new MediaController_SetMute_Params();
    params_.mute = mute;
    var builder = new codec.MessageV0Builder(
        kMediaController_SetMute_Name,
        codec.align(MediaController_SetMute_Params.encodedSize));
    builder.encodeStruct(MediaController_SetMute_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaControllerPtr.prototype.setVolume = function() {
    return MediaControllerProxy.prototype.setVolume
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaControllerProxy.prototype.setVolume = function(volume) {
    var params_ = new MediaController_SetVolume_Params();
    params_.volume = volume;
    var builder = new codec.MessageV0Builder(
        kMediaController_SetVolume_Name,
        codec.align(MediaController_SetVolume_Params.encodedSize));
    builder.encodeStruct(MediaController_SetVolume_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaControllerPtr.prototype.seek = function() {
    return MediaControllerProxy.prototype.seek
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaControllerProxy.prototype.seek = function(time) {
    var params_ = new MediaController_Seek_Params();
    params_.time = time;
    var builder = new codec.MessageV0Builder(
        kMediaController_Seek_Name,
        codec.align(MediaController_Seek_Params.encodedSize));
    builder.encodeStruct(MediaController_Seek_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaControllerPtr.prototype.connectHangoutsMediaRouteController = function() {
    return MediaControllerProxy.prototype.connectHangoutsMediaRouteController
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaControllerProxy.prototype.connectHangoutsMediaRouteController = function(controllerRequest) {
    var params_ = new MediaController_ConnectHangoutsMediaRouteController_Params();
    params_.controllerRequest = controllerRequest;
    var builder = new codec.MessageV0Builder(
        kMediaController_ConnectHangoutsMediaRouteController_Name,
        codec.align(MediaController_ConnectHangoutsMediaRouteController_Params.encodedSize));
    builder.encodeStruct(MediaController_ConnectHangoutsMediaRouteController_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };

  function MediaControllerStub(delegate) {
    this.delegate_ = delegate;
  }
  MediaControllerStub.prototype.play = function() {
    return this.delegate_ && this.delegate_.play && this.delegate_.play();
  }
  MediaControllerStub.prototype.pause = function() {
    return this.delegate_ && this.delegate_.pause && this.delegate_.pause();
  }
  MediaControllerStub.prototype.setMute = function(mute) {
    return this.delegate_ && this.delegate_.setMute && this.delegate_.setMute(mute);
  }
  MediaControllerStub.prototype.setVolume = function(volume) {
    return this.delegate_ && this.delegate_.setVolume && this.delegate_.setVolume(volume);
  }
  MediaControllerStub.prototype.seek = function(time) {
    return this.delegate_ && this.delegate_.seek && this.delegate_.seek(time);
  }
  MediaControllerStub.prototype.connectHangoutsMediaRouteController = function(controllerRequest) {
    return this.delegate_ && this.delegate_.connectHangoutsMediaRouteController && this.delegate_.connectHangoutsMediaRouteController(controllerRequest);
  }

  MediaControllerStub.prototype.accept = function(message) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kMediaController_Play_Name:
      var params = reader.decodeStruct(MediaController_Play_Params);
      this.play();
      return true;
    case kMediaController_Pause_Name:
      var params = reader.decodeStruct(MediaController_Pause_Params);
      this.pause();
      return true;
    case kMediaController_SetMute_Name:
      var params = reader.decodeStruct(MediaController_SetMute_Params);
      this.setMute(params.mute);
      return true;
    case kMediaController_SetVolume_Name:
      var params = reader.decodeStruct(MediaController_SetVolume_Params);
      this.setVolume(params.volume);
      return true;
    case kMediaController_Seek_Name:
      var params = reader.decodeStruct(MediaController_Seek_Params);
      this.seek(params.time);
      return true;
    case kMediaController_ConnectHangoutsMediaRouteController_Name:
      var params = reader.decodeStruct(MediaController_ConnectHangoutsMediaRouteController_Params);
      this.connectHangoutsMediaRouteController(params.controllerRequest);
      return true;
    default:
      return false;
    }
  };

  MediaControllerStub.prototype.acceptWithResponder =
      function(message, responder) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    default:
      return false;
    }
  };

  function validateMediaControllerRequest(messageValidator) {
    var message = messageValidator.message;
    var paramsClass = null;
    switch (message.getName()) {
      case kMediaController_Play_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaController_Play_Params;
      break;
      case kMediaController_Pause_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaController_Pause_Params;
      break;
      case kMediaController_SetMute_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaController_SetMute_Params;
      break;
      case kMediaController_SetVolume_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaController_SetVolume_Params;
      break;
      case kMediaController_Seek_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaController_Seek_Params;
      break;
      case kMediaController_ConnectHangoutsMediaRouteController_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaController_ConnectHangoutsMediaRouteController_Params;
      break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  function validateMediaControllerResponse(messageValidator) {
    return validator.validationError.NONE;
  }

  var MediaController = {
    name: 'media_router.mojom.MediaController',
    kVersion: 0,
    ptrClass: MediaControllerPtr,
    proxyClass: MediaControllerProxy,
    stubClass: MediaControllerStub,
    validateRequest: validateMediaControllerRequest,
    validateResponse: null,
  };
  MediaControllerStub.prototype.validator = validateMediaControllerRequest;
  MediaControllerProxy.prototype.validator = null;
  var kHangoutsMediaRouteController_SetLocalPresent_Name = 1300621351;

  function HangoutsMediaRouteControllerPtr(handleOrPtrInfo) {
    this.ptr = new bindings.InterfacePtrController(HangoutsMediaRouteController,
                                                   handleOrPtrInfo);
  }

  function HangoutsMediaRouteControllerAssociatedPtr(associatedInterfacePtrInfo) {
    this.ptr = new associatedBindings.AssociatedInterfacePtrController(
        HangoutsMediaRouteController, associatedInterfacePtrInfo);
  }

  HangoutsMediaRouteControllerAssociatedPtr.prototype =
      Object.create(HangoutsMediaRouteControllerPtr.prototype);
  HangoutsMediaRouteControllerAssociatedPtr.prototype.constructor =
      HangoutsMediaRouteControllerAssociatedPtr;

  function HangoutsMediaRouteControllerProxy(receiver) {
    this.receiver_ = receiver;
  }
  HangoutsMediaRouteControllerPtr.prototype.setLocalPresent = function() {
    return HangoutsMediaRouteControllerProxy.prototype.setLocalPresent
        .apply(this.ptr.getProxy(), arguments);
  };

  HangoutsMediaRouteControllerProxy.prototype.setLocalPresent = function(localPresent) {
    var params_ = new HangoutsMediaRouteController_SetLocalPresent_Params();
    params_.localPresent = localPresent;
    var builder = new codec.MessageV0Builder(
        kHangoutsMediaRouteController_SetLocalPresent_Name,
        codec.align(HangoutsMediaRouteController_SetLocalPresent_Params.encodedSize));
    builder.encodeStruct(HangoutsMediaRouteController_SetLocalPresent_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };

  function HangoutsMediaRouteControllerStub(delegate) {
    this.delegate_ = delegate;
  }
  HangoutsMediaRouteControllerStub.prototype.setLocalPresent = function(localPresent) {
    return this.delegate_ && this.delegate_.setLocalPresent && this.delegate_.setLocalPresent(localPresent);
  }

  HangoutsMediaRouteControllerStub.prototype.accept = function(message) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kHangoutsMediaRouteController_SetLocalPresent_Name:
      var params = reader.decodeStruct(HangoutsMediaRouteController_SetLocalPresent_Params);
      this.setLocalPresent(params.localPresent);
      return true;
    default:
      return false;
    }
  };

  HangoutsMediaRouteControllerStub.prototype.acceptWithResponder =
      function(message, responder) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    default:
      return false;
    }
  };

  function validateHangoutsMediaRouteControllerRequest(messageValidator) {
    var message = messageValidator.message;
    var paramsClass = null;
    switch (message.getName()) {
      case kHangoutsMediaRouteController_SetLocalPresent_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = HangoutsMediaRouteController_SetLocalPresent_Params;
      break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  function validateHangoutsMediaRouteControllerResponse(messageValidator) {
    return validator.validationError.NONE;
  }

  var HangoutsMediaRouteController = {
    name: 'media_router.mojom.HangoutsMediaRouteController',
    kVersion: 0,
    ptrClass: HangoutsMediaRouteControllerPtr,
    proxyClass: HangoutsMediaRouteControllerProxy,
    stubClass: HangoutsMediaRouteControllerStub,
    validateRequest: validateHangoutsMediaRouteControllerRequest,
    validateResponse: null,
  };
  HangoutsMediaRouteControllerStub.prototype.validator = validateHangoutsMediaRouteControllerRequest;
  HangoutsMediaRouteControllerProxy.prototype.validator = null;
  exports.MediaController = MediaController;
  exports.MediaControllerPtr = MediaControllerPtr;
  exports.MediaControllerAssociatedPtr = MediaControllerAssociatedPtr;
  exports.HangoutsMediaRouteController = HangoutsMediaRouteController;
  exports.HangoutsMediaRouteControllerPtr = HangoutsMediaRouteControllerPtr;
  exports.HangoutsMediaRouteControllerAssociatedPtr = HangoutsMediaRouteControllerAssociatedPtr;
})();// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'chrome/common/media_router/mojo/media_router.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('mediaRouter.mojom');
  var media_controller$ =
      mojo.internal.exposeNamespace('mediaRouter.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'chrome/common/media_router/mojo/media_controller.mojom', 'media_controller.mojom.js');
  }
  var media_status$ =
      mojo.internal.exposeNamespace('mediaRouter.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'chrome/common/media_router/mojo/media_status.mojom', 'media_status.mojom.js');
  }
  var mirror_service_remoting$ =
      mojo.internal.exposeNamespace('media.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'media/mojo/interfaces/mirror_service_remoting.mojom', '../../../../media/mojo/interfaces/mirror_service_remoting.mojom.js');
  }
  var time$ =
      mojo.internal.exposeNamespace('mojoBase.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'mojo/public/mojom/base/time.mojom', '../../../../mojo/public/mojom/base/time.mojom.js');
  }
  var ip_address$ =
      mojo.internal.exposeNamespace('net.interfaces');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'net/interfaces/ip_address.mojom', '../../../../net/interfaces/ip_address.mojom.js');
  }
  var ip_endpoint$ =
      mojo.internal.exposeNamespace('net.interfaces');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'net/interfaces/ip_endpoint.mojom', '../../../../net/interfaces/ip_endpoint.mojom.js');
  }
  var origin$ =
      mojo.internal.exposeNamespace('url.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'url/mojom/origin.mojom', '../../../../url/mojom/origin.mojom.js');
  }
  var url$ =
      mojo.internal.exposeNamespace('url.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'url/mojom/url.mojom', '../../../../url/mojom/url.mojom.js');
  }


  var SinkIconType = {};
  SinkIconType.CAST = 0;
  SinkIconType.CAST_AUDIO_GROUP = SinkIconType.CAST + 1;
  SinkIconType.CAST_AUDIO = SinkIconType.CAST_AUDIO_GROUP + 1;
  SinkIconType.MEETING = SinkIconType.CAST_AUDIO + 1;
  SinkIconType.HANGOUT = SinkIconType.MEETING + 1;
  SinkIconType.EDUCATION = SinkIconType.HANGOUT + 1;
  SinkIconType.WIRED_DISPLAY = SinkIconType.EDUCATION + 1;
  SinkIconType.GENERIC = SinkIconType.WIRED_DISPLAY + 1;

  SinkIconType.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
      return true;
    }
    return false;
  };

  SinkIconType.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  var RouteControllerType = {};
  RouteControllerType.kNone = 0;
  RouteControllerType.kGeneric = RouteControllerType.kNone + 1;
  RouteControllerType.kHangouts = RouteControllerType.kGeneric + 1;
  RouteControllerType.kMirroring = RouteControllerType.kHangouts + 1;

  RouteControllerType.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
    case 3:
      return true;
    }
    return false;
  };

  RouteControllerType.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  var RouteRequestResultCode = {};
  RouteRequestResultCode.UNKNOWN_ERROR = 0;
  RouteRequestResultCode.OK = RouteRequestResultCode.UNKNOWN_ERROR + 1;
  RouteRequestResultCode.TIMED_OUT = RouteRequestResultCode.OK + 1;
  RouteRequestResultCode.ROUTE_NOT_FOUND = RouteRequestResultCode.TIMED_OUT + 1;
  RouteRequestResultCode.SINK_NOT_FOUND = RouteRequestResultCode.ROUTE_NOT_FOUND + 1;
  RouteRequestResultCode.INVALID_ORIGIN = RouteRequestResultCode.SINK_NOT_FOUND + 1;
  RouteRequestResultCode.INCOGNITO_MISMATCH = RouteRequestResultCode.INVALID_ORIGIN + 1;
  RouteRequestResultCode.NO_SUPPORTED_PROVIDER = RouteRequestResultCode.INCOGNITO_MISMATCH + 1;
  RouteRequestResultCode.CANCELLED = RouteRequestResultCode.NO_SUPPORTED_PROVIDER + 1;
  RouteRequestResultCode.ROUTE_ALREADY_EXISTS = RouteRequestResultCode.CANCELLED + 1;

  RouteRequestResultCode.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
    case 9:
      return true;
    }
    return false;
  };

  RouteRequestResultCode.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };

  function MediaSink(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaSink.prototype.initDefaults_ = function() {
    this.sinkId = null;
    this.name = null;
    this.description = null;
    this.domain = null;
    this.iconType = 0;
    this.providerId = 0;
    this.extraData = null;
  };
  MediaSink.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaSink.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 64}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaSink.sinkId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaSink.name
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaSink.description
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaSink.domain
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaSink.iconType
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 32, SinkIconType);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaSink.providerId
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 36, MediaRouteProvider.Id);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaSink.extraData
    err = messageValidator.validateUnion(offset + codec.kStructHeaderSize + 40, MediaSinkExtraData, true);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaSink.encodedSize = codec.kStructHeaderSize + 56;

  MediaSink.decode = function(decoder) {
    var packed;
    var val = new MediaSink();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.sinkId = decoder.decodeStruct(codec.String);
    val.name = decoder.decodeStruct(codec.String);
    val.description = decoder.decodeStruct(codec.NullableString);
    val.domain = decoder.decodeStruct(codec.NullableString);
    val.iconType = decoder.decodeStruct(codec.Int32);
    val.providerId = decoder.decodeStruct(codec.Int32);
    val.extraData = decoder.decodeStruct(MediaSinkExtraData);
    return val;
  };

  MediaSink.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaSink.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.sinkId);
    encoder.encodeStruct(codec.String, val.name);
    encoder.encodeStruct(codec.NullableString, val.description);
    encoder.encodeStruct(codec.NullableString, val.domain);
    encoder.encodeStruct(codec.Int32, val.iconType);
    encoder.encodeStruct(codec.Int32, val.providerId);
    encoder.encodeStruct(MediaSinkExtraData, val.extraData);
  };
  function DialMediaSink(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  DialMediaSink.prototype.initDefaults_ = function() {
    this.ipAddress = null;
    this.modelName = null;
    this.appUrl = null;
  };
  DialMediaSink.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  DialMediaSink.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate DialMediaSink.ipAddress
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_address$.IPAddress, false);
    if (err !== validator.validationError.NONE)
        return err;


    // validate DialMediaSink.modelName
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate DialMediaSink.appUrl
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, url$.Url, false);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  DialMediaSink.encodedSize = codec.kStructHeaderSize + 24;

  DialMediaSink.decode = function(decoder) {
    var packed;
    var val = new DialMediaSink();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.ipAddress = decoder.decodeStructPointer(ip_address$.IPAddress);
    val.modelName = decoder.decodeStruct(codec.String);
    val.appUrl = decoder.decodeStructPointer(url$.Url);
    return val;
  };

  DialMediaSink.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(DialMediaSink.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(ip_address$.IPAddress, val.ipAddress);
    encoder.encodeStruct(codec.String, val.modelName);
    encoder.encodeStructPointer(url$.Url, val.appUrl);
  };
  function CastMediaSink(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  CastMediaSink.prototype.initDefaults_ = function() {
    this.ipEndpoint = null;
    this.modelName = null;
    this.capabilities = 0;
    this.castChannelId = 0;
  };
  CastMediaSink.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  CastMediaSink.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate CastMediaSink.ipEndpoint
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_endpoint$.IPEndPoint, false);
    if (err !== validator.validationError.NONE)
        return err;


    // validate CastMediaSink.modelName
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;



    return validator.validationError.NONE;
  };

  CastMediaSink.encodedSize = codec.kStructHeaderSize + 24;

  CastMediaSink.decode = function(decoder) {
    var packed;
    var val = new CastMediaSink();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.ipEndpoint = decoder.decodeStructPointer(ip_endpoint$.IPEndPoint);
    val.modelName = decoder.decodeStruct(codec.String);
    val.capabilities = decoder.decodeStruct(codec.Uint8);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.castChannelId = decoder.decodeStruct(codec.Int32);
    return val;
  };

  CastMediaSink.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(CastMediaSink.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(ip_endpoint$.IPEndPoint, val.ipEndpoint);
    encoder.encodeStruct(codec.String, val.modelName);
    encoder.encodeStruct(codec.Uint8, val.capabilities);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStruct(codec.Int32, val.castChannelId);
  };
  function MediaRoute(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRoute.prototype.initDefaults_ = function() {
    this.mediaRouteId = null;
    this.presentationId = null;
    this.mediaSource = null;
    this.mediaSinkId = null;
    this.description = null;
    this.isLocal = false;
    this.forDisplay = false;
    this.isIncognito = false;
    this.isLocalPresentation = false;
    this.controllerType = 0;
  };
  MediaRoute.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRoute.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 56}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRoute.mediaRouteId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRoute.presentationId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRoute.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRoute.mediaSinkId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRoute.description
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 32, false)
    if (err !== validator.validationError.NONE)
        return err;



    // validate MediaRoute.controllerType
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 44, RouteControllerType);
    if (err !== validator.validationError.NONE)
        return err;




    return validator.validationError.NONE;
  };

  MediaRoute.encodedSize = codec.kStructHeaderSize + 48;

  MediaRoute.decode = function(decoder) {
    var packed;
    var val = new MediaRoute();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaRouteId = decoder.decodeStruct(codec.String);
    val.presentationId = decoder.decodeStruct(codec.String);
    val.mediaSource = decoder.decodeStruct(codec.NullableString);
    val.mediaSinkId = decoder.decodeStruct(codec.String);
    val.description = decoder.decodeStruct(codec.String);
    packed = decoder.readUint8();
    val.isLocal = (packed >> 0) & 1 ? true : false;
    val.forDisplay = (packed >> 1) & 1 ? true : false;
    val.isIncognito = (packed >> 2) & 1 ? true : false;
    val.isLocalPresentation = (packed >> 3) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.controllerType = decoder.decodeStruct(codec.Int32);
    return val;
  };

  MediaRoute.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRoute.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaRouteId);
    encoder.encodeStruct(codec.String, val.presentationId);
    encoder.encodeStruct(codec.NullableString, val.mediaSource);
    encoder.encodeStruct(codec.String, val.mediaSinkId);
    encoder.encodeStruct(codec.String, val.description);
    packed = 0;
    packed |= (val.isLocal & 1) << 0
    packed |= (val.forDisplay & 1) << 1
    packed |= (val.isIncognito & 1) << 2
    packed |= (val.isLocalPresentation & 1) << 3
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStruct(codec.Int32, val.controllerType);
  };
  function Issue(values) {
    this.initDefaults_();
    this.initFields_(values);
  }

  Issue.Severity = {};
  Issue.Severity.FATAL = 0;
  Issue.Severity.WARNING = Issue.Severity.FATAL + 1;
  Issue.Severity.NOTIFICATION = Issue.Severity.WARNING + 1;

  Issue.Severity.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
      return true;
    }
    return false;
  };

  Issue.Severity.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  Issue.ActionType = {};
  Issue.ActionType.DISMISS = 0;
  Issue.ActionType.LEARN_MORE = Issue.ActionType.DISMISS + 1;

  Issue.ActionType.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
      return true;
    }
    return false;
  };

  Issue.ActionType.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };

  Issue.prototype.initDefaults_ = function() {
    this.routeId = null;
    this.severity = 0;
    this.isBlocking = false;
    this.title = null;
    this.message = null;
    this.defaultAction = 0;
    this.helpPageId = 0;
    this.secondaryActions = null;
  };
  Issue.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  Issue.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 56}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate Issue.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate Issue.severity
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, Issue.Severity);
    if (err !== validator.validationError.NONE)
        return err;



    // validate Issue.title
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate Issue.message
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate Issue.defaultAction
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 32, Issue.ActionType);
    if (err !== validator.validationError.NONE)
        return err;


    // validate Issue.secondaryActions
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 40, 4, new codec.Enum(Issue.ActionType), false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  Issue.encodedSize = codec.kStructHeaderSize + 48;

  Issue.decode = function(decoder) {
    var packed;
    var val = new Issue();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.routeId = decoder.decodeStruct(codec.NullableString);
    val.severity = decoder.decodeStruct(codec.Int32);
    packed = decoder.readUint8();
    val.isBlocking = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.title = decoder.decodeStruct(codec.String);
    val.message = decoder.decodeStruct(codec.NullableString);
    val.defaultAction = decoder.decodeStruct(codec.Int32);
    val.helpPageId = decoder.decodeStruct(codec.Int32);
    val.secondaryActions = decoder.decodeArrayPointer(new codec.Enum(Issue.ActionType));
    return val;
  };

  Issue.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(Issue.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.NullableString, val.routeId);
    encoder.encodeStruct(codec.Int32, val.severity);
    packed = 0;
    packed |= (val.isBlocking & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStruct(codec.String, val.title);
    encoder.encodeStruct(codec.NullableString, val.message);
    encoder.encodeStruct(codec.Int32, val.defaultAction);
    encoder.encodeStruct(codec.Int32, val.helpPageId);
    encoder.encodeArrayPointer(new codec.Enum(Issue.ActionType), val.secondaryActions);
  };
  function RouteMessage(values) {
    this.initDefaults_();
    this.initFields_(values);
  }

  RouteMessage.Type = {};
  RouteMessage.Type.TEXT = 0;
  RouteMessage.Type.BINARY = RouteMessage.Type.TEXT + 1;

  RouteMessage.Type.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
      return true;
    }
    return false;
  };

  RouteMessage.Type.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };

  RouteMessage.prototype.initDefaults_ = function() {
    this.type = 0;
    this.message = null;
    this.data = null;
  };
  RouteMessage.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  RouteMessage.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate RouteMessage.type
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, RouteMessage.Type);
    if (err !== validator.validationError.NONE)
        return err;


    // validate RouteMessage.message
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate RouteMessage.data
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 1, codec.Uint8, true, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  RouteMessage.encodedSize = codec.kStructHeaderSize + 24;

  RouteMessage.decode = function(decoder) {
    var packed;
    var val = new RouteMessage();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.type = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.message = decoder.decodeStruct(codec.NullableString);
    val.data = decoder.decodeArrayPointer(codec.Uint8);
    return val;
  };

  RouteMessage.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(RouteMessage.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int32, val.type);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStruct(codec.NullableString, val.message);
    encoder.encodeArrayPointer(codec.Uint8, val.data);
  };
  function SinkSearchCriteria(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  SinkSearchCriteria.prototype.initDefaults_ = function() {
    this.input = null;
    this.domain = null;
  };
  SinkSearchCriteria.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  SinkSearchCriteria.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate SinkSearchCriteria.input
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate SinkSearchCriteria.domain
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  SinkSearchCriteria.encodedSize = codec.kStructHeaderSize + 16;

  SinkSearchCriteria.decode = function(decoder) {
    var packed;
    var val = new SinkSearchCriteria();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.input = decoder.decodeStruct(codec.String);
    val.domain = decoder.decodeStruct(codec.String);
    return val;
  };

  SinkSearchCriteria.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(SinkSearchCriteria.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.input);
    encoder.encodeStruct(codec.String, val.domain);
  };
  function MediaRouteProviderConfig(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProviderConfig.prototype.initDefaults_ = function() {
    this.enableDialDiscovery = false;
    this.enableCastDiscovery = false;
    this.enableDialSinkQuery = false;
    this.enableCastSinkQuery = false;
  };
  MediaRouteProviderConfig.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProviderConfig.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;





    return validator.validationError.NONE;
  };

  MediaRouteProviderConfig.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProviderConfig.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProviderConfig();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    packed = decoder.readUint8();
    val.enableDialDiscovery = (packed >> 0) & 1 ? true : false;
    val.enableCastDiscovery = (packed >> 1) & 1 ? true : false;
    val.enableDialSinkQuery = (packed >> 2) & 1 ? true : false;
    val.enableCastSinkQuery = (packed >> 3) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouteProviderConfig.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProviderConfig.encodedSize);
    encoder.writeUint32(0);
    packed = 0;
    packed |= (val.enableDialDiscovery & 1) << 0
    packed |= (val.enableCastDiscovery & 1) << 1
    packed |= (val.enableDialSinkQuery & 1) << 2
    packed |= (val.enableCastSinkQuery & 1) << 3
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouteProvider_CreateRoute_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_CreateRoute_Params.prototype.initDefaults_ = function() {
    this.mediaSource = null;
    this.sinkId = null;
    this.originalPresentationId = null;
    this.origin = null;
    this.tabId = 0;
    this.incognito = false;
    this.timeout = null;
  };
  MediaRouteProvider_CreateRoute_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_CreateRoute_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 56}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateRoute_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateRoute_Params.sinkId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateRoute_Params.originalPresentationId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateRoute_Params.origin
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, origin$.Origin, false);
    if (err !== validator.validationError.NONE)
        return err;



    // validate MediaRouteProvider_CreateRoute_Params.timeout
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, time$.TimeDelta, false);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  MediaRouteProvider_CreateRoute_Params.encodedSize = codec.kStructHeaderSize + 48;

  MediaRouteProvider_CreateRoute_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_CreateRoute_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaSource = decoder.decodeStruct(codec.String);
    val.sinkId = decoder.decodeStruct(codec.String);
    val.originalPresentationId = decoder.decodeStruct(codec.String);
    val.origin = decoder.decodeStructPointer(origin$.Origin);
    val.tabId = decoder.decodeStruct(codec.Int32);
    packed = decoder.readUint8();
    val.incognito = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.timeout = decoder.decodeStructPointer(time$.TimeDelta);
    return val;
  };

  MediaRouteProvider_CreateRoute_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_CreateRoute_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaSource);
    encoder.encodeStruct(codec.String, val.sinkId);
    encoder.encodeStruct(codec.String, val.originalPresentationId);
    encoder.encodeStructPointer(origin$.Origin, val.origin);
    encoder.encodeStruct(codec.Int32, val.tabId);
    packed = 0;
    packed |= (val.incognito & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStructPointer(time$.TimeDelta, val.timeout);
  };
  function MediaRouteProvider_CreateRoute_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_CreateRoute_ResponseParams.prototype.initDefaults_ = function() {
    this.route = null;
    this.errorText = null;
    this.resultCode = 0;
  };
  MediaRouteProvider_CreateRoute_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_CreateRoute_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateRoute_ResponseParams.route
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateRoute_ResponseParams.errorText
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateRoute_ResponseParams.resultCode
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 16, RouteRequestResultCode);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_CreateRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 24;

  MediaRouteProvider_CreateRoute_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_CreateRoute_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.route = decoder.decodeStructPointer(MediaRoute);
    val.errorText = decoder.decodeStruct(codec.NullableString);
    val.resultCode = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouteProvider_CreateRoute_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_CreateRoute_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(MediaRoute, val.route);
    encoder.encodeStruct(codec.NullableString, val.errorText);
    encoder.encodeStruct(codec.Int32, val.resultCode);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouteProvider_JoinRoute_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_JoinRoute_Params.prototype.initDefaults_ = function() {
    this.mediaSource = null;
    this.presentationId = null;
    this.origin = null;
    this.tabId = 0;
    this.incognito = false;
    this.timeout = null;
  };
  MediaRouteProvider_JoinRoute_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_JoinRoute_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 48}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_JoinRoute_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_JoinRoute_Params.presentationId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_JoinRoute_Params.origin
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, origin$.Origin, false);
    if (err !== validator.validationError.NONE)
        return err;



    // validate MediaRouteProvider_JoinRoute_Params.timeout
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 32, time$.TimeDelta, false);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  MediaRouteProvider_JoinRoute_Params.encodedSize = codec.kStructHeaderSize + 40;

  MediaRouteProvider_JoinRoute_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_JoinRoute_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaSource = decoder.decodeStruct(codec.String);
    val.presentationId = decoder.decodeStruct(codec.String);
    val.origin = decoder.decodeStructPointer(origin$.Origin);
    val.tabId = decoder.decodeStruct(codec.Int32);
    packed = decoder.readUint8();
    val.incognito = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.timeout = decoder.decodeStructPointer(time$.TimeDelta);
    return val;
  };

  MediaRouteProvider_JoinRoute_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_JoinRoute_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaSource);
    encoder.encodeStruct(codec.String, val.presentationId);
    encoder.encodeStructPointer(origin$.Origin, val.origin);
    encoder.encodeStruct(codec.Int32, val.tabId);
    packed = 0;
    packed |= (val.incognito & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStructPointer(time$.TimeDelta, val.timeout);
  };
  function MediaRouteProvider_JoinRoute_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_JoinRoute_ResponseParams.prototype.initDefaults_ = function() {
    this.route = null;
    this.errorText = null;
    this.resultCode = 0;
  };
  MediaRouteProvider_JoinRoute_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_JoinRoute_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_JoinRoute_ResponseParams.route
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_JoinRoute_ResponseParams.errorText
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_JoinRoute_ResponseParams.resultCode
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 16, RouteRequestResultCode);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_JoinRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 24;

  MediaRouteProvider_JoinRoute_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_JoinRoute_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.route = decoder.decodeStructPointer(MediaRoute);
    val.errorText = decoder.decodeStruct(codec.NullableString);
    val.resultCode = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouteProvider_JoinRoute_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_JoinRoute_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(MediaRoute, val.route);
    encoder.encodeStruct(codec.NullableString, val.errorText);
    encoder.encodeStruct(codec.Int32, val.resultCode);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouteProvider_ConnectRouteByRouteId_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_ConnectRouteByRouteId_Params.prototype.initDefaults_ = function() {
    this.mediaSource = null;
    this.routeId = null;
    this.presentationId = null;
    this.origin = null;
    this.tabId = 0;
    this.incognito = false;
    this.timeout = null;
  };
  MediaRouteProvider_ConnectRouteByRouteId_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_ConnectRouteByRouteId_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 56}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_ConnectRouteByRouteId_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_ConnectRouteByRouteId_Params.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_ConnectRouteByRouteId_Params.presentationId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_ConnectRouteByRouteId_Params.origin
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, origin$.Origin, false);
    if (err !== validator.validationError.NONE)
        return err;



    // validate MediaRouteProvider_ConnectRouteByRouteId_Params.timeout
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, time$.TimeDelta, false);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize = codec.kStructHeaderSize + 48;

  MediaRouteProvider_ConnectRouteByRouteId_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_ConnectRouteByRouteId_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaSource = decoder.decodeStruct(codec.String);
    val.routeId = decoder.decodeStruct(codec.String);
    val.presentationId = decoder.decodeStruct(codec.String);
    val.origin = decoder.decodeStructPointer(origin$.Origin);
    val.tabId = decoder.decodeStruct(codec.Int32);
    packed = decoder.readUint8();
    val.incognito = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.timeout = decoder.decodeStructPointer(time$.TimeDelta);
    return val;
  };

  MediaRouteProvider_ConnectRouteByRouteId_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaSource);
    encoder.encodeStruct(codec.String, val.routeId);
    encoder.encodeStruct(codec.String, val.presentationId);
    encoder.encodeStructPointer(origin$.Origin, val.origin);
    encoder.encodeStruct(codec.Int32, val.tabId);
    packed = 0;
    packed |= (val.incognito & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStructPointer(time$.TimeDelta, val.timeout);
  };
  function MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.prototype.initDefaults_ = function() {
    this.route = null;
    this.errorText = null;
    this.resultCode = 0;
  };
  MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.route
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.errorText
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.resultCode
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 16, RouteRequestResultCode);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize = codec.kStructHeaderSize + 24;

  MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_ConnectRouteByRouteId_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.route = decoder.decodeStructPointer(MediaRoute);
    val.errorText = decoder.decodeStruct(codec.NullableString);
    val.resultCode = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(MediaRoute, val.route);
    encoder.encodeStruct(codec.NullableString, val.errorText);
    encoder.encodeStruct(codec.Int32, val.resultCode);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouteProvider_TerminateRoute_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_TerminateRoute_Params.prototype.initDefaults_ = function() {
    this.routeId = null;
  };
  MediaRouteProvider_TerminateRoute_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_TerminateRoute_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_TerminateRoute_Params.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_TerminateRoute_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_TerminateRoute_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_TerminateRoute_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.routeId = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_TerminateRoute_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_TerminateRoute_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.routeId);
  };
  function MediaRouteProvider_TerminateRoute_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_TerminateRoute_ResponseParams.prototype.initDefaults_ = function() {
    this.errorText = null;
    this.resultCode = 0;
  };
  MediaRouteProvider_TerminateRoute_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_TerminateRoute_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_TerminateRoute_ResponseParams.errorText
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, true)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_TerminateRoute_ResponseParams.resultCode
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, RouteRequestResultCode);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 16;

  MediaRouteProvider_TerminateRoute_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_TerminateRoute_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.errorText = decoder.decodeStruct(codec.NullableString);
    val.resultCode = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouteProvider_TerminateRoute_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.NullableString, val.errorText);
    encoder.encodeStruct(codec.Int32, val.resultCode);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouteProvider_SendRouteMessage_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_SendRouteMessage_Params.prototype.initDefaults_ = function() {
    this.mediaRouteId = null;
    this.message = null;
  };
  MediaRouteProvider_SendRouteMessage_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_SendRouteMessage_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_SendRouteMessage_Params.mediaRouteId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_SendRouteMessage_Params.message
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_SendRouteMessage_Params.encodedSize = codec.kStructHeaderSize + 16;

  MediaRouteProvider_SendRouteMessage_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_SendRouteMessage_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaRouteId = decoder.decodeStruct(codec.String);
    val.message = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_SendRouteMessage_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_SendRouteMessage_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaRouteId);
    encoder.encodeStruct(codec.String, val.message);
  };
  function MediaRouteProvider_SendRouteMessage_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_SendRouteMessage_ResponseParams.prototype.initDefaults_ = function() {
    this.sent = false;
  };
  MediaRouteProvider_SendRouteMessage_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_SendRouteMessage_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  MediaRouteProvider_SendRouteMessage_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_SendRouteMessage_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_SendRouteMessage_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    packed = decoder.readUint8();
    val.sent = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouteProvider_SendRouteMessage_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_SendRouteMessage_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    packed = 0;
    packed |= (val.sent & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouteProvider_SendRouteBinaryMessage_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_SendRouteBinaryMessage_Params.prototype.initDefaults_ = function() {
    this.mediaRouteId = null;
    this.data = null;
  };
  MediaRouteProvider_SendRouteBinaryMessage_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_SendRouteBinaryMessage_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_SendRouteBinaryMessage_Params.mediaRouteId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_SendRouteBinaryMessage_Params.data
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 1, codec.Uint8, false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize = codec.kStructHeaderSize + 16;

  MediaRouteProvider_SendRouteBinaryMessage_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_SendRouteBinaryMessage_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaRouteId = decoder.decodeStruct(codec.String);
    val.data = decoder.decodeArrayPointer(codec.Uint8);
    return val;
  };

  MediaRouteProvider_SendRouteBinaryMessage_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaRouteId);
    encoder.encodeArrayPointer(codec.Uint8, val.data);
  };
  function MediaRouteProvider_SendRouteBinaryMessage_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.prototype.initDefaults_ = function() {
    this.sent = false;
  };
  MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_SendRouteBinaryMessage_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    packed = decoder.readUint8();
    val.sent = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    packed = 0;
    packed |= (val.sent & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouteProvider_StartObservingMediaSinks_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_StartObservingMediaSinks_Params.prototype.initDefaults_ = function() {
    this.mediaSource = null;
  };
  MediaRouteProvider_StartObservingMediaSinks_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_StartObservingMediaSinks_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_StartObservingMediaSinks_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_StartObservingMediaSinks_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_StartObservingMediaSinks_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaSource = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_StartObservingMediaSinks_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaSource);
  };
  function MediaRouteProvider_StopObservingMediaSinks_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_StopObservingMediaSinks_Params.prototype.initDefaults_ = function() {
    this.mediaSource = null;
  };
  MediaRouteProvider_StopObservingMediaSinks_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_StopObservingMediaSinks_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_StopObservingMediaSinks_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_StopObservingMediaSinks_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_StopObservingMediaSinks_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaSource = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_StopObservingMediaSinks_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaSource);
  };
  function MediaRouteProvider_StartObservingMediaRoutes_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_StartObservingMediaRoutes_Params.prototype.initDefaults_ = function() {
    this.mediaSource = null;
  };
  MediaRouteProvider_StartObservingMediaRoutes_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_StartObservingMediaRoutes_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_StartObservingMediaRoutes_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_StartObservingMediaRoutes_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_StartObservingMediaRoutes_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaSource = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_StartObservingMediaRoutes_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaSource);
  };
  function MediaRouteProvider_StopObservingMediaRoutes_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_StopObservingMediaRoutes_Params.prototype.initDefaults_ = function() {
    this.mediaSource = null;
  };
  MediaRouteProvider_StopObservingMediaRoutes_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_StopObservingMediaRoutes_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_StopObservingMediaRoutes_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_StopObservingMediaRoutes_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_StopObservingMediaRoutes_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaSource = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_StopObservingMediaRoutes_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaSource);
  };
  function MediaRouteProvider_StartListeningForRouteMessages_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_StartListeningForRouteMessages_Params.prototype.initDefaults_ = function() {
    this.routeId = null;
  };
  MediaRouteProvider_StartListeningForRouteMessages_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_StartListeningForRouteMessages_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_StartListeningForRouteMessages_Params.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_StartListeningForRouteMessages_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_StartListeningForRouteMessages_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.routeId = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_StartListeningForRouteMessages_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.routeId);
  };
  function MediaRouteProvider_StopListeningForRouteMessages_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_StopListeningForRouteMessages_Params.prototype.initDefaults_ = function() {
    this.routeId = null;
  };
  MediaRouteProvider_StopListeningForRouteMessages_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_StopListeningForRouteMessages_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_StopListeningForRouteMessages_Params.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_StopListeningForRouteMessages_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_StopListeningForRouteMessages_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.routeId = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_StopListeningForRouteMessages_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.routeId);
  };
  function MediaRouteProvider_DetachRoute_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_DetachRoute_Params.prototype.initDefaults_ = function() {
    this.routeId = null;
  };
  MediaRouteProvider_DetachRoute_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_DetachRoute_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_DetachRoute_Params.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_DetachRoute_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_DetachRoute_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_DetachRoute_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.routeId = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_DetachRoute_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_DetachRoute_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.routeId);
  };
  function MediaRouteProvider_EnableMdnsDiscovery_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_EnableMdnsDiscovery_Params.prototype.initDefaults_ = function() {
  };
  MediaRouteProvider_EnableMdnsDiscovery_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_EnableMdnsDiscovery_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 8}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize = codec.kStructHeaderSize + 0;

  MediaRouteProvider_EnableMdnsDiscovery_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_EnableMdnsDiscovery_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    return val;
  };

  MediaRouteProvider_EnableMdnsDiscovery_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize);
    encoder.writeUint32(0);
  };
  function MediaRouteProvider_UpdateMediaSinks_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_UpdateMediaSinks_Params.prototype.initDefaults_ = function() {
    this.mediaSource = null;
  };
  MediaRouteProvider_UpdateMediaSinks_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_UpdateMediaSinks_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_UpdateMediaSinks_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_UpdateMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_UpdateMediaSinks_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_UpdateMediaSinks_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.mediaSource = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_UpdateMediaSinks_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_UpdateMediaSinks_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.mediaSource);
  };
  function MediaRouteProvider_SearchSinks_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_SearchSinks_Params.prototype.initDefaults_ = function() {
    this.sinkId = null;
    this.mediaSource = null;
    this.searchCriteria = null;
  };
  MediaRouteProvider_SearchSinks_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_SearchSinks_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_SearchSinks_Params.sinkId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_SearchSinks_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_SearchSinks_Params.searchCriteria
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, SinkSearchCriteria, false);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_SearchSinks_Params.encodedSize = codec.kStructHeaderSize + 24;

  MediaRouteProvider_SearchSinks_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_SearchSinks_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.sinkId = decoder.decodeStruct(codec.String);
    val.mediaSource = decoder.decodeStruct(codec.String);
    val.searchCriteria = decoder.decodeStructPointer(SinkSearchCriteria);
    return val;
  };

  MediaRouteProvider_SearchSinks_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_SearchSinks_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.sinkId);
    encoder.encodeStruct(codec.String, val.mediaSource);
    encoder.encodeStructPointer(SinkSearchCriteria, val.searchCriteria);
  };
  function MediaRouteProvider_SearchSinks_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_SearchSinks_ResponseParams.prototype.initDefaults_ = function() {
    this.sinkId = null;
  };
  MediaRouteProvider_SearchSinks_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_SearchSinks_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_SearchSinks_ResponseParams.sinkId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_SearchSinks_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_SearchSinks_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_SearchSinks_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.sinkId = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouteProvider_SearchSinks_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_SearchSinks_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.sinkId);
  };
  function MediaRouteProvider_ProvideSinks_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_ProvideSinks_Params.prototype.initDefaults_ = function() {
    this.providerName = null;
    this.sinks = null;
  };
  MediaRouteProvider_ProvideSinks_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_ProvideSinks_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_ProvideSinks_Params.providerName
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_ProvideSinks_Params.sinks
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(MediaSink), false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_ProvideSinks_Params.encodedSize = codec.kStructHeaderSize + 16;

  MediaRouteProvider_ProvideSinks_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_ProvideSinks_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.providerName = decoder.decodeStruct(codec.String);
    val.sinks = decoder.decodeArrayPointer(new codec.PointerTo(MediaSink));
    return val;
  };

  MediaRouteProvider_ProvideSinks_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_ProvideSinks_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.providerName);
    encoder.encodeArrayPointer(new codec.PointerTo(MediaSink), val.sinks);
  };
  function MediaRouteProvider_CreateMediaRouteController_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_CreateMediaRouteController_Params.prototype.initDefaults_ = function() {
    this.routeId = null;
    this.mediaController = new bindings.InterfaceRequest();
    this.observer = new media_status$.MediaStatusObserverPtr();
  };
  MediaRouteProvider_CreateMediaRouteController_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_CreateMediaRouteController_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateMediaRouteController_Params.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateMediaRouteController_Params.mediaController
    err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouteProvider_CreateMediaRouteController_Params.observer
    err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 12, false);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouteProvider_CreateMediaRouteController_Params.encodedSize = codec.kStructHeaderSize + 24;

  MediaRouteProvider_CreateMediaRouteController_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_CreateMediaRouteController_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.routeId = decoder.decodeStruct(codec.String);
    val.mediaController = decoder.decodeStruct(codec.InterfaceRequest);
    val.observer = decoder.decodeStruct(new codec.Interface(media_status$.MediaStatusObserverPtr));
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouteProvider_CreateMediaRouteController_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_CreateMediaRouteController_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.routeId);
    encoder.encodeStruct(codec.InterfaceRequest, val.mediaController);
    encoder.encodeStruct(new codec.Interface(media_status$.MediaStatusObserverPtr), val.observer);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouteProvider_CreateMediaRouteController_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouteProvider_CreateMediaRouteController_ResponseParams.prototype.initDefaults_ = function() {
    this.success = false;
  };
  MediaRouteProvider_CreateMediaRouteController_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouteProvider_CreateMediaRouteController_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouteProvider_CreateMediaRouteController_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouteProvider_CreateMediaRouteController_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    packed = decoder.readUint8();
    val.success = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouteProvider_CreateMediaRouteController_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    packed = 0;
    packed |= (val.success & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouter_RegisterMediaRouteProvider_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_RegisterMediaRouteProvider_Params.prototype.initDefaults_ = function() {
    this.providerId = 0;
    this.mediaRouterProvider = new MediaRouteProviderPtr();
  };
  MediaRouter_RegisterMediaRouteProvider_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_RegisterMediaRouteProvider_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_RegisterMediaRouteProvider_Params.providerId
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_RegisterMediaRouteProvider_Params.mediaRouterProvider
    err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 4, false);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_RegisterMediaRouteProvider_Params.encodedSize = codec.kStructHeaderSize + 16;

  MediaRouter_RegisterMediaRouteProvider_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_RegisterMediaRouteProvider_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.providerId = decoder.decodeStruct(codec.Int32);
    val.mediaRouterProvider = decoder.decodeStruct(new codec.Interface(MediaRouteProviderPtr));
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouter_RegisterMediaRouteProvider_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_RegisterMediaRouteProvider_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int32, val.providerId);
    encoder.encodeStruct(new codec.Interface(MediaRouteProviderPtr), val.mediaRouterProvider);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouter_RegisterMediaRouteProvider_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_RegisterMediaRouteProvider_ResponseParams.prototype.initDefaults_ = function() {
    this.instanceId = null;
    this.config = null;
  };
  MediaRouter_RegisterMediaRouteProvider_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_RegisterMediaRouteProvider_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_RegisterMediaRouteProvider_ResponseParams.instanceId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_RegisterMediaRouteProvider_ResponseParams.config
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, MediaRouteProviderConfig, false);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize = codec.kStructHeaderSize + 16;

  MediaRouter_RegisterMediaRouteProvider_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_RegisterMediaRouteProvider_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.instanceId = decoder.decodeStruct(codec.String);
    val.config = decoder.decodeStructPointer(MediaRouteProviderConfig);
    return val;
  };

  MediaRouter_RegisterMediaRouteProvider_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.instanceId);
    encoder.encodeStructPointer(MediaRouteProviderConfig, val.config);
  };
  function MediaRouter_OnSinksReceived_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_OnSinksReceived_Params.prototype.initDefaults_ = function() {
    this.providerId = 0;
    this.mediaSource = null;
    this.sinks = null;
    this.origins = null;
  };
  MediaRouter_OnSinksReceived_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_OnSinksReceived_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 40}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnSinksReceived_Params.providerId
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnSinksReceived_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnSinksReceived_Params.sinks
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 8, new codec.PointerTo(MediaSink), false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnSinksReceived_Params.origins
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 24, 8, new codec.PointerTo(origin$.Origin), false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_OnSinksReceived_Params.encodedSize = codec.kStructHeaderSize + 32;

  MediaRouter_OnSinksReceived_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_OnSinksReceived_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.providerId = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.mediaSource = decoder.decodeStruct(codec.String);
    val.sinks = decoder.decodeArrayPointer(new codec.PointerTo(MediaSink));
    val.origins = decoder.decodeArrayPointer(new codec.PointerTo(origin$.Origin));
    return val;
  };

  MediaRouter_OnSinksReceived_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_OnSinksReceived_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int32, val.providerId);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStruct(codec.String, val.mediaSource);
    encoder.encodeArrayPointer(new codec.PointerTo(MediaSink), val.sinks);
    encoder.encodeArrayPointer(new codec.PointerTo(origin$.Origin), val.origins);
  };
  function MediaRouter_OnIssue_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_OnIssue_Params.prototype.initDefaults_ = function() {
    this.issue = null;
  };
  MediaRouter_OnIssue_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_OnIssue_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnIssue_Params.issue
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, Issue, false);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_OnIssue_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouter_OnIssue_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_OnIssue_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.issue = decoder.decodeStructPointer(Issue);
    return val;
  };

  MediaRouter_OnIssue_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_OnIssue_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(Issue, val.issue);
  };
  function MediaRouter_OnRoutesUpdated_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_OnRoutesUpdated_Params.prototype.initDefaults_ = function() {
    this.providerId = 0;
    this.routes = null;
    this.mediaSource = null;
    this.joinableRouteIds = null;
  };
  MediaRouter_OnRoutesUpdated_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_OnRoutesUpdated_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 40}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnRoutesUpdated_Params.providerId
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnRoutesUpdated_Params.routes
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(MediaRoute), false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnRoutesUpdated_Params.mediaSource
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnRoutesUpdated_Params.joinableRouteIds
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 24, 8, codec.String, false, [0, 0], 0);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_OnRoutesUpdated_Params.encodedSize = codec.kStructHeaderSize + 32;

  MediaRouter_OnRoutesUpdated_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_OnRoutesUpdated_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.providerId = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.routes = decoder.decodeArrayPointer(new codec.PointerTo(MediaRoute));
    val.mediaSource = decoder.decodeStruct(codec.String);
    val.joinableRouteIds = decoder.decodeArrayPointer(codec.String);
    return val;
  };

  MediaRouter_OnRoutesUpdated_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_OnRoutesUpdated_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int32, val.providerId);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeArrayPointer(new codec.PointerTo(MediaRoute), val.routes);
    encoder.encodeStruct(codec.String, val.mediaSource);
    encoder.encodeArrayPointer(codec.String, val.joinableRouteIds);
  };
  function MediaRouter_OnSinkAvailabilityUpdated_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_OnSinkAvailabilityUpdated_Params.prototype.initDefaults_ = function() {
    this.providerId = 0;
    this.availability = 0;
  };
  MediaRouter_OnSinkAvailabilityUpdated_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_OnSinkAvailabilityUpdated_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnSinkAvailabilityUpdated_Params.providerId
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnSinkAvailabilityUpdated_Params.availability
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 4, MediaRouter.SinkAvailability);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouter_OnSinkAvailabilityUpdated_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_OnSinkAvailabilityUpdated_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.providerId = decoder.decodeStruct(codec.Int32);
    val.availability = decoder.decodeStruct(codec.Int32);
    return val;
  };

  MediaRouter_OnSinkAvailabilityUpdated_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int32, val.providerId);
    encoder.encodeStruct(codec.Int32, val.availability);
  };
  function MediaRouter_OnPresentationConnectionStateChanged_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_OnPresentationConnectionStateChanged_Params.prototype.initDefaults_ = function() {
    this.routeId = null;
    this.state = 0;
  };
  MediaRouter_OnPresentationConnectionStateChanged_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_OnPresentationConnectionStateChanged_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnPresentationConnectionStateChanged_Params.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnPresentationConnectionStateChanged_Params.state
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, MediaRouter.PresentationConnectionState);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize = codec.kStructHeaderSize + 16;

  MediaRouter_OnPresentationConnectionStateChanged_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_OnPresentationConnectionStateChanged_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.routeId = decoder.decodeStruct(codec.String);
    val.state = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MediaRouter_OnPresentationConnectionStateChanged_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.routeId);
    encoder.encodeStruct(codec.Int32, val.state);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaRouter_OnPresentationConnectionClosed_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_OnPresentationConnectionClosed_Params.prototype.initDefaults_ = function() {
    this.routeId = null;
    this.reason = 0;
    this.message = null;
  };
  MediaRouter_OnPresentationConnectionClosed_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_OnPresentationConnectionClosed_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnPresentationConnectionClosed_Params.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnPresentationConnectionClosed_Params.reason
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, MediaRouter.PresentationConnectionCloseReason);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnPresentationConnectionClosed_Params.message
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_OnPresentationConnectionClosed_Params.encodedSize = codec.kStructHeaderSize + 24;

  MediaRouter_OnPresentationConnectionClosed_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_OnPresentationConnectionClosed_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.routeId = decoder.decodeStruct(codec.String);
    val.reason = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.message = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouter_OnPresentationConnectionClosed_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_OnPresentationConnectionClosed_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.routeId);
    encoder.encodeStruct(codec.Int32, val.reason);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStruct(codec.String, val.message);
  };
  function MediaRouter_OnRouteMessagesReceived_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_OnRouteMessagesReceived_Params.prototype.initDefaults_ = function() {
    this.routeId = null;
    this.messages = null;
  };
  MediaRouter_OnRouteMessagesReceived_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_OnRouteMessagesReceived_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnRouteMessagesReceived_Params.routeId
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnRouteMessagesReceived_Params.messages
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(RouteMessage), false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_OnRouteMessagesReceived_Params.encodedSize = codec.kStructHeaderSize + 16;

  MediaRouter_OnRouteMessagesReceived_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_OnRouteMessagesReceived_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.routeId = decoder.decodeStruct(codec.String);
    val.messages = decoder.decodeArrayPointer(new codec.PointerTo(RouteMessage));
    return val;
  };

  MediaRouter_OnRouteMessagesReceived_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_OnRouteMessagesReceived_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.routeId);
    encoder.encodeArrayPointer(new codec.PointerTo(RouteMessage), val.messages);
  };
  function MediaRouter_OnMediaRemoterCreated_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_OnMediaRemoterCreated_Params.prototype.initDefaults_ = function() {
    this.tabId = 0;
    this.remoter = new mirror_service_remoting$.MirrorServiceRemoterPtr();
    this.remotingSource = new bindings.InterfaceRequest();
  };
  MediaRouter_OnMediaRemoterCreated_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_OnMediaRemoterCreated_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;



    // validate MediaRouter_OnMediaRemoterCreated_Params.remoter
    err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 4, false);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_OnMediaRemoterCreated_Params.remotingSource
    err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 12, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_OnMediaRemoterCreated_Params.encodedSize = codec.kStructHeaderSize + 16;

  MediaRouter_OnMediaRemoterCreated_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_OnMediaRemoterCreated_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.tabId = decoder.decodeStruct(codec.Int32);
    val.remoter = decoder.decodeStruct(new codec.Interface(mirror_service_remoting$.MirrorServiceRemoterPtr));
    val.remotingSource = decoder.decodeStruct(codec.InterfaceRequest);
    return val;
  };

  MediaRouter_OnMediaRemoterCreated_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_OnMediaRemoterCreated_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int32, val.tabId);
    encoder.encodeStruct(new codec.Interface(mirror_service_remoting$.MirrorServiceRemoterPtr), val.remoter);
    encoder.encodeStruct(codec.InterfaceRequest, val.remotingSource);
  };
  function MediaRouter_GetMediaSinkServiceStatus_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_GetMediaSinkServiceStatus_Params.prototype.initDefaults_ = function() {
  };
  MediaRouter_GetMediaSinkServiceStatus_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_GetMediaSinkServiceStatus_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 8}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_GetMediaSinkServiceStatus_Params.encodedSize = codec.kStructHeaderSize + 0;

  MediaRouter_GetMediaSinkServiceStatus_Params.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_GetMediaSinkServiceStatus_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    return val;
  };

  MediaRouter_GetMediaSinkServiceStatus_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_GetMediaSinkServiceStatus_Params.encodedSize);
    encoder.writeUint32(0);
  };
  function MediaRouter_GetMediaSinkServiceStatus_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaRouter_GetMediaSinkServiceStatus_ResponseParams.prototype.initDefaults_ = function() {
    this.status = null;
  };
  MediaRouter_GetMediaSinkServiceStatus_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaRouter_GetMediaSinkServiceStatus_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaRouter_GetMediaSinkServiceStatus_ResponseParams.status
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;

  MediaRouter_GetMediaSinkServiceStatus_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MediaRouter_GetMediaSinkServiceStatus_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.status = decoder.decodeStruct(codec.String);
    return val;
  };

  MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.status);
  };

  function MediaSinkExtraData(value) {
    this.initDefault_();
    this.initValue_(value);
  }


  MediaSinkExtraData.Tags = {
    dialMediaSink: 0,
    castMediaSink: 1,
  };

  MediaSinkExtraData.prototype.initDefault_ = function() {
    this.$data = null;
    this.$tag = undefined;
  }

  MediaSinkExtraData.prototype.initValue_ = function(value) {
    if (value == undefined) {
      return;
    }

    var keys = Object.keys(value);
    if (keys.length == 0) {
      return;
    }

    if (keys.length > 1) {
      throw new TypeError("You may set only one member on a union.");
    }

    var fields = [
        "dialMediaSink",
        "castMediaSink",
    ];

    if (fields.indexOf(keys[0]) < 0) {
      throw new ReferenceError(keys[0] + " is not a MediaSinkExtraData member.");

    }

    this[keys[0]] = value[keys[0]];
  }
  Object.defineProperty(MediaSinkExtraData.prototype, "dialMediaSink", {
    get: function() {
      if (this.$tag != MediaSinkExtraData.Tags.dialMediaSink) {
        throw new ReferenceError(
            "MediaSinkExtraData.dialMediaSink is not currently set.");
      }
      return this.$data;
    },

    set: function(value) {
      this.$tag = MediaSinkExtraData.Tags.dialMediaSink;
      this.$data = value;
    }
  });
  Object.defineProperty(MediaSinkExtraData.prototype, "castMediaSink", {
    get: function() {
      if (this.$tag != MediaSinkExtraData.Tags.castMediaSink) {
        throw new ReferenceError(
            "MediaSinkExtraData.castMediaSink is not currently set.");
      }
      return this.$data;
    },

    set: function(value) {
      this.$tag = MediaSinkExtraData.Tags.castMediaSink;
      this.$data = value;
    }
  });


    MediaSinkExtraData.encode = function(encoder, val) {
      if (val == null) {
        encoder.writeUint64(0);
        encoder.writeUint64(0);
        return;
      }
      if (val.$tag == undefined) {
        throw new TypeError("Cannot encode unions with an unknown member set.");
      }

      encoder.writeUint32(16);
      encoder.writeUint32(val.$tag);
      switch (val.$tag) {
        case MediaSinkExtraData.Tags.dialMediaSink:
          encoder.encodeStructPointer(DialMediaSink, val.dialMediaSink);
          break;
        case MediaSinkExtraData.Tags.castMediaSink:
          encoder.encodeStructPointer(CastMediaSink, val.castMediaSink);
          break;
      }
      encoder.align();
    };


    MediaSinkExtraData.decode = function(decoder) {
      var size = decoder.readUint32();
      if (size == 0) {
        decoder.readUint32();
        decoder.readUint64();
        return null;
      }

      var result = new MediaSinkExtraData();
      var tag = decoder.readUint32();
      switch (tag) {
        case MediaSinkExtraData.Tags.dialMediaSink:
          result.dialMediaSink = decoder.decodeStructPointer(DialMediaSink);
          break;
        case MediaSinkExtraData.Tags.castMediaSink:
          result.castMediaSink = decoder.decodeStructPointer(CastMediaSink);
          break;
      }
      decoder.align();

      return result;
    };


    MediaSinkExtraData.validate = function(messageValidator, offset) {
      var size = messageValidator.decodeUnionSize(offset);
      if (size != 16) {
        return validator.validationError.INVALID_UNION_SIZE;
      }

      var tag = messageValidator.decodeUnionTag(offset);
      var data_offset = offset + 8;
      var err;
      switch (tag) {
        case MediaSinkExtraData.Tags.dialMediaSink:
          

    // validate MediaSinkExtraData.dialMediaSink
    err = messageValidator.validateStructPointer(data_offset, DialMediaSink, false);
    if (err !== validator.validationError.NONE)
        return err;
          break;
        case MediaSinkExtraData.Tags.castMediaSink:
          

    // validate MediaSinkExtraData.castMediaSink
    err = messageValidator.validateStructPointer(data_offset, CastMediaSink, false);
    if (err !== validator.validationError.NONE)
        return err;
          break;
      }

      return validator.validationError.NONE;
    };

  MediaSinkExtraData.encodedSize = 16;
  var kMediaRouteProvider_CreateRoute_Name = 1296283292;
  var kMediaRouteProvider_JoinRoute_Name = 1809851917;
  var kMediaRouteProvider_ConnectRouteByRouteId_Name = 1330587979;
  var kMediaRouteProvider_TerminateRoute_Name = 1677740106;
  var kMediaRouteProvider_SendRouteMessage_Name = 2046931000;
  var kMediaRouteProvider_SendRouteBinaryMessage_Name = 1758969314;
  var kMediaRouteProvider_StartObservingMediaSinks_Name = 1392318327;
  var kMediaRouteProvider_StopObservingMediaSinks_Name = 1227847774;
  var kMediaRouteProvider_StartObservingMediaRoutes_Name = 1623173800;
  var kMediaRouteProvider_StopObservingMediaRoutes_Name = 381394244;
  var kMediaRouteProvider_StartListeningForRouteMessages_Name = 1929102546;
  var kMediaRouteProvider_StopListeningForRouteMessages_Name = 1237707337;
  var kMediaRouteProvider_DetachRoute_Name = 1855305344;
  var kMediaRouteProvider_EnableMdnsDiscovery_Name = 1761732086;
  var kMediaRouteProvider_UpdateMediaSinks_Name = 1722434786;
  var kMediaRouteProvider_SearchSinks_Name = 672569773;
  var kMediaRouteProvider_ProvideSinks_Name = 1656261513;
  var kMediaRouteProvider_CreateMediaRouteController_Name = 909174831;

  function MediaRouteProviderPtr(handleOrPtrInfo) {
    this.ptr = new bindings.InterfacePtrController(MediaRouteProvider,
                                                   handleOrPtrInfo);
  }

  function MediaRouteProviderAssociatedPtr(associatedInterfacePtrInfo) {
    this.ptr = new associatedBindings.AssociatedInterfacePtrController(
        MediaRouteProvider, associatedInterfacePtrInfo);
  }

  MediaRouteProviderAssociatedPtr.prototype =
      Object.create(MediaRouteProviderPtr.prototype);
  MediaRouteProviderAssociatedPtr.prototype.constructor =
      MediaRouteProviderAssociatedPtr;

  function MediaRouteProviderProxy(receiver) {
    this.receiver_ = receiver;
  }
  MediaRouteProviderPtr.prototype.createRoute = function() {
    return MediaRouteProviderProxy.prototype.createRoute
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.createRoute = function(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito) {
    var params_ = new MediaRouteProvider_CreateRoute_Params();
    params_.mediaSource = mediaSource;
    params_.sinkId = sinkId;
    params_.originalPresentationId = originalPresentationId;
    params_.origin = origin;
    params_.tabId = tabId;
    params_.timeout = timeout;
    params_.incognito = incognito;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouteProvider_CreateRoute_Name,
          codec.align(MediaRouteProvider_CreateRoute_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouteProvider_CreateRoute_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouteProvider_CreateRoute_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };
  MediaRouteProviderPtr.prototype.joinRoute = function() {
    return MediaRouteProviderProxy.prototype.joinRoute
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.joinRoute = function(mediaSource, presentationId, origin, tabId, timeout, incognito) {
    var params_ = new MediaRouteProvider_JoinRoute_Params();
    params_.mediaSource = mediaSource;
    params_.presentationId = presentationId;
    params_.origin = origin;
    params_.tabId = tabId;
    params_.timeout = timeout;
    params_.incognito = incognito;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouteProvider_JoinRoute_Name,
          codec.align(MediaRouteProvider_JoinRoute_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouteProvider_JoinRoute_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouteProvider_JoinRoute_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };
  MediaRouteProviderPtr.prototype.connectRouteByRouteId = function() {
    return MediaRouteProviderProxy.prototype.connectRouteByRouteId
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.connectRouteByRouteId = function(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito) {
    var params_ = new MediaRouteProvider_ConnectRouteByRouteId_Params();
    params_.mediaSource = mediaSource;
    params_.routeId = routeId;
    params_.presentationId = presentationId;
    params_.origin = origin;
    params_.tabId = tabId;
    params_.timeout = timeout;
    params_.incognito = incognito;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouteProvider_ConnectRouteByRouteId_Name,
          codec.align(MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouteProvider_ConnectRouteByRouteId_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };
  MediaRouteProviderPtr.prototype.terminateRoute = function() {
    return MediaRouteProviderProxy.prototype.terminateRoute
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.terminateRoute = function(routeId) {
    var params_ = new MediaRouteProvider_TerminateRoute_Params();
    params_.routeId = routeId;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouteProvider_TerminateRoute_Name,
          codec.align(MediaRouteProvider_TerminateRoute_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouteProvider_TerminateRoute_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouteProvider_TerminateRoute_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };
  MediaRouteProviderPtr.prototype.sendRouteMessage = function() {
    return MediaRouteProviderProxy.prototype.sendRouteMessage
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.sendRouteMessage = function(mediaRouteId, message) {
    var params_ = new MediaRouteProvider_SendRouteMessage_Params();
    params_.mediaRouteId = mediaRouteId;
    params_.message = message;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouteProvider_SendRouteMessage_Name,
          codec.align(MediaRouteProvider_SendRouteMessage_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouteProvider_SendRouteMessage_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouteProvider_SendRouteMessage_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };
  MediaRouteProviderPtr.prototype.sendRouteBinaryMessage = function() {
    return MediaRouteProviderProxy.prototype.sendRouteBinaryMessage
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.sendRouteBinaryMessage = function(mediaRouteId, data) {
    var params_ = new MediaRouteProvider_SendRouteBinaryMessage_Params();
    params_.mediaRouteId = mediaRouteId;
    params_.data = data;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouteProvider_SendRouteBinaryMessage_Name,
          codec.align(MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouteProvider_SendRouteBinaryMessage_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouteProvider_SendRouteBinaryMessage_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };
  MediaRouteProviderPtr.prototype.startObservingMediaSinks = function() {
    return MediaRouteProviderProxy.prototype.startObservingMediaSinks
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.startObservingMediaSinks = function(mediaSource) {
    var params_ = new MediaRouteProvider_StartObservingMediaSinks_Params();
    params_.mediaSource = mediaSource;
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_StartObservingMediaSinks_Name,
        codec.align(MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_StartObservingMediaSinks_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.stopObservingMediaSinks = function() {
    return MediaRouteProviderProxy.prototype.stopObservingMediaSinks
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.stopObservingMediaSinks = function(mediaSource) {
    var params_ = new MediaRouteProvider_StopObservingMediaSinks_Params();
    params_.mediaSource = mediaSource;
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_StopObservingMediaSinks_Name,
        codec.align(MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_StopObservingMediaSinks_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.startObservingMediaRoutes = function() {
    return MediaRouteProviderProxy.prototype.startObservingMediaRoutes
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.startObservingMediaRoutes = function(mediaSource) {
    var params_ = new MediaRouteProvider_StartObservingMediaRoutes_Params();
    params_.mediaSource = mediaSource;
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_StartObservingMediaRoutes_Name,
        codec.align(MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_StartObservingMediaRoutes_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.stopObservingMediaRoutes = function() {
    return MediaRouteProviderProxy.prototype.stopObservingMediaRoutes
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.stopObservingMediaRoutes = function(mediaSource) {
    var params_ = new MediaRouteProvider_StopObservingMediaRoutes_Params();
    params_.mediaSource = mediaSource;
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_StopObservingMediaRoutes_Name,
        codec.align(MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_StopObservingMediaRoutes_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.startListeningForRouteMessages = function() {
    return MediaRouteProviderProxy.prototype.startListeningForRouteMessages
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.startListeningForRouteMessages = function(routeId) {
    var params_ = new MediaRouteProvider_StartListeningForRouteMessages_Params();
    params_.routeId = routeId;
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_StartListeningForRouteMessages_Name,
        codec.align(MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_StartListeningForRouteMessages_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.stopListeningForRouteMessages = function() {
    return MediaRouteProviderProxy.prototype.stopListeningForRouteMessages
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.stopListeningForRouteMessages = function(routeId) {
    var params_ = new MediaRouteProvider_StopListeningForRouteMessages_Params();
    params_.routeId = routeId;
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_StopListeningForRouteMessages_Name,
        codec.align(MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_StopListeningForRouteMessages_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.detachRoute = function() {
    return MediaRouteProviderProxy.prototype.detachRoute
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.detachRoute = function(routeId) {
    var params_ = new MediaRouteProvider_DetachRoute_Params();
    params_.routeId = routeId;
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_DetachRoute_Name,
        codec.align(MediaRouteProvider_DetachRoute_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_DetachRoute_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.enableMdnsDiscovery = function() {
    return MediaRouteProviderProxy.prototype.enableMdnsDiscovery
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.enableMdnsDiscovery = function() {
    var params_ = new MediaRouteProvider_EnableMdnsDiscovery_Params();
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_EnableMdnsDiscovery_Name,
        codec.align(MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_EnableMdnsDiscovery_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.updateMediaSinks = function() {
    return MediaRouteProviderProxy.prototype.updateMediaSinks
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.updateMediaSinks = function(mediaSource) {
    var params_ = new MediaRouteProvider_UpdateMediaSinks_Params();
    params_.mediaSource = mediaSource;
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_UpdateMediaSinks_Name,
        codec.align(MediaRouteProvider_UpdateMediaSinks_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_UpdateMediaSinks_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.searchSinks = function() {
    return MediaRouteProviderProxy.prototype.searchSinks
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.searchSinks = function(sinkId, mediaSource, searchCriteria) {
    var params_ = new MediaRouteProvider_SearchSinks_Params();
    params_.sinkId = sinkId;
    params_.mediaSource = mediaSource;
    params_.searchCriteria = searchCriteria;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouteProvider_SearchSinks_Name,
          codec.align(MediaRouteProvider_SearchSinks_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouteProvider_SearchSinks_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouteProvider_SearchSinks_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };
  MediaRouteProviderPtr.prototype.provideSinks = function() {
    return MediaRouteProviderProxy.prototype.provideSinks
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.provideSinks = function(providerName, sinks) {
    var params_ = new MediaRouteProvider_ProvideSinks_Params();
    params_.providerName = providerName;
    params_.sinks = sinks;
    var builder = new codec.MessageV0Builder(
        kMediaRouteProvider_ProvideSinks_Name,
        codec.align(MediaRouteProvider_ProvideSinks_Params.encodedSize));
    builder.encodeStruct(MediaRouteProvider_ProvideSinks_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouteProviderPtr.prototype.createMediaRouteController = function() {
    return MediaRouteProviderProxy.prototype.createMediaRouteController
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouteProviderProxy.prototype.createMediaRouteController = function(routeId, mediaController, observer) {
    var params_ = new MediaRouteProvider_CreateMediaRouteController_Params();
    params_.routeId = routeId;
    params_.mediaController = mediaController;
    params_.observer = observer;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouteProvider_CreateMediaRouteController_Name,
          codec.align(MediaRouteProvider_CreateMediaRouteController_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouteProvider_CreateMediaRouteController_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouteProvider_CreateMediaRouteController_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };

  function MediaRouteProviderStub(delegate) {
    this.delegate_ = delegate;
  }
  MediaRouteProviderStub.prototype.createRoute = function(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito) {
    return this.delegate_ && this.delegate_.createRoute && this.delegate_.createRoute(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito);
  }
  MediaRouteProviderStub.prototype.joinRoute = function(mediaSource, presentationId, origin, tabId, timeout, incognito) {
    return this.delegate_ && this.delegate_.joinRoute && this.delegate_.joinRoute(mediaSource, presentationId, origin, tabId, timeout, incognito);
  }
  MediaRouteProviderStub.prototype.connectRouteByRouteId = function(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito) {
    return this.delegate_ && this.delegate_.connectRouteByRouteId && this.delegate_.connectRouteByRouteId(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito);
  }
  MediaRouteProviderStub.prototype.terminateRoute = function(routeId) {
    return this.delegate_ && this.delegate_.terminateRoute && this.delegate_.terminateRoute(routeId);
  }
  MediaRouteProviderStub.prototype.sendRouteMessage = function(mediaRouteId, message) {
    return this.delegate_ && this.delegate_.sendRouteMessage && this.delegate_.sendRouteMessage(mediaRouteId, message);
  }
  MediaRouteProviderStub.prototype.sendRouteBinaryMessage = function(mediaRouteId, data) {
    return this.delegate_ && this.delegate_.sendRouteBinaryMessage && this.delegate_.sendRouteBinaryMessage(mediaRouteId, data);
  }
  MediaRouteProviderStub.prototype.startObservingMediaSinks = function(mediaSource) {
    return this.delegate_ && this.delegate_.startObservingMediaSinks && this.delegate_.startObservingMediaSinks(mediaSource);
  }
  MediaRouteProviderStub.prototype.stopObservingMediaSinks = function(mediaSource) {
    return this.delegate_ && this.delegate_.stopObservingMediaSinks && this.delegate_.stopObservingMediaSinks(mediaSource);
  }
  MediaRouteProviderStub.prototype.startObservingMediaRoutes = function(mediaSource) {
    return this.delegate_ && this.delegate_.startObservingMediaRoutes && this.delegate_.startObservingMediaRoutes(mediaSource);
  }
  MediaRouteProviderStub.prototype.stopObservingMediaRoutes = function(mediaSource) {
    return this.delegate_ && this.delegate_.stopObservingMediaRoutes && this.delegate_.stopObservingMediaRoutes(mediaSource);
  }
  MediaRouteProviderStub.prototype.startListeningForRouteMessages = function(routeId) {
    return this.delegate_ && this.delegate_.startListeningForRouteMessages && this.delegate_.startListeningForRouteMessages(routeId);
  }
  MediaRouteProviderStub.prototype.stopListeningForRouteMessages = function(routeId) {
    return this.delegate_ && this.delegate_.stopListeningForRouteMessages && this.delegate_.stopListeningForRouteMessages(routeId);
  }
  MediaRouteProviderStub.prototype.detachRoute = function(routeId) {
    return this.delegate_ && this.delegate_.detachRoute && this.delegate_.detachRoute(routeId);
  }
  MediaRouteProviderStub.prototype.enableMdnsDiscovery = function() {
    return this.delegate_ && this.delegate_.enableMdnsDiscovery && this.delegate_.enableMdnsDiscovery();
  }
  MediaRouteProviderStub.prototype.updateMediaSinks = function(mediaSource) {
    return this.delegate_ && this.delegate_.updateMediaSinks && this.delegate_.updateMediaSinks(mediaSource);
  }
  MediaRouteProviderStub.prototype.searchSinks = function(sinkId, mediaSource, searchCriteria) {
    return this.delegate_ && this.delegate_.searchSinks && this.delegate_.searchSinks(sinkId, mediaSource, searchCriteria);
  }
  MediaRouteProviderStub.prototype.provideSinks = function(providerName, sinks) {
    return this.delegate_ && this.delegate_.provideSinks && this.delegate_.provideSinks(providerName, sinks);
  }
  MediaRouteProviderStub.prototype.createMediaRouteController = function(routeId, mediaController, observer) {
    return this.delegate_ && this.delegate_.createMediaRouteController && this.delegate_.createMediaRouteController(routeId, mediaController, observer);
  }

  MediaRouteProviderStub.prototype.accept = function(message) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kMediaRouteProvider_StartObservingMediaSinks_Name:
      var params = reader.decodeStruct(MediaRouteProvider_StartObservingMediaSinks_Params);
      this.startObservingMediaSinks(params.mediaSource);
      return true;
    case kMediaRouteProvider_StopObservingMediaSinks_Name:
      var params = reader.decodeStruct(MediaRouteProvider_StopObservingMediaSinks_Params);
      this.stopObservingMediaSinks(params.mediaSource);
      return true;
    case kMediaRouteProvider_StartObservingMediaRoutes_Name:
      var params = reader.decodeStruct(MediaRouteProvider_StartObservingMediaRoutes_Params);
      this.startObservingMediaRoutes(params.mediaSource);
      return true;
    case kMediaRouteProvider_StopObservingMediaRoutes_Name:
      var params = reader.decodeStruct(MediaRouteProvider_StopObservingMediaRoutes_Params);
      this.stopObservingMediaRoutes(params.mediaSource);
      return true;
    case kMediaRouteProvider_StartListeningForRouteMessages_Name:
      var params = reader.decodeStruct(MediaRouteProvider_StartListeningForRouteMessages_Params);
      this.startListeningForRouteMessages(params.routeId);
      return true;
    case kMediaRouteProvider_StopListeningForRouteMessages_Name:
      var params = reader.decodeStruct(MediaRouteProvider_StopListeningForRouteMessages_Params);
      this.stopListeningForRouteMessages(params.routeId);
      return true;
    case kMediaRouteProvider_DetachRoute_Name:
      var params = reader.decodeStruct(MediaRouteProvider_DetachRoute_Params);
      this.detachRoute(params.routeId);
      return true;
    case kMediaRouteProvider_EnableMdnsDiscovery_Name:
      var params = reader.decodeStruct(MediaRouteProvider_EnableMdnsDiscovery_Params);
      this.enableMdnsDiscovery();
      return true;
    case kMediaRouteProvider_UpdateMediaSinks_Name:
      var params = reader.decodeStruct(MediaRouteProvider_UpdateMediaSinks_Params);
      this.updateMediaSinks(params.mediaSource);
      return true;
    case kMediaRouteProvider_ProvideSinks_Name:
      var params = reader.decodeStruct(MediaRouteProvider_ProvideSinks_Params);
      this.provideSinks(params.providerName, params.sinks);
      return true;
    default:
      return false;
    }
  };

  MediaRouteProviderStub.prototype.acceptWithResponder =
      function(message, responder) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kMediaRouteProvider_CreateRoute_Name:
      var params = reader.decodeStruct(MediaRouteProvider_CreateRoute_Params);
      this.createRoute(params.mediaSource, params.sinkId, params.originalPresentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) {
        var responseParams =
            new MediaRouteProvider_CreateRoute_ResponseParams();
        responseParams.route = response.route;
        responseParams.errorText = response.errorText;
        responseParams.resultCode = response.resultCode;
        var builder = new codec.MessageV1Builder(
            kMediaRouteProvider_CreateRoute_Name,
            codec.align(MediaRouteProvider_CreateRoute_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouteProvider_CreateRoute_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    case kMediaRouteProvider_JoinRoute_Name:
      var params = reader.decodeStruct(MediaRouteProvider_JoinRoute_Params);
      this.joinRoute(params.mediaSource, params.presentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) {
        var responseParams =
            new MediaRouteProvider_JoinRoute_ResponseParams();
        responseParams.route = response.route;
        responseParams.errorText = response.errorText;
        responseParams.resultCode = response.resultCode;
        var builder = new codec.MessageV1Builder(
            kMediaRouteProvider_JoinRoute_Name,
            codec.align(MediaRouteProvider_JoinRoute_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouteProvider_JoinRoute_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    case kMediaRouteProvider_ConnectRouteByRouteId_Name:
      var params = reader.decodeStruct(MediaRouteProvider_ConnectRouteByRouteId_Params);
      this.connectRouteByRouteId(params.mediaSource, params.routeId, params.presentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) {
        var responseParams =
            new MediaRouteProvider_ConnectRouteByRouteId_ResponseParams();
        responseParams.route = response.route;
        responseParams.errorText = response.errorText;
        responseParams.resultCode = response.resultCode;
        var builder = new codec.MessageV1Builder(
            kMediaRouteProvider_ConnectRouteByRouteId_Name,
            codec.align(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    case kMediaRouteProvider_TerminateRoute_Name:
      var params = reader.decodeStruct(MediaRouteProvider_TerminateRoute_Params);
      this.terminateRoute(params.routeId).then(function(response) {
        var responseParams =
            new MediaRouteProvider_TerminateRoute_ResponseParams();
        responseParams.errorText = response.errorText;
        responseParams.resultCode = response.resultCode;
        var builder = new codec.MessageV1Builder(
            kMediaRouteProvider_TerminateRoute_Name,
            codec.align(MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouteProvider_TerminateRoute_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    case kMediaRouteProvider_SendRouteMessage_Name:
      var params = reader.decodeStruct(MediaRouteProvider_SendRouteMessage_Params);
      this.sendRouteMessage(params.mediaRouteId, params.message).then(function(response) {
        var responseParams =
            new MediaRouteProvider_SendRouteMessage_ResponseParams();
        responseParams.sent = response.sent;
        var builder = new codec.MessageV1Builder(
            kMediaRouteProvider_SendRouteMessage_Name,
            codec.align(MediaRouteProvider_SendRouteMessage_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouteProvider_SendRouteMessage_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    case kMediaRouteProvider_SendRouteBinaryMessage_Name:
      var params = reader.decodeStruct(MediaRouteProvider_SendRouteBinaryMessage_Params);
      this.sendRouteBinaryMessage(params.mediaRouteId, params.data).then(function(response) {
        var responseParams =
            new MediaRouteProvider_SendRouteBinaryMessage_ResponseParams();
        responseParams.sent = response.sent;
        var builder = new codec.MessageV1Builder(
            kMediaRouteProvider_SendRouteBinaryMessage_Name,
            codec.align(MediaRouteProvider_SendRouteBinaryMessage_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouteProvider_SendRouteBinaryMessage_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    case kMediaRouteProvider_SearchSinks_Name:
      var params = reader.decodeStruct(MediaRouteProvider_SearchSinks_Params);
      this.searchSinks(params.sinkId, params.mediaSource, params.searchCriteria).then(function(response) {
        var responseParams =
            new MediaRouteProvider_SearchSinks_ResponseParams();
        responseParams.sinkId = response.sinkId;
        var builder = new codec.MessageV1Builder(
            kMediaRouteProvider_SearchSinks_Name,
            codec.align(MediaRouteProvider_SearchSinks_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouteProvider_SearchSinks_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    case kMediaRouteProvider_CreateMediaRouteController_Name:
      var params = reader.decodeStruct(MediaRouteProvider_CreateMediaRouteController_Params);
      this.createMediaRouteController(params.routeId, params.mediaController, params.observer).then(function(response) {
        var responseParams =
            new MediaRouteProvider_CreateMediaRouteController_ResponseParams();
        responseParams.success = response.success;
        var builder = new codec.MessageV1Builder(
            kMediaRouteProvider_CreateMediaRouteController_Name,
            codec.align(MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouteProvider_CreateMediaRouteController_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    default:
      return false;
    }
  };

  function validateMediaRouteProviderRequest(messageValidator) {
    var message = messageValidator.message;
    var paramsClass = null;
    switch (message.getName()) {
      case kMediaRouteProvider_CreateRoute_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouteProvider_CreateRoute_Params;
      break;
      case kMediaRouteProvider_JoinRoute_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouteProvider_JoinRoute_Params;
      break;
      case kMediaRouteProvider_ConnectRouteByRouteId_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouteProvider_ConnectRouteByRouteId_Params;
      break;
      case kMediaRouteProvider_TerminateRoute_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouteProvider_TerminateRoute_Params;
      break;
      case kMediaRouteProvider_SendRouteMessage_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouteProvider_SendRouteMessage_Params;
      break;
      case kMediaRouteProvider_SendRouteBinaryMessage_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouteProvider_SendRouteBinaryMessage_Params;
      break;
      case kMediaRouteProvider_StartObservingMediaSinks_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_StartObservingMediaSinks_Params;
      break;
      case kMediaRouteProvider_StopObservingMediaSinks_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_StopObservingMediaSinks_Params;
      break;
      case kMediaRouteProvider_StartObservingMediaRoutes_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_StartObservingMediaRoutes_Params;
      break;
      case kMediaRouteProvider_StopObservingMediaRoutes_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_StopObservingMediaRoutes_Params;
      break;
      case kMediaRouteProvider_StartListeningForRouteMessages_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_StartListeningForRouteMessages_Params;
      break;
      case kMediaRouteProvider_StopListeningForRouteMessages_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_StopListeningForRouteMessages_Params;
      break;
      case kMediaRouteProvider_DetachRoute_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_DetachRoute_Params;
      break;
      case kMediaRouteProvider_EnableMdnsDiscovery_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_EnableMdnsDiscovery_Params;
      break;
      case kMediaRouteProvider_UpdateMediaSinks_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_UpdateMediaSinks_Params;
      break;
      case kMediaRouteProvider_SearchSinks_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouteProvider_SearchSinks_Params;
      break;
      case kMediaRouteProvider_ProvideSinks_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouteProvider_ProvideSinks_Params;
      break;
      case kMediaRouteProvider_CreateMediaRouteController_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouteProvider_CreateMediaRouteController_Params;
      break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  function validateMediaRouteProviderResponse(messageValidator) {
   var message = messageValidator.message;
   var paramsClass = null;
   switch (message.getName()) {
      case kMediaRouteProvider_CreateRoute_Name:
        if (message.isResponse())
          paramsClass = MediaRouteProvider_CreateRoute_ResponseParams;
        break;
      case kMediaRouteProvider_JoinRoute_Name:
        if (message.isResponse())
          paramsClass = MediaRouteProvider_JoinRoute_ResponseParams;
        break;
      case kMediaRouteProvider_ConnectRouteByRouteId_Name:
        if (message.isResponse())
          paramsClass = MediaRouteProvider_ConnectRouteByRouteId_ResponseParams;
        break;
      case kMediaRouteProvider_TerminateRoute_Name:
        if (message.isResponse())
          paramsClass = MediaRouteProvider_TerminateRoute_ResponseParams;
        break;
      case kMediaRouteProvider_SendRouteMessage_Name:
        if (message.isResponse())
          paramsClass = MediaRouteProvider_SendRouteMessage_ResponseParams;
        break;
      case kMediaRouteProvider_SendRouteBinaryMessage_Name:
        if (message.isResponse())
          paramsClass = MediaRouteProvider_SendRouteBinaryMessage_ResponseParams;
        break;
      case kMediaRouteProvider_SearchSinks_Name:
        if (message.isResponse())
          paramsClass = MediaRouteProvider_SearchSinks_ResponseParams;
        break;
      case kMediaRouteProvider_CreateMediaRouteController_Name:
        if (message.isResponse())
          paramsClass = MediaRouteProvider_CreateMediaRouteController_ResponseParams;
        break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  var MediaRouteProvider = {
    name: 'media_router.mojom.MediaRouteProvider',
    kVersion: 0,
    ptrClass: MediaRouteProviderPtr,
    proxyClass: MediaRouteProviderProxy,
    stubClass: MediaRouteProviderStub,
    validateRequest: validateMediaRouteProviderRequest,
    validateResponse: validateMediaRouteProviderResponse,
  };
  MediaRouteProvider.Id = {};
  MediaRouteProvider.Id.EXTENSION = 0;
  MediaRouteProvider.Id.WIRED_DISPLAY = MediaRouteProvider.Id.EXTENSION + 1;
  MediaRouteProvider.Id.CAST = MediaRouteProvider.Id.WIRED_DISPLAY + 1;
  MediaRouteProvider.Id.DIAL = MediaRouteProvider.Id.CAST + 1;

  MediaRouteProvider.Id.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
    case 3:
      return true;
    }
    return false;
  };

  MediaRouteProvider.Id.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  MediaRouteProviderStub.prototype.validator = validateMediaRouteProviderRequest;
  MediaRouteProviderProxy.prototype.validator = validateMediaRouteProviderResponse;
  var kMediaRouter_RegisterMediaRouteProvider_Name = 2043040508;
  var kMediaRouter_OnSinksReceived_Name = 261173467;
  var kMediaRouter_OnIssue_Name = 190425292;
  var kMediaRouter_OnRoutesUpdated_Name = 529541818;
  var kMediaRouter_OnSinkAvailabilityUpdated_Name = 92175575;
  var kMediaRouter_OnPresentationConnectionStateChanged_Name = 742644597;
  var kMediaRouter_OnPresentationConnectionClosed_Name = 1431636627;
  var kMediaRouter_OnRouteMessagesReceived_Name = 781406204;
  var kMediaRouter_OnMediaRemoterCreated_Name = 1486521690;
  var kMediaRouter_GetMediaSinkServiceStatus_Name = 177170440;

  function MediaRouterPtr(handleOrPtrInfo) {
    this.ptr = new bindings.InterfacePtrController(MediaRouter,
                                                   handleOrPtrInfo);
  }

  function MediaRouterAssociatedPtr(associatedInterfacePtrInfo) {
    this.ptr = new associatedBindings.AssociatedInterfacePtrController(
        MediaRouter, associatedInterfacePtrInfo);
  }

  MediaRouterAssociatedPtr.prototype =
      Object.create(MediaRouterPtr.prototype);
  MediaRouterAssociatedPtr.prototype.constructor =
      MediaRouterAssociatedPtr;

  function MediaRouterProxy(receiver) {
    this.receiver_ = receiver;
  }
  MediaRouterPtr.prototype.registerMediaRouteProvider = function() {
    return MediaRouterProxy.prototype.registerMediaRouteProvider
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.registerMediaRouteProvider = function(providerId, mediaRouterProvider) {
    var params_ = new MediaRouter_RegisterMediaRouteProvider_Params();
    params_.providerId = providerId;
    params_.mediaRouterProvider = mediaRouterProvider;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouter_RegisterMediaRouteProvider_Name,
          codec.align(MediaRouter_RegisterMediaRouteProvider_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouter_RegisterMediaRouteProvider_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouter_RegisterMediaRouteProvider_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };
  MediaRouterPtr.prototype.onSinksReceived = function() {
    return MediaRouterProxy.prototype.onSinksReceived
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.onSinksReceived = function(providerId, mediaSource, sinks, origins) {
    var params_ = new MediaRouter_OnSinksReceived_Params();
    params_.providerId = providerId;
    params_.mediaSource = mediaSource;
    params_.sinks = sinks;
    params_.origins = origins;
    var builder = new codec.MessageV0Builder(
        kMediaRouter_OnSinksReceived_Name,
        codec.align(MediaRouter_OnSinksReceived_Params.encodedSize));
    builder.encodeStruct(MediaRouter_OnSinksReceived_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouterPtr.prototype.onIssue = function() {
    return MediaRouterProxy.prototype.onIssue
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.onIssue = function(issue) {
    var params_ = new MediaRouter_OnIssue_Params();
    params_.issue = issue;
    var builder = new codec.MessageV0Builder(
        kMediaRouter_OnIssue_Name,
        codec.align(MediaRouter_OnIssue_Params.encodedSize));
    builder.encodeStruct(MediaRouter_OnIssue_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouterPtr.prototype.onRoutesUpdated = function() {
    return MediaRouterProxy.prototype.onRoutesUpdated
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.onRoutesUpdated = function(providerId, routes, mediaSource, joinableRouteIds) {
    var params_ = new MediaRouter_OnRoutesUpdated_Params();
    params_.providerId = providerId;
    params_.routes = routes;
    params_.mediaSource = mediaSource;
    params_.joinableRouteIds = joinableRouteIds;
    var builder = new codec.MessageV0Builder(
        kMediaRouter_OnRoutesUpdated_Name,
        codec.align(MediaRouter_OnRoutesUpdated_Params.encodedSize));
    builder.encodeStruct(MediaRouter_OnRoutesUpdated_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouterPtr.prototype.onSinkAvailabilityUpdated = function() {
    return MediaRouterProxy.prototype.onSinkAvailabilityUpdated
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.onSinkAvailabilityUpdated = function(providerId, availability) {
    var params_ = new MediaRouter_OnSinkAvailabilityUpdated_Params();
    params_.providerId = providerId;
    params_.availability = availability;
    var builder = new codec.MessageV0Builder(
        kMediaRouter_OnSinkAvailabilityUpdated_Name,
        codec.align(MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize));
    builder.encodeStruct(MediaRouter_OnSinkAvailabilityUpdated_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouterPtr.prototype.onPresentationConnectionStateChanged = function() {
    return MediaRouterProxy.prototype.onPresentationConnectionStateChanged
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.onPresentationConnectionStateChanged = function(routeId, state) {
    var params_ = new MediaRouter_OnPresentationConnectionStateChanged_Params();
    params_.routeId = routeId;
    params_.state = state;
    var builder = new codec.MessageV0Builder(
        kMediaRouter_OnPresentationConnectionStateChanged_Name,
        codec.align(MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize));
    builder.encodeStruct(MediaRouter_OnPresentationConnectionStateChanged_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouterPtr.prototype.onPresentationConnectionClosed = function() {
    return MediaRouterProxy.prototype.onPresentationConnectionClosed
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.onPresentationConnectionClosed = function(routeId, reason, message) {
    var params_ = new MediaRouter_OnPresentationConnectionClosed_Params();
    params_.routeId = routeId;
    params_.reason = reason;
    params_.message = message;
    var builder = new codec.MessageV0Builder(
        kMediaRouter_OnPresentationConnectionClosed_Name,
        codec.align(MediaRouter_OnPresentationConnectionClosed_Params.encodedSize));
    builder.encodeStruct(MediaRouter_OnPresentationConnectionClosed_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouterPtr.prototype.onRouteMessagesReceived = function() {
    return MediaRouterProxy.prototype.onRouteMessagesReceived
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.onRouteMessagesReceived = function(routeId, messages) {
    var params_ = new MediaRouter_OnRouteMessagesReceived_Params();
    params_.routeId = routeId;
    params_.messages = messages;
    var builder = new codec.MessageV0Builder(
        kMediaRouter_OnRouteMessagesReceived_Name,
        codec.align(MediaRouter_OnRouteMessagesReceived_Params.encodedSize));
    builder.encodeStruct(MediaRouter_OnRouteMessagesReceived_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouterPtr.prototype.onMediaRemoterCreated = function() {
    return MediaRouterProxy.prototype.onMediaRemoterCreated
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) {
    var params_ = new MediaRouter_OnMediaRemoterCreated_Params();
    params_.tabId = tabId;
    params_.remoter = remoter;
    params_.remotingSource = remotingSource;
    var builder = new codec.MessageV0Builder(
        kMediaRouter_OnMediaRemoterCreated_Name,
        codec.align(MediaRouter_OnMediaRemoterCreated_Params.encodedSize));
    builder.encodeStruct(MediaRouter_OnMediaRemoterCreated_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MediaRouterPtr.prototype.getMediaSinkServiceStatus = function() {
    return MediaRouterProxy.prototype.getMediaSinkServiceStatus
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaRouterProxy.prototype.getMediaSinkServiceStatus = function() {
    var params_ = new MediaRouter_GetMediaSinkServiceStatus_Params();
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMediaRouter_GetMediaSinkServiceStatus_Name,
          codec.align(MediaRouter_GetMediaSinkServiceStatus_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MediaRouter_GetMediaSinkServiceStatus_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MediaRouter_GetMediaSinkServiceStatus_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };

  function MediaRouterStub(delegate) {
    this.delegate_ = delegate;
  }
  MediaRouterStub.prototype.registerMediaRouteProvider = function(providerId, mediaRouterProvider) {
    return this.delegate_ && this.delegate_.registerMediaRouteProvider && this.delegate_.registerMediaRouteProvider(providerId, mediaRouterProvider);
  }
  MediaRouterStub.prototype.onSinksReceived = function(providerId, mediaSource, sinks, origins) {
    return this.delegate_ && this.delegate_.onSinksReceived && this.delegate_.onSinksReceived(providerId, mediaSource, sinks, origins);
  }
  MediaRouterStub.prototype.onIssue = function(issue) {
    return this.delegate_ && this.delegate_.onIssue && this.delegate_.onIssue(issue);
  }
  MediaRouterStub.prototype.onRoutesUpdated = function(providerId, routes, mediaSource, joinableRouteIds) {
    return this.delegate_ && this.delegate_.onRoutesUpdated && this.delegate_.onRoutesUpdated(providerId, routes, mediaSource, joinableRouteIds);
  }
  MediaRouterStub.prototype.onSinkAvailabilityUpdated = function(providerId, availability) {
    return this.delegate_ && this.delegate_.onSinkAvailabilityUpdated && this.delegate_.onSinkAvailabilityUpdated(providerId, availability);
  }
  MediaRouterStub.prototype.onPresentationConnectionStateChanged = function(routeId, state) {
    return this.delegate_ && this.delegate_.onPresentationConnectionStateChanged && this.delegate_.onPresentationConnectionStateChanged(routeId, state);
  }
  MediaRouterStub.prototype.onPresentationConnectionClosed = function(routeId, reason, message) {
    return this.delegate_ && this.delegate_.onPresentationConnectionClosed && this.delegate_.onPresentationConnectionClosed(routeId, reason, message);
  }
  MediaRouterStub.prototype.onRouteMessagesReceived = function(routeId, messages) {
    return this.delegate_ && this.delegate_.onRouteMessagesReceived && this.delegate_.onRouteMessagesReceived(routeId, messages);
  }
  MediaRouterStub.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) {
    return this.delegate_ && this.delegate_.onMediaRemoterCreated && this.delegate_.onMediaRemoterCreated(tabId, remoter, remotingSource);
  }
  MediaRouterStub.prototype.getMediaSinkServiceStatus = function() {
    return this.delegate_ && this.delegate_.getMediaSinkServiceStatus && this.delegate_.getMediaSinkServiceStatus();
  }

  MediaRouterStub.prototype.accept = function(message) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kMediaRouter_OnSinksReceived_Name:
      var params = reader.decodeStruct(MediaRouter_OnSinksReceived_Params);
      this.onSinksReceived(params.providerId, params.mediaSource, params.sinks, params.origins);
      return true;
    case kMediaRouter_OnIssue_Name:
      var params = reader.decodeStruct(MediaRouter_OnIssue_Params);
      this.onIssue(params.issue);
      return true;
    case kMediaRouter_OnRoutesUpdated_Name:
      var params = reader.decodeStruct(MediaRouter_OnRoutesUpdated_Params);
      this.onRoutesUpdated(params.providerId, params.routes, params.mediaSource, params.joinableRouteIds);
      return true;
    case kMediaRouter_OnSinkAvailabilityUpdated_Name:
      var params = reader.decodeStruct(MediaRouter_OnSinkAvailabilityUpdated_Params);
      this.onSinkAvailabilityUpdated(params.providerId, params.availability);
      return true;
    case kMediaRouter_OnPresentationConnectionStateChanged_Name:
      var params = reader.decodeStruct(MediaRouter_OnPresentationConnectionStateChanged_Params);
      this.onPresentationConnectionStateChanged(params.routeId, params.state);
      return true;
    case kMediaRouter_OnPresentationConnectionClosed_Name:
      var params = reader.decodeStruct(MediaRouter_OnPresentationConnectionClosed_Params);
      this.onPresentationConnectionClosed(params.routeId, params.reason, params.message);
      return true;
    case kMediaRouter_OnRouteMessagesReceived_Name:
      var params = reader.decodeStruct(MediaRouter_OnRouteMessagesReceived_Params);
      this.onRouteMessagesReceived(params.routeId, params.messages);
      return true;
    case kMediaRouter_OnMediaRemoterCreated_Name:
      var params = reader.decodeStruct(MediaRouter_OnMediaRemoterCreated_Params);
      this.onMediaRemoterCreated(params.tabId, params.remoter, params.remotingSource);
      return true;
    default:
      return false;
    }
  };

  MediaRouterStub.prototype.acceptWithResponder =
      function(message, responder) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kMediaRouter_RegisterMediaRouteProvider_Name:
      var params = reader.decodeStruct(MediaRouter_RegisterMediaRouteProvider_Params);
      this.registerMediaRouteProvider(params.providerId, params.mediaRouterProvider).then(function(response) {
        var responseParams =
            new MediaRouter_RegisterMediaRouteProvider_ResponseParams();
        responseParams.instanceId = response.instanceId;
        responseParams.config = response.config;
        var builder = new codec.MessageV1Builder(
            kMediaRouter_RegisterMediaRouteProvider_Name,
            codec.align(MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouter_RegisterMediaRouteProvider_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    case kMediaRouter_GetMediaSinkServiceStatus_Name:
      var params = reader.decodeStruct(MediaRouter_GetMediaSinkServiceStatus_Params);
      this.getMediaSinkServiceStatus().then(function(response) {
        var responseParams =
            new MediaRouter_GetMediaSinkServiceStatus_ResponseParams();
        responseParams.status = response.status;
        var builder = new codec.MessageV1Builder(
            kMediaRouter_GetMediaSinkServiceStatus_Name,
            codec.align(MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MediaRouter_GetMediaSinkServiceStatus_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    default:
      return false;
    }
  };

  function validateMediaRouterRequest(messageValidator) {
    var message = messageValidator.message;
    var paramsClass = null;
    switch (message.getName()) {
      case kMediaRouter_RegisterMediaRouteProvider_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouter_RegisterMediaRouteProvider_Params;
      break;
      case kMediaRouter_OnSinksReceived_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouter_OnSinksReceived_Params;
      break;
      case kMediaRouter_OnIssue_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouter_OnIssue_Params;
      break;
      case kMediaRouter_OnRoutesUpdated_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouter_OnRoutesUpdated_Params;
      break;
      case kMediaRouter_OnSinkAvailabilityUpdated_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouter_OnSinkAvailabilityUpdated_Params;
      break;
      case kMediaRouter_OnPresentationConnectionStateChanged_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouter_OnPresentationConnectionStateChanged_Params;
      break;
      case kMediaRouter_OnPresentationConnectionClosed_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouter_OnPresentationConnectionClosed_Params;
      break;
      case kMediaRouter_OnRouteMessagesReceived_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouter_OnRouteMessagesReceived_Params;
      break;
      case kMediaRouter_OnMediaRemoterCreated_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaRouter_OnMediaRemoterCreated_Params;
      break;
      case kMediaRouter_GetMediaSinkServiceStatus_Name:
        if (message.expectsResponse())
          paramsClass = MediaRouter_GetMediaSinkServiceStatus_Params;
      break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  function validateMediaRouterResponse(messageValidator) {
   var message = messageValidator.message;
   var paramsClass = null;
   switch (message.getName()) {
      case kMediaRouter_RegisterMediaRouteProvider_Name:
        if (message.isResponse())
          paramsClass = MediaRouter_RegisterMediaRouteProvider_ResponseParams;
        break;
      case kMediaRouter_GetMediaSinkServiceStatus_Name:
        if (message.isResponse())
          paramsClass = MediaRouter_GetMediaSinkServiceStatus_ResponseParams;
        break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  var MediaRouter = {
    name: 'media_router.mojom.MediaRouter',
    kVersion: 0,
    ptrClass: MediaRouterPtr,
    proxyClass: MediaRouterProxy,
    stubClass: MediaRouterStub,
    validateRequest: validateMediaRouterRequest,
    validateResponse: validateMediaRouterResponse,
  };
  MediaRouter.SinkAvailability = {};
  MediaRouter.SinkAvailability.UNAVAILABLE = 0;
  MediaRouter.SinkAvailability.PER_SOURCE = MediaRouter.SinkAvailability.UNAVAILABLE + 1;
  MediaRouter.SinkAvailability.AVAILABLE = MediaRouter.SinkAvailability.PER_SOURCE + 1;

  MediaRouter.SinkAvailability.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
      return true;
    }
    return false;
  };

  MediaRouter.SinkAvailability.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  MediaRouter.PresentationConnectionState = {};
  MediaRouter.PresentationConnectionState.CONNECTING = 0;
  MediaRouter.PresentationConnectionState.CONNECTED = MediaRouter.PresentationConnectionState.CONNECTING + 1;
  MediaRouter.PresentationConnectionState.CLOSED = MediaRouter.PresentationConnectionState.CONNECTED + 1;
  MediaRouter.PresentationConnectionState.TERMINATED = MediaRouter.PresentationConnectionState.CLOSED + 1;

  MediaRouter.PresentationConnectionState.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
    case 3:
      return true;
    }
    return false;
  };

  MediaRouter.PresentationConnectionState.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  MediaRouter.PresentationConnectionCloseReason = {};
  MediaRouter.PresentationConnectionCloseReason.CONNECTION_ERROR = 0;
  MediaRouter.PresentationConnectionCloseReason.CLOSED = MediaRouter.PresentationConnectionCloseReason.CONNECTION_ERROR + 1;
  MediaRouter.PresentationConnectionCloseReason.WENT_AWAY = MediaRouter.PresentationConnectionCloseReason.CLOSED + 1;

  MediaRouter.PresentationConnectionCloseReason.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
      return true;
    }
    return false;
  };

  MediaRouter.PresentationConnectionCloseReason.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  MediaRouterStub.prototype.validator = validateMediaRouterRequest;
  MediaRouterProxy.prototype.validator = validateMediaRouterResponse;
  exports.SinkIconType = SinkIconType;
  exports.RouteControllerType = RouteControllerType;
  exports.RouteRequestResultCode = RouteRequestResultCode;
  exports.MediaSink = MediaSink;
  exports.DialMediaSink = DialMediaSink;
  exports.CastMediaSink = CastMediaSink;
  exports.MediaRoute = MediaRoute;
  exports.Issue = Issue;
  exports.RouteMessage = RouteMessage;
  exports.SinkSearchCriteria = SinkSearchCriteria;
  exports.MediaRouteProviderConfig = MediaRouteProviderConfig;
  exports.MediaSinkExtraData = MediaSinkExtraData;
  exports.MediaRouteProvider = MediaRouteProvider;
  exports.MediaRouteProviderPtr = MediaRouteProviderPtr;
  exports.MediaRouteProviderAssociatedPtr = MediaRouteProviderAssociatedPtr;
  exports.MediaRouter = MediaRouter;
  exports.MediaRouterPtr = MediaRouterPtr;
  exports.MediaRouterAssociatedPtr = MediaRouterAssociatedPtr;
})();// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

if ((typeof mojo === 'undefined') || !mojo.bindingsLibraryInitialized) {
  loadScript('mojo_bindings');
}
mojo.config.autoLoadMojomDeps = false;

loadScript('chrome/common/media_router/mojo/media_controller.mojom');
loadScript('chrome/common/media_router/mojo/media_router.mojom');
loadScript('chrome/common/media_router/mojo/media_status.mojom');
loadScript('extensions/common/mojo/keep_alive.mojom');
loadScript('media/mojo/interfaces/mirror_service_remoting.mojom');
loadScript('media/mojo/interfaces/remoting_common.mojom');
loadScript('mojo/public/mojom/base/time.mojom');
loadScript('net/interfaces/ip_address.mojom');
loadScript('net/interfaces/ip_endpoint.mojom');
loadScript('url/mojom/origin.mojom');
loadScript('url/mojom/url.mojom');

// The following adapter classes preserve backward compatibility for the media
// router component extension.
// TODO(crbug.com/787128): Remove these adapters.

function assignFields(object, fields) {
  for(var field in fields) {
    if (object.hasOwnProperty(field))
      object[field] = fields[field];
  }
}

/**
 * Adapter for mediaRouter.mojom.DialMediaSink.
 * @constructor
 */
function DialMediaSinkAdapter(fields) {
  this.ip_address = null;
  this.model_name = null;
  this.app_url = null;

  assignFields(this, fields);
}

DialMediaSinkAdapter.fromNewVersion = function(other) {
  return new DialMediaSinkAdapter({
    'ip_address': IPAddressAdapter.fromNewVersion(other.ipAddress),
    'model_name': other.modelName,
    'app_url': other.appUrl,
  });
};

DialMediaSinkAdapter.prototype.toNewVersion = function() {
  return new mediaRouter.mojom.DialMediaSink({
    'ipAddress' : this.ip_address.toNewVersion(),
    'modelName' : this.model_name,
    'appUrl' : this.app_url,
  });
};

/**
 * Adapter for mediaRouter.mojom.CastMediaSink.
 * @constructor
 */
function CastMediaSinkAdapter(fields) {
  this.ip_endpoint = null;
  this.model_name = null;
  this.capabilities = 0;
  this.cast_channel_id = 0;

  assignFields(this, fields);
}

CastMediaSinkAdapter.fromNewVersion = function(other) {
  return new CastMediaSinkAdapter({
    'ip_endpoint': IPEndpointAdapter.fromNewVersion(other.ipEndpoint),
    'model_name': other.modelName,
    'capabilities': other.capabilities,
    'cast_channel_id': other.castChannelId,
  });
};

CastMediaSinkAdapter.prototype.toNewVersion = function() {
  return new mediaRouter.mojom.CastMediaSink({
    'ipEndpoint': this.ip_endpoint.toNewVersion(),
    'modelName': this.model_name,
    'capabilities': this.capabilities,
    'castChannelId': this.cast_channel_id,
  });
};

/**
 * Adapter for mediaRouter.mojom.HangoutsMediaStatusExtraData.
 * @constructor
 */
function HangoutsMediaStatusExtraDataAdapter(fields) {
  this.local_present = false;

  assignFields(this, fields);
}

HangoutsMediaStatusExtraDataAdapter.prototype.toNewVersion = function() {
  return new mediaRouter.mojom.HangoutsMediaStatusExtraData({
    'localPresent': this.local_present,
  });
};

/**
 * Adapter for net.interfaces.IPAddress.
 * @constructor
 */
function IPAddressAdapter(fields) {
  this.address_bytes = null;

  assignFields(this, fields);
}

IPAddressAdapter.fromNewVersion = function(other) {
  return new IPAddressAdapter({
    'address_bytes': other.addressBytes,
  });
};

IPAddressAdapter.prototype.toNewVersion = function() {
  return new net.interfaces.IPAddress({
    'addressBytes': this.address_bytes,
  });
};

/**
 * Adapter for net.interfaces.IPEndpoint.
 * @constructor
 */
function IPEndpointAdapter(fields) {
  this.address = null;
  this.port = 0;

  assignFields(this, fields);
}

IPEndpointAdapter.fromNewVersion = function(other) {
  return new IPEndpointAdapter({
    'address': IPAddressAdapter.fromNewVersion(other.address),
    'port': other.port,
  });
};

IPEndpointAdapter.prototype.toNewVersion = function() {
  return new net.interfaces.IPEndpoint({
    'address': this.address.toNewVersion(),
    'port': this.port,
  });
};

/**
 * Adapter for mediaRouter.mojom.MediaStatus.
 * @constructor
 */
function MediaStatusAdapter(fields) {
  this.title = null;
  this.can_play_pause = false;
  this.can_mute = false;
  this.can_set_volume = false;
  this.can_seek = false;
  this.is_muted = false;
  this.play_state = 0;
  this.volume = 0;
  this.duration = null;
  this.current_time = null;
  this.hangouts_extra_data = null;

  assignFields(this, fields);
}

MediaStatusAdapter.PlayState = mediaRouter.mojom.MediaStatus.PlayState;

MediaStatusAdapter.prototype.toNewVersion = function() {
  return new mediaRouter.mojom.MediaStatus({
    'title': this.title,
    'canPlayPause': this.can_play_pause,
    'canMute': this.can_mute,
    'canSetVolume': this.can_set_volume,
    'canSeek': this.can_seek,
    'isMuted': this.is_muted,
    'playState': this.play_state,
    'volume': this.volume,
    'duration': this.duration,
    'currentTime': this.current_time,
    'hangoutsExtraData':
        this.hangouts_extra_data && this.hangouts_extra_data.toNewVersion(),
  });
};

/**
 * Adapter for media.mojom.RemotingSinkMetadata.
 * @constructor
 */
function RemotingSinkMetadataAdapter(fields) {
  this.features = null;
  this.audio_capabilities = null;
  this.video_capabilities = null;
  this.friendly_name = null;

  assignFields(this, fields);
}

RemotingSinkMetadataAdapter.fromNewVersion = function(other) {
  return new RemotingSinkMetadataAdapter({
    'features': other.features,
    'audio_capabilities': other.audioCapabilities,
    'video_capabilities': other.videoCapabilities,
    'friendly_name': other.friendlyName,
  });
};

RemotingSinkMetadataAdapter.prototype.toNewVersion = function() {
  return new media.mojom.RemotingSinkMetadata({
    'features': this.features,
    'audioCapabilities': this.audio_capabilities,
    'videoCapabilities': this.video_capabilities,
    'friendlyName': this.friendly_name,
  });
};

/**
 * Adapter for mediaRouter.mojom.MediaSink.
 * @constructor
 */
function MediaSinkAdapter(fields) {
  this.sink_id = null;
  this.name = null;
  this.description = null;
  this.domain = null;
  this.icon_type = 0;
  this.extra_data = null;

  assignFields(this, fields);
}

MediaSinkAdapter.fromNewVersion = function(other) {
  return new MediaSinkAdapter({
    'sink_id': other.sinkId,
    'name': other.name,
    'description': other.description,
    'domain': other.domain,
    'icon_type': other.iconType,
    'extra_data': other.extraData &&
        MediaSinkExtraDataAdapter.fromNewVersion(other.extraData),
  });
};

MediaSinkAdapter.prototype.toNewVersion = function() {
  return new mediaRouter.mojom.MediaSink({
    'sinkId': this.sink_id,
    'name': this.name,
    'description': this.description,
    'domain': this.domain,
    'iconType': this.icon_type,
    'extraData': this.extra_data && this.extra_data.toNewVersion(),
  });
};

/**
 * Adapter for mediaRouter.mojom.MediaSinkExtraData.
 * @constructor
 */
function MediaSinkExtraDataAdapter(value) {
  this.$data = null;
  this.$tag = undefined;

  if (value == undefined) {
    return;
  }

  var keys = Object.keys(value);
  if (keys.length == 0) {
    return;
  }

  if (keys.length > 1) {
    throw new TypeError('You may set only one member on a union.');
  }

  var fields = [
    'dial_media_sink',
    'cast_media_sink',
  ];

  if (fields.indexOf(keys[0]) < 0) {
    throw new ReferenceError(keys[0] +
        ' is not a MediaSinkExtraDataAdapter member.');
  }

  this[keys[0]] = value[keys[0]];
}

MediaSinkExtraDataAdapter.Tags = {
  dial_media_sink: 0,
  cast_media_sink: 1,
};

Object.defineProperty(MediaSinkExtraDataAdapter.prototype, 'dial_media_sink', {
  get: function() {
    if (this.$tag != MediaSinkExtraDataAdapter.Tags.dial_media_sink) {
      throw new ReferenceError(
          'MediaSinkExtraDataAdapter.dial_media_sink is not currently set.');
    }
    return this.$data;
  },

  set: function(value) {
    this.$tag = MediaSinkExtraDataAdapter.Tags.dial_media_sink;
    this.$data = value;
  }
});

Object.defineProperty(MediaSinkExtraDataAdapter.prototype, 'cast_media_sink', {
  get: function() {
    if (this.$tag != MediaSinkExtraDataAdapter.Tags.cast_media_sink) {
      throw new ReferenceError(
          'MediaSinkExtraDataAdapter.cast_media_sink is not currently set.');
    }
    return this.$data;
  },

  set: function(value) {
    this.$tag = MediaSinkExtraDataAdapter.Tags.cast_media_sink;
    this.$data = value;
  }
});

MediaSinkExtraDataAdapter.fromNewVersion = function(other) {
  if (other.$tag == mediaRouter.mojom.MediaSinkExtraData.Tags.dialMediaSink) {
    return new MediaSinkExtraDataAdapter({
      'dial_media_sink':
          DialMediaSinkAdapter.fromNewVersion(other.dialMediaSink),
    });
  } else {
    return new MediaSinkExtraDataAdapter({
      'cast_media_sink':
          CastMediaSinkAdapter.fromNewVersion(other.castMediaSink),
    });
  }
};

MediaSinkExtraDataAdapter.prototype.toNewVersion = function() {
  if (this.$tag == MediaSinkExtraDataAdapter.Tags.dial_media_sink) {
    return new mediaRouter.mojom.MediaSinkExtraData({
      'dialMediaSink': this.dial_media_sink.toNewVersion(),
    });
  } else {
    return new mediaRouter.mojom.MediaSinkExtraData({
      'castMediaSink': this.cast_media_sink.toNewVersion(),
    });
  }
};

/**
 * Adapter for media.mojom.MirrorServiceRemoterPtr.
 * @constructor
 */
function MirrorServiceRemoterPtrAdapter(handleOrPtrInfo) {
  this.ptr = new mojo.InterfacePtrController(MirrorServiceRemoterAdapter,
                                             handleOrPtrInfo);
}

MirrorServiceRemoterPtrAdapter.prototype =
    Object.create(media.mojom.MirrorServiceRemoterPtr.prototype);
MirrorServiceRemoterPtrAdapter.prototype.constructor =
    MirrorServiceRemoterPtrAdapter;

MirrorServiceRemoterPtrAdapter.prototype.startDataStreams = function() {
  return MirrorServiceRemoterProxy.prototype.startDataStreams
      .apply(this.ptr.getProxy(), arguments).then(function(response) {
    return Promise.resolve({
      'audio_stream_id': response.audioStreamId,
      'video_stream_id': response.videoStreamId,
    });
  });
};

/**
 * Adapter for media.mojom.MirrorServiceRemoter.stubclass.
 * @constructor
 */
function MirrorServiceRemoterStubAdapter(delegate) {
  this.delegate_ = delegate;
}

MirrorServiceRemoterStubAdapter.prototype = Object.create(
    media.mojom.MirrorServiceRemoter.stubClass.prototype);
MirrorServiceRemoterStubAdapter.prototype.constructor =
    MirrorServiceRemoterStubAdapter;

MirrorServiceRemoterStubAdapter.prototype.startDataStreams =
    function(hasAudio, hasVideo) {
  return this.delegate_ && this.delegate_.startDataStreams &&
      this.delegate_.startDataStreams(hasAudio, hasVideo).then(
          function(response) {
            return {
              'audioStreamId': response.audio_stream_id,
              'videoStreamId': response.video_stream_id,
            };
          });
};

/**
 * Adapter for media.mojom.MirrorServiceRemoter.
 */
var MirrorServiceRemoterAdapter = {
    name: 'media.mojom.MirrorServiceRemoter',
    kVersion: 0,
    ptrClass: MirrorServiceRemoterPtrAdapter,
    proxyClass: media.mojom.MirrorServiceRemoter.proxyClass,
    stubClass: MirrorServiceRemoterStubAdapter,
    validateRequest: media.mojom.MirrorServiceRemoter.validateRequest,
    validateResponse: media.mojom.MirrorServiceRemoter.validateResponse,
};

/**
 * Adapter for media.mojom.MirrorServiceRemotingSourcePtr.
 * @constructor
 */
function MirrorServiceRemotingSourcePtrAdapter(handleOrPtrInfo) {
  this.ptr = new mojo.InterfacePtrController(MirrorServiceRemotingSourceAdapter,
                                             handleOrPtrInfo);
}

MirrorServiceRemotingSourcePtrAdapter.prototype =
    Object.create(media.mojom.MirrorServiceRemotingSourcePtr.prototype);
MirrorServiceRemotingSourcePtrAdapter.prototype.constructor =
    MirrorServiceRemotingSourcePtrAdapter;

MirrorServiceRemotingSourcePtrAdapter.prototype.onSinkAvailable =
    function(metadata) {
  return this.ptr.getProxy().onSinkAvailable(metadata.toNewVersion());
};

/**
 * Adapter for media.mojom.MirrorServiceRemotingSource.
 */
var MirrorServiceRemotingSourceAdapter = {
    name: 'media.mojom.MirrorServiceRemotingSource',
    kVersion: 0,
    ptrClass: MirrorServiceRemotingSourcePtrAdapter,
    proxyClass: media.mojom.MirrorServiceRemotingSource.proxyClass,
    stubClass: null,
    validateRequest: media.mojom.MirrorServiceRemotingSource.validateRequest,
    validateResponse: null,
};

/**
 * Adapter for mediaRouter.mojom.MediaStatusObserver.
 * @constructor
 */
function MediaStatusObserverPtrAdapter(handleOrPtrInfo) {
  this.ptr = new mojo.InterfacePtrController(MediaStatusObserverAdapter,
                                             handleOrPtrInfo);
}

MediaStatusObserverPtrAdapter.prototype =
    Object.create(mediaRouter.mojom.MediaStatusObserverPtr.prototype);
MediaStatusObserverPtrAdapter.prototype.constructor =
    MediaStatusObserverPtrAdapter;

MediaStatusObserverPtrAdapter.prototype.onMediaStatusUpdated =
    function(status) {
  return this.ptr.getProxy().onMediaStatusUpdated(status.toNewVersion());
};

/**
 * Adapter for mediaRouter.mojom.MediaStatusObserver.
 */
var MediaStatusObserverAdapter = {
  name: 'mediaRouter.mojom.MediaStatusObserver',
  kVersion: 0,
  ptrClass: MediaStatusObserverPtrAdapter,
  proxyClass: mediaRouter.mojom.MediaStatusObserver.proxyClass,
  stubClass: null,
  validateRequest: mediaRouter.mojom.MediaStatusObserver.validateRequest,
  validateResponse: null,
};

/**
 * Converts a media sink to a MediaSink Mojo object.
 * @param {!MediaSink} sink A media sink.
 * @return {!mediaRouter.mojom.MediaSink} A Mojo MediaSink object.
 */
function sinkToMojo_(sink) {
  return new mediaRouter.mojom.MediaSink({
    'name': sink.friendlyName,
    'description': sink.description,
    'domain': sink.domain,
    'sinkId': sink.id,
    'iconType': sinkIconTypeToMojo(sink.iconType),
    'providerId': mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION,
  });
}

/**
 * Converts a media sink's icon type to a MediaSink.IconType Mojo object.
 * @param {!MediaSink.IconType} type A media sink's icon type.
 * @return {!mediaRouter.mojom.MediaSink.IconType} A Mojo MediaSink.IconType
 *     object.
 */
function sinkIconTypeToMojo(type) {
  switch (type) {
    case 'cast':
      return mediaRouter.mojom.SinkIconType.CAST;
    case 'cast_audio_group':
      return mediaRouter.mojom.SinkIconType.CAST_AUDIO_GROUP;
    case 'cast_audio':
      return mediaRouter.mojom.SinkIconType.CAST_AUDIO;
    case 'meeting':
      return mediaRouter.mojom.SinkIconType.MEETING;
    case 'hangout':
      return mediaRouter.mojom.SinkIconType.HANGOUT;
    case 'education':
      return mediaRouter.mojom.SinkIconType.EDUCATION;
    case 'generic':
      return mediaRouter.mojom.SinkIconType.GENERIC;
    default:
      console.error('Unknown sink icon type : ' + type);
      return mediaRouter.mojom.SinkIconType.GENERIC;
  }
}

/**
 * Returns a Mojo MediaRoute object given a MediaRoute and a
 * media sink name.
 * @param {!MediaRoute} route
 * @return {!mediaRouter.mojom.MediaRoute}
 */
function routeToMojo_(route) {
  return new mediaRouter.mojom.MediaRoute({
    'mediaRouteId': route.id,
    'mediaSource': route.mediaSource,
    'mediaSinkId': route.sinkId,
    'description': route.description,
    'iconUrl': route.iconUrl,
    'isLocal': route.isLocal,
    'forDisplay': route.forDisplay,
    'isIncognito': route.offTheRecord,
    'isLocalPresentation': route.isOffscreenPresentation,
    'controllerType': route.controllerType,
    // Begin newly added properties, followed by the milestone they were
    // added.  The guard should be safe to remove N+2 milestones later.
    'presentationId': route.presentationId || ''  // M64
  });
}

/**
 * Converts a route message to a RouteMessage Mojo object.
 * @param {!RouteMessage} message
 * @return {!mediaRouter.mojom.RouteMessage} A Mojo RouteMessage object.
 */
function messageToMojo_(message) {
  if ("string" == typeof message.message) {
    return new mediaRouter.mojom.RouteMessage({
      'type': mediaRouter.mojom.RouteMessage.Type.TEXT,
      'message': message.message,
    });
  } else {
    return new mediaRouter.mojom.RouteMessage({
      'type': mediaRouter.mojom.RouteMessage.Type.BINARY,
      'data': message.message,
    });
  }
}

/**
 * Converts presentation connection state to Mojo enum value.
 * @param {!string} state
 * @return {!mediaRouter.mojom.MediaRouter.PresentationConnectionState}
 */
function presentationConnectionStateToMojo_(state) {
  var PresentationConnectionState =
      mediaRouter.mojom.MediaRouter.PresentationConnectionState;
  switch (state) {
    case 'connecting':
      return PresentationConnectionState.CONNECTING;
    case 'connected':
      return PresentationConnectionState.CONNECTED;
    case 'closed':
      return PresentationConnectionState.CLOSED;
    case 'terminated':
      return PresentationConnectionState.TERMINATED;
    default:
      console.error('Unknown presentation connection state: ' + state);
      return PresentationConnectionState.TERMINATED;
  }
}

/**
 * Converts presentation connection close reason to Mojo enum value.
 * @param {!string} reason
 * @return {!mediaRouter.mojom.MediaRouter.PresentationConnectionCloseReason}
 */
function presentationConnectionCloseReasonToMojo_(reason) {
  var PresentationConnectionCloseReason =
      mediaRouter.mojom.MediaRouter.PresentationConnectionCloseReason;
  switch (reason) {
    case 'error':
      return PresentationConnectionCloseReason.CONNECTION_ERROR;
    case 'closed':
      return PresentationConnectionCloseReason.CLOSED;
    case 'went_away':
      return PresentationConnectionCloseReason.WENT_AWAY;
    default:
      console.error('Unknown presentation connection close reason : ' +
          reason);
      return PresentationConnectionCloseReason.CONNECTION_ERROR;
  }
}

/**
 * Converts string to Mojo origin.
 * @param {string|!url.mojom.Origin} origin
 * @return {!url.mojom.Origin}
 */
function stringToMojoOrigin_(origin) {
  if (origin instanceof url.mojom.Origin) {
    return origin;
  }
  var originUrl = new URL(origin);
  var mojoOrigin = {};
  mojoOrigin.scheme = originUrl.protocol.replace(':', '');
  mojoOrigin.host = originUrl.hostname;
  var port = originUrl.port ? Number.parseInt(originUrl.port) : 0;
  switch (mojoOrigin.scheme) {
    case 'http':
      mojoOrigin.port = port || 80;
      break;
    case 'https':
      mojoOrigin.port = port || 443;
      break;
    default:
      throw new Error('Scheme must be http or https');
  }
  mojoOrigin.suborigin = '';
  return new url.mojom.Origin(mojoOrigin);
}

/**
 * Parses the given route request Error object and converts it to the
 * corresponding result code.
 * @param {!Error} error
 * @return {!mediaRouter.mojom.RouteRequestResultCode}
 */
function getRouteRequestResultCode_(error) {
  return error.errorCode ? error.errorCode :
    mediaRouter.mojom.RouteRequestResultCode.UNKNOWN_ERROR;
}

/**
 * Creates and returns a successful route response from given route.
 * @param {!MediaRoute} route
 * @return {!Object}
 */
function toSuccessRouteResponse_(route) {
  return {
      route: routeToMojo_(route),
      resultCode: mediaRouter.mojom.RouteRequestResultCode.OK
  };
}

/**
 * Creates and returns a error route response from given Error object.
 * @param {!Error} error
 * @return {!Object}
 */
function toErrorRouteResponse_(error) {
  return {
      errorText: error.message,
      resultCode: getRouteRequestResultCode_(error)
  };
}

/**
 * Creates a new MediaRouter.
 * Converts a route struct to its Mojo form.
 * @param {!mediaRouter.mojom.MediaRouterPtr} service
 * @constructor
 */
function MediaRouter(service) {
  /**
   * The Mojo service proxy. Allows extension code to call methods that reside
   * in the browser.
   * @type {!mediaRouter.mojom.MediaRouterPtr}
   */
  this.service_ = service;

  /**
   * The provider manager service delegate. Its methods are called by the
   * browser-resident Mojo service.
   * @type {!MediaRouter}
   */
  this.mrpm_ = new MediaRouteProvider(this);

  /**
   * Handle to a KeepAlive service object, which prevents the extension from
   * being suspended as long as it remains in scope.
   * @type {boolean}
   */
  this.keepAlive_ = null;

  /**
   * The bindings to bind the service delegate to the Mojo interface.
   * Object must remain in scope for the lifetime of the connection to
   * prevent the connection from closing automatically.
   * @type {!mojo.Binding}
   */
  this.mediaRouteProviderBinding_ = new mojo.Binding(
      mediaRouter.mojom.MediaRouteProvider, this.mrpm_);
}

/**
 * Returns definitions of Mojo core and generated Mojom classes that can be
 * used directly by the component.
 * @return {!Object}
 * TODO(imcheng): We should export these along with MediaRouter. This requires
 * us to modify the component to handle multiple exports. When that logic is
 * baked in for a couple of milestones, we should be able to remove this
 * method.
 * TODO(imcheng): We should stop exporting mojo bindings classes that the
 * Media Router extension doesn't directly use, such as
 * mojo.AssociatedInterfacePtrInfo, mojo.InterfacePtrController and
 * mojo.interfaceControl.
 */
MediaRouter.prototype.getMojoExports = function() {
  return {
    AssociatedInterfacePtrInfo: mojo.AssociatedInterfacePtrInfo,
    Binding: mojo.Binding,
    DialMediaSink: DialMediaSinkAdapter,
    CastMediaSink: CastMediaSinkAdapter,
    HangoutsMediaRouteController:
        mediaRouter.mojom.HangoutsMediaRouteController,
    HangoutsMediaStatusExtraData: HangoutsMediaStatusExtraDataAdapter,
    IPAddress: IPAddressAdapter,
    IPEndpoint: IPEndpointAdapter,
    InterfacePtrController: mojo.InterfacePtrController,
    InterfacePtrInfo: mojo.InterfacePtrInfo,
    InterfaceRequest: mojo.InterfaceRequest,
    MediaController: mediaRouter.mojom.MediaController,
    MediaStatus: MediaStatusAdapter,
    MediaStatusObserverPtr: mediaRouter.mojom.MediaStatusObserverPtr,
    MirrorServiceRemoter: MirrorServiceRemoterAdapter,
    MirrorServiceRemoterPtr: MirrorServiceRemoterPtrAdapter,
    MirrorServiceRemotingSourcePtr: MirrorServiceRemotingSourcePtrAdapter,
    RemotingStopReason: media.mojom.RemotingStopReason,
    RemotingStartFailReason: media.mojom.RemotingStartFailReason,
    RemotingSinkFeature: media.mojom.RemotingSinkFeature,
    RemotingSinkAudioCapability:
        media.mojom.RemotingSinkAudioCapability,
    RemotingSinkVideoCapability:
        media.mojom.RemotingSinkVideoCapability,
    RemotingSinkMetadata: RemotingSinkMetadataAdapter,
    RouteControllerType: mediaRouter.mojom.RouteControllerType,
    Origin: url.mojom.Origin,
    Sink: MediaSinkAdapter,
    SinkExtraData: MediaSinkExtraDataAdapter,
    TimeDelta: mojoBase.mojom.TimeDelta,
    Url: url.mojom.Url,
    interfaceControl: mojo.interfaceControl,
    makeRequest: mojo.makeRequest,
  };
};

/**
 * Registers the Media Router Provider Manager with the Media Router.
 * @return {!Promise<Object>} Instance ID and config for the Media Router.
 */
MediaRouter.prototype.start = function() {
  return this.service_.registerMediaRouteProvider(
      mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION,
      this.mediaRouteProviderBinding_.createInterfacePtrAndBind()).then(
          function(response) {
            return {
              'instance_id': response.instanceId,
              'config': {
                'enable_dial_discovery': response.config.enableDialDiscovery,
                'enable_cast_discovery': response.config.enableCastDiscovery,
                'enable_dial_sink_query': response.config.enableDialSinkQuery,
                'enable_cast_sink_query': response.config.enableCastSinkQuery,
              }
            };
          });
}

/**
 * Sets the service delegate methods.
 * @param {Object} handlers
 */
MediaRouter.prototype.setHandlers = function(handlers) {
  this.mrpm_.setHandlers(handlers);
}

/**
 * The keep alive status.
 * @return {boolean}
 */
MediaRouter.prototype.getKeepAlive = function() {
  return this.keepAlive_ != null;
};

/**
 * Called by the provider manager when a sink list for a given source is
 * updated.
 * @param {!string} sourceUrn
 * @param {!Array<!MediaSink>} sinks
 * @param {!Array<string|!url.mojom.Origin>} origins
 */
MediaRouter.prototype.onSinksReceived = function(sourceUrn, sinks, origins) {
  // |origins| is a string array if the Media Router component extension version
  // is 59 or older. Without the stringToMojoOrigin_() conversion, clients using
  // those extension versions would see a crash shown in
  // https://crbug.com/787427.
  this.service_.onSinksReceived(
      mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, sourceUrn,
      sinks.map(sinkToMojo_), origins.map(stringToMojoOrigin_));
};

/**
 * Called by the provider manager when a sink is found to notify the MR of the
 * sink's ID. The actual sink will be returned through the normal sink list
 * update process, so this helps the MR identify the search result in the
 * list.
 * @param {string} pseudoSinkId  ID of the pseudo sink that started the
 *     search.
 * @param {string} sinkId ID of the newly-found sink.
 */
MediaRouter.prototype.onSearchSinkIdReceived = function(
    pseudoSinkId, sinkId) {
  this.service_.onSearchSinkIdReceived(pseudoSinkId, sinkId);
};

/**
 * Called by the provider manager to keep the extension from suspending
 * if it enters a state where suspension is undesirable (e.g. there is an
 * active MediaRoute.)
 * If keepAlive is true, the extension is kept alive.
 * If keepAlive is false, the extension is allowed to suspend.
 * @param {boolean} keepAlive
 */
MediaRouter.prototype.setKeepAlive = function(keepAlive) {
  if (keepAlive === false && this.keepAlive_) {
    this.keepAlive_.ptr.reset();
    this.keepAlive_ = null;
  } else if (keepAlive === true && !this.keepAlive_) {
    this.keepAlive_ = new extensions.KeepAlivePtr;
    Mojo.bindInterface(extensions.KeepAlive.name,
                       mojo.makeRequest(this.keepAlive_).handle);
  }
};

/**
 * Called by the provider manager to send an issue from a media route
 * provider to the Media Router, to show the user.
 * @param {!Object} issue The issue object.
 */
MediaRouter.prototype.onIssue = function(issue) {
  function issueSeverityToMojo_(severity) {
    switch (severity) {
      case 'fatal':
        return mediaRouter.mojom.Issue.Severity.FATAL;
      case 'warning':
        return mediaRouter.mojom.Issue.Severity.WARNING;
      case 'notification':
        return mediaRouter.mojom.Issue.Severity.NOTIFICATION;
      default:
        console.error('Unknown issue severity: ' + severity);
        return mediaRouter.mojom.Issue.Severity.NOTIFICATION;
    }
  }

  function issueActionToMojo_(action) {
    switch (action) {
      case 'dismiss':
        return mediaRouter.mojom.Issue.ActionType.DISMISS;
      case 'learn_more':
        return mediaRouter.mojom.Issue.ActionType.LEARN_MORE;
      default:
        console.error('Unknown issue action type : ' + action);
        return mediaRouter.mojom.Issue.ActionType.OK;
    }
  }

  var secondaryActions = (issue.secondaryActions || []).map(issueActionToMojo_);
  this.service_.onIssue(new mediaRouter.mojom.Issue({
    'routeId': issue.routeId || '',
    'severity': issueSeverityToMojo_(issue.severity),
    'title': issue.title,
    'message': issue.message || '',
    'defaultAction': issueActionToMojo_(issue.defaultAction),
    'secondaryActions': secondaryActions,
    'helpPageId': issue.helpPageId,
    'isBlocking': issue.isBlocking
  }));
};

/**
 * Called by the provider manager when the set of active routes
 * has been updated.
 * @param {!Array<MediaRoute>} routes The active set of media routes.
 * @param {string=} sourceUrn The sourceUrn associated with this route
 *     query.
 * @param {Array<string>=} joinableRouteIds The active set of joinable
 *     media routes.
 */
MediaRouter.prototype.onRoutesUpdated = function(
    routes, sourceUrn = '', joinableRouteIds = []) {
  this.service_.onRoutesUpdated(
      mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION,
      routes.map(routeToMojo_), sourceUrn, joinableRouteIds);
};

/**
 * Called by the provider manager when sink availability has been updated.
 * @param {!mediaRouter.mojom.MediaRouter.SinkAvailability} availability
 *     The new sink availability.
 */
MediaRouter.prototype.onSinkAvailabilityUpdated = function(availability) {
  this.service_.onSinkAvailabilityUpdated(
      mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, availability);
};

/**
 * Called by the provider manager when the state of a presentation connected
 * to a route has changed.
 * @param {string} routeId
 * @param {string} state
 */
MediaRouter.prototype.onPresentationConnectionStateChanged =
    function(routeId, state) {
  this.service_.onPresentationConnectionStateChanged(
      routeId, presentationConnectionStateToMojo_(state));
};

/**
 * Called by the provider manager when the state of a presentation connected
 * to a route has closed.
 * @param {string} routeId
 * @param {string} reason
 * @param {string} message
 */
MediaRouter.prototype.onPresentationConnectionClosed =
    function(routeId, reason, message) {
  this.service_.onPresentationConnectionClosed(
      routeId, presentationConnectionCloseReasonToMojo_(reason), message);
};

/**
 * @param {string} routeId
 * @param {!Array<!RouteMessage>} mesages
 */
MediaRouter.prototype.onRouteMessagesReceived = function(routeId, messages) {
  this.service_.onRouteMessagesReceived(
      routeId, messages.map(messageToMojo_));
};

/**
 * @param {number} tabId
 * @param {!media.mojom.MirrorServiceRemoterPtr} remoter
 * @param {!mojo.InterfaceRequest} remotingSource
 */
MediaRouter.prototype.onMediaRemoterCreated = function(tabId, remoter,
    remotingSource) {
  this.service_.onMediaRemoterCreated(
      tabId,
      new media.mojom.MirrorServiceRemoterPtr(remoter.ptr.passInterface()),
      remotingSource);
}

/**
 * Returns current status of media sink service in JSON format.
 * @return {!Promise<!{status: string}>}
 */
MediaRouter.prototype.getMediaSinkServiceStatus = function() {
  return this.service_.getMediaSinkServiceStatus();
}

/**
 * Object containing callbacks set by the provider manager.
 *
 * @constructor
 * @struct
 */
function MediaRouterHandlers() {
  /**
   * @type {function(!string, !string, !string, !string, !number)}
   */
  this.createRoute = null;

  /**
   * @type {function(!string, !string, !string, !number)}
   */
  this.joinRoute = null;

  /**
   * @type {function(string): Promise}
   */
  this.terminateRoute = null;

  /**
   * @type {function(string)}
   */
  this.startObservingMediaSinks = null;

  /**
   * @type {function(string)}
   */
  this.stopObservingMediaSinks = null;

  /**
   * @type {function(string, string): Promise}
   */
  this.sendRouteMessage = null;

  /**
   * @type {function(string, Uint8Array): Promise}
   */
  this.sendRouteBinaryMessage = null;

  /**
   * @type {function(string)}
   */
  this.startListeningForRouteMessages = null;

  /**
   * @type {function(string)}
   */
  this.stopListeningForRouteMessages = null;

  /**
   * @type {function(string)}
   */
  this.detachRoute = null;

  /**
   * @type {function()}
   */
  this.startObservingMediaRoutes = null;

  /**
   * @type {function()}
   */
  this.stopObservingMediaRoutes = null;

  /**
   * @type {function()}
   */
  this.connectRouteByRouteId = null;

  /**
   * @type {function()}
   */
  this.enableMdnsDiscovery = null;

  /**
   * @type {function()}
   */
  this.updateMediaSinks = null;

  /**
   * @type {function(string, string, !SinkSearchCriteria): string}
   */
  this.searchSinks = null;

  /**
   * @type {function()}
   */
  this.provideSinks = null;

  /**
   * @type {function(string, !mojo.InterfaceRequest,
   *            !mediaRouter.mojom.MediaStatusObserverPtr): !Promise<void>}
   */
  this.createMediaRouteController = null;
};

/**
 * Routes calls from Media Router to the provider manager extension.
 * Registered with the MediaRouter stub.
 * @param {!MediaRouter} MediaRouter proxy to call into the
 * Media Router mojo interface.
 * @constructor
 */
function MediaRouteProvider(mediaRouter) {
  /**
   * Object containing JS callbacks into Provider Manager code.
   * @type {!MediaRouterHandlers}
   */
  this.handlers_ = new MediaRouterHandlers();

  /**
   * Proxy class to the browser's Media Router Mojo service.
   * @type {!MediaRouter}
   */
  this.mediaRouter_ = mediaRouter;
}

/*
 * Sets the callback handler used to invoke methods in the provider manager.
 *
 * @param {!MediaRouterHandlers} handlers
 */
MediaRouteProvider.prototype.setHandlers = function(handlers) {
  this.handlers_ = handlers;
  var requiredHandlers = [
    'stopObservingMediaRoutes',
    'startObservingMediaRoutes',
    'sendRouteMessage',
    'sendRouteBinaryMessage',
    'startListeningForRouteMessages',
    'stopListeningForRouteMessages',
    'detachRoute',
    'terminateRoute',
    'joinRoute',
    'createRoute',
    'stopObservingMediaSinks',
    'startObservingMediaRoutes',
    'connectRouteByRouteId',
    'enableMdnsDiscovery',
    'updateMediaSinks',
    'searchSinks',
    'provideSinks',
    'createMediaRouteController',
    'onBeforeInvokeHandler'
  ];
  requiredHandlers.forEach(function(nextHandler) {
    if (handlers[nextHandler] === undefined) {
      console.error(nextHandler + ' handler not registered.');
    }
  });
}

/**
 * Starts querying for sinks capable of displaying the media source
 * designated by |sourceUrn|.  Results are returned by calling
 * OnSinksReceived.
 * @param {!string} sourceUrn
 */
MediaRouteProvider.prototype.startObservingMediaSinks =
    function(sourceUrn) {
  this.handlers_.onBeforeInvokeHandler();
  this.handlers_.startObservingMediaSinks(sourceUrn);
};

/**
 * Stops querying for sinks capable of displaying |sourceUrn|.
 * @param {!string} sourceUrn
 */
MediaRouteProvider.prototype.stopObservingMediaSinks =
    function(sourceUrn) {
  this.handlers_.onBeforeInvokeHandler();
  this.handlers_.stopObservingMediaSinks(sourceUrn);
};

/**
 * Requests that |sinkId| render the media referenced by |sourceUrn|. If the
 * request is from the Presentation API, then origin and tabId will
 * be populated.
 * @param {!string} sourceUrn Media source to render.
 * @param {!string} sinkId Media sink ID.
 * @param {!string} presentationId Presentation ID from the site
 *     requesting presentation. TODO(mfoltz): Remove.
 * @param {!url.mojom.Origin} origin Origin of site requesting presentation.
 * @param {!number} tabId ID of tab requesting presentation.
 * @param {!mojo_base.mojom.TimeDelta} timeout If positive, the timeout
 *     duration for the request. Otherwise, the default duration will be used.
 * @param {!boolean} incognito If true, the route is being requested by
 *     an incognito profile.
 * @return {!Promise.<!Object>} A Promise resolving to an object describing
 *     the newly created media route, or rejecting with an error message on
 *     failure.
 */
MediaRouteProvider.prototype.createRoute =
    function(sourceUrn, sinkId, presentationId, origin, tabId,
             timeout, incognito) {
  this.handlers_.onBeforeInvokeHandler();
  return this.handlers_.createRoute(
      sourceUrn, sinkId, presentationId, origin, tabId,
      Math.floor(timeout.microseconds / 1000), incognito)
      .then(function(route) {
        return toSuccessRouteResponse_(route);
      },
      function(err) {
        return toErrorRouteResponse_(err);
      });
};

/**
 * Handles a request via the Presentation API to join an existing route given
 * by |sourceUrn| and |presentationId|. |origin| and |tabId| are used for
 * validating same-origin/tab scope.
 * @param {!string} sourceUrn Media source to render.
 * @param {!string} presentationId Presentation ID to join.
 * @param {!url.mojom.Origin} origin Origin of site requesting join.
 * @param {!number} tabId ID of tab requesting join.
 * @param {!mojo_base.mojom.TimeDelta} timeout If positive, the timeout
 *     duration for the request. Otherwise, the default duration will be used.
 * @param {!boolean} incognito If true, the route is being requested by
 *     an incognito profile.
 * @return {!Promise.<!Object>} A Promise resolving to an object describing
 *     the newly created media route, or rejecting with an error message on
 *     failure.
 */
MediaRouteProvider.prototype.joinRoute =
    function(sourceUrn, presentationId, origin, tabId, timeout,
             incognito) {
  this.handlers_.onBeforeInvokeHandler();
  return this.handlers_.joinRoute(
      sourceUrn, presentationId, origin, tabId,
      Math.floor(timeout.microseconds / 1000), incognito)
      .then(function(route) {
        return toSuccessRouteResponse_(route);
      },
      function(err) {
        return toErrorRouteResponse_(err);
      });
};

/**
 * Handles a request via the Presentation API to join an existing route given
 * by |sourceUrn| and |routeId|. |origin| and |tabId| are used for
 * validating same-origin/tab scope.
 * @param {!string} sourceUrn Media source to render.
 * @param {!string} routeId Route ID to join.
 * @param {!string} presentationId Presentation ID to join.
 * @param {!url.mojom.Origin} origin Origin of site requesting join.
 * @param {!number} tabId ID of tab requesting join.
 * @param {!mojo_base.mojom.TimeDelta} timeout If positive, the timeout
 *     duration for the request. Otherwise, the default duration will be used.
 * @param {!boolean} incognito If true, the route is being requested by
 *     an incognito profile.
 * @return {!Promise.<!Object>} A Promise resolving to an object describing
 *     the newly created media route, or rejecting with an error message on
 *     failure.
 */
MediaRouteProvider.prototype.connectRouteByRouteId =
    function(sourceUrn, routeId, presentationId, origin, tabId,
             timeout, incognito) {
  this.handlers_.onBeforeInvokeHandler();
  return this.handlers_.connectRouteByRouteId(
      sourceUrn, routeId, presentationId, origin, tabId,
      Math.floor(timeout.microseconds / 1000), incognito)
      .then(function(route) {
        return toSuccessRouteResponse_(route);
      },
      function(err) {
        return toErrorRouteResponse_(err);
      });
};

/**
 * Terminates the route specified by |routeId|.
 * @param {!string} routeId
 * @return {!Promise<!Object>} A Promise resolving to an object describing
 *    the result of the terminate operation, or rejecting with an error
 *    message and code if the operation failed.
 */
MediaRouteProvider.prototype.terminateRoute = function(routeId) {
  this.handlers_.onBeforeInvokeHandler();
  return this.handlers_.terminateRoute(routeId).then(
      () => ({resultCode: mediaRouter.mojom.RouteRequestResultCode.OK}),
      (err) => toErrorRouteResponse_(err));
};

/**
 * Posts a message to the route designated by |routeId|.
 * @param {!string} routeId
 * @param {!string} message
 * @return {!Promise.<boolean>} Resolved with true if the message was sent,
 *    or false on failure.
 */
MediaRouteProvider.prototype.sendRouteMessage = function(
  routeId, message) {
  this.handlers_.onBeforeInvokeHandler();
  return this.handlers_.sendRouteMessage(routeId, message)
      .then(function() {
        return {'sent': true};
      }, function() {
        return {'sent': false};
      });
};

/**
 * Sends a binary message to the route designated by |routeId|.
 * @param {!string} routeId
 * @param {!Array<number>} data
 * @return {!Promise.<boolean>} Resolved with true if the data was sent,
 *    or false on failure.
 */
MediaRouteProvider.prototype.sendRouteBinaryMessage = function(
  routeId, data) {
  this.handlers_.onBeforeInvokeHandler();
  return this.handlers_.sendRouteBinaryMessage(routeId, new Uint8Array(data))
      .then(function() {
        return {'sent': true};
      }, function() {
        return {'sent': false};
      });
};

/**
 * Listen for messages from a route.
 * @param {!string} routeId
 */
MediaRouteProvider.prototype.startListeningForRouteMessages = function(
    routeId) {
  this.handlers_.onBeforeInvokeHandler();
  this.handlers_.startListeningForRouteMessages(routeId);
};

/**
 * @param {!string} routeId
 */
MediaRouteProvider.prototype.stopListeningForRouteMessages = function(
    routeId) {
  this.handlers_.onBeforeInvokeHandler();
  this.handlers_.stopListeningForRouteMessages(routeId);
};

/**
 * Indicates that the presentation connection that was connected to |routeId|
 * is no longer connected to it.
 * @param {!string} routeId
 */
MediaRouteProvider.prototype.detachRoute = function(
    routeId) {
  this.handlers_.detachRoute(routeId);
};

/**
 * Requests that the provider manager start sending information about active
 * media routes to the Media Router.
 * @param {!string} sourceUrn
 */
MediaRouteProvider.prototype.startObservingMediaRoutes = function(sourceUrn) {
  this.handlers_.onBeforeInvokeHandler();
  this.handlers_.startObservingMediaRoutes(sourceUrn);
};

/**
 * Requests that the provider manager stop sending information about active
 * media routes to the Media Router.
 * @param {!string} sourceUrn
 */
MediaRouteProvider.prototype.stopObservingMediaRoutes = function(sourceUrn) {
  this.handlers_.onBeforeInvokeHandler();
  this.handlers_.stopObservingMediaRoutes(sourceUrn);
};

/**
 * Enables mDNS device discovery.
 */
MediaRouteProvider.prototype.enableMdnsDiscovery = function() {
  this.handlers_.onBeforeInvokeHandler();
  this.handlers_.enableMdnsDiscovery();
};

/**
 * Requests that the provider manager update media sinks.
 * @param {!string} sourceUrn
 */
MediaRouteProvider.prototype.updateMediaSinks = function(sourceUrn) {
  this.handlers_.onBeforeInvokeHandler();
  this.handlers_.updateMediaSinks(sourceUrn);
};

/**
 * Requests that the provider manager search its providers for a sink matching
 * |searchCriteria| that is compatible with |sourceUrn|. If a sink is found
 * that can be used immediately for route creation, its ID is returned.
 * Otherwise the empty string is returned.
 *
 * @param {string} sinkId Sink ID of the pseudo sink generating the request.
 * @param {string} sourceUrn Media source to be used with the sink.
 * @param {!SinkSearchCriteria} searchCriteria Search criteria for the route
 *     providers.
 * @return {!Promise.<!{sink_id: !string}>} A Promise resolving to either the
 *     sink ID of the sink found by the search that can be used for route
 *     creation, or the empty string if no route can be immediately created.
 */
MediaRouteProvider.prototype.searchSinks = function(
    sinkId, sourceUrn, searchCriteria) {
  this.handlers_.onBeforeInvokeHandler();
 return this.handlers_.searchSinks(sinkId, sourceUrn, searchCriteria).then(
      sinkId => {
        return { 'sinkId': sinkId };
      },
      () => {
        return { 'sinkId': '' };
      });
};

/**
 * Notifies the provider manager that MediaRouter has discovered a list of
 * sinks.
 * @param {string} providerName
 * @param {!Array<!mediaRouter.mojom.MediaSink>} sinks
 */
MediaRouteProvider.prototype.provideSinks = function(providerName, sinks) {
  this.handlers_.onBeforeInvokeHandler();
  this.handlers_.provideSinks(providerName,
                              sinks.map(MediaSinkAdapter.fromNewVersion));
};

/**
 * Creates a controller for the given route and binds the given
 * InterfaceRequest to it, and registers an observer for media status updates
 * for the route.
 * @param {string} routeId
 * @param {!mojo.InterfaceRequest} controllerRequest
 * @param {!mediaRouter.mojom.MediaStatusObserverPtr} observer
 * @return {!Promise<!{success: boolean}>} Resolves to true if a controller
 *     is created. Resolves to false if a controller cannot be created, or if
 *     the controller is already bound.
 */
MediaRouteProvider.prototype.createMediaRouteController = function(
    routeId, controllerRequest, observer) {
  this.handlers_.onBeforeInvokeHandler();
  return this.handlers_.createMediaRouteController(
      routeId, controllerRequest,
      new MediaStatusObserverPtrAdapter(observer.ptr.passInterface())).then(
          () => ({success: true}), e => ({success: false}));
};

var ptr = new mediaRouter.mojom.MediaRouterPtr;
Mojo.bindInterface(mediaRouter.mojom.MediaRouter.name,
                   mojo.makeRequest(ptr).handle);
exports.$set('returnValue', new MediaRouter(ptr));
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'chrome/common/media_router/mojo/media_status.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('mediaRouter.mojom');
  var time$ =
      mojo.internal.exposeNamespace('mojoBase.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'mojo/public/mojom/base/time.mojom', '../../../../mojo/public/mojom/base/time.mojom.js');
  }



  function MediaStatus(values) {
    this.initDefaults_();
    this.initFields_(values);
  }

  MediaStatus.PlayState = {};
  MediaStatus.PlayState.PLAYING = 0;
  MediaStatus.PlayState.PAUSED = MediaStatus.PlayState.PLAYING + 1;
  MediaStatus.PlayState.BUFFERING = MediaStatus.PlayState.PAUSED + 1;

  MediaStatus.PlayState.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
      return true;
    }
    return false;
  };

  MediaStatus.PlayState.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };

  MediaStatus.prototype.initDefaults_ = function() {
    this.title = null;
    this.canPlayPause = false;
    this.canMute = false;
    this.canSetVolume = false;
    this.canSeek = false;
    this.isMuted = false;
    this.playState = 0;
    this.volume = 0;
    this.duration = null;
    this.currentTime = null;
    this.hangoutsExtraData = null;
  };
  MediaStatus.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaStatus.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 56}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaStatus.title
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;






    // validate MediaStatus.playState
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 12, MediaStatus.PlayState);
    if (err !== validator.validationError.NONE)
        return err;




    // validate MediaStatus.duration
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, time$.TimeDelta, false);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaStatus.currentTime
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 32, time$.TimeDelta, false);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaStatus.hangoutsExtraData
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, HangoutsMediaStatusExtraData, true);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaStatus.encodedSize = codec.kStructHeaderSize + 48;

  MediaStatus.decode = function(decoder) {
    var packed;
    var val = new MediaStatus();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.title = decoder.decodeStruct(codec.String);
    packed = decoder.readUint8();
    val.canPlayPause = (packed >> 0) & 1 ? true : false;
    val.canMute = (packed >> 1) & 1 ? true : false;
    val.canSetVolume = (packed >> 2) & 1 ? true : false;
    val.canSeek = (packed >> 3) & 1 ? true : false;
    val.isMuted = (packed >> 4) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.playState = decoder.decodeStruct(codec.Int32);
    val.volume = decoder.decodeStruct(codec.Float);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    val.duration = decoder.decodeStructPointer(time$.TimeDelta);
    val.currentTime = decoder.decodeStructPointer(time$.TimeDelta);
    val.hangoutsExtraData = decoder.decodeStructPointer(HangoutsMediaStatusExtraData);
    return val;
  };

  MediaStatus.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaStatus.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.title);
    packed = 0;
    packed |= (val.canPlayPause & 1) << 0
    packed |= (val.canMute & 1) << 1
    packed |= (val.canSetVolume & 1) << 2
    packed |= (val.canSeek & 1) << 3
    packed |= (val.isMuted & 1) << 4
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStruct(codec.Int32, val.playState);
    encoder.encodeStruct(codec.Float, val.volume);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.encodeStructPointer(time$.TimeDelta, val.duration);
    encoder.encodeStructPointer(time$.TimeDelta, val.currentTime);
    encoder.encodeStructPointer(HangoutsMediaStatusExtraData, val.hangoutsExtraData);
  };
  function HangoutsMediaStatusExtraData(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  HangoutsMediaStatusExtraData.prototype.initDefaults_ = function() {
    this.localPresent = false;
  };
  HangoutsMediaStatusExtraData.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  HangoutsMediaStatusExtraData.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  HangoutsMediaStatusExtraData.encodedSize = codec.kStructHeaderSize + 8;

  HangoutsMediaStatusExtraData.decode = function(decoder) {
    var packed;
    var val = new HangoutsMediaStatusExtraData();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    packed = decoder.readUint8();
    val.localPresent = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  HangoutsMediaStatusExtraData.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(HangoutsMediaStatusExtraData.encodedSize);
    encoder.writeUint32(0);
    packed = 0;
    packed |= (val.localPresent & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MediaStatusObserver_OnMediaStatusUpdated_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MediaStatusObserver_OnMediaStatusUpdated_Params.prototype.initDefaults_ = function() {
    this.status = null;
  };
  MediaStatusObserver_OnMediaStatusUpdated_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MediaStatusObserver_OnMediaStatusUpdated_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MediaStatusObserver_OnMediaStatusUpdated_Params.status
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaStatus, false);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize = codec.kStructHeaderSize + 8;

  MediaStatusObserver_OnMediaStatusUpdated_Params.decode = function(decoder) {
    var packed;
    var val = new MediaStatusObserver_OnMediaStatusUpdated_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.status = decoder.decodeStructPointer(MediaStatus);
    return val;
  };

  MediaStatusObserver_OnMediaStatusUpdated_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(MediaStatus, val.status);
  };
  var kMediaStatusObserver_OnMediaStatusUpdated_Name = 368775696;

  function MediaStatusObserverPtr(handleOrPtrInfo) {
    this.ptr = new bindings.InterfacePtrController(MediaStatusObserver,
                                                   handleOrPtrInfo);
  }

  function MediaStatusObserverAssociatedPtr(associatedInterfacePtrInfo) {
    this.ptr = new associatedBindings.AssociatedInterfacePtrController(
        MediaStatusObserver, associatedInterfacePtrInfo);
  }

  MediaStatusObserverAssociatedPtr.prototype =
      Object.create(MediaStatusObserverPtr.prototype);
  MediaStatusObserverAssociatedPtr.prototype.constructor =
      MediaStatusObserverAssociatedPtr;

  function MediaStatusObserverProxy(receiver) {
    this.receiver_ = receiver;
  }
  MediaStatusObserverPtr.prototype.onMediaStatusUpdated = function() {
    return MediaStatusObserverProxy.prototype.onMediaStatusUpdated
        .apply(this.ptr.getProxy(), arguments);
  };

  MediaStatusObserverProxy.prototype.onMediaStatusUpdated = function(status) {
    var params_ = new MediaStatusObserver_OnMediaStatusUpdated_Params();
    params_.status = status;
    var builder = new codec.MessageV0Builder(
        kMediaStatusObserver_OnMediaStatusUpdated_Name,
        codec.align(MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize));
    builder.encodeStruct(MediaStatusObserver_OnMediaStatusUpdated_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };

  function MediaStatusObserverStub(delegate) {
    this.delegate_ = delegate;
  }
  MediaStatusObserverStub.prototype.onMediaStatusUpdated = function(status) {
    return this.delegate_ && this.delegate_.onMediaStatusUpdated && this.delegate_.onMediaStatusUpdated(status);
  }

  MediaStatusObserverStub.prototype.accept = function(message) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kMediaStatusObserver_OnMediaStatusUpdated_Name:
      var params = reader.decodeStruct(MediaStatusObserver_OnMediaStatusUpdated_Params);
      this.onMediaStatusUpdated(params.status);
      return true;
    default:
      return false;
    }
  };

  MediaStatusObserverStub.prototype.acceptWithResponder =
      function(message, responder) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    default:
      return false;
    }
  };

  function validateMediaStatusObserverRequest(messageValidator) {
    var message = messageValidator.message;
    var paramsClass = null;
    switch (message.getName()) {
      case kMediaStatusObserver_OnMediaStatusUpdated_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MediaStatusObserver_OnMediaStatusUpdated_Params;
      break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  function validateMediaStatusObserverResponse(messageValidator) {
    return validator.validationError.NONE;
  }

  var MediaStatusObserver = {
    name: 'media_router.mojom.MediaStatusObserver',
    kVersion: 0,
    ptrClass: MediaStatusObserverPtr,
    proxyClass: MediaStatusObserverProxy,
    stubClass: MediaStatusObserverStub,
    validateRequest: validateMediaStatusObserverRequest,
    validateResponse: null,
  };
  MediaStatusObserverStub.prototype.validator = validateMediaStatusObserverRequest;
  MediaStatusObserverProxy.prototype.validator = null;
  exports.MediaStatus = MediaStatus;
  exports.HangoutsMediaStatusExtraData = HangoutsMediaStatusExtraData;
  exports.MediaStatusObserver = MediaStatusObserver;
  exports.MediaStatusObserverPtr = MediaStatusObserverPtr;
  exports.MediaStatusObserverAssociatedPtr = MediaStatusObserverAssociatedPtr;
})();// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'mojo/public/mojom/base/time.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('mojoBase.mojom');



  function Time(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  Time.prototype.initDefaults_ = function() {
    this.internalValue = 0;
  };
  Time.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  Time.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  Time.encodedSize = codec.kStructHeaderSize + 8;

  Time.decode = function(decoder) {
    var packed;
    var val = new Time();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.internalValue = decoder.decodeStruct(codec.Int64);
    return val;
  };

  Time.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(Time.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int64, val.internalValue);
  };
  function TimeDelta(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  TimeDelta.prototype.initDefaults_ = function() {
    this.microseconds = 0;
  };
  TimeDelta.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  TimeDelta.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  TimeDelta.encodedSize = codec.kStructHeaderSize + 8;

  TimeDelta.decode = function(decoder) {
    var packed;
    var val = new TimeDelta();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.microseconds = decoder.decodeStruct(codec.Int64);
    return val;
  };

  TimeDelta.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(TimeDelta.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int64, val.microseconds);
  };
  function TimeTicks(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  TimeTicks.prototype.initDefaults_ = function() {
    this.internalValue = 0;
  };
  TimeTicks.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  TimeTicks.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  TimeTicks.encodedSize = codec.kStructHeaderSize + 8;

  TimeTicks.decode = function(decoder) {
    var packed;
    var val = new TimeTicks();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.internalValue = decoder.decodeStruct(codec.Int64);
    return val;
  };

  TimeTicks.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(TimeTicks.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int64, val.internalValue);
  };
  exports.Time = Time;
  exports.TimeDelta = TimeDelta;
  exports.TimeTicks = TimeTicks;
})();// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'net/interfaces/ip_address.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('net.interfaces');



  function IPAddress(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  IPAddress.prototype.initDefaults_ = function() {
    this.addressBytes = null;
  };
  IPAddress.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  IPAddress.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate IPAddress.addressBytes
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  IPAddress.encodedSize = codec.kStructHeaderSize + 8;

  IPAddress.decode = function(decoder) {
    var packed;
    var val = new IPAddress();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.addressBytes = decoder.decodeArrayPointer(codec.Uint8);
    return val;
  };

  IPAddress.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(IPAddress.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeArrayPointer(codec.Uint8, val.addressBytes);
  };
  exports.IPAddress = IPAddress;
})();// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'net/interfaces/ip_endpoint.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('net.interfaces');
  var ip_address$ =
      mojo.internal.exposeNamespace('net.interfaces');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'net/interfaces/ip_address.mojom', 'ip_address.mojom.js');
  }



  function IPEndPoint(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  IPEndPoint.prototype.initDefaults_ = function() {
    this.address = null;
    this.port = 0;
  };
  IPEndPoint.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  IPEndPoint.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 24}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate IPEndPoint.address
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_address$.IPAddress, false);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  IPEndPoint.encodedSize = codec.kStructHeaderSize + 16;

  IPEndPoint.decode = function(decoder) {
    var packed;
    var val = new IPEndPoint();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.address = decoder.decodeStructPointer(ip_address$.IPAddress);
    val.port = decoder.decodeStruct(codec.Uint16);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  IPEndPoint.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(IPEndPoint.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(ip_address$.IPAddress, val.address);
    encoder.encodeStruct(codec.Uint16, val.port);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  exports.IPEndPoint = IPEndPoint;
})();// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'url/mojom/origin.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('url.mojom');



  function Origin(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  Origin.prototype.initDefaults_ = function() {
    this.scheme = null;
    this.host = null;
    this.port = 0;
    this.unique = false;
  };
  Origin.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  Origin.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 32}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate Origin.scheme
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;


    // validate Origin.host
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false)
    if (err !== validator.validationError.NONE)
        return err;



    return validator.validationError.NONE;
  };

  Origin.encodedSize = codec.kStructHeaderSize + 24;

  Origin.decode = function(decoder) {
    var packed;
    var val = new Origin();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.scheme = decoder.decodeStruct(codec.String);
    val.host = decoder.decodeStruct(codec.String);
    val.port = decoder.decodeStruct(codec.Uint16);
    packed = decoder.readUint8();
    val.unique = (packed >> 0) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  Origin.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(Origin.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.scheme);
    encoder.encodeStruct(codec.String, val.host);
    encoder.encodeStruct(codec.Uint16, val.port);
    packed = 0;
    packed |= (val.unique & 1) << 0
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  exports.Origin = Origin;
})();// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'url/mojom/url.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('url.mojom');



  function Url(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  Url.prototype.initDefaults_ = function() {
    this.url = null;
  };
  Url.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  Url.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate Url.url
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  Url.encodedSize = codec.kStructHeaderSize + 8;

  Url.decode = function(decoder) {
    var packed;
    var val = new Url();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.url = decoder.decodeStruct(codec.String);
    return val;
  };

  Url.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(Url.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.String, val.url);
  };
  exports.Url = Url;
})();// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'media/mojo/interfaces/mirror_service_remoting.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('media.mojom');
  var remoting_common$ =
      mojo.internal.exposeNamespace('media.mojom');
  if (mojo.config.autoLoadMojomDeps) {
    mojo.internal.loadMojomIfNecessary(
        'media/mojo/interfaces/remoting_common.mojom', 'remoting_common.mojom.js');
  }



  function MirrorServiceRemoter_Start_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemoter_Start_Params.prototype.initDefaults_ = function() {
  };
  MirrorServiceRemoter_Start_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemoter_Start_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 8}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MirrorServiceRemoter_Start_Params.encodedSize = codec.kStructHeaderSize + 0;

  MirrorServiceRemoter_Start_Params.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemoter_Start_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    return val;
  };

  MirrorServiceRemoter_Start_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemoter_Start_Params.encodedSize);
    encoder.writeUint32(0);
  };
  function MirrorServiceRemoter_StartDataStreams_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemoter_StartDataStreams_Params.prototype.initDefaults_ = function() {
    this.hasAudio = false;
    this.hasVideo = false;
  };
  MirrorServiceRemoter_StartDataStreams_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemoter_StartDataStreams_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;



    return validator.validationError.NONE;
  };

  MirrorServiceRemoter_StartDataStreams_Params.encodedSize = codec.kStructHeaderSize + 8;

  MirrorServiceRemoter_StartDataStreams_Params.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemoter_StartDataStreams_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    packed = decoder.readUint8();
    val.hasAudio = (packed >> 0) & 1 ? true : false;
    val.hasVideo = (packed >> 1) & 1 ? true : false;
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MirrorServiceRemoter_StartDataStreams_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemoter_StartDataStreams_Params.encodedSize);
    encoder.writeUint32(0);
    packed = 0;
    packed |= (val.hasAudio & 1) << 0
    packed |= (val.hasVideo & 1) << 1
    encoder.writeUint8(packed);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MirrorServiceRemoter_StartDataStreams_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemoter_StartDataStreams_ResponseParams.prototype.initDefaults_ = function() {
    this.audioStreamId = 0;
    this.videoStreamId = 0;
  };
  MirrorServiceRemoter_StartDataStreams_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemoter_StartDataStreams_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;



    return validator.validationError.NONE;
  };

  MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;

  MirrorServiceRemoter_StartDataStreams_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemoter_StartDataStreams_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.audioStreamId = decoder.decodeStruct(codec.Int32);
    val.videoStreamId = decoder.decodeStruct(codec.Int32);
    return val;
  };

  MirrorServiceRemoter_StartDataStreams_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int32, val.audioStreamId);
    encoder.encodeStruct(codec.Int32, val.videoStreamId);
  };
  function MirrorServiceRemoter_Stop_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemoter_Stop_Params.prototype.initDefaults_ = function() {
    this.reason = 0;
  };
  MirrorServiceRemoter_Stop_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemoter_Stop_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MirrorServiceRemoter_Stop_Params.reason
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingStopReason);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MirrorServiceRemoter_Stop_Params.encodedSize = codec.kStructHeaderSize + 8;

  MirrorServiceRemoter_Stop_Params.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemoter_Stop_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.reason = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MirrorServiceRemoter_Stop_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemoter_Stop_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int32, val.reason);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MirrorServiceRemoter_SendMessageToSink_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemoter_SendMessageToSink_Params.prototype.initDefaults_ = function() {
    this.message = null;
  };
  MirrorServiceRemoter_SendMessageToSink_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemoter_SendMessageToSink_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MirrorServiceRemoter_SendMessageToSink_Params.message
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MirrorServiceRemoter_SendMessageToSink_Params.encodedSize = codec.kStructHeaderSize + 8;

  MirrorServiceRemoter_SendMessageToSink_Params.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemoter_SendMessageToSink_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.message = decoder.decodeArrayPointer(codec.Uint8);
    return val;
  };

  MirrorServiceRemoter_SendMessageToSink_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemoter_SendMessageToSink_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeArrayPointer(codec.Uint8, val.message);
  };
  function MirrorServiceRemoter_EstimateTransmissionCapacity_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemoter_EstimateTransmissionCapacity_Params.prototype.initDefaults_ = function() {
  };
  MirrorServiceRemoter_EstimateTransmissionCapacity_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemoter_EstimateTransmissionCapacity_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 8}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize = codec.kStructHeaderSize + 0;

  MirrorServiceRemoter_EstimateTransmissionCapacity_Params.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemoter_EstimateTransmissionCapacity_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    return val;
  };

  MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize);
    encoder.writeUint32(0);
  };
  function MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.prototype.initDefaults_ = function() {
    this.rate = 0;
  };
  MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    return validator.validationError.NONE;
  };

  MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize = codec.kStructHeaderSize + 8;

  MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.rate = decoder.decodeStruct(codec.Double);
    return val;
  };

  MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Double, val.rate);
  };
  function MirrorServiceRemotingSource_OnSinkAvailable_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemotingSource_OnSinkAvailable_Params.prototype.initDefaults_ = function() {
    this.metadata = null;
  };
  MirrorServiceRemotingSource_OnSinkAvailable_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemotingSource_OnSinkAvailable_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MirrorServiceRemotingSource_OnSinkAvailable_Params.metadata
    err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingSinkMetadata, false);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize = codec.kStructHeaderSize + 8;

  MirrorServiceRemotingSource_OnSinkAvailable_Params.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemotingSource_OnSinkAvailable_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.metadata = decoder.decodeStructPointer(remoting_common$.RemotingSinkMetadata);
    return val;
  };

  MirrorServiceRemotingSource_OnSinkAvailable_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStructPointer(remoting_common$.RemotingSinkMetadata, val.metadata);
  };
  function MirrorServiceRemotingSource_OnMessageFromSink_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemotingSource_OnMessageFromSink_Params.prototype.initDefaults_ = function() {
    this.message = null;
  };
  MirrorServiceRemotingSource_OnMessageFromSink_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemotingSource_OnMessageFromSink_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MirrorServiceRemotingSource_OnMessageFromSink_Params.message
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize = codec.kStructHeaderSize + 8;

  MirrorServiceRemotingSource_OnMessageFromSink_Params.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemotingSource_OnMessageFromSink_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.message = decoder.decodeArrayPointer(codec.Uint8);
    return val;
  };

  MirrorServiceRemotingSource_OnMessageFromSink_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeArrayPointer(codec.Uint8, val.message);
  };
  function MirrorServiceRemotingSource_OnStopped_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemotingSource_OnStopped_Params.prototype.initDefaults_ = function() {
    this.reason = 0;
  };
  MirrorServiceRemotingSource_OnStopped_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemotingSource_OnStopped_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 16}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate MirrorServiceRemotingSource_OnStopped_Params.reason
    err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingStopReason);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MirrorServiceRemotingSource_OnStopped_Params.encodedSize = codec.kStructHeaderSize + 8;

  MirrorServiceRemotingSource_OnStopped_Params.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemotingSource_OnStopped_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.reason = decoder.decodeStruct(codec.Int32);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    decoder.skip(1);
    return val;
  };

  MirrorServiceRemotingSource_OnStopped_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemotingSource_OnStopped_Params.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeStruct(codec.Int32, val.reason);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
    encoder.skip(1);
  };
  function MirrorServiceRemotingSource_OnError_Params(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  MirrorServiceRemotingSource_OnError_Params.prototype.initDefaults_ = function() {
  };
  MirrorServiceRemotingSource_OnError_Params.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  MirrorServiceRemotingSource_OnError_Params.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 8}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  MirrorServiceRemotingSource_OnError_Params.encodedSize = codec.kStructHeaderSize + 0;

  MirrorServiceRemotingSource_OnError_Params.decode = function(decoder) {
    var packed;
    var val = new MirrorServiceRemotingSource_OnError_Params();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    return val;
  };

  MirrorServiceRemotingSource_OnError_Params.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(MirrorServiceRemotingSource_OnError_Params.encodedSize);
    encoder.writeUint32(0);
  };
  var kMirrorServiceRemoter_Start_Name = 694706996;
  var kMirrorServiceRemoter_StartDataStreams_Name = 982313204;
  var kMirrorServiceRemoter_Stop_Name = 1550337060;
  var kMirrorServiceRemoter_SendMessageToSink_Name = 1700984722;
  var kMirrorServiceRemoter_EstimateTransmissionCapacity_Name = 705019034;

  function MirrorServiceRemoterPtr(handleOrPtrInfo) {
    this.ptr = new bindings.InterfacePtrController(MirrorServiceRemoter,
                                                   handleOrPtrInfo);
  }

  function MirrorServiceRemoterAssociatedPtr(associatedInterfacePtrInfo) {
    this.ptr = new associatedBindings.AssociatedInterfacePtrController(
        MirrorServiceRemoter, associatedInterfacePtrInfo);
  }

  MirrorServiceRemoterAssociatedPtr.prototype =
      Object.create(MirrorServiceRemoterPtr.prototype);
  MirrorServiceRemoterAssociatedPtr.prototype.constructor =
      MirrorServiceRemoterAssociatedPtr;

  function MirrorServiceRemoterProxy(receiver) {
    this.receiver_ = receiver;
  }
  MirrorServiceRemoterPtr.prototype.start = function() {
    return MirrorServiceRemoterProxy.prototype.start
        .apply(this.ptr.getProxy(), arguments);
  };

  MirrorServiceRemoterProxy.prototype.start = function() {
    var params_ = new MirrorServiceRemoter_Start_Params();
    var builder = new codec.MessageV0Builder(
        kMirrorServiceRemoter_Start_Name,
        codec.align(MirrorServiceRemoter_Start_Params.encodedSize));
    builder.encodeStruct(MirrorServiceRemoter_Start_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MirrorServiceRemoterPtr.prototype.startDataStreams = function() {
    return MirrorServiceRemoterProxy.prototype.startDataStreams
        .apply(this.ptr.getProxy(), arguments);
  };

  MirrorServiceRemoterProxy.prototype.startDataStreams = function(hasAudio, hasVideo) {
    var params_ = new MirrorServiceRemoter_StartDataStreams_Params();
    params_.hasAudio = hasAudio;
    params_.hasVideo = hasVideo;
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMirrorServiceRemoter_StartDataStreams_Name,
          codec.align(MirrorServiceRemoter_StartDataStreams_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MirrorServiceRemoter_StartDataStreams_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MirrorServiceRemoter_StartDataStreams_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };
  MirrorServiceRemoterPtr.prototype.stop = function() {
    return MirrorServiceRemoterProxy.prototype.stop
        .apply(this.ptr.getProxy(), arguments);
  };

  MirrorServiceRemoterProxy.prototype.stop = function(reason) {
    var params_ = new MirrorServiceRemoter_Stop_Params();
    params_.reason = reason;
    var builder = new codec.MessageV0Builder(
        kMirrorServiceRemoter_Stop_Name,
        codec.align(MirrorServiceRemoter_Stop_Params.encodedSize));
    builder.encodeStruct(MirrorServiceRemoter_Stop_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MirrorServiceRemoterPtr.prototype.sendMessageToSink = function() {
    return MirrorServiceRemoterProxy.prototype.sendMessageToSink
        .apply(this.ptr.getProxy(), arguments);
  };

  MirrorServiceRemoterProxy.prototype.sendMessageToSink = function(message) {
    var params_ = new MirrorServiceRemoter_SendMessageToSink_Params();
    params_.message = message;
    var builder = new codec.MessageV0Builder(
        kMirrorServiceRemoter_SendMessageToSink_Name,
        codec.align(MirrorServiceRemoter_SendMessageToSink_Params.encodedSize));
    builder.encodeStruct(MirrorServiceRemoter_SendMessageToSink_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MirrorServiceRemoterPtr.prototype.estimateTransmissionCapacity = function() {
    return MirrorServiceRemoterProxy.prototype.estimateTransmissionCapacity
        .apply(this.ptr.getProxy(), arguments);
  };

  MirrorServiceRemoterProxy.prototype.estimateTransmissionCapacity = function() {
    var params_ = new MirrorServiceRemoter_EstimateTransmissionCapacity_Params();
    return new Promise(function(resolve, reject) {
      var builder = new codec.MessageV1Builder(
          kMirrorServiceRemoter_EstimateTransmissionCapacity_Name,
          codec.align(MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize),
          codec.kMessageExpectsResponse, 0);
      builder.encodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_Params, params_);
      var message = builder.finish();
      this.receiver_.acceptAndExpectResponse(message).then(function(message) {
        var reader = new codec.MessageReader(message);
        var responseParams =
            reader.decodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams);
        resolve(responseParams);
      }).catch(function(result) {
        reject(Error("Connection error: " + result));
      });
    }.bind(this));
  };

  function MirrorServiceRemoterStub(delegate) {
    this.delegate_ = delegate;
  }
  MirrorServiceRemoterStub.prototype.start = function() {
    return this.delegate_ && this.delegate_.start && this.delegate_.start();
  }
  MirrorServiceRemoterStub.prototype.startDataStreams = function(hasAudio, hasVideo) {
    return this.delegate_ && this.delegate_.startDataStreams && this.delegate_.startDataStreams(hasAudio, hasVideo);
  }
  MirrorServiceRemoterStub.prototype.stop = function(reason) {
    return this.delegate_ && this.delegate_.stop && this.delegate_.stop(reason);
  }
  MirrorServiceRemoterStub.prototype.sendMessageToSink = function(message) {
    return this.delegate_ && this.delegate_.sendMessageToSink && this.delegate_.sendMessageToSink(message);
  }
  MirrorServiceRemoterStub.prototype.estimateTransmissionCapacity = function() {
    return this.delegate_ && this.delegate_.estimateTransmissionCapacity && this.delegate_.estimateTransmissionCapacity();
  }

  MirrorServiceRemoterStub.prototype.accept = function(message) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kMirrorServiceRemoter_Start_Name:
      var params = reader.decodeStruct(MirrorServiceRemoter_Start_Params);
      this.start();
      return true;
    case kMirrorServiceRemoter_Stop_Name:
      var params = reader.decodeStruct(MirrorServiceRemoter_Stop_Params);
      this.stop(params.reason);
      return true;
    case kMirrorServiceRemoter_SendMessageToSink_Name:
      var params = reader.decodeStruct(MirrorServiceRemoter_SendMessageToSink_Params);
      this.sendMessageToSink(params.message);
      return true;
    default:
      return false;
    }
  };

  MirrorServiceRemoterStub.prototype.acceptWithResponder =
      function(message, responder) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kMirrorServiceRemoter_StartDataStreams_Name:
      var params = reader.decodeStruct(MirrorServiceRemoter_StartDataStreams_Params);
      this.startDataStreams(params.hasAudio, params.hasVideo).then(function(response) {
        var responseParams =
            new MirrorServiceRemoter_StartDataStreams_ResponseParams();
        responseParams.audioStreamId = response.audioStreamId;
        responseParams.videoStreamId = response.videoStreamId;
        var builder = new codec.MessageV1Builder(
            kMirrorServiceRemoter_StartDataStreams_Name,
            codec.align(MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MirrorServiceRemoter_StartDataStreams_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name:
      var params = reader.decodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_Params);
      this.estimateTransmissionCapacity().then(function(response) {
        var responseParams =
            new MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams();
        responseParams.rate = response.rate;
        var builder = new codec.MessageV1Builder(
            kMirrorServiceRemoter_EstimateTransmissionCapacity_Name,
            codec.align(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize),
            codec.kMessageIsResponse, reader.requestID);
        builder.encodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams,
                             responseParams);
        var message = builder.finish();
        responder.accept(message);
      });
      return true;
    default:
      return false;
    }
  };

  function validateMirrorServiceRemoterRequest(messageValidator) {
    var message = messageValidator.message;
    var paramsClass = null;
    switch (message.getName()) {
      case kMirrorServiceRemoter_Start_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MirrorServiceRemoter_Start_Params;
      break;
      case kMirrorServiceRemoter_StartDataStreams_Name:
        if (message.expectsResponse())
          paramsClass = MirrorServiceRemoter_StartDataStreams_Params;
      break;
      case kMirrorServiceRemoter_Stop_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MirrorServiceRemoter_Stop_Params;
      break;
      case kMirrorServiceRemoter_SendMessageToSink_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MirrorServiceRemoter_SendMessageToSink_Params;
      break;
      case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name:
        if (message.expectsResponse())
          paramsClass = MirrorServiceRemoter_EstimateTransmissionCapacity_Params;
      break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  function validateMirrorServiceRemoterResponse(messageValidator) {
   var message = messageValidator.message;
   var paramsClass = null;
   switch (message.getName()) {
      case kMirrorServiceRemoter_StartDataStreams_Name:
        if (message.isResponse())
          paramsClass = MirrorServiceRemoter_StartDataStreams_ResponseParams;
        break;
      case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name:
        if (message.isResponse())
          paramsClass = MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams;
        break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  var MirrorServiceRemoter = {
    name: 'media.mojom.MirrorServiceRemoter',
    kVersion: 0,
    ptrClass: MirrorServiceRemoterPtr,
    proxyClass: MirrorServiceRemoterProxy,
    stubClass: MirrorServiceRemoterStub,
    validateRequest: validateMirrorServiceRemoterRequest,
    validateResponse: validateMirrorServiceRemoterResponse,
  };
  MirrorServiceRemoterStub.prototype.validator = validateMirrorServiceRemoterRequest;
  MirrorServiceRemoterProxy.prototype.validator = validateMirrorServiceRemoterResponse;
  var kMirrorServiceRemotingSource_OnSinkAvailable_Name = 652145635;
  var kMirrorServiceRemotingSource_OnMessageFromSink_Name = 1973709325;
  var kMirrorServiceRemotingSource_OnStopped_Name = 1367822394;
  var kMirrorServiceRemotingSource_OnError_Name = 1243999687;

  function MirrorServiceRemotingSourcePtr(handleOrPtrInfo) {
    this.ptr = new bindings.InterfacePtrController(MirrorServiceRemotingSource,
                                                   handleOrPtrInfo);
  }

  function MirrorServiceRemotingSourceAssociatedPtr(associatedInterfacePtrInfo) {
    this.ptr = new associatedBindings.AssociatedInterfacePtrController(
        MirrorServiceRemotingSource, associatedInterfacePtrInfo);
  }

  MirrorServiceRemotingSourceAssociatedPtr.prototype =
      Object.create(MirrorServiceRemotingSourcePtr.prototype);
  MirrorServiceRemotingSourceAssociatedPtr.prototype.constructor =
      MirrorServiceRemotingSourceAssociatedPtr;

  function MirrorServiceRemotingSourceProxy(receiver) {
    this.receiver_ = receiver;
  }
  MirrorServiceRemotingSourcePtr.prototype.onSinkAvailable = function() {
    return MirrorServiceRemotingSourceProxy.prototype.onSinkAvailable
        .apply(this.ptr.getProxy(), arguments);
  };

  MirrorServiceRemotingSourceProxy.prototype.onSinkAvailable = function(metadata) {
    var params_ = new MirrorServiceRemotingSource_OnSinkAvailable_Params();
    params_.metadata = metadata;
    var builder = new codec.MessageV0Builder(
        kMirrorServiceRemotingSource_OnSinkAvailable_Name,
        codec.align(MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize));
    builder.encodeStruct(MirrorServiceRemotingSource_OnSinkAvailable_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MirrorServiceRemotingSourcePtr.prototype.onMessageFromSink = function() {
    return MirrorServiceRemotingSourceProxy.prototype.onMessageFromSink
        .apply(this.ptr.getProxy(), arguments);
  };

  MirrorServiceRemotingSourceProxy.prototype.onMessageFromSink = function(message) {
    var params_ = new MirrorServiceRemotingSource_OnMessageFromSink_Params();
    params_.message = message;
    var builder = new codec.MessageV0Builder(
        kMirrorServiceRemotingSource_OnMessageFromSink_Name,
        codec.align(MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize));
    builder.encodeStruct(MirrorServiceRemotingSource_OnMessageFromSink_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MirrorServiceRemotingSourcePtr.prototype.onStopped = function() {
    return MirrorServiceRemotingSourceProxy.prototype.onStopped
        .apply(this.ptr.getProxy(), arguments);
  };

  MirrorServiceRemotingSourceProxy.prototype.onStopped = function(reason) {
    var params_ = new MirrorServiceRemotingSource_OnStopped_Params();
    params_.reason = reason;
    var builder = new codec.MessageV0Builder(
        kMirrorServiceRemotingSource_OnStopped_Name,
        codec.align(MirrorServiceRemotingSource_OnStopped_Params.encodedSize));
    builder.encodeStruct(MirrorServiceRemotingSource_OnStopped_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };
  MirrorServiceRemotingSourcePtr.prototype.onError = function() {
    return MirrorServiceRemotingSourceProxy.prototype.onError
        .apply(this.ptr.getProxy(), arguments);
  };

  MirrorServiceRemotingSourceProxy.prototype.onError = function() {
    var params_ = new MirrorServiceRemotingSource_OnError_Params();
    var builder = new codec.MessageV0Builder(
        kMirrorServiceRemotingSource_OnError_Name,
        codec.align(MirrorServiceRemotingSource_OnError_Params.encodedSize));
    builder.encodeStruct(MirrorServiceRemotingSource_OnError_Params, params_);
    var message = builder.finish();
    this.receiver_.accept(message);
  };

  function MirrorServiceRemotingSourceStub(delegate) {
    this.delegate_ = delegate;
  }
  MirrorServiceRemotingSourceStub.prototype.onSinkAvailable = function(metadata) {
    return this.delegate_ && this.delegate_.onSinkAvailable && this.delegate_.onSinkAvailable(metadata);
  }
  MirrorServiceRemotingSourceStub.prototype.onMessageFromSink = function(message) {
    return this.delegate_ && this.delegate_.onMessageFromSink && this.delegate_.onMessageFromSink(message);
  }
  MirrorServiceRemotingSourceStub.prototype.onStopped = function(reason) {
    return this.delegate_ && this.delegate_.onStopped && this.delegate_.onStopped(reason);
  }
  MirrorServiceRemotingSourceStub.prototype.onError = function() {
    return this.delegate_ && this.delegate_.onError && this.delegate_.onError();
  }

  MirrorServiceRemotingSourceStub.prototype.accept = function(message) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    case kMirrorServiceRemotingSource_OnSinkAvailable_Name:
      var params = reader.decodeStruct(MirrorServiceRemotingSource_OnSinkAvailable_Params);
      this.onSinkAvailable(params.metadata);
      return true;
    case kMirrorServiceRemotingSource_OnMessageFromSink_Name:
      var params = reader.decodeStruct(MirrorServiceRemotingSource_OnMessageFromSink_Params);
      this.onMessageFromSink(params.message);
      return true;
    case kMirrorServiceRemotingSource_OnStopped_Name:
      var params = reader.decodeStruct(MirrorServiceRemotingSource_OnStopped_Params);
      this.onStopped(params.reason);
      return true;
    case kMirrorServiceRemotingSource_OnError_Name:
      var params = reader.decodeStruct(MirrorServiceRemotingSource_OnError_Params);
      this.onError();
      return true;
    default:
      return false;
    }
  };

  MirrorServiceRemotingSourceStub.prototype.acceptWithResponder =
      function(message, responder) {
    var reader = new codec.MessageReader(message);
    switch (reader.messageName) {
    default:
      return false;
    }
  };

  function validateMirrorServiceRemotingSourceRequest(messageValidator) {
    var message = messageValidator.message;
    var paramsClass = null;
    switch (message.getName()) {
      case kMirrorServiceRemotingSource_OnSinkAvailable_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MirrorServiceRemotingSource_OnSinkAvailable_Params;
      break;
      case kMirrorServiceRemotingSource_OnMessageFromSink_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MirrorServiceRemotingSource_OnMessageFromSink_Params;
      break;
      case kMirrorServiceRemotingSource_OnStopped_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MirrorServiceRemotingSource_OnStopped_Params;
      break;
      case kMirrorServiceRemotingSource_OnError_Name:
        if (!message.expectsResponse() && !message.isResponse())
          paramsClass = MirrorServiceRemotingSource_OnError_Params;
      break;
    }
    if (paramsClass === null)
      return validator.validationError.NONE;
    return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes());
  }

  function validateMirrorServiceRemotingSourceResponse(messageValidator) {
    return validator.validationError.NONE;
  }

  var MirrorServiceRemotingSource = {
    name: 'media.mojom.MirrorServiceRemotingSource',
    kVersion: 0,
    ptrClass: MirrorServiceRemotingSourcePtr,
    proxyClass: MirrorServiceRemotingSourceProxy,
    stubClass: MirrorServiceRemotingSourceStub,
    validateRequest: validateMirrorServiceRemotingSourceRequest,
    validateResponse: null,
  };
  MirrorServiceRemotingSourceStub.prototype.validator = validateMirrorServiceRemotingSourceRequest;
  MirrorServiceRemotingSourceProxy.prototype.validator = null;
  exports.MirrorServiceRemoter = MirrorServiceRemoter;
  exports.MirrorServiceRemoterPtr = MirrorServiceRemoterPtr;
  exports.MirrorServiceRemoterAssociatedPtr = MirrorServiceRemoterAssociatedPtr;
  exports.MirrorServiceRemotingSource = MirrorServiceRemotingSource;
  exports.MirrorServiceRemotingSourcePtr = MirrorServiceRemotingSourcePtr;
  exports.MirrorServiceRemotingSourceAssociatedPtr = MirrorServiceRemotingSourceAssociatedPtr;
})();// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

(function() {
  var mojomId = 'media/mojo/interfaces/remoting_common.mojom';
  if (mojo.internal.isMojomLoaded(mojomId)) {
    console.warn('The following mojom is loaded multiple times: ' + mojomId);
    return;
  }
  mojo.internal.markMojomLoaded(mojomId);
  var bindings = mojo;
  var associatedBindings = mojo;
  var codec = mojo.internal;
  var validator = mojo.internal;

  var exports = mojo.internal.exposeNamespace('media.mojom');


  var RemotingStopReason = {};
  RemotingStopReason.ROUTE_TERMINATED = 0;
  RemotingStopReason.LOCAL_PLAYBACK = RemotingStopReason.ROUTE_TERMINATED + 1;
  RemotingStopReason.SOURCE_GONE = RemotingStopReason.LOCAL_PLAYBACK + 1;
  RemotingStopReason.MESSAGE_SEND_FAILED = RemotingStopReason.SOURCE_GONE + 1;
  RemotingStopReason.DATA_SEND_FAILED = RemotingStopReason.MESSAGE_SEND_FAILED + 1;
  RemotingStopReason.UNEXPECTED_FAILURE = RemotingStopReason.DATA_SEND_FAILED + 1;
  RemotingStopReason.SERVICE_GONE = RemotingStopReason.UNEXPECTED_FAILURE + 1;
  RemotingStopReason.USER_DISABLED = RemotingStopReason.SERVICE_GONE + 1;

  RemotingStopReason.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
      return true;
    }
    return false;
  };

  RemotingStopReason.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  var RemotingStartFailReason = {};
  RemotingStartFailReason.CANNOT_START_MULTIPLE = 0;
  RemotingStartFailReason.ROUTE_TERMINATED = RemotingStartFailReason.CANNOT_START_MULTIPLE + 1;
  RemotingStartFailReason.SERVICE_NOT_CONNECTED = RemotingStartFailReason.ROUTE_TERMINATED + 1;

  RemotingStartFailReason.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
      return true;
    }
    return false;
  };

  RemotingStartFailReason.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  var RemotingSinkFeature = {};
  RemotingSinkFeature.RENDERING = 0;
  RemotingSinkFeature.CONTENT_DECRYPTION = RemotingSinkFeature.RENDERING + 1;

  RemotingSinkFeature.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
      return true;
    }
    return false;
  };

  RemotingSinkFeature.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  var RemotingSinkAudioCapability = {};
  RemotingSinkAudioCapability.CODEC_BASELINE_SET = 0;
  RemotingSinkAudioCapability.CODEC_AAC = RemotingSinkAudioCapability.CODEC_BASELINE_SET + 1;
  RemotingSinkAudioCapability.CODEC_OPUS = RemotingSinkAudioCapability.CODEC_AAC + 1;

  RemotingSinkAudioCapability.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
      return true;
    }
    return false;
  };

  RemotingSinkAudioCapability.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };
  var RemotingSinkVideoCapability = {};
  RemotingSinkVideoCapability.SUPPORT_4K = 0;
  RemotingSinkVideoCapability.CODEC_BASELINE_SET = RemotingSinkVideoCapability.SUPPORT_4K + 1;
  RemotingSinkVideoCapability.CODEC_H264 = RemotingSinkVideoCapability.CODEC_BASELINE_SET + 1;
  RemotingSinkVideoCapability.CODEC_VP8 = RemotingSinkVideoCapability.CODEC_H264 + 1;
  RemotingSinkVideoCapability.CODEC_VP9 = RemotingSinkVideoCapability.CODEC_VP8 + 1;
  RemotingSinkVideoCapability.CODEC_HEVC = RemotingSinkVideoCapability.CODEC_VP9 + 1;

  RemotingSinkVideoCapability.isKnownEnumValue = function(value) {
    switch (value) {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
      return true;
    }
    return false;
  };

  RemotingSinkVideoCapability.validate = function(enumValue) {
    var isExtensible = false;
    if (isExtensible || this.isKnownEnumValue(enumValue))
      return validator.validationError.NONE;

    return validator.validationError.UNKNOWN_ENUM_VALUE;
  };

  function RemotingSinkMetadata(values) {
    this.initDefaults_();
    this.initFields_(values);
  }


  RemotingSinkMetadata.prototype.initDefaults_ = function() {
    this.features = null;
    this.audioCapabilities = null;
    this.videoCapabilities = null;
    this.friendlyName = null;
  };
  RemotingSinkMetadata.prototype.initFields_ = function(fields) {
    for(var field in fields) {
        if (this.hasOwnProperty(field))
          this[field] = fields[field];
    }
  };

  RemotingSinkMetadata.validate = function(messageValidator, offset) {
    var err;
    err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize);
    if (err !== validator.validationError.NONE)
        return err;

    var kVersionSizes = [
      {version: 0, numBytes: 40}
    ];
    err = messageValidator.validateStructVersion(offset, kVersionSizes);
    if (err !== validator.validationError.NONE)
        return err;


    // validate RemotingSinkMetadata.features
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 4, new codec.Enum(RemotingSinkFeature), false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;


    // validate RemotingSinkMetadata.audioCapabilities
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 4, new codec.Enum(RemotingSinkAudioCapability), false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;


    // validate RemotingSinkMetadata.videoCapabilities
    err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 4, new codec.Enum(RemotingSinkVideoCapability), false, [0], 0);
    if (err !== validator.validationError.NONE)
        return err;


    // validate RemotingSinkMetadata.friendlyName
    err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false)
    if (err !== validator.validationError.NONE)
        return err;

    return validator.validationError.NONE;
  };

  RemotingSinkMetadata.encodedSize = codec.kStructHeaderSize + 32;

  RemotingSinkMetadata.decode = function(decoder) {
    var packed;
    var val = new RemotingSinkMetadata();
    var numberOfBytes = decoder.readUint32();
    var version = decoder.readUint32();
    val.features = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkFeature));
    val.audioCapabilities = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkAudioCapability));
    val.videoCapabilities = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkVideoCapability));
    val.friendlyName = decoder.decodeStruct(codec.String);
    return val;
  };

  RemotingSinkMetadata.encode = function(encoder, val) {
    var packed;
    encoder.writeUint32(RemotingSinkMetadata.encodedSize);
    encoder.writeUint32(0);
    encoder.encodeArrayPointer(new codec.Enum(RemotingSinkFeature), val.features);
    encoder.encodeArrayPointer(new codec.Enum(RemotingSinkAudioCapability), val.audioCapabilities);
    encoder.encodeArrayPointer(new codec.Enum(RemotingSinkVideoCapability), val.videoCapabilities);
    encoder.encodeStruct(codec.String, val.friendlyName);
  };
  exports.RemotingStopReason = RemotingStopReason;
  exports.RemotingStartFailReason = RemotingStartFailReason;
  exports.RemotingSinkFeature = RemotingSinkFeature;
  exports.RemotingSinkAudioCapability = RemotingSinkAudioCapability;
  exports.RemotingSinkVideoCapability = RemotingSinkVideoCapability;
  exports.RemotingSinkMetadata = RemotingSinkMetadata;
})();‰PNG


IHDRTTaøR	PLTEÿÿÿƒÝÏÒtRNS@æØf`IDATx^íÕ1
€0ƒaïç’%÷˒Sºd‘ZDÈ Å(ozÐám;Ǝ‰⮙zìYE;CQÌÐÑþ¾Ÿû!ÑbWàۚVU`]æ-jÌñ–^ëšқ&úæžj¯5ʄ<oIEND®B`‚‰PNG


IHDR”‚RüaPLTEÿÿÿmHtçIDATx^íÙÑ1„áiËÞÏCõý_©75ԔXbŒ8ÿU,ù¬ŽœÜÄom”ª¡ÈzŠ%¢†B	ÔS(¡d9Ef)’KJtŠÒ6I†‘yj]3… Å3©¡ÖÒP	øšˆR¸G‰ÍQ|MAuU€Z}v¤ äÅ%ÓËSª˜B7xî£^=ö½ðÞ4ª\û(q®ÔQ><Ÿ	jý7Å)(–¥rJe)IBK(A²J¨ÿnrë—. ÕRC¡š2$£Ü2×GC–RN©Uy	0׃C
å†Z%h;•oš>8üܪ+VÅMIEND®B`‚‰PNG


IHDR@(NÎüésRGB®Îé¨IDAThíZiL\Uþfc†mXf€™aXʎe+XZcƒˆ­bš¸T+¨MüeӤ&&556F[kÜBâ/cSI·TS£Q­XE´-„²o-0ìËÌ0žsYª„I æyïÝûî½ï|ç|÷œ3̓€¤³³ÓhµZߖH$÷Ùív÷¹«ÆnÂxI.—¿l4;%Þf³]¡Î`w½.2ĀL&K—³çi@°J¥‚F£Yf©ñnÓGxa2™`6›ƒ»”,±ѭðŒ“ÌXY»œ¨¯çƝz>ôÀw<ý‘Tƒ?*÷f;ýìy¬Œ]êôl7›à1€›9Ôi88m27›àa€›9Ôi88m27›àrá¿A㍻#„YLãSÐøz‰ëoú‘®†Öo¶íÈnC“ÓPʤðö’áƈ¾töWÝRëŸköM!dn½Ë-CŽ–tªßå-ðúöxùȱɨƉâ4h}HÑûá±8X¹T‚’\ü”2q=ßæ³B&Ar˜mCò£])HÖùA)—bw¶^ŒcG¼˜Ïã%ˆþ»´ȊT;ÔÑà[¦v4â6ý¬l‹iåöcgzÎ]¹	5yðìóx§²ì©ÍñŽxwg’XÍ4>³ûó£±ÿ\=J|s­íƒfèéúÙÜp¼Vވ¨`oû©iTóÿØ2ˆabËý‰´
˜o£Õ¿í2Ž]î´ՐçOÔt‹'?wo]hÆo#x iö›—uƎ¯ëzŇU·á¥ÏëÑA 3ˆ=,7G-(HÒ
f\íƒ^­ę_{0f±á‘ÔP°á*Lbìr\6@cßv¤„bÏf#ʪ»`# OféPAݝ™D"tå“J!Ëô
’µøø©áÑڎ1桍!Â(/~úŠsb;Ü„3µ=ÐßÑGQQ¿¼´¶¶ÚùéQQQB	gu=£øàbBµˆìiTfɠyïªRàè–öì$ÝoêŸ@¬Ö*ÚF9ŽY¬˜¶Ù!£y{ɧJÒÑKÁOKUÂAÒO)ǑóMè²ÜÑ×aV¢­­MèârÈ/ýE,ôåÕ^q^îÖ÷«.ÉÿpU\6€#ªöå`hbzá6ӿ´ª/l‰Xèã³uFx—=όž´"<P…Q
’,
J‘f«M0‰Ûìýža‹È*|]•3€è¾çT2#f\sÿ$N–¤aßg×`±Í`bʆð•ˆüÏÐ~/û¹ÑõëzÆð*¥Ï7+šÀN
óc«[‡©ÆPP\1àPùućú"È[§©트—zø\܃y/”âv¸`¼Rƒ­DgNcEѹnxl“ƒĒqŠò~+<¥ ýïMŒá¹:%ú)úsªܨ÷_(´"‚TˆñYêñNõ­ˆæ5Щ½ðx¦¹сøª®y1ø¡ySV»¨|Yqªð,×Dý)bR®x.åðÃ	àÔÚÐ;ŽZJ­eTpåQmñ	eWeE¶ӟ+¿`Šܥ—څŽ\$°!~ïÅ™z\l4¡êúJrÂQHi‘Ë袴PøÒ>ç,Às‰ê¼VMû0Uœ
üðùfJ¯Z“`¥ŽS—DÊÏïù¼÷ª±+K¥Atrú4y<!dv\û`"ƒ¼QÓ6ü¯¹¼E¸dætx¶ö†¸7CVæÂÈUY°R~?ëùÅ
_‚¶ŽÆ.ž»¸½ipEcÀb…×bÛc€µè•ÕÔÉÀմöZ|–‡kÑ+«©Ӻg€œ^èáßÉù͉ùß͝ñ@ï‘|g†¯‰±Œ•…±K	|7øµ‘ùÜvWaŒŒ•…±¯û—¤¤üª¿-E9͔¦qãÃÆӌ™±ÿ
oügʍé{IEND®B`‚‰PNG


IHDR@(NÎüésRGB®Îé
‡IDAThåZ{xMWÿåäA"!ïWiHh‚øâ2SA$
A=¢Ú2F™èiUÐ~D•~UžÑÉM
zţÞꑐw"!oò¼÷&‘睵NzNNâJBoú‡®ï»÷¬½ÎÞû¬µözí}ŽÂÃÃ
W­Zµ´[·n3ôôô0íe…†††»•••û֭[·966¶V‡…ŠŠJÕÕÕu~Y…Ö$Wccc֊+Üu>033[ollKKKèëëkêÿÒÐêëëQRR‚'Ož@¡P¬Ô%³ŸÅÒý„g9yYV–]Ÿ|ރ¹ò‰˰ï\ÎÆç£AÝȏÃãòjä<V¡¾Q-´-La߳üÚbÊWøyôèñ'Êʲëdgg899iýYeªZ,ÞqÙEJ,ˆ±Þöèjl =§LYƒ£×`Cìm$ç”KtFü<m°ý=?x8öhA×VãCÂT¦€Œ‚#ÿ‡åa¯áqîmòÝÐЈu1·°vßM4ÙCSwVÖ?ÿìð‘®mŽ‘›¢t_dp{cxåCÖü€­F´+<ϥ§§‹șC°c‘_‹©«žÔaægq8q+·]›NQÀßö^ÇÛ¯"€L^„+Ʌˆý1Sl
םß'!%§L¢Íìy­¬¥®¾³7š¢ªVê§MDë
È~¤B\|.Þõ”øŒŽKÈeG]*щKÈà?Äù»ùýÓ9Caڥ9NðÇÕ'îH}´‰h]‡.gaÎë}a ¯'ð™žW¹[εðm¹յ
ûä$?¯°•yLá"ï"àÑqéϜã©ÎÏAкÎ&ä#pˆ£Ä¦ÿÄK©N"¶BJU5ØõC²D?ØAÂE$·XõT¦ïý’«ÖWR	gkS‰§i$¼-京ŸK/3]>Rj¤ÿ¢Ö ª®ƒ±a“ù3cŠªºñ§”��V=©—7µ‚k]6]QPZ%1×ϡ»„·…¸ËúÉÇËÇØYv•7µ‚k]^®–¸”T(1×^Äuè7—Ҧòñ"ÍØPžNbSkW­+ l¸b.dH†ú:ãaÎR[²lòkàܴAi¤½w­êäãøTzÔ4×óҴ®€QTÃW?‹«¨££ƒ˜c°0¨?ôuy­›¡«‘>ÖÍ‚oûJÄoΤ!•R§¸R\=s°œ¤5¼Sö·ï—`ÆÆ3¸¸1–fƳ\Չõ[·SsËá»ôÊ+[V}½9XP”4‘NÝxSXCµýø¿çoäÂ3MÞNÈ*Á؏Ž?%ü[֒•ttÚñÏT?WX˜ȧÇñ~ˆ'ޥ_.°(P%mx6J@•º•5ÍiÎÐ@ŸF¶ÑbßθvŠÈåMÌgãÁ%²—‹%8Ýõ01êûxZõS·óP%¼)D>œ6NÖ&򩴊‹.Ðé
¹æ}þ]Úe*Q¬x‚FuóΟâ$,H)V&äÖz­‚%ϡ¦þ?ž¿ßaÃ`hd(N+\«««qãú
Œ=ª½­†¨€¹˜ìÿ÷>üñ½…ÂabnNfϙ:LÅí[·‘’œŒ7gÎhëyB®èlþµ™™8yâ^éÓ*•éié˜>֯Ǿ1O) ° [>ÿü¹ ñÀGbükJKKգGŽ”ºöÔAãՊ
…DÓ’—›«~kv„šNo¥)KŠ‹Õ7úI=ÿwÕeee]Ž„‡…ɛíâ¢Ü²Îårptt$mƞݻ1Úß

õpvvÆÕ+Wacg‹›7n lòdXö쉳qq‚հéVWU!''>Àȑ#‘˜˜zI???Xü|RûÍ޽@§DÍû	¾'ÞW*•ˆ;}¡oLB2Y^A~Æì?{III˜6}šÔ_η&ü…!777¤¦¦ --׮^%!k°eófØØØÀÉÉ»ÿ±c¿„w …­X¶\è·mëV˜˜˜ ##´
ÄüXäæ6yeÝÏBo›gŸ›ššâø±£|¦¾}ú‚çcP)Uðä
{{{üaÞ<M²j¤½°
Ї|´w¯&fíìí`aÑCPûnii	NŸ:[[[áÁ+V®„‹«úõï‡À	à=hŽù/¾üâôéÛWbÎÅÕ©))R[b`Ð96™˜šÀÜÜCCPWW/MMc[Ó:¤r(p.ù!.]¼„9sçŠ$W#c#”—•ÃÓÓ¶ärPTTà»ÇPW[‡ûc¤[³#æ ö7(¥·7"°B8Øʡ¦¦Fh2_ô¾µ5ÍÕ#[ak·••ãŠG¿:‹ٿ_¸–—`Ǯ¿Y +ë>¸’œB/W—›‡ŒôtÁô#(SD­߀[·nÁo”233¡T()<DñãÇ8uò$Å	K>Lâ‰-éë;±1*
>>CѽGw\¹|³#f«ÊÏñÿýï°qÃ!V°ðiii՘qäða²C,]¾Lš¯=äW«Úcä׾ÿ\u»Cmm-ŒŒŒÈÁ/9‚‹¯™¸173§•Ðî³	ªÉ<Ù
Ødy,ÏÃã荴0Ï'B#½$á9ÉÏy,¯p]2‘ò•ÇñÜ<g
þ©T*!°2yŸ#ÎÙֵC.ð׿,ÃØñã°/:ã1!(۷mƒ‡‡'²éS¹€»G?Ü!?íïÑÐÕÑCbR"ååX¹_}¹5µ5X½fP´,\´ˆâÈE\¦X2!8Hhõ™!øóå+—,¸Š™YwÄÇ߁‹‹Ž?†»va¹IȤI¸O֬ÅÞèáôÉS¸ví*>ŽŒDB|¼hÛžïu(ZY[ÃÞÁS§Mǵ+רì¼/oo‡LD¿~îpruFøԩ°²¶¢ô¤rpoÛÞM+FQZŸâ3Ô4Ç×_mÆr:ӡÇgSM0ÄÇG¨+Ä(î1ÀVVVØC©têôé?a<îݽ+¤ÇАP|@)ÕÍíJ·N¸Ÿq_°_¬{YÚxe«à,Óèĉt©FڴQˆÚT±‰äWh®T#°)ÚP>/,,\‚Ûó,€R©ÀªéËÉ2233`Gi’‹%MЭk©FàځÝÀÏ4FùûcϞÝžƒS�G[¤>®:zK–,‰äŽݻ?ûð’+.3Z±Œô¸S;nŠ
ŠàN«ŸxïØÿ½¼¼Èì„ڝûw¡LPààÁԙ!k² ‰I)àú«C¶Š$ªÙʲ³ÐÊy#7/OHƒ/ÆÙ3q(.~,Tœ……{êðzÀr“4R|0¥ýȰáÃÉ2¯¢'UžEEE("¥›“<mÉTAi˜A‡L癌‡Є;/ñð<R2ØD]ŠäÑ,+6Â7^v`YV–ý·ü‘T6}$õªížòóó·ûúúVQ޵¡Ülý2[›=Õ
[è³ü™Üÿì#Ðƨ[çIEND®B`‚‰PNG


IHDR@(NÎüéŒIDATx횃“cMÅ÷¯Xc­m۶m۶m۶mï&™$c{‚KÎ÷nWu*o?¯k^NÕ}ÖùõíÛ=(DŠŒŒTGGGŸ#IðH"¯äY·ù,1 ³È$HNN†ÝnGy$¯Âi,†ÌK pÉr÷íààà////€oUvv6„|ág^999ð”S<žþñ%bnž‚%Îø{
†¿ڇ­[4m†U+V¸
=r„{÷ö-2ÒÓѥc'¶äçaƒ‡Àl2ƒDsîÆ!40ˆγõÙ3g@нuw;”ÆãfEð¼MQ<j_Ϧ¶€)F‹í[·²ëïݹO6œ=#-5
!ì3¦NÃõ«×ÜûeK–BŸž½`0¾½¨K‡Ž8zø0fNŸÁ^شQ#äææJ̞9“m>x÷ïÝÇÒŋÝQ£JU”+U[7oÁí[·°rùrì޹ÉOoã^ã¢д-Šèn%ßOØA
è+ðdly¤ÆE",8ƒWJJ
‚ý0iüè{ºvêŒçÎS°oá6o܄=»v3mZ¶üzƎץ‹ÙÃ׬Z-0dà Öò/ž?‡§æ͞ƒ_¼~õ
žr8xЯ4í‹!¡W	¤‰Æ3Fª1N…”I*|£€æÐtL›2¾~HLHiýÚuì?~ä8·8€»wî€D€äWw€«J…Šèѵ›3§Ϩ•Ù~§öíqÿî=š7iŠ捛àK٬fÜoYQ=J u°£TȚ †iº2gû f¦
oW·‚泆=sõʕZõÊUXW#qeÂJ¢^­Ú,öïÝ˰îºfÕ*Ö0ƒúø~*—¯€Þ=zJðt§ԮS³;þðÁ4kԘՎ/%X²ñ¨C1Ä(ŒÑ*dOòi†,ó}aZ䃸>x»®HÝ:wAÕJ•YŠÓs¯^¹"Ъy1Ý7²xùâ…@¹ÒehM¨¼P–0™Lp¹\ }üðÁýâ™ӦSð”•èɘZ0Q m‚`†–¾°,ñEÖ
_ª~fHW._fÏ+_¦jר	§Ó	®ê§NœD•Š•йC‡o )‚T:¶kA8F
ã¸1cXêӚŽ_ºp‘*5˘Jåʳ‚ôèáClٴ™¥jҋkx>H¨‰J¤ÏQ#K4Ÿ!šYæƒ×ËÊC°¦»ëE­jÕÙ3wlÛ.€ºÄùsç(¨1$5€Š.m/˜;ïëð¡«Qý¬‚[Ìæ?
ƒ”–<å(¦Nž,yIß^½Y1ãÃä‰ãÇAŠxϧ”Æû)Jhç¨ð~ž
o77ƒ9^š1­TH(Ë4ýã0ȋ ã
òC'BÔŒ#›ü•hèԇ‡³Zá)‡‹tÝCÄ?;SÜ{ü•¬V+tZ-¾·¼Sáϯ¡ßÒ[†\8žïnZtòà4ÜAþ–FÈ]àKæåðîdœB>\IŸ!ÌMËkñãC¸YùpF<€p°'7)Ž7ǐ¿µ	7'®Œ(Øo.AÞÊòܔPkºáPoä-ôãf
>güØ.ÏDފ²€+é췖!Cmɇ`.8c_Ц—"Sý¯3ö~í?Häeá¹ÛùIÈ[Uñ‡›æažëÃÌg—süÜ‘±çÃýö;+‘¿«­XÈü’i©ù¨)* nc‡˜ûORÚwˆ¼}ÆC“¾¢t“xêýú0Ìu¦Ÿ›]µ¸ðü7¹ä¯6«yƒÈ{Ga<¹úÍ=>¯½è·ãì²jy2OÞÿÍÿxeÔi°£IEND®B`‚‰PNG


IHDR@(yÛhPLTEUUUÒÒÒÝÝÝÞÞÞÝÝÝÞÞÞÿÿÿàààÎÎÎ~~~ÀÀÀ&&&888¿¿¿ûûûAAA«««ÞÞÞ'''


ÿÕÉÿð¦àìììèèè)))>>>GGGÍÍͅ~///ãã㨨¨ÕÕÕÅÅÅððð,,,555ZzööövvváááQQQ
ÇÇÇ_€sm1/òòò".›››---^p2uuu???Œ¼›ÒrorrrÌÌ̵µµùùù€€€"""OOO'4i޽²¹¹¹„„„hhh­ÈÍ
———QMæÙØØØÏÏÏíí�³ƻÝÝ݉¸Ô~wjdŠŠŠSSSÒÒÒNôâ’¢¥1tRNSxÔßÒÞù£IDATx½–×ÜPEßð¼Ø£S{úٶU۶þ~_jn’ÕÙÁbv|îa)–ÈHÉ$Äá,-Å ËXBªY<"VMJ°¤dñÈXR’I$ýW¬8ZÞÖEŽ$p}üÄwC< {ᦁ¿0Ì0³Ž¨›tg †Gèh‰N¸hƒKøøÉ9õ8~áÓGñ‹#ü0~C&	^®:qRû.¸w¿xl…$p<{Àž¶Μ
ãç/_)–ž\à€ëüroøÕ@ðüExUz
@#	lƒOú¸Ú/å!Ã#£bo“òX³91	ÁTyÀÌìœØçɷ0/-4°–°¼RVë4úCÌmlnmï`—Wö.^ºy«pûù!*¸û¨òøðöؽÿðñÓgúk”Ñ™ü)·Əý3Åý{(\mij˜PUÿ
Uµ·±N,„ÑfGm=žαF슳d¥YPó’RD’¢æ}ê3mYÂÛIEND®B`‚‰PNG


IHDR@(NÎüésRGB®ÎéIDAThÞíڱ
ƒ0Ð|Hûû꿨ƒ£“(FAi…Ô+¤ ”H‡gnà
u(½‡€r•ZO]׏ªª‚utY–ææӬ9C­õS¿<þ=ï
xÐuY–ÅÜý #²"óš=R¸øàCø#Â~Ze¯„oÇæ&p0ƒɲÌÄq,rðۑÁ@rø#‚3€ôðv@€oîÜ	@€ø÷¦©)ŠâW– ³D-ÿ½€Â’$qèû^>@žçNá7M“|€yžÖz{­ý:ø®q¹€Ðz\hP‘‰<®Ȅ
E!†|+I¡†‚ØÖÂ^–j<©É6üè
Þ8[ŠŽ­IEND®B`‚‰PNG


IHDR@(NÎüé†IDATxíšt]Äk۶ÝØIm۶m۶۵Ý&¯±m×HæÛû6»ç¾ܗSoÎ×dª$=º¿3ÿ™ÿ»»ùˆ†RD&“-”…„„à_þCÎHÎJÎÌýáLþ37ý	âDΞÐ ?ˆ‰‰Áׯ_񯋜‘œ•œ™œ=g	òM.8<
A|‚%r›„sÿ2s'wtzU»îC¹îQºïq”|ÅF\F‘qf(8Ùùg:!«<laÜwN×ÓÄåjª°¬¤çòê¸[ZÏKh#ˆ&‚
j!«Ì<\ÑýÒ$4>d€¦G´Ñæ„&4Îj@ï’::«¡§¹
ڴ—Àò­6¨ª¹•õ·¢B§Ý(Kô!Îf0E¡)6Ûõ[±µA{¨«‚“µTq‰`QIN€;€gϢ,€yŽ{Qa›>ªïÖC½ý:hzXK@¸¨†N×Tы0@
vÎn¨¡²R ’þTè¸KÁÅG\˜%€›“Ö4i'°¿N{œ¨©‚ËrjrwËhàYqÖf·Qr£@µ]º¨KPп¤NHç€csV ªÖzÁ€³Ô8BÐáQãå¶5äÔ$ Ð#P@‚OÏTç(s@çÌ`Ýîïhª±ÕۯF@t@™¾'Pr€•jÚXݘw 822
€r›{ €耶'µ .d€”#P«Õ"2"€Š$䎣 øHù0!¸¨y[Îí|TÍPN¹48šTp¡Üå·ê):€ F@2Âð€R,jÑN’'©`@(´ÖH!êñȹ¬Ùr‘8•ô¶ðЃÀ8`!ç€ÕT²ØPâ;:S5(©ø #p@lÖôÐ!¨BF@Üî°@[ƒ'Iä”T¾ãºh”Î4ԆY‹ΰkÔΕ´Ø`3 û Z@ò2@e†1܃á’·Ðd¼KUØ–¶V…ù’Õð¿uïã¡ Œ|
AªË#„^ƒ`ʯ£ýáíYŒÞÄúÁ3Î^ñ¾ðNð…{¬;Œ½®` e'iG€dÁ¤tæ™!«èˆôö­±ñ¸b
߃qÉïd~ J¹ì¨tvñ…“ÿ=¸ރbhy'¾‘²©̬Aâ]€àFN·p¶‘³ÈZ
Døà%J̲ß*Ö`«ãúˆ{Zƒ¬u1Pª !H-B$¿ëAß>Æñ6FBò-PN-34™4Ûa›‚Zgz ís¥H—5©ïŠø.€(™×¤Uyˆ5È/Bžòd$}HEDZ"¹?¿~QzF:î…ÝÆHÛÞ91|Tü~((ZæIZ€l‚¬ÄM‡an¸"³ƒ±‡-œnÉOô%ýì,ÐÏRS*‹É0-Ð}¥-h}ü’þÝøÞ}“T
šxšƒÖÙ7¤ɀU›-ÑXo½€ßÁò~ hÝðŠc(† s ›Â"äèïZ®ÁÖÒ8€èÓ篸û4'͟ã¨ÙÈ9ùý´[[¡"½kð}L<®*©Á+NJø'†áq¸žFºÁ'ÁYµöÁipÁø!^ʐœú´ÒÓ3à™ŠCN>h°ÚéEhnÝDŽ$¥‹PŠóC²	-ð½Eˆáƒûáw±âî\éZ€Þjv܁F£ސ“(?à”Òûz¦ïN7ЂyËN°oL¯ÂìgBkóîòîòîòîþŸ÷%æ»dw@2€s€šR„”4ü¥û€ávZ9w@B´y. Ðßû$ûT¸æCPm0M¹hBP!¸êD»à ´ÀXþHéËh:I
R!HZ€}0B>½3»I‡ Ìs}ªFºæÜ}qýhlÎUPhGB®Aæ>€Ô`ô¼] UˆÆT}½´$¿ (;ì<ôW;áڣ0¢[`
€¾p©¬…WFãhìJن`“LhŸ×Á§q¸âôËO‡óçö$ò^‘ÉÅ/I“³ôkr¹à59ú5¹ÿ16lÄNIEND®B`‚‰PNG


IHDR@(NÎüésRGB®Îé
IDAThåZ{LUuÿœsîåq¹¼"Þ8žH4L͈­‡2››Ф´©U[MdÜÄlæЍȹ6©´­-uÍØtTK֋ÕÂYh"²9ã!)0¸p_çÑïwô"xϹçžsqþþ¸÷œïë÷ý|ßßû0 ¥¼¼<¨®®ngXXØËÇ-£´…ZA¸<55ub߾}§Nr1üC¯²,›¶PA+áE±¯¦¦&‡éì쬍ˆˆ¨		ALLL&“’ü‚¡ñ<±±18LLLìbIÚo¦èð'm`Š•Š%}~	}y`-?í\nZ…¾"	oק㧴+Å>ïù.üÞ
ç_Âõõ÷{ ŽOÈn±ÑQ0=¹æu…Ùú˜ØGæºë¶Aèi†xãˆ#çmH’Æƚ6¹\j1˜¸ü¹z¾1ýýýµ‘šš)áj/¦köÃy欦†Œ7!¯mAػՀÅ¡óð]BrMjêr‰Oô²LL`“Õõë×åºæ%®Ï[0¹µX��ñ­¶@àûô¨a9˜žz\îv]z³…=`g<;‚Ɋ7tƒçÂX³;ank;ÅëªZ¸ÏíÿÛ~]zJÂÀ}¶
S;ߑûª’q5ÃIˆ\7
ÖJ€ó‚:GxD5qU:ù„?N©òýa€4aÃäæ7!	d´ÖY,OL‚˜Õê.æžqVîˆó�©ACºTÉpì
MGÿÒ]±‰}Ìæ¥Çޚ÷·ˋ®Exø‹
Zbª|cpó }ßH	Κ&a—'/unxʋæNŸpŒù#ê%c(î¶s3ó»—E†ð‚ÓÕ7숌¨fAEáÆw¾DTyÆðíOª}1X2òËŸš(‚™4°j$öÄAƒ>©ùâ‹.þilÐa­Ú&ãԖQòM28ÊqxDÉMkÑÇ8´e+²ôIјÑ¢%¡Ìçé( Q8?d”Lp¡JTMš¡`ã5
+	6N‰<‡&…hËÌQ¸ûÂXâ”Ț4C0-ÍÖ4¬$ ÚÈæSôÝÂRˆ±
*mÌ'C*}Q	Ÿ&Mt3p«ÊIdg(†·ȘO†&/‚yÕ
U ¾Î>õ¾*Īó|Ùd¬Éäœ`¥/Už¡Pkº—7Pœ}ˆ
­lf!$…°HN³–Wì‘
éÓ"U™_xÁŠtW*‘MŸ­=ÚKψ„¤ß6v9¸Ì2/{þô×8˲õÓC0åd͢ø÷肽3|FXŒ³€O°̼ûû@Gþ ç>6Üú´ž€ÀDXñÍq˜–聧.FÀÞ
ޝëZA`¬IZwœôÅ-QŸü€@-³©Ɉüå‚ËK|Vt?“	&³F=ä?Yïgû|ç’H÷+ù
Lt®O9˜ór&詈ÿùWLï}îÛUJèhð«e°T¿6óîA¬ýø+A¸z\õ`”ar’¼¦¼·&<ï©Òð¿çLp^àñF½
Wk۝cñÁaÒÂf°q”ÿ8Ì«Hڪ,¥E7¤‘ˆ·.@¢k{lCÉ
‹sÉÏ¡ÆV ¿fÿ?Ð̮è¿úì	@Àc€^€7oÞĕ+Wôª©ÊS 'NœPåk1V$Z*÷ømmmèèè€ÓéDff&®]»†ÊÊJP§Ž;†”””••áҥKhooǦM›dzoo/vì؁„„=z%%%ÈÎÎÆɓ'ÜÜ\´´´ ¨¨QQQ²µµqãF´¶¶¢¯¯UUUhll”‰ŒŒ¼ç”Χ€2àüùóÈÈȀËåÂèè(âââpúôikg ¹yÆÐКšš°fÍ$&&¢¸¸¥¥¥(,,D}}=


pàÀc``@Òîݻ±}ûv$%%¡ººZ¶ÕÕՅÁÁA;}ÔÖւÜïËJKKÓ	y®x@ ¦rrr••5óO¯žém‹åÎâ†ìéé‘
»ÝzMÝßßòÁ***ä÷ŋƒ\XÊÀi°¨,-äú~ÆVrr2¬V+Ün·\Gxø½•,¬ó‡#©¸—êÐTÓ[ȗò"u:66Vv444ëׯ—[—fÄêիåVǶmÛ@AÒ,¡h—hnn–äççË7Ôééé2†4í4S¨­µkׂN‡yyy ò‡‚Íf“ŸiÔS¨?´<iP#ÿ–ìÌ,@RP’iJ>,ѕbgIFӾëa,ä@PŒ+-ûÃü‘T?™­²¹îînL/GÈ`5M>I$_‹;]üŸ¤
M{2p¾O>|…~&÷ۦ{ÚW‚…IEND®B`‚‰PNG


IHDR@(NÎüésRGB®Îé§IDAThíZoh[Uÿ½$m³®³MÒvµI·é\SKªàdT×?£2‡øaCÄ2E‚¢”!‚úE±ü E?ø­-Ûcĭ®]7ö·u+t&˜´Î6ý³µY’¾$Þóæ}ë{Í[ßËÊJ“Hî=çžsîûýî¹÷å…'€I p‰¢Ø!Bc2™¬$[¦
Ã8Â0öX,–v—Ë|<`F{¦‚N…‹1a6›½Zyæ`·Z­p8`̤òÏËP(„H$b'ì&ÆD¡Ëð„“˜°’v+ý»IÉô•'Œ\8VÂnâÆlmsdëÊsܹ
àLdk›«€l]yŽ;ë+@ówï£ß?ÂI’Z“`Â=ÅëðÚC¯ãáŠ͊1R¾þýKì¿ԍÉȄbìeï«x¾öÄâ1´t=¦{g˻ؾn‡l;óÏi|rîcø¦}H$²ýàÎÃ(ʷ!ÿ‡!٦èÌŁÐ,0–ÌwY-Øì\ƒ7ª°ý^›ÂU­è®º ËSÃØÛóB×Çyÿu_|¶¼ÂieüúÞ>ÞÎ測ÏÃòL\…y\MÑ&eÛՈˆ_†'ñÄ7ƒxï¨_¶§êè&€GãQñÿÌU©=4|P¡§£|÷ǷÏÝXA­ø½µ·x`„”aïõ¡Ç?rŒŒ†	  Á^j$¹»†ßƹšV;ÄOÃ?.»ç¾ìª^“Ú/y³Ô_¿¢6ÉzZŽ
`fnFJrr´ñۃ·!];#‹f 5îl¨D»‡=¶³-¡µ~sôâ;4DóTû—–c"’
	§Fú±Í݊¾àqٵ¼p-h/Ï?ÀäAUЁ¡ýòègúƒ}²®îä1œ՗⍎ŒÎâÏéhÏ'fWá˜Ú]Ò7:V¥´“Q7ÞòzLE&A'5IßH/šª[$"$ûjóìƧöéZMs`¨›íý+´É^ƒV÷ãšÐaKñ|q2řϾè£qà7V5³Aû,ÝPhsõ6™€“¬.ü{´‚$ìÏ4±‰ˆ½Ãè¾Ô%»·yžƒ˜˜“uu§7ð+zþ>¦6ßR¯X]ë^Òô1tlu5‚~\N£ãÔrâJëPºªLÖõtèÖIyH*‹œzâôúxJk±¯õsZØöÐC`³ÚQ_þ Î]9+¥Îå´Íl;^=÷̦gerµò¨Ïy³Ɍ¶šÝÜmVîgÛÉ[V¿`Lm0DӾçðdTþUÆ	àñÅÅxrÃS\ÕlÕç¼Y0ãïM=†¶%¤…o>ÇQ‹µì®ìÜø4
Ìé†ßVœaVêʼŠI©*ҕ¢ü"ìb,—&€.´…Ý
æKsåOU´¾d>Üځ’‚’ùéîh_ðù|ÒÙâv»ïèÄË=™ßï—.!­
Xî‹_Êùs,%›+1W®Vâª-å5ç*`)Ù\‰¹rÀdFiåè͉lŽ•°ÓÇ8½6Â2™ÂHXI{ֿ$e¢WÅèm)FH'ß=úõ?ÆNÂLØÿŸ¦xûâ,žIEND®B`‚‰PNG


IHDR@(NÎüésRGB®Îé	UIDAThåZ	p“Çþ,ɲlY2¶|ߨØsûà0PŠH 0Rh’0ÍEÓÉÚ2MK‡„¡!M¦HÉÑvMB´!)…”r™Ãcllˆ,[¶B’-ë–Üݕ¡L,ë—<édÌÎHÿþï½ÝßÛ}ï}»³! eåʕâ­[·¾(•J
……”6Z‹Óé¬ïïï߿m۶]°…PåwìØñµ@ È­J¥—Ëåjۼys^H]]ÝËr¹üU‰D…B‘H4”ü¨¡9hµZX,ôööneÿ8Õî~PžêI'˜êJÕ]@|¾€¾Œö™§:r…ӕê.àˆ÷ësÄïìè‚þw‚åt\†>Ÿv´†‡cOÅÃøXgG‡ÖèSΛ1½(
æX I§…Ãåòfù¬!(ˆû.FqJ²O9Ž1"¸4Zh–>
‡ZÃõçó¹éÁåø¢ſ×AñÌt\ri0 å(üž.×ê»5xêð—¨}fƒßF#r¾=ûy)_]R‚/Zù+ôȬð;~Ÿ=Æ~Ÿ<oƈ`þ÷ï¾|ֿJë“7#;+*½a(oZ~<ñ%h¸´:Øo¶óøpÁØT&gŽáÕïpBs2҆c{xAÀz񪧓á*i$êÔúáD¾ÅsI¿E
˜ðÝ ŠŸê&òŽܖ*S/W
ê)03-•W۠³€mÐ	Çÿ†›
šÅpb,_U°}7@ub
ÐÂߟdèèíÃoÌź©…€h!ðõ|{'žùü(úív¿ŠMNL@¤8ԯÊÌØê› ÊÉDhAœƒiP”KÞó²ao¹ªœüvlŽ;x•ËVNùûѠ¹͌1+߬ò]þAÀVӀ2+aE“ظ­•—Ù3lÚÄÁ÷j T„1Qh3;B¨“³ñì#%ŒOÿbdáÐBey§¿pE(ÄB¦&%â¬êš´wa²9˜1ê{î¥R!iC‹L,fOúÆÍúœ~†¢
ƒr.Š‹ÜG–Aˆ§O„³]
ab’.„ÃlE«4?ÞyQÒ0¤ÄF!=.
³ÙÉ10šm(y~š?ø9ìNäaø¨®ö*ÂDBLJŒÇÙ'ס$5¿<þ_¼ýpdeéEAG›[ñÆC嘳÷¯8º~
~øþ‡¸Ôم9™ü25@P.`ôñ”|X¬p4+i_̙ËɋÌ-@ѡ÷0:UôåÕs‘+ÇöŸ–#2\ŒÇ_û”DŽÙů‚™Ì4õÿy™¬Ýg
7°»ê2Òv¾EV…ædaÊÛ{Խp«š~7Øٵ¨T–*Ÿ¤ÈH֞Ï_à+€`r[u=ë[ —!$Léê%”aZŒûC¶am·ÐÅäZÔZ$ÅÈpöš
Ï.-Amk7*Šr Ñ÷C!`2ª=ÂÅ"TutâÉSqÇdÂöSç<:”¦¥€ºÅù´Pˆñi¡ gهX=ÿ§
^ö†f¸úMìcúWÞdƐm\Qr<n¯zökM(¢a9vfIÎ5´“™B£JƒJRÿ˱+(Ÿ‚iã’ñè+û‘F\âDíMč‘By×@fQ
ED8þy½™}ƒûûüF3Rår¼úÀÐIVIº›¹åo?U‰îAè¨B”J%ƒiîeÇ}Ð×ÓøÞ'Ðýz—/¶‡ޑ•…YÒlÏ;Ÿʔ%¨Õôðe2?+žŽ—ÊJ‘÷Ç=°:ŒÖøÂFLˆsxבJ¥bì€]€€ÃuNy59ãµçØ"â4&ìýññ89V͛„óèÂó¥E‹8ÞÒÆöOMÅÕ.
2HF‘’ÜN3Ǒ-КÌø}ù<†
8åÈ㡼÷ 7OxIM¾sÛû[žúвüyÓRXHÐûÕcó‰[Ôà'‹¦#¢¶©Q2¦¶¼‹‡rÇaëü2¼vú¶-œ‡·Î_†SPFp~^\,*Uø;É\™Mҟ;9rÿπ@Sœ³çŽÿ^‰ą>߈­(7ï½̂ FoÄÆ%Å0„·xü8䯯֡Wɞ~ËÜÙ,ÒÓh#K¼Ý`ÀZ•7ÐtGKV‰òc	Ôÿi。 ßåo ³óu·ï
PÁ¿X1ôð¢ßbC1	Šb±Álw`ç™%i´"7{ªj>qS‰˝ÝDñ»˜?6ï\º‚C×oüŸ
Àsù_)p#ÂoŒnð¥|Z66-ŸÅޞ[VŠ’¼4èŒl?]‰®>#>m¸Žֻ:ÌÍL‡<,k'OÄòü<œ¼IRhé¼8»×4F§‘+‚<§''q¯¼Ÿ­ž¨ŽIô9€ã5­hîÔb×g•ÈüÑëÈIQàdƒr\M_}÷mœlSá‘	9,×?qè= ÂÇ× £Ì1c°æ“ÃК͞ï§&3í!ð¬ðŽ.]¯ñùëû‚Ÿ)FÁ]òRI(V”u`T,ÉnòN“1$ʤ,›0žíNoXÇ\à1ol:Qü¯]‰Յùø¨þ^Æÿéyã˱3¸½þ¥!•ò&ZI*ÊÏ-cØޛî]ÏNŠ&CIÐ_t¤óçâ-MH ÊëÈNS3´h›ô(9œ$VPp¤ÔëÑkµ!E&ƒÎb&1ãž|¹~5åðÇã¾°¡°vÓðGح]:=zMVœìl‡Þje?c°ÒN2-}÷Žܽë”GÂùn•©¼wá¸
wã¡êÕI©C‘}Òbc#G|:1>Q$`SxÀެäÕ³ °$§º7L¼:÷!´,?×Ç?™·DÉ	þ{#Ipcr^ÂDH¯#«ÁÃ
¾m¼årcxaf±7) :ï,óæVè¶섽©
 AÉWyºênÍ\ˆSj,vÿƸ«1¡<?ÍN1x–èp	*HУ9†ԃ-¼³@°ø¾¶ã²oø¾*2Òq	ȝ™Ú	½9q¿NWª»€\ÚG§×F8Æh6wE†êHu¿Ÿ/I)É%©ñÂÆÆF§Z­Þ]ZZj"WG’Èm±øѼè²7okké5¹ÿ…(Œ\ƒ‡šPIEND®B`‚‰PNG


IHDR@(NÎüésRGB®ÎéäIDAThíZ}LUe¸|ˆ"W􊀄|DMÄ9&\M§I¦–𫙥6³2­´-RÃrÎ5+?ꏬ-g,ÃMRü*tÕæWӜÊå*HD>/
/ÈǽÐû;xï{8‚‰KàÙà¼ÏÇûžó<çyÏsî^'b´hÑ"·ÄÄÄu‹ÇBÖSÉn·_­©©I޲eˎ”””'8¿m۶NÔSÖ򫩩éfBBÂ('³Ùü¡^¯ÿÔÝݝ¹¸¸hÙ÷™Íf£ÊÊJª««£êêêõ:–öKà]op~âÃW|ױ=?LOóðQ&ÙWø®“…½õÚ€Þúæe¿û2@ŽDo½öúøßv=e•VºQTEv{ùy{҈á^äêâüÐÕaÞÝz”NœÍ!<ˆšü¼õ´áÍi´dÞµJâ£|EyE•ŠîWãh󚙴aç	ڝ|^‘¿8ûIúfó…/¯ª¡{ÏPòqU[ë9ýÝhᬱôåÆy‚Lº¥˜VmN¥ì¼2E736Œì’z<E¦5pùFÍEôý¡K”rò*Ùlvi’òjJø<âá4t°‡°BÁy'''Zú|´dcbÊÓøˆá
›v&‡Vlü‰jë?¨¹ß@·+îñ"e¼rÓAÊ-¨PxLY%ïˆé& ¯?™O?|ö’°ô|z¡ óã±tAD!C¨¹¹™Ì9âCEö—l-7ÊheâA‡ÎËÊö2ëé‹ymœ‡¼¼ÊJÅeÕ¶K3@=+Þ8’B‡
7ËÌ-¥¹Ó#ÓںF:ük¦Âc°|ÁD‰ÏÎ+'¼E™œu4.ÜWb×oO#km½¬’²jÝr#	õ¥ûõdɽMÇOeŸ1²ñ^–ŽȔ]BÇé©%ù¬§Lpíúmañ#¿g¶qdδ–™²Äôö¦þý\ÉÆ@îÜå|aoM§eó[Ŭ¸‘´v™Q°Sq§†~9­ȁ|3Ø=gO	WôZƒ·?	éÌS&{3<%3ñ,-ž¥ wº*r:ßgYþͅyH릦fA¦Å`»5>À%èW/™,˜©ƒ.(0
Àä	A·î(/,¾K\ÉWô<øA˜n¹¥è0ˆz€žý(ø‰!‚îðo™4mé·tÞÔcxäÔË
«èNk^‰%w–U2™²Ŭ“åüµSð1”p@^ÀfÉm)=ÉÇÓ% “uF¶]~ ¤¹z»Dn­Øïj2³ý;ûõ=ôƦCôÏ=±$ÂYróï*eڳSGI¥22ÌG‘¡„—”kW٨S$XUAûYíæiÙüh…ÍbAªc`&šȰ„ýz-:–Añ+öHû׫Á=H
”mƒ. Êd@xöÒM*,¹«ÈÑÈàaz–˜þ£C}ÈÍUìêÐ(%o_LAªí€ùhp>ÚuC‰Ð0ñàgðò §&…Hºñ£Z3‚Œ¶A$ÝHþ‡¨k?~°k€âCÊk=ÃûÏ«iÓÛ3ð”u©¬¼¢-©ÁO6ô‘#[3¶e@§Ê D]hÉûïÚõRåÖG
~˜sÅB§&dJ^wWB SC£J+¬ä¤íà}Rê%éO¶å¯èڣNg‹åÊ὚z¡ƒãÁ¶
vðÑÒ¢É)â¶oÓÏM|7ìg{2x
 Süò9ðãçhÑ>—:h¡a/ÞEk
€pߑ+b
L+øÁÂ×j”©ˆÐaÒÜË×nÑs«’hæäPšÊö°¿Ï ªo°ÑVþöÿ,‚ªqb+q.Òw‰æÛâ» Þè©iÑåh­¦?ØàK'”)փР	:yî/鏷ãǨñ_|0‡õ÷"øÁ潥Fòһóæ0§œ0+2!Zy-êR|Ñ?/ù±¸ü k€-鯥ƒLMpþ»­/°þÃ@»’Î	Ù` WÏPO‘z>ía—0wŒ‹n¬~0pÔB3~„Ô`®š|‡zÒû¯M!óѵl‹„Ij5ø-|:R=Mâ#B¼ŎPՆó“œòóó¥¦;0P¬ï¼Qw”¥¬c+a`…Ö8È0
`U ;©  @Z¾K[àa?J~òÂߣ¦.oGý Ýu¿¾tWd—uû2àqySÝõœ:vfFú''zɾÂw;0´Žã؈¬èɁÈÀGøޛIå³CRá΋Å^\\¼;&&¦–ñcŸ-Ÿj=4
öV«u';ø2ŽÉý¸d›¹
IEND®B`‚‰PNG


IHDRL(#õ,ñsRGB®Îé²IDAThÞíZ}leŸÀ6¡|ˆà¢"‰@Ö°YÛf B»¡ÓdíîZî®+n8!CMjBǂԀd?þX7‡"A BŒ "ȇ	®³çó^ス½Þu-+2²¾ɓ»¾÷Þ{¿{î}žç÷<o¢iõ:	þ]@s‡5ëÝÍtn¡¹ƒèÈqÜÃuÐl`’Ô*“€„¼]„ÎEnhâ%Œi&ñEº?ØØÓ2Üþõ&
ø%¤AàAÕÕÕ}à=æ|fÅ9ñB¡͑׉©(=dÖÈðÒøFCÚø„î´+e£!7·¯ÖuÕbc_DG«/µ°ţNg2cu:‡‹'G·ß'(¿¬¡ÜwN9™øÞ{dQÃU"Xö
êá® :ùÈûѾ™ÅÆÛîŒvuö´¡Ôëݞ۝Òþ°µ ;DGš.v"]ânåÊÉÈs´ÔÁ^Ýè·Ý^ü¾&ž#ñ×%•‘ƎíE¶c†ûŽ7,<?Òbãˆw£sz¡c†8Øç½û¼Ò('q7÷Ãñ@ÐìY`µ£#,سZ“Á"ý‰ìGG»Ý9F¹`KÁâOÌÝjÍǻ9/ 5ÃzzoC~QiXꍺ<M§x¦A>Œ	 äÖH—³§Ž–¯åNë_¯םìjqîSúÆç‘Ít2N$m5ƒB4˜ÁÛj!°³¨ßJó%’ýA$ç.Iý‹lÜvîÙ[µqKƒ€çتF”¢ØÁ_聢0Ü'dpPÅ|jDíµØQ¸\®>èG8è»÷z剙-†Øi¤zL¾>S²V6OŠDcÁ׸œPÇ]”.ºA‡ãQ	h€¿ªúIØr BÀ9‹fɡ»¨èÁ€€f+H`ˆË-©‹E£Yvro½·ÕtÙõzê#•ßS҈•õÚi÷\P¬šfeX}AQíZI㬏¨Ýge8k'Óåã¤
@þÖ}zm È,Â@íl¤–73Fi݋‘}‡cêcْ‡ºÄw&@éuû£½W
˜v AŒaõV†_UÀð4Ií-Åѕ÷¡~1óõ×%gã N˜]Ñ6AYä”ûf·/½WL`¤8(<Ï!hߟüÓP⎂½Ôç÷&½©ÌènÉScÆ-&5`(g…æ~ÄDöt Gfç=±†kÂZe˜¢ǂµÌUŠ?ڽIùÑ3¸[35¿HyÜ~ÍÏÅ×KKKÂõ½¨`Áõ•r*Ãp'@“
äº!ŠÏWg#Q¡ZÆY離ÅŴÖ
iáD¡Ï(°±&‘sIãyžO!@Gã‚ó­*sS'½1ї™k¥„#‰á€ˆÕ!ëˆæ?Vä¾H“ëEê´dÉ 5.¦à`æf|žöY™ꙕÍ#£m^Àm°÷K5™éؔe%D½UÍ~æW?ӡEӪsÇGã.ÈRI­4W –“,tÂú%]mþãðikÌH§÷é<ysoe´0ެIŸ‘_ѣ@¡`œVÇ[¼ÅۭkbÕL܆¡ê MéÐΨ3@ȗÕçÎL镊•dÐù¥La%Ê݇N¦ٵ@êµSÞ"ºݭiÖ􉠨fÕ°žòÃqKƒZܐE½Ô`L³ƒbÖAÚwAg N…Kó"Q˜VfىÀ׎Šûü¶*«msÊüƗÇ_
Q”úHp¹úti¾99É7ûìHÖIÝطˆÂäí)«uƒ†ù½‰í8k^3\hÈNm‡•”ú<?…)/“	:ý‚³
´›®nÂ\$‡Ѷ<Ë0¯ŽÀ9äc§\aƒ¸•O³­¸cûI	e²+Kû®Ä´&Òʂµ$ËÝjè¶IÒüÒÖ$VD-*n í5¢o
¹ç)î62ÜÏĊ|WTðBçS„i£É÷îWI±-Aµþ]ɥJ…ù½IËc¥0cyËüØ9}n?Ã8Ž.ë4c›Í1É=•$}qτ`“ܛ4ŽTÖeï€%›3þÉؖ?D
À«…ÁƾÉj¢/÷ý¢°ŠÖQ±2IeC//|&R…+6bœJó¬,ö5¹_Q¤’Ûño‡V~¹mŒî™Gì™ü#îÚ#ô3¸}ûB”å��Z6ÞB˜Öwv»k€FI§XMagó«ä9lü¤B;ŸI”…@yLl˜-·íTyNú–ÂA˜ÔR›Œ¥ªsë6-¸0½r½é¾\Ù+÷ÕÄÚé+ª4ïÈ/§؅UБëZ
“J›_HJ÷qM*ƒ¾ˆÜêܤÔ*óWZŠëJt
;ž^}¨q–»m⭈’düÁmt`_Ä^C¾½,ôïAûð’:NaRAçÂO~}Sá~jՂ)`–;R=¦]+Ëܐê1/‹ö)PϏ³Ò|
£½Â}Ð
^t;˜ÑI´Ç¼[d±=‰ç'£¨Âlÿˆ·p¦Íp^IY—JJJúÇ5.pÐÜ&‰kù£¥+½®‰ça¸£Hɍk$ÞâíŽkÿŸÆås®½×ðIEND®B`‚‰PNG


IHDR@(NÎüéìIDATx^íšÁJQ…}™°•‚†.zß=¸ÈZ»IÐGЕÕN!ÛÔÎ6ãÊ6.Dg …Ù¦ƒcHº9Í!bˆ6¦.º3¿ppüïüÂù`î=Wo`44MÛstíhæ׌^é™Þi>Øjµ¬~¿áp§èiÑ#½Ò3½HƒúI½^ôN3RñÇ3Ì	€_ŠÞ	ù|ޗ@ €! ”ùøˆ·«+ع©>ŽŽ°
‡)^³Æ1LªU˜†áf§ûìËhó“L./ñªi0ù;Æó3ÅkÖ8ûô”÷򝽛ø7¯›àð¨Vårý>ÞËö6Š(—ós@×7h@¡«TRÀÃppL§[säwpžßÝ) “š͝ñ×jxO§H‹ůr¥R¡Öüìêåé	ËXL!Çǀeù@6Üßïî¨×{ÚíÝM‚–õ5	ÞÞ*¸
\ʶ_‹E5ƒCÃ..þ„V+ö¸AHñ(ìÆÛ\΍ºÎq¼0»]7
36G"nöÐfˆÝÍP<ŽU(D0øH&n†Öø¿S¶Ã@@9 !Gdö}|Hjÿû˜\4َàqÙôJÏôþ	g‰W«,}ëÅIEND®B`‚‰PNG


IHDR@(yÛÆPLTEÂÂÂÂÂÂÂÂÂÃÃÃåååÂÂÂÂÂÂÂÂÂÂÂÂø==öQQퟟååå휜ãããÖÖÖòrrÂÂÂçÕÕókkçÛÛéÀÀú//çÔԉ‰‰æÜÜòssæÛÛæÚÚójj뵵æààöSSèÍÍçÏÏ~~~ô``÷GG�çÖÖù66ø::ø;;æßß흝ø<<쨨좢붶÷EEòttçØØ꾾éÁÁÕÕÕ봴ú..ù33ø??�ôbb짧l%d	tRNS­'ñïó%(òœ
·ñIDATx^í–ŎÄ@Dݙ4†™a™áÿjµ§ÌLïÅñm•’|©ÓÚ.µ
Ì^EÐ25[U”í4€£z0l
Àn‚§Hòp€޸‚'	®|¨˜ÝoûÖSºߧ±ìo‹pàQ^yÄ-`$&—Æd<Ânïz×Vo9@+Ý[-€M÷×Ȳr”ên€ãšøúֽæ	ƒåK|Eq¬ñ$‹Oσ4å:ÊÅ.8Äþpè?ËåRá§+voï•ëúGÒóùù ,
à-±½â´i%«
&ƒŽWQ`æÓQ‰“VIEND®B`‚‰PNG


IHDRðð	‹ úPLTEUªÿÿÿÿ?ƒÅAƒÅ@ŒÌ?‚Å@¿ÿAƒÅf™Ì@ƒÄ@ƒŀÿÿA„Å?ƒÅ?‚Å@‚ÄI’ÛUªÕ@Ÿß@„Ä@‚Ä?‚Å@ƒÄ@ƒÅ?ƒÅN‰ÄGŽÆDˆÌ@•ÕF‹Ñ@‡Ç@ƒÅ?ƒÅ@ƒÆDƒÇC…È@ƒÅ@‚Ä@‚ÄUŽÆ@ƒÄM™Ì@ƒÅ?‚Å@ƒÅK‡Ò@ŠÊ@ƒÄF„ÊAƒÄ@‚ÆBƒÅ?„ÆB…ÇI’È@ƒÅ?ƒÄ?‚Ä?ƒÄ?ƒÅ?ƒÅ@ƒÄE‰ÄEƒÈ@‚Å?ƒÄD‡ËB„Æ?ƒÆ@‚ÄI†Î@ƒÅA„Å?ƒÅ?‚Ä?ƒÅ@„Ç@†ÆG…Ì@ƒÅ@ƒÅA„Å@ƒÄ@ƒÆ@ƒÄ@ƒÅA„Ä?ƒÄ?ƒÅ@ƒÅA†ÇAƒÄAƒÅ?ƒÅ?ƒÄ@‚ÅF‹Å?‚Å?‚Å@ƒÅ@ƒÅAƒÄ@‚Ä?ƒÅA„Ä@ƒÅ@ƒÄC…È@Ï@ƒÆB„ÆC†É@‚Ä?‚ÅB„Å?ƒÆ?‚Ä@‚Å?‚Å@„È@ƒÅC‡Å?ƒÅ@ƒÄ@‰È@…ÅB„Å@‚ÅA‚ÉC†Ä?‚ÄA…Æ?‚ÄA‚Ê@…Å?ƒÅ@ƒÇ@„Ä?‚Å@ƒÄ@ƒÅB„Æ@‚Å@„Æ@‚Ä@‚ÅC†ÅA…ÆDˆÌA…Å@„Ä?ƒÄ@‚Å@ƒÆ@‚Å?ƒÅ?ƒÅ@‚ÅA‚Ç@‚Ä?„Å?ƒÅA‚Æ?ƒÄD‚Æ@„ÄBƒÅA„Å@ƒÅ@ƒÆAƒÄC†ÈA‚ÆB„ÆC…ÄBƒÅ@‚Å?‚Ä?‚ÅA„ÅAƒÄ@„Æ@ƒÅ@ƒÅ?‚Å?ƒÄ@ƒÅFƒÉ?ƒÄ?‚Å@‡ÆB„Ç@ƒÅ?‚Å?‚Å?‚Ä@„ÆAƒÅAƒÇ@„Æ?ƒÅ@„Å@ƒÅ?ƒÅ?‚Å@ƒÅ@‚Å?ƒÄ@ƒÇ?‚ÅAƒÅ@‚ÄA‚Æ@ƒÆC†É@‚Å@ƒÄ@„Å@‚Ä?‚Ä@‚Ä@ƒÄ?‚Å@‚Ä@ƒÄ?ƒÄA„Å@ƒÆAƒÆAƒÆ@„Å?ƒÄB…ÇA‚Æ@‚Ä?„Å@„ÈD‚Æ?„Æ?ƒÅA†Æ?‚Æ@ƒÄAƒÅC…È?ƒÅA†ÇA‚È@ƒÅ?ƒÅ@‚Å@ƒÅ?‚ÄîގýtRNSҦýšüŒvþùûW÷ñø„ö
 ìúP)ðëó	ô
ÓƤ»J—#YIàî²ÞÍòœ%ã­"6}ïˆSµá½_(¯Ür·H èz¥±§7'–¹æßå³T†çÎ~ؿ.kQ&íy¶´é<€5֔,>¸/=ÝGº+0a@[õÇÏÛp“ƒ9CKh©\g¬ÅÚ×Vĝªbâ-4FOwo‚*Z:AB¼ՙnNt«u£!q•$M‘ÊÙx¢RlɟËe¾äXêD‰’‡fc`Л‹®Ș…dÔÑjLŽŠ|¡2^Ì]81Ui?ÞEm;3{p¨Š'ó[MIDATxìA€ ý©©€¹·ï()«4
àOXh;;g:ÐtCӄ¦»‘’ˆÉ%ƒ€€QPƒŽ9ë˜%+æ̎aÌ:Î섙<³a÷9gÏÙãÙóޯê~U]õݯªüýÛ=}î½ß}ß÷V¬ª­:ùǭÍÙßÜ|˃O^:a/~¨֞zî³E›hQ·|Ö%}[‚–Â5×÷(§{g½ӂ†‚æní>†bì[¸q.ëO‹ÓÙûNT!ny7'V³ÓÒÇdg!MükÃTý٥ˆ7¥çç1s·"ž̙žÎH-ºñâʻ}tÂÛˆ…_ùè”E[뼻ºÓAéŸ#¦]y6d	bWɺdÚK½w{Ÿgüóçç<ðþš߭~õëëÇLNfۆ!FÝwmԌ¹ {g=üd>ºfã­e´ё˜ôN>urÆýçÁØðîœrqµúd!æt¥FÞ󧲂„Ý?ʥƾH1;og`·Y…Õöš̀:~‚˜rgٳ®Ô4B³ŸåEìXíc¹KG!%Ï-c ç%!V<ÂÊF¬B˜²VeÛJ<‰��Hzuý½yb@Ö$ú»m%"T4‰þ.,BÔeö¢Ÿî÷x¹›ÚègHÔ§¦Ÿ[áˆÚèçŽO]—Ó*ï
8¦b$­¾,A4 ÕäßÂA¥oÒjj¢ç­îî;)Ãúè3tûÞoÇøvïö¡}N4·x`'éW´:æE´Tøhq	ôê}:~Òڻ5@o|:->G”œì Ê÷gè4MY”F­ô½3Š sS>-þ„¨ÈXNUÞVû“‹’DêŠ{t»áñVªr[
çSÕñ$ú䆑ɞ®@@¡ª=ªºá¤éó:†,-±”.¤êz¸îd.å× €ú¥9ì”ä§‘T—%-§"õ1ðìvZÙÇ^øۜOEõ¸ëLªÀ_ïKÃ}ð÷l2‹áªÞuTŒ†¿S릜›áïcª„›†RÑ+VI݁Ãýá§êáž~TÌ[«ý_2"׭„UÖ>*–Â5Y“)ùž€Մ±´ãË}oÀúrÚÉÝ
«Á”ÒæÀ-¥âX
/£Ɛž3ÎÙRŒÿ“q|ÚÃ}º¤2°¼×a՗ŠÃ%ò)KÅ5u$}ñ‘Áð3êοç2ßX%RÑîM)§»ó@û3£ ¿k§2€{`Ñ¥»àŠÆû½3—þÞ=[•ǒé'ùÙ ‹z7Üð/”®ˀjØ2ú¹í ‚j™E?ù›a1ŽR/¸ `=¥k j¼ŽVÝwyŠCÒjä¨&¤Qšíú¥òyX̤լB„(ó,-ºÔBµ”Ò@—u.…äaP EÎGè„l¢E"TÅeRW´lJ¯A5¼œªù+Ñ)hѪ.ÆSðUBQÒFU—‰è¤ú‹©ª)…bU.…îI0«*Ýn¦jÑ*tZÂo¨š	ÕRW‹¦”þEe9
õƒ·'U¿„bÔ
CaÖr
Aõ.—",Iۨh«…â
i0i¥
»óŒïõF˜J~oÛÞßAéf˜ô¯Ê2!¥\F)y3ÂV:’Rî*(Ú)4À$%ÓKP,¡b#"°†Š_Cñ0…Ô3`N“ݽn9¥í^ǰe%¤SXs£ð
͔r†!")Mb1…óaÎ 
# ˜Jégotm^ý/„9WS©)™ÂäDêǔ®‚Tè£p6LÙ@¡Úi
¥ñˆؿQJ´9/n)»l*³O)ÌO@äÆQ™©…¹³…†´ÅùËԟÅÍîlâ»(¬„t”Bn-œЃÂ HÅòԞCº˺Ìé"
ƒôV®†¢Â˜Q¨ï‚'ÔPØ
Gì÷Qؠ4=3êS¸×gŒ£°K»<
3~NáHœšQ˜išÇô‡úölO
×Â!—RxÒq7&_è·ÔÛFn>žjyôCJɑ(LPOÆ|/¤yë€c¶ShÒ³<0¢‡¶TšHaó3
ÑwOo„òIÎï!m¥ð2³šÂ7ºR¸FȡÒ
H¾ƒcާp&¤§)Tˆ4méð
p̣їÃaB&…ó }GáӛÂ:ýÐöLø„ÂWÎ4ôïnÔßЧ¨‹ʄR
Ý Ý`hC%P8é#ó-€³)üүպÑ1Yú]ô…l˜P¬¿Ù>£¶ŸS¥ïNÎ0ÿœÇ+«µ/ §p³–Âhý òßaDµ¶^Cá1ÀHõ°Qÿÿ>!âŸַŸÀ17QX­¯Ï6§´³z@s­~øÐ#öÊ´jåö~Žé©ÿ¾ÿ…1WC3 ÉÇYu^8årJXi¾¬UaÆ1
WBšDa-’!oïmJRå[q˜1ƒB_ýUë
8dš~Òq?…©0£‚ÂYúqÞ\#¿Õ]ªÿò¿3ÖR˜¤/kҊጱ^׿½øfx䖺Š~Eu%…òþÆP83”TÉY>0°¦_¢°ŠjKːÞ€ô
©à€k(Õo¡…î<
ÿRB5…Ëနv@zǝgâ~as)ªiDÄ®¶UiSV%ëWÑáVí3”6ڬ§~0¦Â=6çtúD¨°•BÚý7¯îl⻡øŽÒG‡<НÍnaÍ˚‘™
jèà·øþtJ›õEŸƒ9žV›ÖÙ˔Z‹‚ɔöAñ”îƒAwSxŠ5”îòD^kÚd‰ædohS^@ŇÛ.*VÀfóL‡Ig'SèEÉ2*þŒ0=PN)õ~(n¦ô:ŒH¡,Š#TøîDX.­£bTû(lJ‚Q§hӑMh§"mÂPٝŠºR(fSúfyRè’EeåãÑi˨úª™”ðh7Å:@‹KÐIæSµªÇ-ç™i¥©Ú2¡ðŽ£Å-è”Ù>ª~ZÕ"J}aÜ\Jÿ„ª¨•ŠD/)~üU¨UP5SZŸãΡ´©ª'ʃçM‘Frèþ?•÷SJë`žçû7Œš7kî÷«uGÐÄÇ`q-¥¼ÞpÁJùƒañH¼Ûø½MI¼"ªÂy”ÖÁ
ÞvJ
)°èiŸw*ÿ߹•¶‰/k„EWJ5£àŠ~T<‹„×ìò^D†˜¸ÇDûóƒ7À%£”·Þ˵y3ÇP±l‚6ñÞFXŒú)¥Öᒫ¨hO€Õ׺¼ÓbÙMâ^%°ºU³´̛JÅYðÓ/pށô3o-Ÿ	«ßQ±¬®™“C)5!IšÉFHfçPÑ.:JEÎìòþ7~â¢s©˜7y¾¤âܢòN¢Æ{'Tñ§T¬o‚«*ó¨èR4ïÔ҂ RfRu-\ö*Uc’`+a(m{/R5nóœ¦j`†mÞ[ië^ûģ©j×íȧªW½MÞçÄØãÐ{QZЊlZü­¿6ïa5¶ޯhñ2¢â,Zœ.D@žÿah§¼E‹^D…w-VÎ;‹!™¿ü’·7"JŠ»h®˜
OW†h~‘æť¢z¢¦´{yÏcÈÚBHìë‡(ښ,oJOvÂսƒ&ž‚¨jÎ’÷5vÊä+‚$¾Q6-Ç6ïoHG@Ô=o“w:;íºý6‰g Ê׿}‹a¸ýlm⇞Ø8¯÷ïË+ºÄÏ!FœwÃôÊDr?bš÷3†íÂ&Äo"#pGÜ%ö>͈\Vgyû0BOÅUbïùŒØS?^¢¾…xñ"ѣ?âÃn:äićqtHjâB+2
ñÀ[G§¼¸Ð@‡øÎ@\XC‡\81ŽèR€8áéêHÞ3€øOÿyM%þ_òí˜@ b K„¢3?C×íÇÁ
H^]œ÷&q^_œ—Þľ7±ïÝÅy}q^_¬xûÞĸwçõÅy}±çMì{ï^Kœ×çõŲ7±ïM¼{q^_œWûÞĀwûÞľ7ñ]޶W÷Ö÷œó·ÇD€0À~dffA*"ð[½k’»~9oh
(ԵT>T¨ìFIEND®B`‚‰PNG


IHDR  szzôgAMA±üa;IDATX	c`#=a”šéù÷ÿÿYÿd`b4#ã,Eñ܆††_rd
0Áô´¤ðÿÿ´û_HK+„飔†;¯ÏQm±üùïÇ٤ôlKTaòxð(ˆOÎøOžÄëbddx÷Ÿq#{þ‚	>€t²¯r•ÿÿ3ã1îÿ—Ÿ¦%LDDåæmã˜âqÀ†ÿ¢ê˜å šèX8w##kÆÆ&VL/Ñ€i 6=êxœң BŽ>Xz‚’ëXÜ!Ç'2›Դ4tBæsB>$V,Ô<O9ÀÈÀø,´¦‘í‚GÁF†-´¶n>#Ã&ž
í´"`S‰™‘ῤéSB=Ô&d``ÜÌÆÄWL=SGMê!y&X7 ˜ ’IEND®B`‚‰PNG


IHDR  }JbsRGB®Îé
IDATX	íW=ˆQ~/ÉéåÎàqB6äç8±Hsr…XÙب`g%h%l.v’ò„–"–‚6
6b'"Š"VêUç…lÎK„ÜÏìîsfu–ÉîÛü
НÈÌ|óͼyó޾Ý5²f]¡/$HÈtö±1„Âbْõ”s½¤íÚJÆóʐw¸u?F‡ҮU	OßՏ?E®d}VJíÇlT ê~‘ëUcˆh¢¤á€ϒŽÒ'ðUäMë‘<Ba©qœ”®P7ÉöŽë>!€$ÏHØï‘~ŸxzÞ3Žóþ®M@NZöv}%s€p.µ	råͼrºkœ;´Q«fÒ=¡Pþ+Øò… ‘ìc‹FâÞYéݓ€J&g””Rހ£s	ýþIȕêÞa
â8Tx‘Û¹ÞÓDZ‹®™@܁³0I’~	Uj+À$9³þ޽¨ëŽ0â8v]Adšgɚ[(uC»„œiµ”PÞ%EAI9m¬VS
²I†*€y9ŒäŽڶ(ˆ˞Ŋڣ”¸Î	\‡äϸzO‚ÖV£$p’/ÌOG9æ'€ußJù6'qÝösnû°îóÜÑO‡É^“ßO@ÀPRŠաxÿI¤ÚGI7sÔËNǍº»t܄Ôaɹ´a7¼ƺmøZùyU&mN¤ŒډYîáÆÐàéø]I8õö&ŽNŽüÍWZ3JÊx0™’b²Xiìâƒì‘
(,ÕÏ}kï´àÊ	oS­¶ÛΖë§MÊýCm|È|©ñ®«<8J‡¤a;NEù9>°€¹+›EÇ龀›8ôFæ‰Bº۱DláãrúCÈǀ¾[ÿ,–m»ûväÉq%¦ݮû>kZWÙ|!UہÃåTÛqÞ{>1 …|—I¥¼¬È/ÁðP…RýŒ£Äý ñWØñ„<¹vÍxÄs…¶>|#¿@xà8ºc‹»xP©Xü ”H”[Aò¸6´¹$åԡqsü»qß¾wôP’T“IEND®B`‚‰PNG


IHDR݈pûPLTESSS¨i'ÿtRNS@æØfRIDATx^íÑÁ
€0CÑpbFéhéhŒÂPÅX àâ
ùK9ä]rÎ9ÜZ*Þznû­K‰)RN`ZzÊIȔ(9µËÐově.óW4¥ ƒðvIEND®B`‚‰PNG


IHDRV@AW_±@IDATxÚì{tÕ}Çw»«ÕÒ,ÛòۖÃÃ.\^Å.Ž¥„„òø£vI)à4 §é)1!BO9-9¶0y•ÖjNJhBzì<hNÛA¥JClCjêGŒ`DzY#ËZíÎãöޙ;«ÑìÌî̮,­´¿¯Ïxwçy��ùÝß}J) P(jü$¡	P(
JB¡P-Ż‚2îùx÷‘öq¹"ÃE”B›D`‘I!	jÙåT
f߇Ø÷“†	o7‡GŒŸÿ×cËßï´`è…Bk/hƬëî=4·.)odg»‘ý\5’1ã]\ËuIêÿ`ڏ²LÞe;<?¢Ñ'SgôçûvþNÙTD°¢P¨)ÖOt^S“þR7àڳC᧧ù<Íý >Àóî¯*’qé]æÍ~+«™;þãÑÏ XQ(Դëu÷¾ª.)=–ÎÐ+2š9>*øÀÖíµúíË=Ùdœb?¿9ҾÄ<Ø‚…BM;°þþæƒM3äºAîHgLbsæ•–VÏþ°u5rV§ÞûÈÏ XQ(ԴëÇï;´&—ž:›6çS~\~>Åú°ú……â*áË7OœÖ?ϼW
JB¡¦4Xoºÿ`7+ðÿõH–ª!’–´0X}aIC‡œ}[ÓP+÷
›×ÿ÷חÿv2ÁÚ}ÿƒQvobK»ëwŠ-}øH¢¦ª¶m} TR;֛»ßøšfЭ#YSÍAŽÿG&þ0ÙeOíµ	é•5Ÿ;xÞ²=‡ês®e>ŽÓBž&
Áªž`^êݯ ²‰jy–/9‰ÅìÁacI\%/1¸ž·5	â%}â%É?w¢I¬¡tý~ñ•tƼÃ0M»°/<U:¹LÍihĜW¥g¯¹û`+ÞZÔk½ÇSíbKšÁZPûܫŸ1ó:ƒ*µ`:¦>ß­9ù„JK’	é™öMoÄñö¢&Øcõ
J`
ÖÚϼ²RQ¤Ç4ݴKü9žº`ênà!à:>»øÃõ¬qIsƒòÞ^Ôª×ó+#¬=ÕXMRýq:c$˜Žê

O֧c@YðŒHX¾{:cþٵ÷ºo1j‚Ä!ºAv7[:\QÖ|-¾`鿩ŠÒ¹â?ÍUZå¼V:êµÒ\E–t“Ð
2¿mßôF
ÞfÔÉêôV¬ºý««jkëæ,šF63¶ÄOyS'3R:괊ýh$Ç3LûҨ|>›16ÖÊâmF¡P)¥ÐƺÚÄYH¬¶ZZêáäÉ!b¢NˆŒ¥µš]Ùë­&­Äq\É׵>nÂE‹c°`–
Íõ2Ô'ÌÓZֈŸԵ_ɾs"£™”ˆsûhþ›äàk7˜•œo儝bíaÅW‰ª
¹õæûö÷<ýåUoãíF¡P“
ÖÛ;µ,WVj†
­ÙKCjà504Æ45‘åé0–ÐÑ!£Þ%±ºb7^ÕW]<ƒè¾T£ø´Šì©Á,ì;‚=NC†ç%"Ù»¬Î]H±€Ë?%¶’wøâÿIláëø>²$޳ÓSÈ=Oloãußÿ o^Óùµ¿}b)7ÆÆÏÛî9Êuþ(òöôê
Øo½çzý¢ˆ;Ñé
›f¾½ÃÇþ½!ÓÛckôK½wQzҵùظ?âõ¼sïdۑå‡<;nÛúpUƙ»´nê9ӫ(Ê:·Ùz÷7ðNÿ»ÌkM€¤¨659Üù(w#ݿ٩g$)Üõ‰&Xû»yÅú3iM¨¯áð›°3g5xæåpä×ikÔ"ÎK¬ïHdEY’Yz$k½“~{;‰ª"¿?œÖænùä‚l¹]ZÅÃÓáÚ)ò‡«G,~ã9ÏÃÞé‚[—σž̸=àÜâz—¹2¾ó7müfC}bßB™6Œ=R®ô¦JLs§+£;ém+p½qMïõœôê!Å_&Ý€Wè~zÅÓíîi×-ÒEÞ™T²`û«	¬k\•¯1\uTü¶5/˜§Þ;Ù¬µʆ+µŠ"»3>€øQ‡î˜sfÚáƒ,ƒè‹G^9JáÈqöÛÈE uÀʅëVXÒÂ`[«Âú·—_?/¾6hÓ{£ 
‡)[$Y΁Ôòd©SaE`Ks}C⦞WT9ðv‚›EðÖG€ˆów…ôœ}K©nrgW̑*ò÷í‚pí5›Lx&ÞTâ½hçÙ)ìZìz[T6@†=Öy¹u”‘ÖJքۑåM®»«¬Ÿþ»n1ĽïG^ŸwþR8úú05Í™¤ª¹0€=
º…M¶޵ëmøîe·ãÛ/Q8=ì*Ðþ<þÀ1¶<{€Âêó>µ†@KÁÕ+›AQØs8ªªæ<W' ky°¶‹jÇ\%Çcµ¡j…Ø?E–þ¤œÂŒ.(­›âî2¡ê.–¶û@݁[g‰™k_‘EPQ°=z=ékòdÔ]X=Ó엡ÝEn¿°ŒcŸËÄgPºÉçåâ\¯¯„¢z%kRìÈòP_µx®¾­˜Gx—I¨Oy£vF#4Ϊ·¡h0¸:ØUW£ͮjU¸­5Õï¿Badz6TÔk^b^í–]ŽŸ¶×^¾¼–/N0Àò"¿lÅPeÙñZYñ_ëœmŠ”Xß.‘5O¼˜‘J„j{D8:ÙÃBø"Šc—‰¢Ýîˆ`mwAµ_€Ç9_§XšÅgŸOQ¯£„̵Ë=§øÛéZúҺÍ'4᤹Ó'ͽ>/‘õӼÅuL¯°M³ëZËÄÒë“Þ}.õï˝Vç\Û<¶é¤sbG–øRMvŒæ±*’´Š@Ÿ·t	|ðþÿ²ï²å¹î)*ª¨¼§pËGaq«Ý|ôG,[þd9h0aú€­И¸æâ:8þÒdM)ç±ھ*qB½¶§*Ù눳= `èWÄ~V‚vùùCÔW-µ¢ÆyÐ7(‚;±»}¯¢ÂU4¸3W“+ÍÝŽ÷†CúŠ„#zÅâõÈwŠõ©ˆ6êŠ=;öi÷@¡XZSÂàÀúכªë9³£¨°êÃhNg;†÷Xo|X"2i,4°Šœ¨Öùsr±W, ºfÐ:ƒÀM״X›¾ðƒ=´(Tƒ¿>5ðøó"æ«X¹Tµc­Âcå1Vs•ÅoEÄ]e×vYx²|aý½CÞbQTËUªTÝûm÷ñZKÉ\}%´—f™ªד†®ˆéîwo‚ÂaÒêçmM·¡'Ŏ¢ôW}`•ÁXh£5Œ®NUc`8sѐUbumµº	˜®†»|œ}øw^5 (T<äýoSxí×ö÷ãìÜԮ¼²àiÅN8%Òъ-9°¿+ª|a	6ò«çAÕyˆSöõeTm‚h_>éˆ7Ûîêsa£Ýë¤5åó¢išfyÿœÛQx®ÓݎáÀ
`žW¸‡”#‘aÁÒE®-Ċ·®¾Ď¿>ðöÉü8m T©ߵì•ÿþû“ƒta³ÝÔ* ²u¾;ۉhß*b*ÁFëC¾ÁÇC½÷ï/Ókí)!l±>DÆ+ö7ºÓÝ1Ýam”
ӔjÛéæi¡'¬ÒܰϘÕÂ{g1o•á˜y®³›˜7Ë«eï[ùc\…ªÔ_ £Ûßg7J¹
,IÀ3XI´ouڰæ_qÄ0@‡Ï[¸¯��¯¥ï½ÔœúÊÈlåؿom[éB;N$X™—X¶	=o90ÿüű8ÌÎIŒZóDyPu7ä7¸ß:)`^KF㦲Ý+hž.šÿ».¢}ÚÊ_¥¦@æj§ÌÙW伕d£é(´ã„{¬„$(Q(>ðI<Y-sš­Xkcƒ:zç†=¡ƒ¡J=çK¨N«¦’¬šèѐÊi¹0Þj«P¡·Š'դ’Ÿç´ð±ZÛ°bø˜áV¬ð€·UA©Pu{¼Eü¢ުåùê”àY^flTՅ†¢ÎaEdæ.žœÑsëkóÁ\ª… <CŒªšÑÊú{‡𖏫zÑ(T¸P0Û»4Ïk…A#wš%3B	 J\Oî¥.id¡c¼ְު,öL™öÂiÇÇhÇòԄ&˜j`5Íã¥Ì6Åb‘êgCJx­«ÿxB@ñß7 ¾,ŸŒÙßO-½4ÏN÷›)T\®DõŸ£ޏ¦ÅӴ«nң¹©|?ZÚKMcì9tÖÚÂGªšßä-à¥úõºîb"˜ðÛ3r‰ު¥#eføj ÇËíVôX«
¬J,þ«Âc–·à‡í¯FDn½’rZCAõ‚V€«D³þwN1ä@¨õXMz(Êþ۶>œ×k¤ZºäÈ;t©]=Û}Î[Íj;Çû£&¬O~6iš&êÊê,×~LJb°ÿ-jÅ.[ʽM z‹þ~På`ßýQ{M3áȀlœž"Þ*oïúR	6òö,êªògÆk¨#Tu@þÕV	VN	|§"X¹Ã|­<‹A÷Çû‰2˜¶á¹q55†ðR} úÅÌi°¿ڟ…¡¬"ò£­Ôuã¬$K{K°‘7ÓwU¹×Úã“ɣxPÞá·W¡
S>`
kÃôX§(X™ËúýrN:8ðOÿC@7í¦üŸý®æ#TÑ0€ûÇE¾òG>4[¼Þ§áxºÖ>&l\5?ñŸ×Äõ¨˶­û
2ò\¸N·LÐçñZýÆu
ÒNÈ«§
óßÀÙÛB†Pv!¶¦(X¿óÏ<<½œÿò87^ ¹>þ<$ðøí6\N`^S>õ1€+—<x#‡n&Ð"úH½rpúO«`P-®ê­03é÷Êøs¼cH6	¸nóOŽ…CäÍŠÊSAÞ±œ»
xYÏùlï†êmyÑãR	šæÆ$ú9ñ=Øb¥¢8畡{E¾:ÊɼÜ;tà«?%ðÇWRXØ̊÷	öô|˜/†³gìšþd€OJ ¹êºF²~òó4~7+WÌÝ(-@í0 Sž.ÕH¼‹ÏÙcgpö-b@ßj+Êvº2ºã™ï„ÑkÝÐõóf»«Ô[uƒÕFY/÷¬­~ӤtÃèœ\¨©â±r难Ù0̂ÝY5Ärô^ʆ뮽ĚÓÊo—ºx&ÀÒY`ÅQ¨f4^8¿Ù=?íKÃÅ4EƒªßvJÿaãšøH9†!¨c—N÷âlÐÔ-®¥ÉÊ܎۫Ü~…osٯͧ´PÊp¨JðX¿÷ù–½w|ãô›19¶,êI½EvƗüì—1˜ž7`n…ú¸
Ôa杞b¯èw²ðï0œ6Ù1&\¼,g‚µ$Ušçy(ªòèx‹Õy§»…§ÚÅ㊻az×x;Sc‡™ى§F{º¿œxþÚ&<Ц"îv—íð_Á"ÞZz÷|·îX¯I¼ÈÇ:oyákèé4O˜|
#°z6h&)	ª4çyk߸s]Ýݣץãö7ˆ
,¿¢®3ïUµ=üm_݂Òç«6u€ß)ñ,1Çï`°rÝöµ÷_fp½z¼.T«od3`hºõÃ0t¸fE“…GÈ*U-«ŸPcÊù×Ä?8`E¡P(?:3œ¹^ÏdËj!ÔæÕ›¥†Ý6ˤ&ÔÇM˜Ù\STMÓ使îuC…B¡*¬»îŸ{:›պLØzêx‘¦ÕËìÕCÖ ûƒªÈêÿ|çºÚïâ-F¡PV®§îõّì¿òy­Â#S¿a©å]Ú}U4$kâŽÔPei=KÄîÂۋB¡*¬\߽gæ
z&s8J+ý‚M±\8XùԃzVƒK/lÍ(ªm@’åë7®‰ã Ö(ª²ÁjIM¬вÙcàÓß?T»ր<Ì`.YÆÛ_IÅçÚ
€ª–ÕeE¾îÎuɣxkQ(Ԕ+ùjøÌðÒL&ó¶…Cb ­5g¯&H¦Kç×[ã=—ñÿ$óT×~zmͫx[Q(ÔÔñX™~ðÅùIM´éé‘}yZ!ÜVï&«5€iÂ+’ Öç'¯øIgŽJŠt5B…BU‚жc-¤[wœܡÄÔͲ¢’%÷¼
º–…HÃÚ7C`£®/•7©bžêÉħ6®‰‡šÏ
۱¢P¨Š«
ׁլþ#YU[$IŽ4[£–†ÎUµ ©J$/•WR±´Þ×ÕY÷D”ô"XQ(TŃÕÑ-|9¦*›%UU‰"Â.kè:´&3péò¹–A.®³*›ÉfM“~;Q€y©‘»ù!XQ(Ԕ+×Íկ&¾.«òÌ{­‘”À1^øà( ŒÀõWփNIA ZžmFcE}úd¼&ñ%Ôc¥¦JB¡¦XÝúä#·Yz@"҅’,©6dGjè,Ÿo¢Ö$øuêÒ8x³ú0ûú;þ©X\ý!jºÜt!XQ(Ԕë˜0c'/gg½Lz)cëBhÕ3êÚKêuFºA¶Kš2Ā{‚Hä(Û÷ ¬({Ԙ²§”éT¬(ª¢
B¡P¨ò$¡	P(
JB¡PV
…B°¢P(ªdý¿AãèÐã$âIEND®B`‚‰PNG


IHDR  }JbsRGB®ÎéïIDATX	íW]lTEž™ݖ
bm»»ÞÛB( Š€Dì¾ùó€ñ_($ڀ¦»Æ@¯?U(­1 &ÆÄ(O
>`b¢ðB• b°&¼!$öo·{·…Š͖¶»{ÇïÜݙÞîÞB#1&†Iöž3ß9sæ̙3gfókF,ÝG¸і–®œÝ!dÍ'²Šè,ݚ㙨îxÕ4Y²fbäQ­¥˜5–\aÆlËt(LS3–þ–:Úx`=„U4óõ¿êlŒe¶Wo0cöçp²ß×ÊlçF[ ü…V4ÚlGwJŒٖž$V@x…1ɕ3n?O)ÄËDÝVTR=ƶ–5@£‰‘U¿ò€\ …ÿ*Ãý¬›mv¯dò~’qÎ~	IÉ֖t¦º£þ[Ô·7“ÿ͖•”™ÏlQ<Ñeñ‘դC™C}AÕ
Ž<ƫ«ú,îƘpé8‡•œhÿþ†^¸½{xÜÎR?Hj¥ý`rºp]½4¸ËÝ%qv¯Xj²–\ƺÖ3É
î@¿ϲÄè]~8aH‘AZ‚’k@´~EÝÅ\,mc–°G@Ï$»"M^ìÀëh—¯¥1f?…äiÇFމ¨÷rxu¨³þ—r½
Æ—šØdn ¤ØÇ?‡MÝ(¥¬%lÃÚHðÈÓ\oá¬]X_ÌÀê‰dw´¥|6ªY§ÎØyàzâY™xUfmˆÎz{S9Õ
c+'‘X)e\PJ(!ÑòTCÚmJGÈI֪Àkс½·Œ‘A¾‡hÐL¤’vZÊbÝrӔs+Õy“¨!€M§¯rn€žÉÎèÏ®wb¤Ý;˜ù促ßÇ3:ŒU‹àioŸ‘'PÚ=ôtŒ˜œpOí>ïaò¨̰w[²z¦7Ã5ïk¦ÁF<ó’Bu€-:?6nOáêyWa›,„G§sS +§ö‡?S2
 Š^aŽó¡#>ÀÄ#ƒÝáËñ›ýÿ6¾›èç=ì#ÛæìA­nðÓñbT¿…‰ëmúu 3ëHv2âNÀY–3ñ«⇒ï5üÒõÂÄèF8¿OhRwáÒðã·ó)•˜k:€»ò{LüéBñ«ÛGží±8ÕÃy5:x¹üôIԒFw€[½gˆ°9Àä'1ùÃP‘€xp°³á¬߬ª,Ðî''¶öÁV‚xÁŎ¡®ðâ©UTXæÅâäèp¾u®ÉIw>-Õى‚ùé:R¾¿|çå%jœ¯B:Xy±Õ.bG#ýëâx˜vòë”-}'ï~+¯ñ¾hÇƝq„ú¼+yK
T+;„Ûû9Ú
\À?É*ޚÚþMÉ厃›¬ԤÔWbžáJXƒ”|5¤Ž	öà9ô¶;µ,)>Íf¶!Æï`¢[™­H¸Hé®?k¹Éaà轚ìŠnRv*Pz^¤:êUÿŸRzÏæeáB„†£‹Ã+µø„²7§JèÌöà
žê¨Ozå~¼m‘,ÿ¥*Z´UˆäåºótàR£tòߠ¸¬.3ЇöãoΜV*~‡z€yôâ1öš÷1æ‘Í]¼J^žþd&2›‡=‰ÕÝ'¹4ð\©AÚ1"#{¸õ{FzíÜäUþvýQÖ7ƒIEND®B`‚‰PNG


IHDRÀÀRÜl9‚IDATxìÓ0Â0ÿž™%w•Ðn‹ôkÍǠ	€À`0€À`0pw}óm«Šãxî9'צ’{MÓýYkb³¸2蓠Ĩo‚O*ÓŠ¢8S!›Fö vη™:T|)t>Nć@‡˜¢i6>(Œ é|Q2IoLü}{¹åšD½–ô¦÷³f7ÜÏçw-©ÕßÍĵœPˆÃDLjˆƒ­C¸„S¸…cÑG£}0Æ<ÄôÜÜÜñB¡ðÂæææùZ­V¨×ëß4
MӾw°/p—p
·pL®cp÷Cïoˆỉé\.w_¥R9¿¶¶öE<?
…ñù|wʲ|®qÙz9áNáŽáÎá
Ó3ÒMñÆb±;J¥ÒÒâââ'333sÎÇöG΂k8‡{jàZ@ûa¿?›ÍÞS,?ŽF£'ék±?3pÜSO¢:
îE#=Œ±‰|>ÿÂÂÂUUÃxÍYÎB™Lfm ‘‘qtäݕL&?p»Ý>ówúhm ´2R€orfggC©T*/˲ú~œê`?ú]hc~~>VÐÌ(WVVҊ¢í3z±;س;`uy½ޣh͌Äàg½Ùl6‰Dï7~:«ß~Wùìå‹W^Lûá‰Äë??zâôxìÄéÚ?ð‹Ã
¥ÖÃËSO/]}åÕ÷Ëùw/^»V«}µß!@+¹\î8Ú…`"™Lž¢ ¬„§Â_ýèÒç'“oŠs˟F×Ë[ÁVÛëñOµÃGÂ×wö)Úuê&®ïY¦û`jÏÒ}¯MNuºý{«¥­ ܑÛàNÁB"‘Hœ¢?úì><Z}ê_»öÛ×Ï>ÿvëRqýv¿? ©êƘg¼!ÜB“˜Ô܅KÆ×ú.h"¬ÎþŽ›}€ëyÿ‡4DÌ÷Þp—šnYÖàî&'ƒÛpùÌsg[Õê¯_Z=
¨™¨ChÈÎps:~ˆ16feÊåŸ.¿ôòòmÏ$ózýÛgtS]FôzäÜEò۴·›Ép5	
×
fÀu¤N„3è~Oo˜	¡#p3Ýpí:.;q™‡C¿ŽÂåøø–μ^ßøñ²•@3h
ÙyÆÃáðÝV>ðDO‡¯Þxk5ê›8¢	Y6‡ÙîÜlFûîëiÀћƒ—H:Á{ÁvvŽ¿ïÿD7\˜ÿÝÞ›B\ÆI`¼®»‚3Ó )obJ[:{!
×V>(‰vА@VåØ=ù[­v5ûڇ·ªê¡m.Ä_ìœAoÅ…ëœrb%Îæ½íÛæǿˆ-KØþ@BA,X	vñfjú¤¦nkîßͱ5]Ý=Ó]§ªÛA˜Ú!PâgÒg€ӆoÀï&m
RÉ(ùgÈ¿
áÙÇœ_ç}Â
Š&U«ÐN…°چơuh¾w(wž?äxvssó¿½xóÕwà×þìùuO~ØÁ"˜5ñS„C·–}	:œý÷`,ɎÄ]ãO&9;”ݣŽ;Yߕo{}`ç^⠸‚Å>5
BÏ&]bLhZÿÿͷö
@¹óì!¯®®^žKþÃaúýë·ï^¿zõŸ¸F'&üqvk
\6Ú„Då¶àð¥÷
eë7¹ø™”yW'ð}NÏÕw=‡e€`\o¢þ“ہŒ{դÜÌ‹6ʏE¡-1…Öo¿ùáuh®”;|È€½ÿØíý¿þrýâf"™'¿“‚˓'¬‚?̈́¯2É~<€Pb©­1™€.ŽžÁ2ì>CËÝ!}}—/ïõû´§ôe
Ë13ÆZ1‘&YݢE×ÔRCBóÐþ\n(wð`÷:߿{}}}£-Íä7b
62é{ äXéR8&xX!?¼Žaâa¯L6ýXÉqиò~ç)ԯñI~óЧïU¨}–=чýjÌedüƒ¥-MºFИª!Ô€)4íwòãßÿ;Á?ýüÛço¬dn:-– ÉgPc¶çgL@ØE0,!8\ƭ&L>§CRÅü!=`ML<ƒ‹ùaI}W@ÖmXïêWAkŸ‚‡‹@'4tƒçյ’–&-¥ñš‡öþ—âÿøøç÷«\[n%åükàYÛ*^ŸŸ•Ě0V	BF;“YI'òä5ù4×{Ûó$·ù9X|À>oy=õMßQ;úuÐE)×>\ç†U<—8x‹]Bj¤˜ê0Ê6Pú»¶ºé[hþñã_/}ÜÞÞ:€¦“!h%€-¬NYkAŽÕó]![Ozæ	¯$nK¾<g2giM2­ÃÃ.8©Äõ5ùïjß.ô÷«]ޯ¯ëÚZ·öÓúþôLh,¥ÃÝh"uI­64\µj‹ÿÓí'>úÐ*"h͠[ ¬Õ"!l	~ø„žÏ#!šÁÀ“
¿ɢ5†e`‹ålltk$š3l÷>·ìœ… ó®䜄Šøž¹–a}®uӎ÷£}Ö}×x¼݋©Ç>uéV㤡YÑV}\üfOt 
,ÁT?Žo;­N±&HSÛfë=ù¸â\}ް¾ö{¾íŒ³aB!¼À_õïŒãŸp­7üÚÇø]¸ö%YÀè ¬µÓqE2
š¬ژtª¶ÒZsAìý	_'R­[˜Y9ICƒ’>âWh[€³%«[@Ï&¿NF7õC‰¥gù:¯¤Bž¸5NÊnŸ‚Ãøãâñ<ù¡âÓ:9¬ߵ/*¹Ý4Fq€âBšÄͰ‰}Fš}n²(lÐ65ßɏGp wÚ-dMI“;üˆ¿ë¼dóÕè3™ø‹ñžê3Cw	Ñd)ägÃÉhÌq\ÇCPv„91îèY0ýs-„ÉWÆû|S{ˆGø‰ô™|[çZiÅ;µ”nÚöhÞÓÿQ‰,BNŽ!ØY{7'	œò#ûȵŸ`M”±?ÛÛI¿•¬Hö“ççE±]ÛëÆPØàد¸(Né+};?ɶ53HSË[!ûŸ
 ådßfPw’ß$¤Ù ^½	ä$²ÁFâr<¹sB«LÌÀ>/¿±sÃhs1öԞ„Æ,ÛX*‚!޶S[‡ÕÌ:öéH†l–
šáK“%ù£½}ê+¹O&~& 6“¾$ûZ$^琉oÀ
ŽçCdQȿ½ž(­kû6Ðø!^—hî¨õßì[ëvÚÊÒìqòÅ6æ‚s‰ãìïýß.H£3£¡íZ%
x‡œü8‘¼z͖˜-¨ªºzþW	ð‹­îú2aòàWA‘Áë[d<>Ÿ”˜Aߞ£-PwƒHdÁûÀ3d 9L®8àú8Z¿f’àšgÇßüUˆ‹ÜÉkÍyðKûá¡åI¯gT_ú;à`ÐàÌ@ˆ‚ÿ°1HC„`2 É;‰ –(ມ%b‘ó$ÈWY¿Œ*¿v@š>~¶<Bªoà2 ÉYà³:ƒz›e@Ÿ+z
ìނîCïÃdÈAU€È;F*l‰ò$ ;tÕ3î	pýÁµ
~ô¹àÿ3ª¯Šjï2ÀÐÚX÷WœU¼H¡ö\{Í”Qâý˜Tøþ.O„x>eZøbÑE^ïßxô5€êûÓeZü,ø!è‚߼>©þEàA”·?•­
©}¡ùÀy.s?3Yœ‹D l`µ¯¯Wžgû—žm_\‡B¨†–'^cÕ@8é¾v¼ý
 EAE²6ċÐÚ×ê+F¯"¾ÁVñJ†.b­ÂX3DPg{ú”
ðsǹ´ú>@³¬Ïü°¿o£ç?~¶<¤úp=|Í4¯,Ìö0€Uð¥öêËJ՗Åj1Š¯Š*œ׵Q«:1;Ä÷æû剟“²Y¢ó$ µÅu‡¹î	ð§ *jlrQÁ{üŠÍ0!շ 早}Ñ|E'÷Ù#°#ÀËò§óÕqp÷a±xy>¬¶›óa¼ûp³ðe9(?]íODP±Œd€ì‚Y‰€Ål ˜õä]$€Â›e0=RG]ßX€àwé2ìa¿ühyXõձE*pû‘Aß.`M5àWZ•Çðog?žŸ–ëõÇqQçÄñ1œÿóý°¼ÿ¿›YœWE"Ծ±I*j¤C2ÐÖj'eXw’{)¢‚Í2(ÆbD¢_•ú"ø²ïwm?*o…÷ùÛà'/_+À™T”o×ô
=)~Ui€_@\ͧ?¾=-Ð'ƒ`>Ç`0D¸ŸÄyW7S_eeÁÇYø^LÊ^D`$eë{E]$à>vŒ»ê—·B}#ìÊÃ~þ“»”˜¢³ÊßÌȃß9Ê.ùg~óxýxï¨ص¯«Sùc€<û'z³¾ŸŽ†-¨ñ¼ oç=>ÞMc¦¸[Þ̽ŠH¤˜I8Œ<–¨‡a™-œ˒ ­e®& uEáz࿳×ß ©Šk"=jÊ<²=~5©%\{¯0 ˜Ç��ªß(þ"*þj?:ɀ'éÙID3"LþÿûÓêãr1
$ø²Œ‹D8ᒽ?œsöÒâ:‘¯憅†›l…zü¦@Œª#’ñý
+†ëòü¶0€ß´
6žùºƒƒùɧ'àðƒs™¿|=,7AGÀ6ÿð:ØÈáNÖh»¹k,Ôêv2C"¨’-sÜÆω}ÉÔØ'îR=`BT‡ÀLü{޾Pëcã)R3þ·©)ì±çσß%`€ꃝh¿òê½תúY,o&³_w·¨“¨Ü*}‘@†H¨íf=ùñõpˆ6«ª²x%‚·þý`‰r$àšÀÄÀkòy+Ô××7¼ÌúHÎú ïÇ,š<üTäR7X"øüå|2ûþu¿Ú>ÞO‡ƒ¡kï{>p>’!†C·Ý>L_Âû.#ÊÒÅ‰à­XÆ"Y5K¨	Úkf ·ó¬â]¡«³@O€¤B¨.Îv}âÁև}Ú×Ü~!³2ÉêTթðo£Ùó·ý‡hMÅ’#@cpù9@Q´"Ê.!#u¿½Ÿ¾|Û}hˆPŭ֔"Aù^L\vß$S ³BYÚNz\©þ\hÕPŒå¬(š`3v{2àWmƒ_ômW'vn屸]Œ§ÏAyw|È&†¶ƒž…¹)$®ýSG²uÃáHw›ûéó—ýjµ˜Åb¹±FާE	`wˆ~Œõ@nÍa¾:cú·à—ýúPÅß]Ë%냾ŠbGŠàÏü†Ööñ}l`iÔÍb,Çn¹Û<Ìð]—wGÐkp]>x^ݵ„Òk“ñÐm6w³`–!#L«²,B48ï@$`ù¼Å^
~Mâz|ü]Ö,«þ¢`ÎY“V&ít ØÀêX«ªJ-“âϞ¿ìV»í:¿ËãKôdiTóV)Oé¬̳a†n·}˜Â65By¡Œ ¼CfÍЛ³Büv¸ÆõˆvDÜYõ·1Í'ëÃۏN‰$oÊçýi;³,“ՙ§ߣâo×Óñx¤*J>M¸¬ÿ§/ä9&Èf»6ͬÑh¤ûíCØ>Ý/oç“iÈfE$¶¯ËT#ZE1Y!ºÿù, Ԭì	ðþƒýOVý©ðM"k}bI#â£26Àq7óü/Ûån?(©S —"(ZÀ'C£)·ÃÃó¡›ËóÛïåœàÇz@G7Áöëh"fÕñè*_jÕds/”UÈ
Áןaý)ˆ;]¼"ô}P3ÞßB©o歏ÝղéÚ֕–ÇR# óá4ZÃîa6ìtPCHIõ…<kwœŠ
"]ËÛ"Î BÙ	¯"Ä1d2÷´_O_ž÷«˜á|øÜÁæ%kä},|Œx€î\–éÊ5٣¾ð/L™¸¯ìòÞÕ2CÎúÄ׭s[••V?K·˜𷫧ý¶Q|»ƒ_PYÕçb–ŠÙÄiÃOۄp¹lï!#&£±ûtØÌ^¾"Ì|S,7$0kŸA0dk+ð=½ºrÔÎ #ä¼?©ÿÛÊÃkuÚؔ¸³˜L‚â/?֍âǩ…5²àGÕg¿NE©Ø_ã:s¨8{_#øp®=#“à
°…ø‰\ö^MFøüˆð|XÞÞL'M&H
'\Ê6òrãs{c¬·@rô=õë¹ÂB¾Sýí5PÖÚ}þôx{Ø>Ì'“QQC±,¤ʃž¾ëc×ÓÊcHçaÀÈà#G«ÀW8DßÀz"Æd<.>íç_ëeú*—³ÃŸQ@{ô/¦Og°k8œŸWÿÿ°wí]mY½ç1’lŒCRHÚîãû‹ݦ“fûÏBŠ!`“fOÛØXóعR¦â²SäféٳçH9cy$uwîï>4q۪”1G'g?N/–RVÆ	ØÉ!‡×þè8b҂
Š2¹cž܃ߺk4ç¹c­R¢R䛊áW‚
¤ðÒR+÷î€÷áíéùòõ›éOZ+cퟰ�V,,+g…z
´.éÁ{è&z2Ã!šíï˜ý‘“E.æï¯_ì¿úùèèxµª*ÓôõT–zêdšÊTò
÷·ŸÇã†ýœ j¯èì,¢O	È0±?à¬Àjµ2¯߬ž¿xùóÅìêÚA¸þj<@λ+ùßæ¸'ԑîÀc&oN!;¿þ¬ÙoÎþæÆbsÍC$‘‰ãÄdYª“,ӗó×ß|{°x}t\ÙÍx|€ðÛ?ðqë.…@ͣô~%ðûnßѽª’柯ª¿??X\^¾¿Ž’T§Y¦ã(6Mé©ÙПJ¼µ1VÝl¼۶–uӠÞè6	.¶Œ­0æõ-õ@	´¦ϧÐ^ïМ$¢86YJ5¥\q‘+B¸œ]ý¸|þíáâèø¬j‹âyÁ¯hÑY/è±%ð´ð>eøú•À8?ö”¬ü¾ožï/.g–a’r®c:ƑE>DǪ¤Qúì‹qiT“=%@T́'°§xåÚûþíFŒMäÆO"à”|àn0]ë`wgTÒ$Î`ŘÕà¼8‰Mše†ªA	„(Tƈœ_ý¸xþb²8~ó¦’R"@ú¹ðíÙƒ¼¡3ž†”Ã3›cŠãW‚;œb)«£ããêoø³Ùû¡\Âoæ‚+øýÌü¶/DR«	Ow·ó¯ž>.8£‰ֲ®‰ü£ê\/
qÉ2è}/ì}ÇÐNˆŽ­C\¬O«¦´Q’ìímçå`$ÎT%kó JÒT’iF¸¬QƘU„Ëo_L~99y[)%Á~ÔPŸð4¿Ý„`íï@~Ëm?Æ}||Tç—Ùü_K
ߗ•bŸ˜(²‰0Þ}<.þúõ^^ä"qƒ–PUj;xhНâ€ø&¹^ÖãÿmòˠÌbý	•0^,ªÀÝzÆXôl÷‘ørïрє@¸.œœd‰ÎՔ	Íy¡Dž+ʸšÍ?,_ìO''?TJ*㘦§b²þ­OÛÀe­"„Þë·ÇÚU1•’R™7''ø6@í(cô\qnO©ŽÃ؄aTߣ8ڈwò¿|µ—Ê<Fµ?¶i)Ã
£ݥ}4½ƒ¼ܧ~@ïtñDœ\»‹þ ­Þ/e¶Ž`¡”„{O¶ù—6@³XÎ(¥j]JâÈ4ŠÀ4BåE¡(å@–/jEZ)7?8qr×ÕxZÅò$¼Jæœm4Õð7`|Ör-fs|Ê$X´œ[e&\'qjšs,ðC=ÚŠ?µWEÒ\•@;9º*k7^ÔŸôAïx7Œ]/òӰ­mdÚÝÌژ!¨ɢ/vlhïထ˜Vª1÷Ð/‰RÃo!ÏUn¥BÎ-°ö?¾}ûƒTJûOy¼¿ùûû• nn,…Özã­þþþÁÇÙ|¾dŒ[׊s®e:J²øÚþƒ•X¶ǥøúËÝr4,Säo…˜¨ñÎFø`€aåõz?ù#ÆèPèáÿ>­ñ¬_éöÛWD‹;¥Yƒ.OŸ€"$T*¨–¬êNq”˜,Í4B-*ÊRR&¬Ex¿<˜¼üøÃé©ÔZ›Ûà÷UŠv7|Ž_	ÚïÐJ›·öû-Eû8³ãç6/’qPVªSB4˜5c4<Jþ§g;Åh8HÃaÑàFÌ͟¼3”ßoðÕ;¡ß?ü¾İŸC" CÃYaDœˆ‚µ1fðDÕöÛÛÙ.#Tʦvª.!FN²L3ÎužU’2n-Âûådòrqz:­@6PœĞæU—ïüzÆWæt:­&ǿZRÂeQ”ud‡2ª3’jõÚnA u4
öìé£rk³ÌWÿÐ$ûPb¬Ù<–ææý¼Öõë´ðýaÝ1!çûn^'¨ým^‰øŽãæ°AUèöƒÝ}ò`ÈiF«jAí|³|al ‚Bicœ"Ìlfyòò»Åt:jd°`à·ãǎ&Ž×;ÐÃV"­,ðϦòàðåââòêšP!‹²¨#;„±øQdÑj
ƟÙpæhs@¢(þ@bÆèxk!Pbõ1˜•~ýé«AÑmuJp—ìTûYp›ÿã™[v4؃[›Ԗ—‚fLJÕáÓfCьq-òBÁL«©ÑáËW‹éÙ;i´F/ë÷]·ßGãß@–®s:=“û“ïlëj	ßS–¥B(°H„$:#`:Pæ•9cOwwʭÑ ‹¢Æû›%çaà>O»u8­¼ºß+@wh,X¿“§ša=ü]Š•£Y½yk4$öa’RpÂd%# Gð1X’-×EЁIpF­°8;;—#~ç-wJ”@ÛóÎÎÏåÁäp׃¨Ni
rP¼,#õŒoûJÉH°ŒڪÎÆ
À÷‡ ±%Â~&=~þÒ-Ì5`߇AýfÖìð®×)»5³{œì»ÓpÞS›<JbŸ³KYՊ}5j|„B•%8£¼šͭE8|µ°@VZë[˺P&¦AÐïüüßârfÏxUäøE®èMàC˜·’!8îOv¶‹ÑhH£8
ºKЂnª‚åtG‚ð֗CߋEè8‹»ƒï¢Ï0EðN~(º³ëpXdöùà„k%ã_óIb ³Ì9×´ÀY5Ÿ_-¿³Šðî]5º÷<?·Ÿՙ/(cXÈEp!ðáÁ}’Yà?—ãÑ&ã(ôM"~Š·Ž_ä¡B”<{ ¸—aHò뤃µ{Þ8xdO–EöèḌ
¥T¬”„µE€ˆÿdŠr(9³ár¾´Šp}~q)i®c‹‹K59|u}yag|Ϋ¢´ÀÏK¨×ÑYJtÆŠÒ@Ѳ$¢··ŠñÖÐ?	Ûáá|‰Ÿþ¬Pä'÷&ϠW€?ÂTÝõçGǽ]ÀÍ,
‘>|0gYh¥ F`Êã¸q–9g(Ì`¸	аšYgößÿqz~¾ú޾¿»˜-lŸU9JPP(ÙCàøü*Œ£<cë˜'i2ìH÷:!÷<µ÷>=ɦ[0ØÔfXv
–çV¶GEÎi®•²ŠP5է1P#ª…E(Õ`0””æÕb¹Z&ªÁ`³¦:™Yf»JV²ñhXڈ³+ô´øÝÔÐÛé÷ˣÿbúMžØ\B.8«Aɦ(*0ˋ¢F¹*ò¢.³¢>X£ª…Aj“WÅöx“§iÒˬW€ÿ£­™Å¨©0Þ,,À­e*å*hhS\Ýj¡5LJã`1 H7˼°áL‘¦iÔ^´ßz
Ôujç¢[ðýëY»÷ߍ™Q7‡y.xaaž£ëÌiFŸºhxIËB”[[C‘ei¼Υýã3këhÐÕ×t}ÞS ÿÙÛ-ó™ÀE`Bjбë=¦ùõ±ÀÞò³s†ˑâH.îÿ]ÄÝû?èÚä·Ó;“d!íðOzC;F]%@ÊÊÊØŸÛÿ_¿˜#Õë¯Ó}~~nÿûïþýú%‹1—´/øQ–aOøyZ×7Ga:$Ì=	P‘?‘g	«Ñ7/¯ìû¿>þµï{½šØë¯_LJ­tøð¶3æ½–ýžYÎGïç›aÄ;ýOü±8À֩¾Îß;Îàd3:GŸ9D0P%qøýzõz}áõîÎ?™àµmj çät^°.üzÝ&eÇ{Òóýéõ|jÒçŠ,ÔY- c¬1¬ÅK¸.ÄaF~hZAIÔ/פ* ´ïn@±8÷Œd”0I”¬Àk,æL“Ó=5ÀÛÁ[F=‚:QS›õ/å!ð‰¬@æ=¤òRA•¾úµï	þÓúS„Q0¿öAæ9˜¿˽Lƒ·TߑLZ®lNë#éÌr@•–$Ԁ¾	.ÓeXx\Aý;_MP’F›ƒÿŠý¡Àå˜õ;¼»ÄkÁ!’ܗÒÇæÖÆö‰dû¶æ “>[' b"^ïé]P„>VÏêY 2\ڌ&R¾ÀmûNý'¤À׺.Z«vþHÀÛ-iõüJäýi		sia2ڂ‹³Œ5—Azepæµ Ðèð^^Túãêʿ:û˂a%äýŒã$̟˜ÿ™ž_òM'±çW"ý“Š<»TL£âLy€ïÖ$€³p6ö'VE³åÄ6Þ'Qˆ’Òn<v—x:3DHY•úô&¨í|
͗IWVÝ&ºGÁ*
³Ú	ò.ÕJ&tÖsɠT»Áô–,xçA@	;ŽúA£‰BaßÁߙ™2éÔ3–ËHùÓ3ŠB˜\˜›;@“ŒŸgtµ³Ù3ËB8ë7˜É ¨IÑÂn3
‚óãTƒÒ~
þ  ¿®UQ¿”?	ô ”,€½õª‚Öñlƒ®Ø? m“êÒÆaqª„/ÁSEicfõk񬢊@¡(UX'pKÙäÀÿí¯Éøpbmʀ3aÿ”D°?1‡®睶X—bËPYmy?ˆEŸo{°t䜮}‘BÃ[°ša•èE¯\rÍl°@è¶°”ø¼qŽ"¾`ÓôÁþKù]þ°^ŽT¦1úýãŒäs¿ٌŽEÔR›޸Ji1ÉL¦÷|Y´ºŸë{(ÕWCÿ4J#˜mœ׎ãü–Ò/Ùzï!xCþ¨(÷ѥþ‡§xOãáe¨Œ¹ÈÖ2³‘-¨”µ€Û:Ð'RH×A ÜË÷fÚßÂ@oþü¾eÊ5øu-}*Á>a	‚kùS×òÇœˆÖõÝSܨìɢ/Ê]”ì¹È›ÐöscÕIŒ¸Tä«VÖ\ÿw[§49ÁïǙ­Î¼ßggÿ˜£Ûò'օ;»­ÿ	”<7"€©ÒÑ*Ž=eßÌ¥ZÁþ*DÜuÈ i¯}Ÿßê‚Z‚ßÿUÔ-÷ؿ¿²ñd×ÖåOÈI®ð7£Á%OéϢg¡çö0ÍÉpÄSXñe¯5Lë
Öv)vhü?áÁ!t–B»z0àWaÒÂd
~õ‡hªª¸ß1ޚýc1Âb]b­Þ{ú©ÔÆø[•78Ń!²@×÷Ã+²#åO‚ÙΌä€͇]_u¢¨}×~½Ž¥ÃÖJ‹ݠ	ø]æ˜Ds¹Wçy˜²¿…×±äZ­åÏS¼#ˆÈà8ŠÞւµ†…"d•L
í²T~+TދsÂ@£±IQ$+žîçÑüQ|ݗ?ýu›ñ¿5ûgPù:„[Âÿæöç#,û"hpÃ7³€}ߥŒI ê͂ Çt‡”‘ƒdà֟'Á;ûùAX}ù-ꇞ
:øÅY÷ãN¤SµçEMÙß[1zÕåÒûȶA¹z“Áu+£­³(SõD
e= n£ÌÎèZìꔓª]UڷҞ¯G;ã«4‘<#h4¡Ôýé’G[¥¤Šù/Šc±¶Šïáã‘@>{l´, ®³€ÆbË÷ۿK!ß2vëA…1þŠÁ<x0èZêHY ïöôlTq]LÀ_uy¿)}l,ëâ‰:±¿|:ÿԷAßÿ<»@àrTÓ,ð7{×Úն²C=~‡þÿŸtN¡-)œòh¡P(PJK„6Ä#]ËÁh>i—ûá:YjV‡Œ�-ÆÖr¹xÃ`ÜÜú0ºº¾½QŒ@çƒC’@‹2÷ Ј	½\áïØڪڀÉ ò
1VáõAþ†ôÎüúþµKz\ÝÜØÍwïGq#G©ý5ïï9#!›:,×Ä ף€¢C!¨S»Ûëei¿†£éÛ͝ackr=l%'Æ-½9’zÞÊ"̨ xüGú‚8á]übɧۏ››ô7ÞMúۣÁïÑ4I3 Hj×þLѸØE€åWüÂËìZ¢€²A0ŠŒ“³¼„¢\±·5ÖûۓÁí-Ö•VNŒ-0…$҈ÐB9ók­=¿´Z›éø»Ž¬,ßÚÝn±v“7o·†ƒÛÑ4/z6ËÜeÙï¢?z޿ÿ݊°¡zð0ÞE_
ßmã$Á4É /[–/ª²÷ÂÞܧ¯úÿ7·¶'¿~ýB2À˜äùç!ÀƒRêÀ­ÖÛÖ=@#ç:BòÐgRþ,~Úÿw;“µõÍáõà״,{¶轨в´iš‰ä».+Ç\ñþrF¿Ë–gì>Œ@¬î_o£*…ø²á§	¦iižXº«#Ýáèjð{J'~kûýô÷ï!>F#%Ñ=˜%€jEÒV.`CÐÈÁÀGà¿+$saðëý}Wï÷êëáÏëÛø+Íý‹šYžC’å`’cú£Ɓ›ù&*dàŸ'ó$ê§#€ð!LÎ0Ðڥƒ™qŒI’bÒ¡€¢׳½bÅÒͥ\&«oÞ·wö¦ÃÑØÑ
àλÙf˜„´A$µºͿo}’(3̾4r¿/HçÝøUðÓþmïìN_¾z;üþóf’—+
èËI|’&Š1Ž£¿.}8ϐçç	'¾º«C#{ÿunîù˜-ÔÔØ4
ŒÓ²¢´emEoŒü~u=Y}Õî¾ߛM&dR‰ÊPô,É$@xi¼-Ë+ڧ%èæòC~$¼¾ߓ$	5žŒqgw¶º֯ï*?˜Ԡ¯ô‹¢´q’9àòú±óúðˆܔ륕y›îêÐO‚ëyKQ‘Bw$`í{Mžˆ]DH3$Wä¥m"Bˆ•êÛåõø¯({{k"Lя:,°þdp†ÂîÁíä’Ü$è9÷°€*ðPxýp
ÿÃÞþì¯Õø—Wã¢èUDø¢WÚ<Ÿ{ý$ÃFëðY^zD¤ïº×Lg¼±=÷ï æ"Á\]
ѫšˆV	@ÿ*	ÍI'ÏG9B–;Hž±,VªóoWã¿×ú£ýƒÃÙt2¹AH&¿ÀýH#'¾¶6¸<ˆ¿§߫Z\ÎIãÝÛ?¨¿>úrñóøy½Y^Ø$%àèk‹	øF$ûb«EúÈÄžüüÙ`#Cmxb”|0$2	ÄìiS-Š2G„b.
zMBX}9ÿAD~ª¦ӇD`í­EµþÆî'Áì}å§yÊï	л÷CàK­OߟͦÑǃÃ꯵õáÙ×Ëq–å¬ñðŸbÂßÜ{oU$&­^õYRútX>!f`ÉIÅàkU•Bj0ðH‘Hâ“<‡¼ }ÜkˆfEuzv1þ{uý÷§£ãj6›!ÀÝ(B2Bi}>Òx[´z–:“ܪªððð¨ª=þðäìë8­_ç56¯˾D€$u?nö/F_èàG¿XŽɀ—	¶óþ¦#ÀÓ'9êâx~SÏø©@ærþ桟$Al²¢°U(a®˄IVØÏ'ç4:>9©ª·22x„¤É3¯p¯´]m<.ô?::>©ÿft|z>®^'·TÎ|aó¢€,Ïmœ$
±cÖø Öëàçg¨ûժÜt·Hz¾>!¯Ò#õ©WO_ŒÞv‰‰+&BÜȢÂæ4àªFU'է£3Š£ϟ¿T–ۜEbÊ$xßyÔAÏã¶ÖÿïÕףÃãӱIRšä»~–5•cÜ>D|Ü¿wŒàaÉ9мížMút—
<E’¶	€-lDã
—#0’ŒHàZ+ʚ&NgGŸ"œž~­ü^"·4ds^ß%¼b[ozl€o£ÓӳøoF‡G'ã(Éfü’€Ÿ@R‡ÆIä%ãYio?É?½†ÇVæaì€LG€ç$ô¨BJÓIÀ%RÏJÏ-£$Bš¤ÀD ÀQe¥WM<Û?ø4&`žW›Ûü=˜‘žHÿr?›?ñ5ƒ…èì˗ø{ÇX$YY¬à'I4ΦpA$A”û
íà—çgðêrýn“@&vd¬­Å«ˆôpÉ$aˆ™هŸÆ/W×Ççç¶~x}Aô±l²Mš?gb~½¸°/Wߌ?썡&ZI¿ÅÀÏòø1y{vڀÂë‹k:@p\¿wìŸ]Ë'ÿ.'ºZœøP1èڈÀ$ˆi»��Ð4’Y"ƒÅhºóá`´öº?þúí»õ{ÄØ\I”_´_|ûf_¾ꏷߌ,šéð©*•føÍÚn͖^?”<>àE¾š¿üü~w£ìÿýÃ÷H:	81VoJBCh€-ÿ&‘)"$	õ5D ²#•;³Ñtkg´úúíøòò§²Ì÷Î^›Çå÷v­ޞ¾W٨~^[FšTǏS0ÉãÀG½¾G6W{Dž^üáäãS?:à™”H€ÛI ç	 z4ÉjØËòHæ½Fqœ6
wä©)*€ÇÓjöÏîþ°ÿÏNÝv|kã$4Æý¬1
y®o¶¿¹=¤íFÓٌ*:YÑs³·nšÄÖÄ-ÀcS½>/¬ó·_Ì?ùír€%Iž<@#Î
T"€!‡ϻOã¸D„ÌMª'³éîÞÑ-}Þøïy#`ïîßÒç%ÍÜÖÛç½b|חOÀw½ùTPOÏÀë+á’ÇB'²ø»`	?
	‚œ,ã©H"u±NY:ÕÈ̱B€M’†i–A–’e9D&Á&Ð؍izrìYQB–•d$qñ¼eaޒ’’M¾æõ¥äa€‹I.©ùøŸáw99ŧ#˜1’HÐBÑ@#ƒ#ÜÊGvíIim”ao޽ºm(‡¨-ISڦ!‘ÛøM/ª=|ÕëKÉr’ëIÀï¾aºàôçú( ¼€D
äç’a…E'C8áÅd "˜Ôlqñ^Nh£xޖÌÀôZ¥
ôqk^_~.ïJ	ô¿vÎ:65\²Ååæ	ä$XóŽùîMYwmzŽ “A÷СI€Šù6…T‚^ÓørÜbVÚ÷úÁñ@¿½a‰:x®°ý\ÿ?_‚=ži9Âk[ދ„7Ó¼™ô’27É3ƒU%¨`•¦k÷ÐtRAz/‘ÌJà­/¶	%¼·ñòÑۀ>?÷nÝU!î×;ºƒBÿ7T4Käšþ
£ØF!È#“Ay,B&[è14¸{ä^n¾lj¸|6@±߀Bò,·¢Mô¨³BwNçή¶»Ï;	”¥™p5>XÂû£|y©Dó'á¥$
£AتA“/JYU\cQӣEH`ÐÇÓ|à}V¼¾h¼ûÙêÎÅÈ9›+Š/Œ×íî?ÃH|‰‘HPÄ5è‚DŠ	AWšèŠą1º1Æ&nt3€äZ|•„—!Œ3a½3ÃÜ>ϱž9§¦«;÷6\gÄ\g’_N½TuWÕóœê0|’2¤º—»Ú2jԾ¾Nø‘£O­‹ÔE,"…¦Eº1‚²¾ƒÇA#4FaŒ}ªÖË`– €Ñêšõ!ÞÏ2µ1ÊäóšçXÌץc×אƧ½«•m߉fïA‹pÍR%ÃêԲ£�¥8rt~¨ªû7„S/¿pOêšë nò@‘Š`FçY9KÆt˜¦!\ÍðH "a `Ÿ%À:¶M'n®„ˆ8¬‹µiê›G$Eay
¤5_0á=Ҭ¥½>îÇç¹ɡjû“`ûUC•qÀs™î,]ƒŽ&6!馹¶¤¨G[µ°¿àõ3§¶67‡Usӫhv¸ªé`uØæxyz”#AÕ#`Ʊ̘—1ˆ/«%‰¤D±2R;ÑìFœÐ›góSŸÚóí},»¹ӭÞ|ɺk#ÐާŠïú³ëž}£cëöoÌÏñÞGͩý=@=é7AÜü+'Ÿ?õpcXˆ ™Û5Þchßþ^þ»@0(cˆ¨!‘:Ähýàh!`¿õ±® c÷ۨâm	ôÎ3š>ÖÑ~„Øúd§ˆ¯;Rk‡ãsÙÏýïâüZ_’kÕÕ0¥ÖԜÚ˜ø ÷ŽÎr@U×{/¾ýæéëÃ?Öþç7„	¬”ª.¶’FüÔÏñ»G‰IJš@³d€_ۆe]%F^·6a4ê)7Ù;	ëi¯vnÄö'¶߰[’FŒpÝÚæÏúM[jL­©9µïó†{³œ£áp¸\Eß&Ãŧ_•z[[ËS«–$(v걬Q¢‰°k@’˜$Ýä„u!6&™L…1KÆÉI{|"Ÿ/÷‚¤/ƄuûpŸ»F
jà¨éeÁ5SFÓ2%5¦ÖԼïÀô½CÍrl­¬¬,r3ø9öåçïý~ÿîõh´}vCiŒ́Âëu’	-öŠÜÜ	´û·wÑ17x?ù	%íõ¥v!ݾXÞ3ÒùÓÇ51”cÚr,µ¥ÆԚšGz€ޡ‡f9֯\¹òKY–üw´½_gžžã³O޽±¶z{n´µ¹“
MåíhIɐS0î5HÑ”€#šӞm)@N |î˜q0„hFhæí=EûŒ”‘*×J3óSӵÕ[sŸ~üÎujÝwûÓ+ô½CÍr/_¾üsÜÐf„FŸ€pâø³o}óõË>X)Ü[Aì IÕl¨<rªû$ï=@ƒH‘¦Ýë&#Ò:ã0ö™ÿо«¥“kÂèZiIí¨!µ¤¦_}ñþ­—N<w@Ÿ˜ä!½CÍrÈÒÒÒýk׮ýTUUïW }	Ï<ûý·—}íÄÒʝ›ïÝ]þÿÆúð@=ª+*;\‹!Qî bû“„¢CrÐB‘h·O7NwPè“ݟ¦˧EEښ ¢VԌÚQCjIMãÍÎoþÞ۟^‰žù‘ޡ‡fýïÖ~àÐÄÏÚãý豋Μ_øKž[<y|~e´±*˷¯º½xuþÖâÕэ±Ã͇ߺtûoLÏ4Ïb,Žá/öδ‰0ŽÃäúA¡t)"¸¤u
tk‡î‚n’’5¸dhéT?PÐÉIpŒY´—³øQ	‚C‘x‹V‚I*LϦiÂÙ\â¿ðFŒ‚Cï½÷â˜÷y޻\s—'tCGtEgtwwýúº¤Óa̳¶’J¥^²>;0£Z(rš¦õ.n†ÎÍ͞½|íÊÅK«ɫÑ{ë±Ùôx$};>æҷþpá4’ú¤O's.HÏ
ѝÑ~\ãü°¾Ù1M3§ëzU–
ЍX,–s]·2::ú×&P£†M°
6‚V6Z2lx¶mÿH$ñB›j¨?Û`#µZ­×°eØ{âņQ^[[{ˆ÷y±±±߅qØF-°	¶ÁF؊hf/ð Ýnó~pZ™Læs<Ðív+ããã¼àáÎ÷?9¦Ó=`l‚møÞöXlG–»A‹¾{:ZØåÅùùùû¦i>Ÿ˜˜ðO\	¸8’ԑžN閎éšÎéž
°6ዟ­¥¹;ÙÁ?_AŽêõzuiiééòòòÍr¹ü‹áNNNrQxJìÃÅ
0
¿KºŽ;¥Ré
ݳ¶À&@JlF¶ç¾€&èöu]ßYXXxFW³Ùì#,Ì+×u‹š¦5±XÞÔÔÔHpQÐ!]Ò)ÝÒ1\¯,..fèž
ˆúÓ;Ò=ƒÍ¹=àæ&þ߲¬Ýd2ù–‰DÒ333+ÓÓÓ7°ˆ‰ࢠCº¤Sº¥c¸þFçÿha›­H³ü§@ŒÞwУà'86øªÀ
4Šªpiӭp<(pW´áø›‘ñ‘ÈCðÎ÷vHš¦hâ0,Ï; ïÿ됚PÝENØŠ?ŸÀØ^h´«ñ„ó-ÑÀq˜¿ÔÁ&ø* :êì ÍQ¾#œV„ãMáܑú‹±Nø	á/`äÁ°žņp™n-º>Iõa¿ۧAþփ\ € € ð„ € @¾Ø5ZøÎaŠIEND®B`‚‰PNG


IHDR€€Ã>aË IDATx^íI[[é•Çk›|<UòÔ¨M²ìE™½è]‰d“OЕ¸\¶±3	Ä $1°˜Gcf3ϣ„@h¦ÏO¥·ZQªU±ê‘tïâ<²º\Ýÿÿ¾ïþçÜÏîîî¾×þë¿ÿçgbŸ‹ýVìwbûsZ›nûO±ßıû¹Øgʒ1þð_ˆý©ÌÜó׶Õ/ûfN^-x
‡—¼Åékº
Î_ôLî紺W¾;0K0}ÿb¿¯¶þmhñªH ³M0,ËøÊðˏðc`@v™chãQ|‹øu2øÿÁ/¸¦rt²ÓÛç`Ö
÷Ä=ÿŽ¡õèd·1Xƒy"¾`ŸÐІ5˜ƒ½ºûÿ„³  ÇÌÁ|.áÂ_t´e`öà7Úóúus°‡¿“$O®€¶ÌÁüQ{>ÝÀì!u´i`¯Ó	Õ!V2¸à)‘BIéÀÜVæž=ÿæç¼/¿‡éÈ&à÷Í̇òîñ}ƒc`£ÎîZ¶X:gmM³v^m=K–v÷Z}×؞±ïíi¥B‘A'@&ƒþÝYy÷Ø^½w¹©Î>ÑY^Û?ðº¼cêUQË\îkÛ¯eŽé’j×pe´Û✷vmÕB>Ÿ+‚Nu×÷NŸTrÇ׷N9Jª{FJ*ëýî·ޝãÐím ÞÝ¡èÁáYx|béÖhîÙ/(mŸ®±ŒtË*ÑÔ3qPÍ¡V™~Uۛµúê¦áîü’Ö÷ÀÌu0ŠF"ѻ°X(üÿãgaÄæÖa°²ƹ]fìlöŒïWã#p\²ìËò]Ñî^7W7ô¼.i]ÙÞ>
E¾=rý«…Äx"ødu07ö•{ñ\SÇU7ýW%,ÙΑS­m¢#¯Ⱦ°-Ë}H@
¸Ð=¦È†þhi•cËÐ8Üãܬ×àø:Òüîgé·v-4Uu¹ÞÝÄÀÜh`~a#€ÈcØ;us
ÓLìÕÎÑ]£É:æ|Uh[½ñù£êÎÿ¡ä5ºË/²¯s<‰$”/  ]—ÿ~‰õ[ûWÊdïnmºà.Ìk|¾®ÁuZiv¿!š`Ð	¦F¨Fìnë^l~]Þ91:¶àWwÿ5>ßls_àQÁ*ÒÕÐ	Àþ/ÞzSçœ=¿´}fæݚD}ÿ>šzÏeE’•%Ý	 À5y¤ðvdt>ð)PXb߫0»ûÛ6Ì@}h–- °Ò9áì¿þw	°¾q~‘߼dlsvo›ÒÝÐ}Iý¶ˆX^ûæMQië¾$tēü(ózo£¥•m§E•]c–ŽY›’H§{ GRȩµOtH‘g¶­}äæǀï¹òE+힗…öùšæÑ.ÀÈèyîP)ମ%Kyݛ7ÏrךmýR÷	ßùƒ‘مç&ZXbõæäY޳÷U`ùg•Ñ	u)çšïZ‹ªºG?«Ýéê>xýþ'/ê7ýÐtoÇ4z- C¶²uDmý«f“u¼3·°eîÉ3ÓÅm t/ø—W7Ñ<®>͓(ÂÜ2Õîp¯ױôëÕHž%¯ÊJyO¿‹	ʊ“M°p;7kÚ޶”uLýý+Ãɇ3oô>llF?5í•Ը†¬RÄñ»Oø÷¿–øý’L½¯'Ú @’ûÝYl¯¦dK¹µ¹kÁÚ,k÷B3ʝ–¾•F/Çà†§Î9²mDՃ@ã§DKáãß=“GöjY²kå- ¥Ò<ÐO÷ÕcƒÇ{í¿wØÙ;|õÄxPlè᜺Fwkp,ɩȊO€ÉöPÎ9p^œ#ç
ù8w¾߅ïd_B¾ŸÕ*ǵõ,Zä=sܷ¨PÓJ`? rLͣýE•Î񼒶wù˜,½R}›¤’Wbè!'Μ»²~ ßÐ0䪑ú¾Ää]g¤ÜëDâ…ÕÚƝü¼ºq¨G·7¥5®aŽ…XTj»ÜÜ<CñÂw…EÍ^!Ír…8‘²‚´áÚ{ß7a6q.Ò✋é	ÛgZQqœ—¡qÈŹJêæÜK„Hò]ÆùNÈÎä;Î`…“Ô }—†kµÉzÀtîî|´wiyÇ…﮼7‘£ã³ðÆæAp~a30>±èã~ëçÍ+EK‹Õ}V[ßsl¬ë>,¯rì–:vJÊ۷_—´lÄm«L~^mê:jlî?ëèõNL.ùOÃa¥pý÷ɟ³󫨩®ëúÉófn¡½à”6ŀbå·¾“÷æ_X—r_[WŠÊZ7+k:÷8G‹Í}ÖÞ1|Ù㚼z盘\öÏÏoÖÖ÷‚{{'¡³³ËðõÍmÄsu‚¬²B4°Êpm²žìyìÏ,¯ÜË+;ÀQJ0€K¶H²EŒ÷>Ã1T1Hÿc¥àóž«ëèêênèíە€¤•oåտ°¸Ÿ÷öO×oÄFÿ~K:‡dSßõàè<ŒրÕD岞ñåßPß:Ý&ŠÜùíÝã0Üb‰@„’ìáé[~W}Žcþ`ócª^’Ý÷÷•qÌäﹶqB‘Ü ۈø4®Pƞ'á™ó¹$ZŽO/"$iÒÕüX0É>Ñqe«²ˆÑF´¡	°ÿ‹^ψXóéˆuïõm´f`bj9N€évM€°®²~°/'·a‡%S‹`%1 ˜%ÒЈsñv‘V‘§/(²‚Ú%@kÂ/áïLƒ¤¬ñ‹´B€
’#äÙË+ÛO´L€ŽÎ_~Iû4ùõQ‰Š*ĽҦ5\Së<Ó2ì­×ä,s6¢M€=w’­oìõ}óš3BÁFKŸñª(˜¬¤¶³ždºHxX‘lU8'l-n¯V	ñë›z¯Dº6.×”ë£T‘ÿ.”ªCö@î
ÀC€ª£6 T»’ú,(uLKžÿöüÚ3 rWcr^²2¬‚•Q+0àõR“b‰_Ó0:/âhÒw¨ÓÿööOkšFS—"€EShp̴H9uÆ=ø.À~xãמÝ
ˆ‚
ErŽ F[hŸiy%õt­ÀbíóÒÀBT„¨!è+hi¼½"³lIy€da²ñ^æû®ÞI¿v	¾ëˆëÐ$×Ce•fRµƒ”ϙyÐ%Æï%±Ã2+
°м)a`‡sÔ÷
Bš3_¼üRÆԙ¥¬ÔÇÀ]£;F|sËd‡Ò{‘¹3א‚dHP,gN€Ô')P«ýW»Ýmn…s^5®›G»EÉl¢¡EM6‘k'bYƒ©{³½c䬷oÚÓÙ5~nªïÝ#„®¬s¿±H8-
dS¿|N­‘
ŽÕD-k¬ë:'$º¾
iÎnb¸{ž۰/ãèl¢8¦›É.ª㪆~âJÇʪˆHÉSÍ䕉%Î<áVÇÈÙk)$ÕÙ';E~^—@‚ô¯¶
ÃËLýîW–_àû	àÿìüF¤§w2lo
ɐžÐÌìZäâʟ$À°XßøØ¤¡á”Hásš7vEtŠXæ_ò$ñJ"d˜žYñÓ+’ôD6JY	Җœ¤Cš&dxcšý£ãËèw°½w}ùªþ†Žž¯žšv¿Ωے¿miÛ:|òÌè‘"ìõ3šzxtùú©ñì™ÈãrrW_¼j8^±(µ‚ÿ÷¯‚LN-ßÒÿ ‘•¨ŠöjT[Ú
B„Ñmƒ*˜\ÀÐȼ?€£SOôًº‹'/ÖóJÚß‹v T–I™å;Déy~ó⣯kêê{ޛ@Æ€)†_D&¦–‚Ëï·C7¾@TÿAz&D`3$+}	[AÚÊÂñ^ÅÃmÔÂҖãSoÔëßa[»§‘ÂۇÖEyaÔ¤ Y¢«Yˆ#zBB
º~›,ýk>›¡ª:HzXùDü<$À'ˆˆÄþ=׊p‘U m	 ڷé3·M·ÓVPܲ^Ûàú ?§O¥-[bã·r¯äìøxÈòÅjPþIeR¶‡ý™Ùõ°7“I'öc„Ÿ`µ\0۸5ÞeÄ6¶½Į¬„;õmÓmÒÕ'͘ÃÅâ•׹ûkí“€ퟐ�93ވYÉÒÒû¾AF»wɏ¹¼×M—O
A-ÛÎrÉhäXT—QÚvsr€JVPV`2ØÉ*Æ>Æ]Nb„•B5MŠýÓü²c(idïq{na3¬U\ßïh°‘ms©®eҡÆé< D‰F"(ƿa0ï%õÎ'O©$š`+À_¥Ÿ¡Uàç¼jZešY¼۸,SD|ìÙ=aš$-JA¥¸Ô~Ix¤U\Ýøï«yâ	þ×']	f²=ؙTÑÃ$~>a/¼ò5iJÊ
°"sº҈©O+ã3'xUФYxÅÞÍm„È(2×(#¶€IJg²©å»(jQÖVÕt\h–âûHª<Öd"9[Z;
xê٨`x²GkÿJƒDMcvÆC¿ûʜjhy5õNçè-1ñÕMfÙÊÚ~´ÉÒ2Ô86û@hñýNä‡ãÜs}‘׸+õ•¹Ž\×t“Áǁ32Jj.i}-ÓBŠ啚·8vöäǶ}W.AÈb”Rj{ßÊê~˜„J&¿ºvý߿W\ýCÒڏ%”¥æñ壪2Ø2xu|ø^±ni2•åžr¼(TÁuNK¨Q<‚EF±
»ú¦OwwOB§.ÃkëûÁn×äYa¹ã-CŸÚÖÍ&ªÜö¿<†dQ±‚,.³Ÿúü± cÀç\ëÌÝÒÙÌ$”$Øp¡|——…-³B„=	kÞgñýnX²§[¤ÕyLNÂ<ãôÔ߷¹×ëßÖá;ý¶ä)Æ+ÿ_z¿Ì/nY¤bȸ7–4òʳÉ"25ŒÐgqi++ßdŽyå|ó_[.ÉdV5õÔË<CFÅÈàŒîË|cÞröL>vŒ¹…­ð‹Wû¯¥ÍNœ¿6ò"jÕLK¨Q2ÉÎȴ­c€û'‡Få¶çdª#d 
ݳˆH
óʀ)êçÌÿÝE|6£aŸ½0ŸÐˆFBÇê"–¡¨ÈÛg/W«MNÏÌÜFøðä*z.:ˆyåÿæÆ>ï“çæM”U&ÛD'7Š’ˆ¥m9X
ˆ›ð<2Žý»€£È¨SÓï2Ed²”™úEÕ_.¯ü_êç›îÁ?à{Õݟa((´žÂ:K77¯AqëF=ýTV¹Çâ<zbÜÇO`´ão™±P×2å ÄçH¯«»?-	 DQÄaé¾ñ|‰Üã‹HW÷˜OúèÎ*Ž“Zs÷¹«oÒ'B’ʵôg"ʫÚ?ð¼b&‰ÆçÇÒãDAÔH¨HaÌAe°…,#¥5½ƒ¬~¤Àñ£˜eÌMøi/	cyŠˆê†Åç2–ýc¨z7µr4qʞŸó>d*„̗,õh$¹ûU^„ëÄÿ¹Yx`%5px)~ñJ¨×.Û?ü£ĺIZ‹Bawgœ¬‡'—Ñ{`oWuoe¯öüŒ&€­uÀ+á¯êŠ@…Êj5€ìí,ñ‚Wîx~Î]ÏïeŒ,\­F˨“Ø}cë8â¹4hØÙ5~KöŽvy•¼I.˜}ϴñ{2¦iL–-ñr;Ÿç5/Ï.l†¸.¯z;=÷Ý-,ïD†ÇÃ#ãKáù¥ÈñÙÍOvWB€73f“ÍÔČ åâ¹R¸_
þÔXÛ<Žš\þG_WŸ‹Âøè+ñ¬1ÉÆ’…«28n'gV#)'Àͷƒ"çÄãoÓĔ0–.ö0#¢gïí›
\ÅL¹{üҌ9ÐOPçÊß/ý—L’)ã¹E­3Ïr›V‘žWVµûEœ¢ó‰'r6C/EÌBX¬Ej¢;•/Zö6ǐï§ Kß]¥¡ýVbé‘¢ϔI|m”0ŠX»I’LT0<$
‰$Y6ró¼‡' 0,:L²Ë$9|UÂÕĈ$Þx¿
2&íʗZð=bò¨%ÜåH¦ˆŸQS8!*Áäß&žàA¨…(*Žª®é¸¬T`_rÏré
LqhaJ˜í›ÞÀQƒ±ã›bÌ/nE=©9@B^'À"@%á<¨šja„T„b܉Cĕíää%ûv°¼²I1Ƀ ƒ74÷ðd2ÎCƒ"©ÿ“ђ¦ãT€»ÌXëôI'ђ–ºŸ½6YpŠ%
U٦H¾TQlzÕô^¶ª@*Vr̖Öï>V#õXÚl[Áãbbu|Y¿›ÒÀ{{'û~¬à‚x”;€Uüü}zV
OôíӾVcê¼N…¯‚й¸´åˆFY¹&êÁÔÙ?-œ® ¹»zeÝ<þà^X©°ƒó(õvqú¤`++ߗ/ç=­àæKᩪºãêÊ÷éϏcJµï]nn’¬&w w­ÐèØW7#©Ÿ;Œ>Cñæ·Xb)š<ä+¨Q6ùҜÚhqݤŠMÍýŒ‹eRX¬ÅHÎŽwRžžY
օ÷ÓڥØÑéUôkYØnXbH€’8I<šN´åaÙ ['>GŽé19¤ƒ‰LԤ0M<3ˆöpIÆÌõ»gdÆíSÁÂbÛ9>¥ՄALß~b¨ÊÇܼƓóK_ԓ‚s$Ôï~{O:8[<)¬c¶…d<ÐçIXb‡Gç2‡gEB-W[ÜÑJ&A²֐r+«|™״%:ÅXçñe

©&§WHÏãpr]4A”@¹3©‰{X^StÑ
0Œdz‘rGJ6•ìýW De*W~±}MbB´P©:?É1„%L]&O—e5TCGKßûÆØďbëqÂþš’}e‘Ô®™ºÅs{]Sdžd¥1ž+<k ¤mn}#~
Ï
ßgïð<’ËŽ:»T60[	œ¨Qgâ¥ï0ô)e9NÓf0ví"F!
I”N«؟ hdÛ%+‡ºóSyn|w•
tªl`6@åȽW˗qçÚÖî‡Hª/4ûøÀÐì5t–¤„)	³•‘­N—Þï„Ԫ”jã¼ò
­[4Èto™4AXN(È·éí;»ž
¦ÄãŸ|ï+a%NžêžIôKˆû)SoUd’j#ZcîݤÃ)¾@Ìì%€
qx¸à<<Ù=4ë#1rîMqüÆf÷1å^z¿ƒßÎ0¥P(Uçszé¿ÛØ9NË\£>	]“çsÿ4a ò²ž\p’vqÅèoh؝|»˜[Ú¯mGw<Ñÿ'àD¤_ÓïÖãó4¿46YÓÑ!>@òÀù™ ½¶·
_\\‡~4È{ǞèòÚAdlj%ÜÓ7²¶ª>ia¿Dˆ;2”Œt!Hے0&
Ïz¨‹lÌgT*â­Ó‡T‹‘9/êÎò-W¥­^əûä!K~QÒÚ;ǂŽÎÑ “;)öêtM„x¯¥m8`2wßȸ¹˯sLÔÜyî?ý,ÿÄۉ4jäy~™–­møjmû$rvˆ
!÷¥+‚ÎÌmŠ–p)ÜÓ;²·
ê\·¢ñ¿–V/ÈË>(©ÙãguÛh
¤¢¸ò"ߺ€
)_Ä&HÁ¥§Œ®Õؑõy	°
ÀxtïÌÿC¨Áj@£ù¹P“Œ‹㢽|mŸ—´ñbŽI¹˜úTœÇ'B.pÜÖùró)á¾(°-æ·Í0†®B)˜/HËlr2H¥»ÇöªÉR¨b+€RMÜú¼îä–»’2˜
p!q¼œc`¦ ¿þFjnÉw¢¬Ì÷CY/€ó}ÑD¨x’sR±²ž‰ӾXzqit`Ú(‰bI.]0rg:	Ḙtʨ½&Ñ7Ç{4•B(²k‹ãÒ8™<y,¹Ä* ‰¢
3$f ­[5wAÈBþ¢Ôô
¸œçÅ9š`dfHÞÈí£.h´ª÷è‡dç¢fÿC¾D™wÖÕû!q‡*‰ qÑÈpq޸˜,ãv̵üOмÇï!ïtŽ¥úî>2yL5c”µ
Àj‰’;"aK@›ø÷âתVjêÉ/ÈÇ2àªÛ9Y˜’Š ÔOS-ˆÁE<. $‘‹‰¸°ße¼™œÏúC'©Ž%<EH@åÕ)ÆÏ UòßK8qâ™úÛ?5Ð=$*Qª¥H¢ˆrÝÁNÈREH,XÞK÷S¬@7ºéÐM'€n:tÓ	 ›NÝtè¦@7©7ZðêhËÀì!ÀïúfNru´e`öà·m«_êhËZÝ+_
ö¿Ÿ—™{þ¢ -s°‡?û“*ef¿éÖ`öŸÝÝÝA‚/ª­ƒÓІ5˜ƒ=P«ÀCt²ÛÀ¬Á\@‘à—ą®©ƒ€ì´ÞéÃç`Ö
wÀO$oØðu²Ë:†7ÅÁÿu"æŸL‚_ˆýž}";CÝáK–}u猉>Á¬.ü•<‰9Xšgu#°3°C°ŒcúÙCL„ÏI‘5ŠìÏimºXØýà•%cü¨Å	úV-åvIEND®B`‚‰PNG


IHDR&&4!%UIDATxÚíֱ
À0A-¢i¦ÍÔ9+(AFHØ ¾¿ú#ÉBs¾‡f!_
çk?‹#ª­ÂÐÁÑe̘1cƌ3v&]*ñìåڪ
•ò
ü™é¦÷ޮSIEND®B`‚‰PNG


IHDR``¶jPLTEjjjgggiiijjjfffjjjiiiiiikkk¿5!	tRNSŽ*òÔ’ü»WÄS	sIDATxÚíءƒÑ5¤€8dTÀD£p¨è˜4€£$3ð»¥ÎïùWÀ-ðêëæº'Àw®Û;þÐ,ìyT´ïL´X2°óÉÀF…@ @Pñ/~âL‡8µÄ1'ÎEOœ¯™ôëk‡IEND®B`‚‰PNG


IHDR**ò9i	pHYsšœ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFPLTEÿÿÿ			





   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€‚‚‚ƒƒƒ„„„………†††‡‡‡ˆˆˆ‰‰‰ŠŠŠ‹‹‹ŒŒŒŽŽŽ‘‘‘’’’“““”””•••–––———˜˜˜™™™ššš›››œœœžžžŸŸŸ   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿÔ?1«tRNS@æØfbIDATxÚìÕK
À ЙÜÿÐ]„ÂRQA¥7ã[ˆñ°X(K¤•ê§JI:+I“F’&]µÖMºåAQ32
长}LæQ%7iÖ#ɚô{—VÐSËüÏĄ¶J=tIEND®B`‚‰PNG


IHDR µBñIDATx^½–ËkQ‡w2IÚZk-ânÄî»q'¢+uÕԊE»qᅨ ¶M‹J•ªpa)Š¥*i¥Q|”mMҦÉ4™L昙ݡ¶Iüàp¹“!ßüΜK"ºº„’Íf›ΞXxâd3L*ہǽH&“„§T%"¤2„L¶8aЦ¥åÂá®ÑG½MgZ%©ÊmÈ–u³¸„Š«Cz·S’*Dâ
UÆÚç¥-¨ = %´t%†¥ápؑ”²HªÍU
;ýط;PXy"CDŽ
…B+I‰ÀCcùÔnPP¿Õ‹Š€à=ÍfOÉ• ÑÜBOO÷hä^g£
wlVáÆöüõXR‡|$ò_/„£œ°€µnªâdð«nTj*5gÊLÆÀác§óŸ+pïúð$r¶¼Ê2¾g|*
ëh©¾ –séüÅBXװ+ȲUòTç(_Á¿J¶1ٺ*ºA˜šÕùþµÂB€=ì{?F¹ 0Ò;,'vKÙIå–ÙBËþ?Š¡Y~ŸøŸ-RKÍ2âú4#† ¯uz(B]Uæz,@&¼Ș)LÆ#øèg™EP©Æޚ£Ø_w
•¾ZW™ç±0=|ÓÚ†æ®@ËÅ\$‰‰…>&žâЖسñˆS&ý{èÆX¼ý?Û%™›xpî2†£ÈUb!qBâ„Në›X7&b-LæÓA¬kuõÙ	Z©ñ…û,[âÝbŸ–XaKÀB8wÔ+ŒÄo­Kfm^GobÉøåœ·¡I?ðâ÷U´^cP/ç¯ãø¶‹™£¥93‹ç󗠛©"d6ßÓcô99XpI-H<@TÿR¬ÌÑƑ…ž`9ÿGÓ3ya_)eŒ–‹b8~úh'|6s
&%”Ù|M
a\»
=§ñ^´µµ“¦i%–ɐ TTðŸºV8…3áIEND®B`‚‰PNG


IHDRr
ߔcsClÁ0`M¯IDATx^•ÓQgäPÇáw3Weo‡!ÃÊÐ/0„Ñ|‚¥,ý"ÛS–~‰ÚzWÊ0��«a˜Û6çœýɾœLŽé^<BþoßÿœÖw¹¬ïþôýäݤõËGî!hwÜBú¢oÎI˶nñ¸ـp£®Àw¯;EQH‘ºс	¦Zº
ËWxÄTwÝã¦+ñ˜@Ô9V/Z!Ç¢&xÐ
»>)3)r\B@Č_6Rz<c+Ž`„.(p‰±\4+Nʜg‹g
í‘0ðCSähK}6Ñl
	xA†c¤Á
$`®×&• ÀÌŸi½`CN‡-ìJ³a©ó´¥•;gg0ïc~‹G(ôÈH¶€r{%^i»cƒº,r}à€[È	ӊ٨-2ò¤C9ÓÈ)³G†4;Oïa?2£'·Ç;/saÖÚ6؃¬OOh)ëJ_! ó9¨Wk›
öˆó|6ïrƾCÎ`æã2Jçô„MÈOÌÌ!g´³˜C0:鑦>#ˆQ8cæýnœ‡Yý{}ÌDÆ|ÄzÞc<aa̻w¬ÏϘÅbÍ<c…1
, oJ(³hp×1
,!P
”iސª7ÍÆ,uWÜÛÓûÇ'@Ž¥#(‘¢V)e°Ô4Käˆÿuè7Ä9H@‰5jˆª-ïPBäÚўpî»I %RÔ#§¨5+!	
Ì"Ž9á'Þ7sž
©>É}Î5‚
©>Êt,‘5&øQaÍLiÙөàÏoˆ®H¯†«úHQATï]#_T!Õççž
)j2‰ôȰÒöim5JWþ?J¤¨uO
v۶‡BB(E‰T•sX4¦Ě‚%DÔ_@ëqo°¾˜FIEND®B`‚‰PNG


IHDRr
ߔcsClÁ0`MÀIDATx^•ÔAg\QÆñÿÛ{7!«RB(a(eh•î†a4Ÿ ”ÒU¿V颺(ýá2dJ¡”B	e¶mç>5¯‡ã^s2ͳ™ÅÜûþÎûÞsNûüý@”ðâ8@b•<#˜Ÿ(¡
)A›À/àØè0€uNŒì
Š7ÆàQ¾‚‹ÿ€©ß}„À5_D	¾F|NÌ1Ú%ŠÑ ±Îïb°¬½¾¶¬õŠÐgT0TP"Ñ9pi‘Jž&Æ
XPXµHgHçÀK¶EY`YPհ¥ÇXËÆ8kéûqGñ¢2¶2Þp§ғÁƒmùi¬ZzA°ÊbF+«<0:¾›{âάAËڱ" E=Îʫ8AîÐ
×`'cFÍsŽ;sëe²œ¿Îg©Þi†Á¢˜‰-\“­ú5Î=٠bC޶ŸÑìLÆ	þeˆ[£`
‚±PÀqÍ¿{+‰	öµ+cƒ.hJI”âÂc¼Ýò¯Gªu
£ ¥Ï¢šK۾‰<Ò~ý§
:{ }vg_ÄÀvƒ¹iT§þÝ?Ë¸®M£Åà|àÈ2N}i	ÄcÊ9½ÞÚá:w©ŠqèΎ¸ŽŒÎnšr¤þ†qg;°&w¢ÁŒp
@¨`“êæWbs­¡"<^£’oš2ÆΫ¦^¡jçºkôЉk."QmŽÅ__ÊÑùö§^3dH8˜QE×씝êç¦Ã`©*†1w6Š0¿ë»ÍñnîÒ¢Q9÷\ƒr›$BùŒÑљ}€ƒDjZõ}®PDK¬äJ¤á³FÇß^þöޥ܈²Bƒ¹Äj	-ã5êry‹(‹Ɲ]±3ª}ïSð¢e½ìD£±ûsÆuø{ªSG/]IEND®B`‚‰PNG


IHDRJ~õscsClÁ0`M^IDATx^•ӽKBQ‡ñ›EXQD&H[CK´¸õ²4µE†€¶D‹ÔÐØ´õ2Dc9ÅCÑP$Dm‘´HP’ö¢aAŠz‚Ãá@ÞS(Ïö½÷3ü†c‰&³ÐÑK;N	ЇeLƒ¶xEPd7RÄþ䨑$A	Á)NƸ&üè'KŽq9,!œ3Lœ3ˆ#ª!‚2H†°\ ˜VGß+Pe„ŽŒ@þôÉÛdxY¡B›	œ l•	±I™(]v5€~Ž%}&BÇoà¢`y¼¬iþÄN
°˜£Z
øhá‹4
eX¤S,fy«#¹·²Jž[…²ø%ud;
鑱I½¢€nˆš&èW< xÑ@çb†	*xÑS|“ÀÖB–ÄQÿÍæYV$dÆxǍíÅÓÇï6
F¹” fæÔ?û¤)ڀh²òdsˆÃ(>IEND®B`‚‰PNG


IHDRJ~õscsClÁ0`M_IDATx^•ӻK‚Q‡ñ7‹°¢ˆL†Z¢ŭËÒÔ!AþbØ-jPCcSÐÖeˆÆjŠ(Š„¨-’	JÒ.¤¨'8ä{
åپœÏðŽ%ÌBG7­8ñ2M–1
úØàAUÜxHûŒ’¥J‚CŠNq2Ì5á¿@/²ŒÈaàœâ$ñ˜AAP
„l/iÂfp`B}¯@…A¶80ùè“=6É 4ð±D™8AØ*bQ:ì jEIúL„¶ßÀEÞrøXÑü‰9œ`1C¥äñÓÄ)>J3O»XLñVC¦åÞÌ29nʐ@ÖIî4x¤K~Æôz¬€®Ÿª&kèW< xÑ@çb’	ÊøÐã|s(­3„,C̲¨HÈŒ)ðŽۏ3¦߮q)AÕ̩;êvIQ°Ñ`?iˆO¢öi#’IEND®B`‚‰PNG


IHDR``â˜w8csClÁ0`M‘IDATxìØS›ûh†ñ»HÞo3©ƞŒֶm۶m۶½û=öl}¾Ÿe¯¬1ž¦ûoúÜ×õœï¯kM)¥”RJ)¥”RJ©K¦™ž·Ù2\\,ð!ðUޗ>Ϧá’ôy§ϟÿ«وƒŠ>ÈçA¯#‰8˜N7äsR±ÀÇÀW½¾ô}N¦S%‡üçãF%‡’u·Ì3Q*ðž}I„÷ošg’,›
9$Õց/ýQ4r(YÖ0œW€Ouàÿ]z.u—óɸ·uØ+î] ï€4@€4@€4@€zf€&h€&h€&høïL‘§f-GWn@‡çyu ÂÞ-ô_â	tpÕ2w|»/૽ð&Î@‡fËÜwá$ƒü­c‡‰=.@ÆÊ<¶kY–(±ö¹Ü.€ŒfJ<?°+Ô2L¤H€"‡ëªiŠ<³ÙÛrм[u8VîË=©̄œÜóa™‡=ÆFöNµlæöún}jkbÖÐ1ÃDÃõ4ÀlÀñ?ˆËï59EÞÜè—î¡-Faí%–VìrKOŒûœ}ù!ëÓ=ˆm™{Ö{[éïûIJÈj†ÓwbOôW¸j·:5–èòiÃ2°öº/övfƒ}¾'f¾Êñ=P-sרÇ+´Oƒô_ë£k¹½†áگ²ñÒï;ês^îüOÇc¬¡Y˶•ÒʿŒb—[.œ¤	›/±Ôk.7æ`6äø緥ÂöØ5ýˆaé/ÝûwŒ™¤µ¶̃¹8ïÈa,ë¬Ჯ[äõ¿ߖWæ©р­isŸìÙ:â¨ÜÔ]®ŸµÔØ@íNÔçrë·U*ð©)r0uô0ÁDÀY¹¨:Ü7P¡Å&ºx’þÈá.à«f…kޞˆK,qÃp].vˆ8ä§ýpØd[GÌmsô5&è@-C3ýs×Õ³!'^2‰GöÁn8;Äڵéu–]kXº¸£†ð§BNï:€Øá–˜45
Ww
@Pâ±>‡&9ªiˆ«÷tÀö‡>±5.9êí]qv©qà0c9íð!<rØCx‰åä-@€4@ÙõK{w, Ìß:Œž
¤¤‹‡tñïòõÃÀÁÀaX˜X˜Ÿwcec#½êz {LIEND®B`‚‹µV]oã6|÷¯ط\4‡ÚúdYIؒ*ÉIýv²DÛD%Ѡ¨˥Eÿ{‡´œ8qZ»äƒwgg†˕º Wn•X­5}pÏéã—Wt#åªà܏ñ\ÔZ‰E£…¬(­rjjN¢¢Z6*ãöÉBT©z¤¥Teݥ¡×$•ý+mPJ™‹¥ÈRƒѥTqÚpU
­yN%¿‰½N5~qà…|Պ2YåÂ$ÕÅä•\Íú²ÿŠZMr¹ã”É‘M­Iq‚«AMò›ÙjE|UR‹Œw!j*€g`žËZy/9¡hV¤¢äÊxD‰ àž#;"Й7 ÷ÿp¡­Ê)—YSòJ§»Cà<$ö•©æJ¤Eýl¼=0¼/c×É-‹)®“{'òë0
îØØÓhNNN<rƒi8K¼¨KÌwûôõ«#ð쌌Ÿ¹ñ~#/Ž)ˆˆMÃ	C>#ÇO˜ÛÄÉlÌü›.f	ùAB6e	’ ž9̤ڦ^äÞâ_gÄ&,™۪×,ñM¹kÔs(t¢„¹³‰”p…Aì‘Ñ3f±;qØÔ÷	$P˜¼;ÏO(¾u&“·õÅ
ü$b D1<ÐuFˆµý9€#ÏMLÆóʅm 9éRz.ÃbëŒYN4ïs{¿Î‡};Sç*?ü»?VU@tüـŒf1³ò™ÚÑ,LXàŸÓmpq¨áÌbol}
|Ëþ‘='øi”X'»tëa+2ÎX½ŽC·›쇡$lHLþ3Sò½›	»ñ|×3ºg±wãYlضø½3§¢P1n-‘­׵C욜ñ3üÛxœeÌڣǣxæ޶¾™t:ƒš↦æ*i%Ñù¸–䮕,ES.ˆSåJŠ|r>ø
)11«‘ 0³´BpñHµ~Ŀ_Ò&ò{+¿˜‹„5/¸¹vµE²ûôgÇ\È57÷|HŸ~Ú|ÿÜù«Ý{|ñ»нÒìíöx•²n†E>øfó¤UïAäz½ÿ"­6|§˜+‘‘‹vu--¡÷;ejѬú™,W—?_]ýا°à)f.«3MÙ:­Vܢá´ÚYo,®›B›ÙdÇùÄØaâ0ôÔ£kHk‘ç¼:IMZñâ˜6¨uÒØr;B·ñFz;„1õ$-x»‘cfîøgRñÁZ—Š^§¹|؎qÛýl³yq¢Ņ¨xï0v	È^-þàCºüÔöÂNœ¨0š«´x-ÏØV¤½,­uÓY£e·bªþÇ>ÓxuX¢æ	^”\³ú0ã}ž5J¡Ý,^ï
«ýVÎûª[ÅK@«žZÿí¬÷10™íYíî½Ð#¨e£ù‰¨û¡GP—MQԙâ¼:û0á©Â?õø^o?£Ÿ|·¹*dšŸŒþ:áh…ÝX;¹Âë„Α¾“+|*ï™IÏsˆß؏ƒ/'Á&Ís4吞FÁÑÙð7¼¿ùé‹ŽÁJÅ0D÷ùŠ7°U7‚®žõ-qSý€&½m.¤¹ä¦PÄ7ºœÜaz‹A.Gæ5(®ý
îîñCȲqÝpª$—§ñ_,ÈT(ï4wÀW!È
\P¤fOð2Z\e§œh†;0áe|½-zDBdO©i&…Ÿý--RÓNÞ߆óÇxƑ:ÛÓ[k`1ú\㴶Ð蕆º9|7ÿ"…•%=µqRÞéÙü˜_Œ> &ã‹mPÑNã0|ÏWŒÔ"œ¶׊ðr\áéÄ ñê8›Æàؑír¨ÿŽ“"Ž•¥•g4³;»g'X›¶·rS{LÄ3–­p_ֵ5ì\v¾6֥¸T
£ÐR#»¥2<8‚©àkéàLgA˜’àÆlÉj*Qôàø}w•8ß+‚’‚t°ùš{®QÐЩ2.!uà	nÖ׷wר¤¢ôä,ŠbE•O¸µæå4ŠÇ${„·`®½æÈ.¢݁n»ùO˜ÑQÓ@æ˜/Û׋€_déë?üÞeôx˵«Œmr8Á=N’l:ªƒ"~êšé¿LÏ;,•#fÙð†A¦åBú>ײá^cÅXã0ú“¶Sá@¢+¤H
ú+ÉNXzÎNÁR6ÖY¨YøOÃÁ*©¥§Ãñ¾ÏlLò9$)Iñ0z¹jÜQýü¸>›/>¿ž©¯,oè0éàb?ðöu;치°érOgìˆz½¢"ø¢‘‹u‘ËNÃ0D÷ùŠ‘T¤mŠ@Uº*¥Äc|€ëÜÄV;²¶õßqµ‚˙û˜síÉ+ÓtVVÂãŠ_c6Íæø„•°¦–me녱nŒ¥Rˆ–Ùã'#˜^HgZË	Ü„ +³#«©&ÃÃûcê|§JrÒaÌæYƆúM¥iu©ƒOxyZ­ßÞ×(¥¢1F“$¹`֚}ª¨ôÙÍo5ª&çXEg?’fåß!¦®Q¬ËC’šҍ2|»HŽÉyIl›ŒðʶYN~cMCV…c”¬4öҋXÜhQšҽ,¼È1Ÿ^.‚#¨GÈq{ßz^ÆKÎTwå¨eQ(ê+¥Ñ>uò‹rdw}óñŸۇO´ÏDÍ@ↂ¦ƒ‡7 ÆLµg:[I=ÌçH³ùòo¼‹͒‚0€ï>E&g¥ê,,xØ7A찬µí´Háí
àèe^š¦ùòµi‡bçl…"ݥ¿ûÍ#Œ7cc…¿}ïÆRJYR™-“œsFO¤Mg¯ÿ"Ïs¶T	­ûazơÓéÇͧÀAAîb?]¡¶õÙèݹn®mpw{)¬Nð⾗{‹èë†`tÔaÐxڔޙ©uSGz{‚KëLËvGz×ٞj‡­ø¡2ŠÛ# ûH!ß
±ŸR®Ê>–¨·D*j£…LJ¬¦YRÎ?|Ú<`Á1W¢‹Mޱ
Â0†÷>ÅqÎ6פéà .®îBkHÓ`C|zÛÁï¿å‡ïŽkç¨ ÖÍuþÌXJ©N‡zz+Ɖˆ-B2}йðAFéðkÑé2e‰\,ƒð2ÖJÜ]ØU°ÐúgÐÐK¼7ÍÉ÷%±¡²e[v“°èëÕi."·MnׯºêŠ;'¾‹MŽÁ
Â0†ï{ŠϮ±V²îàA¼xÝ]Ø\µ-®,ç·V¿?—¾„´ó2Áúp~ÖhRŠG!˜¹æ}ž“D$²ÀvHF£TqE0£LúµŎ|
«F©ò ܭs7çvdÚxKם‚ÆmPÒ7/ÿÆw×?b±óIZ¤ºPOFª"·Ÿ§ºê
È/Á½‹ÔYy¯âJvÿÿ}
g¢hÞîm³0ݓHå}ߍ(Òx·ñŠDùî)s¹÷vO¯)Rê¾åªSg?¿:.пü†ü!«úڤqÒ!¿“ óétƒ€ºÎC„/ýò¹/·H¶asƒßÚ6["lUŏ}b$2 m»&õú.­JÄ-¤oC$-‘¶ê?¼Ïxié6W$ªš¢}B†´Kª¹ÿ­únäRTA¥¾;òxBÜ&Dê°)Ү¤nªsÀA—¸ü/„|ò¼Ò2FüªÒqS;r÷a÷qÏ>üj-RE¯:ùU)û¶ƒw.ÔuäêzÕy\z=2Ÿ²êR?|‚i‹äßÈæ]ìݼ/u‚BýÜM‹°¹{qþµ"PàgyUÚôP¹ÿ]+œ‚ÊìÜנ¡0\oÂíÂ&uóöÝñ��?7ã5,Ž7Se,4ǚ¡nyЦbM“h„TeͶhã	áòò·¿þùÏP(øo?²¡wšA›&¢/k÷C†P,ž6ï%›âö	!lQT‘x™· ™¥>A%è‘É×;•AdÚ 9ø^â­ý]*Ã[Ê(ށò¢ÃâI[ÆÈE³
M5id´‡âMR¼LS°Px
Fè-­XˆÉIú¶}ꝩ*–ÁCeUÃDªH{¨ì!cƒ&­qÇûˆ„nƒjJOˆ©Ñ$/ž¡¡YÀØ?΁lMZ·!\G( Zùûýs·ÊP¡Ñ槑	a›üÝ|^j¶fñªò©4ʶISw?©Ê][è_ոÇ	ús´äîÉ'Äáh¸dŒž¹ÛFCLh7i}NEB7XãþwM…f%ž¥’	ԑ‘ÛôÐñ¼9ð/°GTh
i¨ÛC‘/Rïé„g@mùQÿ=Œ¥É?B§L›ä~Sýí7+iª"í$#·Ï;#AꎵÕ5,…”£@Å>"ÖX~Û"Q
áÐwK¤*ó+ÒvWøøW·Òêßîåøױ‚à8ÌñÞ^8Ý×?Âjþýß_%üÇÈþv¯̴­s÷ú{"ÿ”uÕtnÙ}úí¿„CtÉGd1֗O÷™$±NÍǙWòŸ‡ÐËÒîùnÓó«ħßîª}oùUJ±¥ŒŸ!@‡‘¤jÒ$póçÎûô¹i	±#í¾Tä‹ɺjï0õB]qç~z܄þËBÞ5Ÿ¾tB”‡ãÆÑóg´~•÷EùXƒ*=Gn‘æp‹ÆÄÈ?qa~!^ºˆö៞£òª®zBnOÈÛúҺeû¾4záw„€œF׻/`Ð^ÔxËàeÙÍӸ|N»°h¡ l~îîçÚ-ÃüC×@Y5<¨Êî'øzÃ=$Uíúiíœþ‚̰ôóªíèËz#ü2¹fÓé¿|+·ÞÒ&MZfweÆ9èà®*Þ»ðÒ=§ep÷ác®vƒ&ÔÛsá6qZ~Æ2Mow
¯j‚°y†S¿êޟ™y'úûBû~Ž5Õퟌ�#&„÷†çŝÛtÐWЏ]…„åݣomË(‡g\ç´M=á9,ïÌ ¨¥2„÷>¦«*¤-\ؚANmR
È8~µäÃcúƒ|½+󢿫; ¢
Lôø0?.ͯ²àvæå-Z°Ii"Øj@dHæÏÂ~wÙǗ¾òËäpû®ú^RiùüŠᯓyZ†Ï_Óz®ŸÅM՗4<¯šÈ?Gîø}5¶,}óÒä@æú²}Øk¶vDò˜ä‹SéDðëúŽݒ{…í©¶]‹Þ	ý2>Û×ܫôáÃG…"Ó‹öÓoïÓBè콀ÆÉáaV	A7ÿtW[v³yO˜AUþ¹{…Ó1pϏsªýðªKˆñüyc6ÍK=¼Æ?êóA¾ƣ^Kð=0ï	áz-Úî‘]U¿žyQüەŸ‡Q÷%D}G…׊ý™†—·xÏÆqö‹ý™°Ÿ€ǏõK òæ†_9ŸèØç@ør}FúõJèÖuèÂôóaàayBh*áñüÅö¯ê%- YßXÜ!.t¿¿À
Ò7ùï۹ï+h]Ɵ<·
WØSº%Tc˜Šl\øQL;¡íŽøñ‘„ß=üKQZÁIãQ’1Õ:P(Ð&ñÙ
­;åŽݝGíø,Ñ
ŠzØß÷,rm²ÊPí)ö#à<PƒfìPiºҟHÛÜö“}‘/—K¶ʌúsÂgƒm
֒|ƒ®ݢ.–=‰WðN†¯æ*s]oßÚÊRåŠë)w³ˆv¹-‚+lT|±ÐÊswY¯ËiØËçe™L¢dQF›åòv›Í6~þ
°šª783=ԁZ”;I ïÈ
1RŸ]),&¤E`šnN€°_šhF‹!í%´q‚ØKô­ÈKLgX
HÚnêps8Û: ‹ؙ€Ùr‘S2Å:y›]gqéi~&8‘
r|%^ªvԃ+NÞȄlj5w.õvë{ê‰ïΨ™™g`Íš—†)nìE*ô{á¤aÄݼ˜zÒpâÁæÚçæ$!OÀÚõÌêL•#P—8ea²‰‚Y+s'a&`·kc¸Áڗ1é3ÈzubŒԒٜ\×Ó뉹hS4ibݥÖ!¥Բý¨›’¹6Ã4îz΋³R´°ý†Œ%]Jêq•’$œ^§վÁ'”g¡čèÓxÎp#]âW.ÅfOhÉ0»î=ҚÅr³+XL;0h<kE®¤¢åϸpÂxX¾AÍF?N7r·çñŠqÖú\­¹<“S_]Ÿ6óÍÜ›¯8±‰=Ë8AöD;ÔɎ8ï­H܃PÏu@µ楜%¦8 ÀtGlµ¥–š¼
;Aº,©Õ2ÆΒ˜5™.H~¾]-wZ+ڂ͘f͘ðY¯ãhGµ5æ٪+Cþõ RÇù‹ìÞÝߟµãqÞøª“vl
\OÈá$ÊÒÀNp•°H§—§æv¤L􉩯^¥b“ÆUÄ
‚<8Øú(î†[=!Pã7·<»¶qÀ.Æ<§­ùô²èÆăé"7õv¦É€ï´½azrP§Tv¸åI¼«ì³eo¶2³k¤§û=SÃÎƢÐ'lǤ¤˜‰UÎʘ‡ÏÛ+	Qç6¨¥
.3\¥tŠԅe¤ÙU‰blÂq–$¤.Í.×f¾Âg°z<쏫öZÍÇ:	‡,{h…¾’úÐNlòjV}´ØÜ\KýŽ“Ƌ¬(©ä£%t¶I:õɻjCCvH‚
g˜ÃY*Ý^]1T%Éó޽.OYä%:5&Ã
MĹ¼2.^/öD~á'ËŬÞҘIh«bU,
Ñ!½v³¼’ö>ØYÄ	…@P¶„‰ÝÑ_ª±s}¸kúŸh™Ú]Ÿq	M™a®íð(Îj;0ZÉ×Ý
'5°ïóc‡oÙ5”øÆd¿S¬ѝ!ñԊSòUžØ#Óު†¸$÷<ÿ¯ ³Ë_!/íÌ7۱&„Gҽ©y¿¢xo0^ºé/šêïtæŸw¬ß{MøüÅxþí÷â/_B޴aòØ;ý~™–Pq÷q¤¾Í=Þsÿ''þ‡qüì%ð«
¯ÆÿÓüONƶ€2‘øì0φ¦íä¢*é±']Â\„š•šÛHtë"]@§"FkN,ÜæX’•ï³ԥ_–9IŒç43É遠n™f±Ž5˜·›ÒErÖÆ=•}Ӟ&Ö[¸‡è|€%é»áª^±D~åÃͻ³§L;Õ4*jí؍׋‰†gÑA²x»ŠµÝ\ß	B›e—Ä=gòùº±ɨ™m¦Ýuç	qøz’Ì&!Ù+…Ë:Çää`m¬×SGW"oÇÛ ×b1ž~žAzôgÁPʸ<]q±Y-Å<“
u~^±JvTr3‡sá–¶äYÂÊ}c…äVh¹îâz Ð	WŠ<%„xn
ɜ'€¬ì®ÀÜ&;{áF1MÁYÝéPuœ’FÉ*M¨ëÝm°½‚3ú¤+‹©Nee	ÀÏv—!wä>#—°;*;¼sJÀ8³å4éÕ3¶tٝy±Ïz‘ºD²\-ÌV…“ն£¨K·Õéêõۙ
V‡‹5ìE hÔ¾jY8Ýð|L—e
}îl´n×VzM\	‚:.´LºåÌlñŠ0º
m¾¸ì6ë‚"»Ce>©ÙB$ñ]»œÄÈìf‘µÎ|,潸+ýÛB'{VtÛù!h÷Tֻ;j¯Ósãêî²ét˜Ùq¹ž­³ªP/+t»áJ5Ý{' ÏÎ}­8
We{gr!7=S+3K
Òiìð
Ë-q<NÄÕ@é4ɐdΝê袶·<š…Eã3æœØjx­ƒƒBÀLYß囦ÃäRØb¦Å¡	m‚TA{·¾Xí¶p‚Ô/öQËT{BâÝÙÁ¤cé«ë…dÍ:£˜à$Fyn󆗴I¨¤·¯o‹ù¦>øI%A„Ûåz-O[_"øĊ‹Hôç“ËF*E»’£$„zµØ1çqŠo.ì|cÐ1$ž„Vƒž‡6VPž1zC
 $$نLwF_RÌ&¾%h­n/ñ&$åðR¦4â4p±D×èÚ/ûƒçΏ$Càiw	7ÝŌ®2É׬¾ò¡}d|ãçëu¤†Â!qð‹ìéYeó,.0\K4G]&lށ=…°¤vGÆ
ù€$F(ÊDšñÒØ*X[R(˜+š
A
›sZ8KžÎKGÌ
°µ¯3´öêèa‘¯@×7a¯,ç¤1öjʹ±ÂqyšêÏï3׫‘ŽÈÓǾÃòó”¢Ô,
Òâ{€™±Vy̑°›%8§‡/æŒ*Ùlnêóm+
ŠFw†.×Ùþ¯)™¥¢<YvÓãçi0dëÄÈdr©-aïçÜTó<ý23E€yÍîЈÖǾy!S«Óv@çA0|&È ¸ê7Áužƒ%ºXKŽýi~ë-³xšãé2¶+¶w#Tzn8V¼zë>q£4´ƒeºÊâLeߣ¼FN§r–Ÿ(ÿÖ.•<çb·k¹¾ª€ºÙjä-ó´èmê\%ÂÙï£| £l†Nd
•-4ЛÅé(Bz'Ž­s¶Í&¿‚¼*EGë}ɏ®U Ì}ŽÎ+3{½ ÉGsòӓw¼ª‚MÅW7_ܷveòóyoZ¾w­ö£«ìäêù½Aš!³÷{´׶gúË<ô/ˆ֌—ݨ¼[À2é_®ÊnUU´ï¿ú½\D#|ôò㟸e¶OHÚݺ|½»¼߮yácý~½æWMˆ&]‘£mâՀ~~ßv¿h{»¿z¹„z~½@™½µ`ߺDþQû÷õä/ÇtàÿéK–±Åԣ/ƒM;pã»3‡3,o~˜sæzÐ	âÀn҃IžÔ‡­ïcéû9|c…Ää½÷Úvòvë»|COçuGѳê⛓y—
¦;ŸO‡@qŠZj%^áŠL˜øCpÜW–¾3ãhŠ,„²—s=¹*¶i8g~Àf¾ÉÇ-3خl\H5ִ²:7[
³Hên'«Ë5v'‹™‚…Ùc4B‡ lïÊ9½×
 pq‚‘Æ%/ٹÏW˜p+vª>÷‰åÐW(ª‘vÜuºZ‰ètJA*WÊöO˜ÞMj¦´®Í[<볇]ækÕÂӍvbænéŠÎYòà{v
@i™8ÑÇõwür{&·R¹˜já*[ß2ÝË ‹øPX²·r+—~p¤êý24¯"lEô=hn”KcbÝ,ãtb¥r»BÏΞ¯4VâðrYØ4¼MýIAM§Å-œŠ–‘ЧLW³dÅk†e9°ød#OʭJµ`"œ–•|{Ö0R[ѳ
Ñêœ_vn¤jÆÒ!:-[ã@÷!£Ÿª:!@líÖ=H޵˜§´‚¯ֻ>ÒÓڻ¦N@ó·¶$ÃÅmW&ìõôßì|g“Ã:våR•™S¹ö˜só7‘b%1ó×/ú½ñ{3³“l¯=ުíêf³A.n8¸hPx;ˆocˆ½ÃalYÛ4Õ6$ñ%‘ `¦-RkÈÙz‹¹SëhyÔ{ƒðoéËfPmï8.KØ\‡x‡†“9O>i“fMê˩BíE?ãöE‹Ž±Š¡’вcIڎ¿.,Z¥#wØÑ'Ýz¢Æ}nuu<۾³@¼ìëÍǎföò ԊqÕj&ECïʊ` 	ëɚQÛòTúhS¤¾ø¡‰ÛɬMk7)N҄ä
0W@€ø†¼/§Îx·ú=`m·jÄONêcҸµ±»=«‰t@4ÞÎB`ù“H6'IK׆&<$õ!<´îó`F��*šûCPŒÏY\+Öû[~.›òêûùÁë]Á׏Yo—©®w	[uˆåSÅÎë.¾æç®ç’_°¢ÌGµ*ÕûàLµŽÜf@8ÿ埭HÕ@åoø[jx’ӝw8Ðõ+ÜNöj9‹,1¯©ú~ëɫÛ¼Ñ÷q'yܪ\})Ì1yÈØÖl7<ý䔈¦r§‹û¶۰Q-¦ŽO-á
¼%ó‹vŸrüƒf÷ŸšۅqFÀÁøN;†áµz/„Qìø[Òt~/vÖ)C ¼F=¿¼ÿRé0jê»NóñÐg±
£{­€(|Þeè5û•±¬§÷qŗÆ"	|N¡ú'Ã˫R…—F{þXQ*Üû¤,Z½-úùz_ÔˆüNïܖá4,NûCoõ¾ÐN ÚþܩbͲbKÐǎ	ÚK®•IÅÓo|P®„ΒŒ‘þÔò
˜²pž@Ðåå£H5Ø3	›ÌÕ.Ãx᭐$0үLsŸ%	1•NžØ|X|¬Í߼‡²µŸ»½LvõuNR-ݥÜߛ
d¶ÒúåU¬‰K2ïd]Ñî;Ď'|X®«Ï5±T.sÌ2®›ö
R—M’¯™夾d!j„>
Á)ZŸÔñI(o9ŸÁXÏ	CIŽÑr‡õÕ7›(޻ëk齿-õÍ?”<‰7&aSTE;}ws
ái]Çóר-‘íW4´2ñüîlï•÷3nœy/8ýô6ì™VãàšŸª³̊E*?ÃÈò1¤&^éâ=æ·Ùï@.밢÷;ƒ”ñqkţv,ÒLMbñg8’Ãì=;jïžò©AR$¨·þ¢ëå“ô©ƒÙT™Õá=
ƒ¤IÍ(ù~‚²o)±Wv¾0VF‡ó£ÜØ&c«/ŒnD*
¸¨Eâüú
ɶ \?¢tuੂµÆé²ü³¶†¡wðI_-²}ÉÒÍç¬Ha4´º¨—ºê{…p7lÉãfa¤`š Ö êèÎÈ|CºMКšF¸7¾¤z²µ|˜g»ª,mô¨Lƒˆd¨qW ÷¯Qðš,ÙO…zX/¨¯A^_ð{õö-	˜¬”&{Sƒp@=V*·Ÿ£žGÝK?U 5d˜FšÛ-”©K
Q×òVÃkù>Ö⧨מzWϟ™
uÀòú&ùywCû© ¡©„à_ŽÈֺVHè5/
*‹ÞJWë]±¾^Ñq³[A•®ºªU@%èú<Îâ5ÁPc}ýúâj,ÏJIÄòˆV]&F³“¼ éÕEŸ`­éÞF­›ÚÊÅ[€z’jÑÛ4}ϧÊ6xÚùÈìÏuq5ØyÈÆ<gœþºmG4×.ðEèÍaˆå&‡èa6Ío2TAfS¾Àw>ÑÓI
Åv`EEΞ®æOeQ7qR!·o·>1z8¹Ô^F¥KÌ>ÖÄüW"¦â„'@ѵB› Onó	n,	OÑ^¾¯‰Íýê—85ñ<pÀbt­ùöîîGÔò®&)m_å°š],¢îÅ0ҏëñ+¥Æc3‚fH¡V¾6«kjvþè­lsST½Ã}o7;ʹï7¤ÚœõÕ×vBŠä@S…vPd»#Ў=C Ÿ¸ê[⫫\UCé#>×ÚôD:n:Awg'º}ø
FædUe£ç-ÛÖ/:ˆO€ú¦J8´¬†ö
­Uð\Œö
Óù¾A!AW
o)9™Jð>ׇ¡ߒ<5ãùŽ&¬çŒÄlIx>LaÀñR‚yèÎS8ßèµ\_[-˜òÉ}ä“*<‡X²(­ü‚吺&>Væù¹|®¸œýhÖ(‡ÞS€=¸ǎ/ãb¾LÙÐËÅZðæxªvÑq‡ºC­³Ý÷\»yŠ¥e`È-˜ߠ»í°̉ÑYÙ?ËÐÄV†¾q«ùFq‰`ì%[ؤ(¤<çù©©i¹¯s†ññKðÜq{3Bo¿Ցì'é*¤ê÷ú¼öC,˜
ù‹Ez$ÝW±Ç~<Q3äñײ÷òñQ0Ø]—ì0ÛŸë•ZÞù:ÙÎ<û uk„b-î·WIò_4”Q‹·º°ðmb¾1aw‚BI²}¡¶D‘¶ùxœË×#šnD!ßU÷X‚Æ7O+Ñ[)VÇö—AKø^˒|ÍYX“|Iïèl‚),ñÐ};ÇΓ¯ÏöжY”ˆ򣷍§<Â@þdï…S}€Äë÷3²{‚¥?¨_gµµàö
õîÀ×ѪIÁýK*¾ª@Ӟ†(x=û™8ÞA©‘ɽ>;Ý[?Ÿò ·ÑëÁօð‹¾:•=xá†x¿¿ú¯>®»aƒWܭ}˜Zñõ!l¼çÝҐÅڋê˜0¹ Oϛ'÷è»]ÓÂÆzQçØ##(69®…B{_½}£̂O+1‰ü½ÔcùVêyº 5µ ~â·üœлg÷wÍÅm"䆊²Àñڙù?GÒ)´Bš:<ùŒAåfÞÑӰ£.#”éòéBݹþ<ï4HùùwÇçs`Ù® 
s$óüA5¡˜§ЪTd£èÁÓZÃDױð¼ª8趽ó†úV”ÊMieš}꺡ü¥?&Ø6©,ŽM
Æ>Ýsku/8Â#;“‡@¦õX†r†$</hwr„³›jG³9¢áxî·Ÿø›„°]“Qu2…ˆ=›gýKçü~˜é7;ÿ&…•(Öö4³*¨Álë‹|ò	pUåg£Vƒg«Ä9Ñ@´þ[ÐB¼7õ3`؄*}¾nŽ÷PL•b/¡lé]¾›îwXCÞʌ÷¥3Akó$¿¨æ…Ögڅ½Žܩ±çÛî("û˜ûV#Tªù—0ùtiåÄ6Ø
Ì=jôb\8‚GÏõnn–U‚æåx#¶Y`tŸZ|¿#(º{XêÄÓþY­	Üxßõ!êW.¼2Õã+±ã¤ў¬áöY#Ço{—¾rƒ)òժRZʷt؎Ç7Áøëå!^âš2=¾ìwzM¤ðQ/Ã(ÄîÇA\GaÈrïã17›{q¯'Ô"­°|,\‰zËØàѺEþõhÄYó%위GùZ¿ê‹*¯v{ ·†.½ÇdGjz»ˆxd²õúŒo¹
ÛJ˜]ԨYɗ©òY’ØA_Ï/¡®2òF
²̓8)Kµ+ÿ~:ŒLK´Érõ2$|bÚ܋¡ÕÍJ”È)õ¾dw¾6ÌôÌÞ|$^Ã8±¸îXŽk{µÅS*îÜtCñô4G¢ŠV£ £ëE8ªT¦נħ?óGª>dbb“‚09ý­ÎË
ۤjW¿Ñ0‹ä2,Õ/û;¼ôíôº®ÿ×ßÜÐü=íì¿tCóɰú-‰ê/æIþƒû•”?ú¯;µó÷’?ÎÑü£ų¿¼îõûòY񘗿¿|öG›¸ÿŒµ2ØwÕÀw&"L~Š~[#Šå+GE±«*Ì	!Gõ ð|Õ:<ŒV--	†!½žk$œÃRdá3$½MÓϕ~òðnʋ‘°­xZ4µ¹E2.i:¬DÍ$ñdé̺\“Z«^EåÀ̭@úeÇv¦<üþÙzÿ}ewœ]úµDù탞–`\•`ýcžÓùp»³c(ȗ2ANËó‹+åÁ@8Æ€öKÍg†¿º¯a—éWËCÄíJ˜ø–'¸>»•a¼¾­ŠeØÞLJ(²aÖÕ?‚=òºľn×—Ì3ž¡íÙ,>{UښœEh5ƒÅý&‡¢þ)ǂÞwùÝ-([T7iñ~v2L ž¼`¤<[{/¡rTµÀÃG	
ç߁ĸÒ$ýoÿXâ=þ¾O*-låz°8£¿ÏÛåôÁÒs•ސí ÙJ5±Û
q͕Èg„«*‚cû
ú”Š–ÁÊ
R}1f‡Òm?+³0èܚ¡rŽ‘·šrK;bMº.c*ÔÂ}0†ێƒæËþì³ؓ´AíøÊý|ÇU^òE”f^]?`á•XDΑÅÏؔ¦®á“׉Y
ëA¢DúڍMDqV"¿PõëEÞl·Jµ„ܬtUqK6â6qÅZ™ç¡uÉ,8“}oºÌ7åWNùÀ,„ïùJꆡ&ú9 P{ÅæÊ`%gÚ`äǁBò(Ô×)s[ão2í¨ÙÉwRšŸ=Ñq˕k†Âë/†{œî,#{Còa=Ï‚xpTä©yB÷_òä
?{"©ƒÜ+¢˜ļvBº¹.ð„5´9'¼ë7frǹqõL±¹65ð <֋pÎí_;UmɄ•JُLÏ܏½…L°ª6<Ë9n›Æ`ÆÀÞy8Óœ?¶r_»Ïߞ?]Ê9îëØ)k”™>懇Ñ@£
Tdh7=&ŸN?mH,ÕryÕԙ/vg™ª67ÊæLêD«M+ù”[.ƒŽd©sS²‹øGÐö¦àŒü:؋ƒ\‰¯îy6]p¸±dLhmAŒHWyÌœ¯=UœÊ稆¤^˜¬㤁¥Šß3ëõËRšM’•Þy¦ĪÐ(€̢d†™Ŵ‡•œ„©(ï0• )'W
áX즣ŠçoÙB¾(–¶óçŠçIÚHñU¬ªtÓI̊1³E̡~¦R/yæý;á3*®c\íï3ž-ñˆpKf¿·t<&ïÅåJÖ`Çßjyžžu	Nô¸y¾¢*µlÌÈš´ÍKc‹N¸Ž!R‡ñ–ì{Ÿ%.ÙxõJŠۯ>VWˆðŽÎzô5xÐŭr<‹\ºD9L5tT†§“Ÿ@ó<§kO·‹N½×ÛdµBÒn€×ÖO‘®Ä6éYÌ2iGWnœŸ߁õjɤë1P½æ £Cο‰$n½Äcùãþ(6ãßûX˜öcëñÏοëm–“HZNÚy„Ý7˜Œ¦B8ÙÉDæÝ.ÅtËÁ~å¸)‰¶…ó—¼ay`äMΧfìN¢[­N_ä^RÆ[M„ÃLÅqØån Q€Ò۱¶)/8|n’9óqmS‚¦~ŸÉ8e’{ÝÌÅ ˜¦©®4¿-í›óÁӯí¸a»GwxÅuÍ4°¹!Éﮢvqõ:*"º@ÌïZ憤E‹‰LøÞK{”вzMO_îÉaéX˯¯®	È/.îFôݰ1»t|ÃÙݦ7ùìÍ=ºqPË]ë̒ÿ\ÛÞ?œ”µIàS7‹;ޡ®F¯cæ$þ°âsørD?ïRó#âÜ7ݢӟ‡2¼ê#™¨ÚÅ€aõSÁə>1˜kύ`@•!ÂR4
Oz¨!?ÅímåŸs?´b"#«Š¯¥RÉ
'}-Î*ùeïfÞL/Իÿi€ý³XúßP&¥Bñ§a=ÄCƒà–úۓ ¶ý߇ƒ‹T÷Ï¿ù
ÿöç6‹ÿÿ¬ôWýïNìûk@ùË#ü׿sä?£ÿå7$ý?+¿ïÏe¢®Ø]•rȞ±£ ¨ҶÉ"‘cêíµ3J²¶%
p͖cѧlM$†;ow1äÉRò[G²!ù¸aº«ÊöDQ"¾.0
ŒOlªºHÖg¼i;:IúÑ|ðcÂÿqù9õþÏ.às¨ÿüò©þÞÿR;„ÕÅVdå^LA,̭ÚÔöȐþÊ6B$(ë%+V”ًGyeô	†cž.Œ0‚°0T!ûõ–b+IæuOòAö§ꣁ¾©³¤¸ٗ×Ðя	Oګ%±ö‡NŒ‘,ä°wçÚ
o¡½üMÿìØ]UÞ5oì|’۬ÅQ¾mDš€‰Ÿ±¡_dŠìpl2@Q[ ‘@Oւx	–}«|<õá@%(þg¸^ó“4ª! ùCA‹çÄm[ÄW'V4Å{¡ò^9=ÿ~lɳ¤¡¦n(R­þ0s%ò°ìbÉkH†¶ülòp›⪯bsCxߪïv+sûñw(ÿå*ðÜ&¶_†ÛO_žE,ðÞvK¾{{؃ˬüÙîdE@`±!N/ֻÓRÅíYys\U]ÆöæËíñѲp­{²º§	ʹZ[Ìä3JSϕ£Ðg’`›5ÁOà/Ç盲¿kÞ HfÃQýìU_4”¹Š ì¹1Úiµ/Ȉ­…rð'ºû.@<ˆ&[Ÿöûe(©*rOK•@Ax^[9(Ò7ä%ÿÒÀp“é2z,qݨbŠ7ÚE^׈2Ûydóê]À{y²…Í]ˆNʋWÙû.i02|&QRs	ˆq¹=iƒ¯Su-Gª7ºzÒå PÚK=Ȧ …wêx’-U%هÝ1–?(ÌcQºBž.ˆÀvž’°¨õ»TŽ™QdMŠXv*ïIYö÷1»µ³œvúԪ»^ƒ¸Unңwh7/6AÔ}NÌöø}†?k2>=&rºvÆdMÖw’sú×E­ãµ	ÇΕ½×-֎õ“×ꇄF	ڞêölªùðs‰}ù:¨¤9ñ6ébt®õi͇o¡#A÷Ö$É/ì¢+´‡T%^Dm7`/ÿ¡á)c”l\!jēýM< ìT¿Í>Ä<³2ëxñÕÅwÁñ<Úpìö¼Âé~ô¸°Ú\è
ZøÝ#Åjkbµ‚Ÿ….#ïõ“Ý _"¾ját2R·3æSLð4/µ¨\+µ¥¨ ý*)ßɇ|ì·Jl¾´oDÔqùTo¸ì*+ãDÆxœŒueãݩœ4³ôçE(ˆ¿ф4´ú]֍ss­÷iûQü`L|š„мۘq	c\y+¥ð‡¤½;‰½ëëT±ö®ßW‚¼¹­Hð>$=ha®}7Ê<`ªB\̒ØXD'kß7­U·#/‚àó#_ÙWBà 1<NîÆ<)®\“rfŠҔ
yÉq̣º3yȉֵBË"ñ6)0žL
‹R¿!%÷¯™q†‡Y•ô9åÎ9 êc!HØP›ðãއ_q¾ež-±]È5!=_íåc߫9õ$DË+SÏøê#ÐÉr7úЖOÓCüŒ©´ӛy¹Wç‘ÐLj4îaÏ/î(pbƒÆ âêÞÑõD„÷Úãí»rD—Ýݕ">1~¸í9–dô‹lˆðã±G¦e‰!àŠSCúãGèO©·uõãñŠͤfBš쟹äQ¿1¨|¹Q"¯‰ù&¦}]V×:äæb†ßúF49bf¡W(‘Ÿ%«ÚUT
®٢‡r׌:cdth8=§��ófµÒOh*e>ƒâ‘kUQOÔù±œRtcù³|©Ѓñ‹`Âx•tûê>ôô=
©³ÓÛBßm_WèCrÞEèåӖ4˜J<š²`¸äO'—hþÊ`,­å>€
6O}ᮛ3º¹émÏô¦¹áøTd}œ?´7HÄ]lðÀ"b)žc/fþ([%†ßhu9¢*x‚¯¦ÃûnØÑ:Þ9²~Eç 7ª·KbRòĻà—SˆX·Ò@¼{8B–§$²‰ô-åötþc9>f¢‹Çæ}A¿ö‡ë‹tˆsĪäÊüÒh^”µ‰é„wôÞìɥ
ß;=³ÇGˆ[Góû€ÂT·öÍp™N ¦@ñ†Ü`Øìn˜Å}¢¶&½‘–¶ˆOV°øª€ýß DSkÿ³0M]ÿ€¬ßj¨°±‚n¡NKÈïù«‡ƒþ|;¶Ų~Køü·Û;ûúwŽöÿž–ùwøÿOÏàü/:Y#ƒ…7^¢ü<0°ßP:ÊJ6|™D
@Ö>!|”f@v¯ôwï/g\»BËVÿÉß5-b^Ȳvjùãq’ê»_X&ÿÃ:ë_ب~ѝû
ácïWRú‡ÂÿT¿üe½èAPᕯ¿’þÿ¬ý珬ý‘IýËøXçòïþߒ?¯ð‹%þ?jVÝ#SØüXJõüü
ÊìRº;ªy)kö>†öƒÒ%méÛÀIhx72ßpô¡óy-ü܇º™sµ¼ðø 8Âè$bG5³82ËÄf}9©Š+ÅÿšÆ#ƒ:ÅIRèkª̲‡Lï-R›5S
@3ôr-/¨„Ž|—͹€ߢñùMòw€õï¨Ï!êó¤‹2láÆ>½,1vž¯çS©ú±_‹;}ÂcaÜÞ1q8îˆx>©(ñ3¯ys‰,¶`›Ûûžäj´zÊÌҝæË°vê¹dyLìríGÝ{HÄgk©°üy@ò"=—JI±¸%–?íÇ~ ¿¶O<¿;E
¯_ú<‹Oðá7àTÐìUíÈ!¨¼ï·'úÓg¤Ï÷Uü¶FZ©ŽmX¨SòS·ÄH.È@ÐÀ*|Žù(«Βä.QsR‹eØÔy­Iãî>uçÞîîÆ.Þğr‚•E5+óN7(Ÿc°l·
|ºm·qd“Út÷¢V+ö “¶r\ 8oêU_uA$Y´ò,[ܘmî ôÏ€›ô
I ßt嘀ˆ†ŽXŒY!áV¬ŸûƒZþp?ÿé½þW+²6B*ޭòu>›ý×Éü‡ƒô?͈y}K^䓸J<µpSÿØ0â÷;©ñÃÿÿÿä\[w¢0þ+œ›b£ÀÙ'ñŠ"ÅV}C	ˆ‚(7/¿~“`ëZ<»}Ú=<aÉ̗d’0Ÿbíp .oa¼¬%KÓWc³m?¾NY™µäåBt ܪÖÑÄoN[B˝­&º	Mn_â;r5fQÄuFf8íF[Çö¹râws4ØXà­*âG¥å¸gÍb•íªӸ+¬E¶”°.†•'Õ2ô…Ž:䀡¯j¾SïìʻHNê}Y_¬÷î¼úҜw—Þba6nhAý(G®Ájk¦kÂz½…ÕßrRs%	*ϻžØ&‚
Ox Ñ;@5\c/KƒZf%†ÌòÒ"<°’E™üñ7•ã% k`ôz­Cfß÷üOd¥HþHÞîËÁÁé5žÀa¬¬¬ŽS­¸_Jmm^îíÀx0°ÅÎÂՕC¢ðV	6Y3<¶³`[³’-ÐWÀvšOHÄí?–
ž»núl{rôzÖЀþ¬…ãr(«S]z”“£\ó†àI,õxŒ>Î —¡=<IÙC~¿Xl$	Ž>·lþp”Ùdw¨ežØ/ÙZÇV8YW¨U>X]/`#ÇC”∔ø$(Šr³Ÿ»7ºç&üëëh°
²Ön’Ó
بÞbŸó—8ΰ3KÔ=,hó8 «úÔl?Nõ-2qžN±‘s”îªòm¬˜ã”4ڻÂÿ’PîDu¢šºŽßýHÄë0¥m"œb$³™6"¢äüŒ¥SFޥÕ/CÇoƒ§BE©Ùí ÂoÜS4¬Å&õÑÝ€zY«¼t?Z–ffDM4÷S†¯‹Î⇣|זPމˆ|­ÿߙ‡ŒxN¹øþ;c#ûpD#ætmä0à!&zÀ÷ù—@Eúä{ûî?]žøp¦‰»×j½+ËÈHSÝì±ÿäPºß¿-¡!¦Ž‹±7ûÉ0#<iKwS™Ч,t—î]¬0¦BBK‡
†{z<£Äp"¬=Fi.0v9¥»;áôš³ð,ÆBæ#G†åI)ý¹{ÃöbX(W67mäï&Á	IÑÆñ-­y‘‹¯„¿ÐϿÿÿä]Y“¢Hþ+Æ<®Ӄ\ûPÜ âíÆ> r(§ ‡ýë§ÐVÛníkz6¦cõÁ(êÊÌʤò«ÏFCôG§–~fÕ
#­YA¼JV¦áû»šéF©V–[ӭEþò®z|AX®‘¯¢,9׮x¹¡¤¬ÊtûPCM7…b¹”ÕIÁ`Ë7Tì	_ë´qR»$Š‚KEû^+Ü즇Q)eW,½T?h…PFgí3£æ5ó=*y¬Çß÷ÖUUµ?ò¾×ÓC›¶ž"íY·–S‘UZËÚ0-ˆŒWaœmÿ‰S+[F{eúV[ýû‹`zl ZQMïûÛ*¿Pý÷µퟐ�Q»;Oê5&…'K߉ò"6<G­ÐÁڗAëT³¿4‘ûÑG÷(ÞþŒ)¼U÷%mïëDžç'¡ë]Õ÷¦QŸA5wè%ç, 2Ðó…}yò(”«œŸ8É.lޯºpgذÀçÏôÇxoç\­ßÙûCÚr”õy_OÒ|Âõz"F߬B_[úÏ!YÇ –ÀڤMü¾ñýÇ
re„Ç0ýì‰öþ&СÜ=:ôõî||”Wjû3³Ì~ۨxÀÝMA¿š¶͹¬€×{‡ýL“ܧ-Œ^Ë<T-<0s“m_Ɠ.’1%".Щ©§®
—Âf+OåxÂYîÔeÖtP S–’ê‰õ¨E–ëþîI˜šãbë5B³ÕjPH”aÒäçi9ªϲíä¦Èj‘g“PWƒe̶ÖÛ.¡}ªlÚI”…-ñdæˆ-‚2”>¡[å:#(‚T>Þ]eæ43e#"½L1Ç0ËL‰îU±¬èÖ)ìœÊü
Ã?sr^çù‘(Aƒ7ƒ¬‹‚¢¤yæj\^D£žЉ£¤ºãMäšßÓí’3‘Ԉ؞ºÒܖ)i7ÒÖYXCÏŒƒÐÊíñÀպ½íÏJÝ9i7§ú¢Ãáb{QntLgin¶p%ÜøSפæÑ5|øÛdû’Uö9Sd(Ofhœ'¦ˆ#猄è\s×Öå{¸ßåMm­õú„Wˆ¤ìidâ¨1Šg”‰r±wWEìo½qGÚÌÇÛIw†Ïɰßùx<\á":>¶‰:e›¤?#”5Ëƪ7h½Eá|§6yßMæ`k:¹[ñ[{„"0ÄNRgö&ÎÖSÝòⴳèm"b´˜µTao3tB“Ý`ÇÖÇ1ßÚÑZììa2‰CeƒÒóÞi×	U¨M5ûï㟜‘½±xrTØeֵyé¨nþUÁAaDütùÕ7ɊU<5Ë
ßixöÀÿŒÿ۳</¶Õ
E:g`å=°AmAiÚ8.B³uo¸‘ðödÌr7°
…8òÈúd±…¶}=qAƒa_˜ÉӢ&4Ôbêh
:åڠãäÀv.î	gÐÄJvÊ7&O4¬Jo'Q®P0æ&î	ݗü€®ÿAÄW…B<3Åç+¯¡"^zöksúz÷(©/ö`¢GÈ#,a¥Ê@uSPh 
ÐH9•_/I€ÑBàoi9µltP·W‰ëH!‘fÂMZ%ÃÈ¥êhzÎì؛ÙËTȜŽָ…TºÁGIÉl»2Âж&{òÖþǣsgð†ÂÀÙêŸìɮƒÊ†)̃—Í<·ƒfh3ØLOÎսR²ˆr¤(‹H‘(¡F,hº¨úJ¢ÿú¯ùҰ)Sñ¶ô¡
õ4
¿Æ-R’)ž'ãLµéÛyß&g¼n,ké¨>«Ø/a؞uÐIoo,¥.”k S+Ëa×îƫ£4uwM‹׉ãDsæ¹Ë!De‰_°KŒXËW񄧗Žåû˜ޅ_éCËØ0YûÜ{p1Z,°Yï1:0|м¬LBÜ×Òîó¦O:ٷN2ï¹2nXó҃Þ%,K°Úv
ïByieô;¦³qèºë˜WôôVÊïì[ˆI®¬øZø¹ÝƒpR%
ÈÏ5^êùqnö“Mjð+ÛVÁûñù?þøüë¬
r‰ªMÖÒ^al*ywß#۔Â`±RnAÖàööa±â¾˩mµ	+(˨mKy¨ýR,àXKm»³w>…¨k^䣨•@jÀxÛ}ÛTˆ'!¶u¬)ïX¯öb :Kû¢z¨=;xpҜ¦_œe‰æxç#56Áâ£ý(£•2؃Ìçö¸XcQ¾´ê£I+çC}UVn¿ D´f•¦HöèMá_ß
ºÁÛBo×úšš-㴐€BMBw§'†%$§%WÇ̾Ž^\ХÖÃ,	<[À8)‰¼8g'ºçxY3,øð	îÉ1âì>¿ÂBá¯ΔU¬¶ƒ'1Š$rrŠ&\ù¹'ถtã̶;S"ԅÏè*ŸZ(ëÀ'ÙÉ™ïO±¨%*rO»ÉdOšܶkÅëX¥Ã9
ŒI8Í+2±¨Ç;:ÔdŸMŠ1ÿ>sa>]-Rû*û¦]P½mµõn•ó	ôðîBðô2·:ö݋ÒNÕò†noB)´ÆÑÏ.?þßûÄ+~[ü¶ãÃVª«_û—‚ÃHN×çڇ‡¦٪>äª}%£?}òÎêMAÚ@Àî}¾kGÁüœë…PÜóúQKhî\Ⱦ¦Ñ.üðžנ
&.í­ûÑfq¹æ÷ËÂeLL‹~:ä½G¯Q}D¹̬¥OÇWϲi@ÔòÎÆW%<×ni¾àvïM±üƒÒò2Óð+33™g&*õ¤Hë)!w%Mé‹ÌßµSÊoË(õ¥›½\(¨}sϰs÷%_åXtÈUx‡S‡vú2µ>œh¤£ú9\ԬZ˶té>åï]NOm+™He2qwƼÄÖoÑjï0¥*¶RFVk¾°vØuó`;&LV$üFëÑØ\”;dO’ŽÔfºC;ôÍɅŸ&=ȷê²?õ³BÓBáæäÌ~áMEäUë’
‰¸ígšGc½Ö“FãÅY̾«h’«‡¯ÃëæbX+îÙàûÓí¾9¶¢͍$IéMUU/;îšíbIP`Iãþ…)¶,ºmùAým©yçrEóFS5—‘ùàί÷ñ¯Ñò´n•ÎÍŠôÿ¿)ſßýúW[®ÿœ"þ{wÿÿ6먅Iÿ±KÖü'>‰¢0Avìç~ux&%9ÌÌÝc[òvø0“L¹øçájª¤C¹ÎÓsd²LE~¤?ŽÕ甼ùÓlٻ™¦t†ı&޶ºÊ3UüV'«P1¼öL59Éó×;63X†Ÿ<ÓZ#þ¦+•‚è%x$¢¿jM÷wÄÈ1—`×﫞K#|‘ÍÓï@„¼¢
"i±_pԃ9»oqü‘åKc±_sR"iW°Hƒ1;¶˜uÏ4ôB±h:O¾üXË'V_£Y6CÑS!…ÐaPtY­ã¹Zÿʌ€¼©ƒŸJáOƒ…'?‚g|¸(¢ƀFêesP´r±XõD…N|XŽܭö›‚÷r0R¡xa>åP[Šü1ðûŒnU++Ó-_=üˆ‡!› N«¥ƒ†‚„]¦0J,Ç
-’Ä!þ&šŽŒ¯8ߢR MԬfè²Ú!Ò(¦qt֓‰!Er}+փm”jjµcKI	í[ÉT¨wfHoÎåh
žl…ë1˜ru‹¢ãü¦óF%1.Ð)«•y&Å-ÿb‚b±¡~5ˆˆ±Íõl'(W 	¢¶OÄê¬CšVX¦t0à"Wæ0€DÆÌéJé²j¶43¦\¿A&ôˆöôïì}YӤȕå_)›~™6¤fßôæ,A°ï€Ù<k°¬¿~øRY™•Y•#©Ôӭ6)Hû‚tÂÝñ…{ÏuÎõ«÷7¸ÉŸL/¢_÷¹°Ïçµa»=G]Ÿa÷FiC”Œ»?gñ¼HâÅH´qŒò³FÈ	λ©l1¬R!8P‘uKŸˆaî0ƨäðDTå-ƒí…µ-we·¼²ΉÇ:Ð$3üJyÇùó–Ÿ+‡%ŽóI0&c½¤…µ’­ïKÑʃ-Ÿłrò¶TPW¶l’0Ó*zîòzGHÍÞüðyó6xô¦Ê`åÎêiù%sô^ÊD.‚WᠫÊÏÊݥûKíÙE@4l-*
Roôî´]Ñl™^‰¿—Gx¤Û%·Ո‡Íï’y~“ å"xþ	Æ`¼‚ÍÇS¿+q±Š÷WF÷
’Œ‹C‰ÞÚ.¹^Ã]-,âÆ=žiaOcǞãRdá2-\­§úçÐDºoæ[›`QZFP9Ru5A”µzÀ^"|X£Øe˜º¿púÞn3*ʘS“ç=?9ùÆÓÒ!ÊXą9¼P¼Os	"2ExË\ÁäŠ[ßOüҕ
`5ïœɥ÷ÔÑÒqœYt{Ia€L¦ÍfÌ/+-\¶xå,Œ»kµÑÓj
çS*£ÌáÜCëèÄÅïɐÀVøþ4.÷
~.ÜvbøšËÏ1ÜwH„àC-޾w@`;s9pSˣ~ˆمáÚyvƷæJøš~Ìk[Ý÷æ97@»ÝÊ
ÀÉ6§]Xoªru¨ËC8¥rá~ÜÈÝy„‚HË„NÍjE1H9ëÙ1RÔÓ&Ç<˜wÝ!¬Ƃ§ð”{š‘rBa®\+Ϯï…XÛæñžŒdT&AMŸJq^ÇEê+Ⱥx:꫏ߐ·G2±Þ#´Ù6,qµ˜ާ™ó*‹?m'¢Û)NŽ3;–^’ʷŽكÉLå5~8ôeÿ£,ل>®[9æ½<†n@3$w)¼Œè螺ôQ¤žÇç7G²aÓ)϶TÞåò/Ì盁<íSޖA¶ÿVs_MöǏ Ù	=çõß.aü­±7þš2ÿY–ÅjF-÷cmï¯Ëâúüò1),©ü’iÍÔz´Ýg¸”5ôsôšØËM·¯Ó%xߞtŠ@êՎ—AEı垵•Ž_ꉤI®,«ëKV“yš'ž{OÛCÿñQNrªgázK*r‰a°Žàê\EüT„¼ñfĸ"御d‰d?ÉRârá8Èv_›%n+ÿ@/ˆ3î`P{
ߜ+cE§hÀþ´cV[º˜m ÜU¹zð†Aü¼˽¿Hp)3˜«GÓæ‰»–WÄW¼´ÁÏå à4#Éѕ}—«…»
…ðÒj¥ç€,W5›#ʲPðÀv®ŸOì«,‚¢ÔÏ ‚g±+î=?ÿ¶vþm6ϟڶEç
ҍ'?trÈld‚4/»c%F†Çf}z¨HÀÁÍËaËÆ!yœJF‡
fY7N­fŸ‡ÚÝî/ވ‹¥°´
‘«3IÙt]|tоíl…ë…,k©*/˜H­0C ¬óxoów@‹Ã„k7áÁ=RŒ¯¡
pËKxQ,Ümx¾ìm’K}­9
X±–Ü
›@8?4v!"æޕìÔtÏ'ÆE /jÃËðœ°Ef«“ÍK`——`ÞË]Îã{Ñ*æž#Ì,öɁ³Ÿ	à_™ׄˆïÛ`nƒêµnõY¶ª GúvÆqˆ|êÍv„./Óȃ%¼xe…ßkA2ÊLTÕ"±5ÐV°xT½ÎÈgCÞøŒW…”äºnj÷@7í
óÊ7ÇÜ1V=¶8“9ª‡4¹7Cn”Œ´[æ¸ó*Lpž€äl3/¿ÏðqB ‹ΗñÝ?Ÿpû§)sžlœPŸ#½KÂÉË]A·í	A.„•Mé@«
¥_‹!šI¿Þ¶¼2Bî&‘q­º*!W…¼â¦ëœø¾†_èì¿ù;‡d/œõØîËIê|».¥Ä񋢔å¬l!UZ½âDøÝõބ¥²1›^%–.ȸp»NÐâ+l£·î™z™ùwÌiTۛÜYޏåýwh¿ÿø9šüÿhóºxžOBü±khœ¯JͿ¼DLߐôDZC¾£¢%[Ç#;#pÆF»šþ˜…‰µÑlFQ€¯¾XÈòk.|-9øoëí §% ‰Ž”·
Ð‚l¿^zÒ®nMG¨_¬2–žvî‚AiÑH.Áì^UhÛæÜ0SEh‡.å­ÈÁQzJ¯ÅÍu£;D»:E¿WPžûbqªY°¨W«åÚ—kž|tÆÝ޸à27äØö2!³—t ~„¤€J“£P{£r7%Ú,RêõT“ÒfJ׿¤jÇ38§f#,RՐ3WÂ1Îf%èn}gTø™€ä0¶7µU#OӜ޲Œ¥ÜÆÂ:ð͟˜ۦÈV.·9œ^®§Uš«„€jw•êm¾eQF+á”o'2ºªz{÷ÃûŠjçfŽ´oÛB‰ .ÎDä3-€ãÑ'µ§Úçث3¢ÍÇ=
EÜÐH£+_‘¸æI·¢S•&ïøÊv¯,9Å&M6™Ó@o•B¡봺®UïŒIiƋð:7P}þþ÷ëý큙“1ƒ…¢ŒÆ.H
MSe2ôÙN‘˜§ÕLŒê&3“¿ßHZžñ¼·ÊEQê}΢vèkÉu£»Ió­kG†pS“¡ª‘AƒáXÍÉÚùäP/½Æ!šÎò!¶ª|NNMæߘœü±]`¡Ä!'Þà¹þýž¾?{Ë$õ›ršÿò+ȟßåŸéÝò9Ï_Z+üužÏê«ÄÏËw–þHbþ[þø8~å_ð…‹ú‘ö…pJ~É_Yàè×Ô/wóþ–ð%}ÿ%v{–söÉÓèӛÕm|ŸµÏٺŸ™KÄwãÏ>煯éï/^FÈdž?açý|\ÿi,âÇÿFþðÓçÿÿþ‡ÏBùëù	ÿÈó)ãoåÁ~3ùQÅG=Ä#ñ»fÈ'ÇÏï-·¸é“ú…öoöqü›êÿO?Mócü¬ú?9¯~!h!ßéáŸ5)J}ð+—$kšr˜Êéw·âOϏÂ~ϔÿ&ûß>û‘ýÇÛù8~wãþø‰7ûËø~WI¢ÒERXÌ'èÐkXW’|Íæ^šã£Lôü¿&œ]–qö©q}ôÂA€çñøҲihӮïp·kõ £¿çæ*'pLó«m¿|ë6s¾Ò.áˆm¢€Áæ^r)Z)z{ç/u}<çòší‹	VÊýÍgŽØô§‘}í—#GØM„9é^¶{Òì7á%J²ä4ëÑÖÃL–_2šèn÷Á_àô(£'¡+Œs>ɅÃ%º&HîÞ´Mö—I ŸHy“cwÊÇÐÅLê± ñL($BÎá;B1qx¨
UYY‚Óі|¢êy®䛮ÂXˆ­7.1ž-ܖŒ§3_#[ß9u^§5´C=kd5ž/ㆿX¼
¹F±7á’ԸGìô
(nÉ2®L‹`Ì|Ø"‚©,ûȎü/ǓȤüá@±À!ù`Õehüu°m/Õü4½IÎnæåu಻%+ÛõJr&OäbûêݍÍ
V±¶Ñ,5|§ÌÃw+âü	•n4ørKx׵w0O,£Լʼ0´#o‘Uˆ„60તP“š—5º®¨¹ì6>¹lðŠ¥Û@Ò ¨N8˜qÒÁ%XíQýÔmÝvµ:©ÕGMùè0ǬžÐƵxӡ†‡±kh–¸]nÏ(Y«½ùUmuˆÆ3ÂB¶v›4ÎnI*ÃGáޭ	ã
›çØZœÖg¾¯C[O£ë
b65Н)º!âʬ[{ä8ÌĐsρ‚šK¯ìn(ô£h÷Èj†C¡¨ыÈ>‰Þ[TCfùÀ'rÏùÃèçõ»™Å2\Þ$k+©‡¡TOؼOC/:°º.%	@LörçkÅ{žª«ƒ£VI˜>ˆÔÕ<«4ÛCØ2[L9%´óÐöÑf2Ð=–
y¤y,tp›.Ü"
¼]:*£dô¬>E‰7òÚp{Íóܼæx÷ɊŠõ?")±¨ýôÜ×EøDñ`¯9ç8t§Ö[V]&/¡•|ð¹´ÌëM>ۨ+'Ô/ƒû:û³,+ì…B‹%ÖN‘l®3ÁÄSHèn] 8ß'êêu&"¡ϵ–\b!x»î	Ýkûµv>ʑÁíoxäôç EÁaG®K‘úË+cTªºÉÎÒ0”-¬ú²ï@àϢà
-g—m¹Ú>È5M¬…‡è¿
ÏÅqFP×Áëf·k# #í
ùÖª`•)g}ÔðUB¸jãWÂo¹ÍӐ
ï˜<›°"O~ìÀÍm¥}¥0XìÀ.ׄØznž¬!‰@w_“u_®/ð\TXMóÁ^áôru®+@Þ쵸pb±R=ם⛼$la¦bq} {JgàZÈU¢·»)ÕS7;0Á_Ŕ`ÑE˜ªw¬ºYí’ÿö7ûŸ,ç²)çý[TøMø•Saò‘ý̴ç›ì{oPò“3èw—©ïPê7×þ̂ÿ»”þŸ’g–ÔÙÏlÙçõßUA]v_þ©€r‘àÜ#§3Ý‹µܻ‘ôüS¦—z’‚Z/˜ï^[ñSù¤Ԡʍ‡áyéŒ~zÚO—ɸPŒYUà6(㋋ ?—°×$Þ.è6EëR]DFœ²E,lr]ÔðtzܲÑT8OiÊÒ\€lŒ¡͉é^Í:L÷»¯—ʩ	ͽpϊaÓy‰™gò`¬-DJtã˜%	™4ð}hd~¸†è~ë!!Éàæ˜¿^]hèmx٬B×5-%ñqg^ƒ*<̰¹>ÜÊî̠ˆD51XÂóIè!Eک>­¥ÝÖ-ծ…5ãNóÙt­Á÷sɚºT‹A¨q*™2é)x6‘'Ž Û •Úbëªt=Çͥ\DÂ÷çÄë•Äak·Ç[ÎÃÚjʍ)jÎîº]òõè†Â
`ùì{‚Fûz£ò‡×(‰ W³¢Åo\#Þcaçc?†Éɀ]ix9\Øsî„IÆÀp‚Z°üA@æü­òý²ÖQ¾烌´Ry¬?+R]:qæoÒôê#[GŠ0Ýku?.»k¸Y?ޯ‰Y‘·ÝDñIÊàz0ìiwç·<%»*7R/ûÊ7Z^M·w¬ag¸i°èkl]CÐÁ#è;òlAØ|úö ý½óŽ7à¬jc4.¬‘jþe,N?4a	ºœ‚uȨD°óbÄÏDàcõ萠Þý.UjÄRáè+bh@^MÒÏ=…÷±Ŧ.i¡PœÅ@(Hik4Å!ç&!ñ$Žü™[ªèrSމ.bî¿ñúôӦÂùcéÃ+9‹&øyÁr4 ΜÐ]­1Úig•7òJp18±ÌVو@M! iZ¥¥¾•o&¿²p“upÂaƑX†;s-;ÇމÜq<ãAŸB„ ñ×G»ª}Ã1°H}¶¿Ö\\_ÌA€"jӱ±_Ñ��ŠÙ
hâ`
J}°ÄFp<)F&gßVO™UŸóù‘$K¾jeBœ §”̶¸Á5嵙脠#ò_2sôm9î)ÃÆzÌ}t<g­£r\ióDü!Îó³òù½’ݯ³¡ÄWÚN
È^½RJR$ÚÛǮ,ÅÍ9Œ¾² #©Y°•,¿±Ö\Ã>^ê)t3hE¡º9m΋ѷŠÀnŠÄÕU”ÚH–=ÚÖkYŸýi'ˆÖ
”FÙ̱™b|íӉÒ:r‡L
­•ÜÕɥ4ªy¼Øû=߷Ø
õÐ)2c4H×ÎûaH
«ëj1Ã9|ö²róíÔńÄ¡éCŠ”1‰ãþM)g€þ(hh”2!ͷWNYޤDH`(Õ	ƒ/÷wëÍÍp
²MSkgX†¢ÞÝh߹$äðäiò6²bÿ¿¨|Yçú²`òó.¿ý‚ý’ü#ôò{±4Äs97Ù?@9X¡¬OŽ.:ø
pÎ};ϫœ¿iz¢uzá]g
ý0)J՛D£h(g—ì'ц#JPå­gý»}¿Ivýû¦xò¥;¡ùôBÙ-tÿÖ>Ù8^x
Š¥bŠ8‘xг^b1µh{Áý
Z˂°™Z܍S;cî󴊍ý–6³=R·¶$+½±‹‹–îìÂC?>βƒ;Û*{‚§)¢ËÛa-PŽæn3Á5Ãð腲˜T ×:uf
]Aè<3}ÄO£L)˜aÐçˆ#½aQ{«të<3ŒãHMTAcƒÖe¡ys_÷,êÄåx¨ÏþqáE`kÁuë±t#з?€øj¼[K1aæÂ!âV'õÝç©À%UȭFó¡`{ízÊr‹|Œî¤ꪽ»àÔþ²k÷Ó4ž{'Zºi T§)L;U.޹Ì’¨§Íó¡¾ב[wÕ×:,uSûόɓÈjÀ:†é!Pç;·C÷=ÎòqF—'ú‡eÈ<X­%Gá{y¬Ž<@ƒË7Á}ÄLM°„Ç(<Þ2)n%öMìŸðë
¥}}aš\ڄŸße5
¤‹é5†`IӒ¤ÐL§9åñÊš¤3ud¾àß.Aª¾øéÆÊÐÉ.&+¶cªÁNö½—ðJC8…Ä#zÝôöԉŽ廕ê>õž{‡—gd
Òí†ácõ=vˆE)7Ød°sLuc1gҮ÷éË1<x„wÕ᦮·bêçãT	)…¶ﻶ=œô"aE^§°5ͷ~¦—ula‰Ñνø5{h[•¹„‹‹KêWÿÑk Ád¤Ucr‰޹n<Lì¥K‡ÜG!ÄbG)K#hCl>ŽÔx£ž°ôk«VHîsäâèXÿs*†/‹ÛßoâþWføvc»¼{³eržõ‡·x~vGSŽ«Ð×mnÑàݙX¿±óԧ¬¶ê(¯tÔ	•Åàö(„Ä^A*”-·Í%'›s>få%¾!]±9Xr¿Š^òˍ{ɄßJ\‹ñžaJµ(×J6~d÷uVx¹ԡSã}øœ–ñEÍ9F’oOõy]AÍcWJ¼éi|µ™ów±åQB‘³ú48ÔÇÜÚí‹fHM&¾¨<Ç×èÛM*¯µ0>’¢#ͳ߈‡‘vBC)@=`æH!¶J‡ÑAֆY´™|7ҖmióS›@ÔS"-™ši¹…֧ÌíúNë	=õ{Ï-]ñCî)ñô)âi¸:|;¸d]núÂÈ%ŵZLôοe°”物9sî¢	9ºKÇ6³
óc$Ô
Tš_ßDמ}äûÞiÉk›7$Gw̛Ž»ÝY©=-Âå;äu“9ìËß>XXÓm‘›o‘±A#j´[8@ÝÕ-x߮f•“yH,.6¿`£Xð
".¸•Žu9›’Áð¼SíEí}þϕC£—¬FTsõy֔òÁ^x H¸VÉþ—u8à¬c]^ÜYƬ"0‹Q´Ï:4âõ©ŽO?l«_Šhßyap\JŠΚ^ϸ'aí5
k¹z™±Êÿr§ù/'õüH,¦ýÖ5ý#ý«åèwþApäÏ[Ñdà:ãºHè?[±MB[¾i¼;ò¼`þ¥¥6É,3Êìô.¾®Ž>©Hy£C>õaÎqž&„¸\\ñlޙP5\·CC“U»Êcè5øˆsĝŸr„øÑØçü'¦9_…Ì{A²c8ŽóØb±åç—Á
ì}ßî0¬-踎NհÜQpN]/ºÀ|–¬´Îðû–¿™õ»ú­bói=õóÞ[Zx]Å^0µzkexé€
¼Ïu—ýá‰2P†zr*ð¤¡ð:/YjƒYˆžI]s’ރ¬š¶ÖvAÅ=ѣõÁÕÁBOVNKh£Þo/Zÿp…0µ‰(hڊïs ãÉì“Ó!Ÿ€3°Î×[J‚SþʹKæ€C±2¶.KoÈzC~à5…i
Û
§ôHªŒ`ø½WX
kÖ@>t9@(\‰Tè3Øu}¼x©Åes1o±zn’
Ð*ò0b!ºW¥ ,7¢•Ä%/¹Ãö}·…‡±~‘ûË# +¢¬¡dó‰³ópÎ%œ)ãàk)g‚	TçÉûêí™h)›Sv–Ëí'Ê8OæZ•bP¤k»€7¯lV°ãvZ\å+M†‰¼ñ%/ê“%2€vÞ\=Dþà²]"pø‹|jgXÜEîÒÒîԎ¼./nƒÑìGÎ=9S
Ä­sñ§üýݳâZ©S»ՑæêÈCœ~¦Í+Ӄ o‹}¹Ã)œ€ßCX¹ùªÀ2bGp,®ÿ͹zÖÐm¯ùJ~lZOmbj¢Ñs²ž6<¦<֑ãÙM†å½b񙅲A¢q%'–z3	2 €•‚Xßïð‹Be‚ÍeÆÓݜZéy~y"‰WÈÉ|‰v€±̺AµŒ«™¦^Ùf¢+	A\{¶Y‹@Ïí|±·ÿϦÜHµR*¯.™+ð/ë?®û!æw3i¾g#}íà¿q«úÏܤò˜þaéÏý‰1? 2}½ð{}ŸÝÖ<â¬ùºÑÝߨ	ÿëÿüôKÆÏ7CüGûíA¦¾{×ø
åøk~ßGø­X1I¿L†_ÎÓo½#ÐNÝÙQ·éÑ}l;–ù¯9d¿ÉÏãô‰Üvš<øéëôßÿ«7ÿ¿Â<1Zà¸ÔM-j(F–!pø;ØmIE©‰ÙÀòDé‚Dc,¹4=õg恒)Ô瘙} …&ZáaYcHTº(JMτ·=qŠ’kLõŒË2 Þ&PþÈÍO–¹ùE™U t–£[’„y>-.wˆx0‚n¢†"ʚOüÒ('Ö(Då¼wo@,Nl™‡ýJ˜ŽÒ+N–&9 ´«1.­.É/P016Î-Ç]bØ‚V ޅ€+5ÿÿ½]ɲ›Fý•TVN‘„ù	¼kó æ©Ê@b“Ä_=û9΋]ŽËveÇârû4œKuûœ/k½경õ—?>õÙ~ïk‹㇅ôÙRàCãî«yó6›ž-Œ~{Aö˜¼¶`x™|Œyßܻ¼p6éêݛécäguÿ`ë¥ÿP‚¯O)_%ƭ~̵|ð½L߇þùX~áñz1tSŸ^~ù&åÓø¬ýúî÷ïLÒ<nÏ'ùè\þS}&”ö-©¾ñ[ùûQý­WûÝ^վ{aċKüÛç®ìà·ÈéþØÿ¥¯ûùŽÞO£6—1~þ±ð³fô¿luú²BïñZ½÷$ëLOXIŸQRи0Éà‚áÛã5m´ðœ®çíI–ï~©çÕ]o¤¢Täܝs†¥|©ì0ÅIïc5¬Úڔ
Î̪BziÖUduaKéÖØ÷‰4‚½ŸÛv6šìòt W^AÄÛáB_ÂÛXi‹4`Íõ¯¸„@»ˆ¹pÄSë¨î´¢‡´ezK¤u~˸›g½Ýõç2´ã öVÃÄÛwÞ 枚XIv€D6׸8]aáÂLÍSD±PîP„b¥ڊg뉏Žö\èʒA€Š Z³5k®«£H6i´
–a*‹²Âf8&âN5ʊÉXÃõ2t·EÒÌuܣÏðjìŒ>Ãê)P`B¸Xñ'‰Ü©˜jù–΁vÔVOæ«,ÑÂuX‡-Î47á,WOsó8hx,šÊJæy©Á6æ‚3ÑQ%“S,‹ƒÐp6k`?ú{–§.=OñCL¿ÆÐâP¦D<;Jr´ãéÎ>&+‹Þ(-0gz·vŒZW_	
U%$‡"C_ZjpÏ)Ð(ï.º‹î>^”ÎÒ.ƉŠ5’êÎíU	c?Ó&÷õ‰:C]“‘) ²ˆ˜[*!0g6Ẋ멆qÊ‚\k»@-NópTI4° p|€@ˆ«4nKogÝæֺCm(kðôm𷘬¢M<¥9ç`ƒ.ܵ&6”jµƒÇ¥AWSCùóäÂàÝÀc ÎÀßdP^/ $?R ®S¦±s×êMpmäHu¢•߁Eo-rA¹h‹¹;pð&H»w\€é‰ó`	âEÔn‘­`üÚùÉw½5kO6$
Þûi "ÕçXÃX¡m÷û,wÌöÓ}uüµFÊái¼”þV˜Ü!ŽS¥“wRËVû!éTÎ'ÙõNÒÒl.¿ᘇâ~£=æ܃!íÂ"¬ɂåâCÈÏ˸ȽYd$v·]
iWÆVÙø 	7…EÔ7;ªPþ˜S†ºV‰°5¯Þ@n†4}¬ìï‡ÑP
®R8'/Îí	šI2	öÂHJDŜΝog³Æ!L"Òò§%×Áâ¢z÷xâH&wâ Â:‘ËÂN,ÄMÊy‡C×Tѯ:­˜ª™0¥(ì±IVŸ„„í‘<[UËZعöԧ‘ƒ£qFhvª‡‡ϔ@f’Gˆå×|ëþåS‹=‹ìisâ:òûü
Õlm͑î+SóÛæ2Ø`[ïƒa„ËƆ­ýï+Û@H&3ÌËîÖÖKÊe«ÕRŸR·Zd¿»;+|־€B._“ìÊÃ6
lÐüöÈhXH	ð ÞêwS^… 8ð44¬C@›ÞBρ:Pw@ŒÄeˆ¿³ °:Ì_)>Ш0ži‰Gȡpú<ÛJM°D¼ûšýð!ûõëð5&—à Žk
`ÇÚÝÅ݁î@¦³صÀ'Hd1™bÒ·Žï3!TMäg–ee\ŀ;žü3f	؊g ç(¿%ä#ÃT‚­)ÜÇî=ȥ߉žN-û>¶OM.ûl%ʬ`ŠžÏåþþ
‘Àä)´€ä{æL%Qáû“(‰
;¾‡-r{ô'݉ ¡GerŒŒM-w¨Áўv+VÆWc޼ g)b9ò|zTŒ-ÅGÛD1:򠖂-ßK!ĵ”Ý=XZ0Šñ;s†§Q­ÚNÒC™È,Yý“ˆ©&ñ§[ði˜¾‰âuE´Œ‘é0ì݃¿år‰n×ñÑr—ÈI]$%—Žw*2œò¡M(=Ú
½=‚öTù’%zÿ¥né|š…	5Ä-?"&ú~â>Œürô„Ëâ*ºNÍqh}0i¨8Š9LzUìéÐËPз/)ö—*ˆ¿©˜gæ=¹گEvc¼$n‚”ˆzDP\*žâhT¹TZªq‡úדa/Kñs÷ø¥|Gºuê$~ì$^¹OôtoSK‡Ôó‘NÍðíÌB鏭€œãš,ÕÜè‰
Ÿ¹NáЃÂÃBq°g+Ö7²_Á@1!H|!ÙCtì|ò‹)æ2£åX>Ýxé?N©bªØU4äïvô©zkðÐrw…2Z "-£Â=‚ÞçtK;ò· ý̹Öìw		W񨺯ró‰;œ8ÎýŒãü•ìþ’ú½ƒýÏw‰D™88|¡~µý‡K` ãïÅñG€þHר¢™†ǤûdS>Bv$ô?žõù“®øÊ}˺ŽñMU¬”n‘Ìb˜ëµ
ܠCiºjNø³IŸnÈ6æôÍðõÆ6°¦i5DzÈKù‡ŽùƒZÚÄgM[ìl¤Uuš·ÝîÀêÕýj׵³iËYôª#¢¶g³érŽW®>\´ä½3•³[a¹̖¶K½k
\Vª¡Q—í¶æHëö|Ûôš¨^n `!°­‘VéMmqgZC´%¬"#ñ&g‹yÇn´[cèwѱùckëބo
ÖdW¢<wÚ;êâåžeMÈAÑÅÒ:‚#¡Y™ðe8¶£ÅH˜ÒïfmÝGÁx->T*mOÀ2?Õ
wŒ7ȘõˆÔiIV‡陛޴¶»ŽӆÝéƒ;f¬™ˆîníXҲ­MKÍé~O¶¦Ðm¹;Þ}0Üéܔaה­r$Kr§EÇɲawcèÂòy:N™–ÈÔÛyŠÐÙLƒĝŠ×4¸éZ̵Ý6"ºÐl5úb#⎽f76E)p†’£í|·6W'땸‚|7'uhçƒ+òž0Yé’ޙUL¥W­Es·hTjaiS“J^Ñét\gbDãº#WÌ
SÄaÉËuµYgoB³"èµ	ïÝì
š5¢Zˆݚ„½‘Ól›m!ðš<^D†;2jƒEN¦9(á).ç"—Y{kvԂmíIóöÖfZ]·…ÈZhµZ‚®(ҼêD]´©±ƒ<mÚ.k¡‰‘ÓGŽ-È7“¹S6R°3©ïfæLàIW›îʑ/-¾ÇÂäÞ"šºòÚ÷¤Q[¯ísn~íyR¿yCø¦|3oNG{¬Jj§[˜îz}­<›Úa_më-Ýe[ú-®V•‡ȯ
V‡pÛjÝäPTÜ[
dÝèFe\*3”·E§1•U³Íڂ°ÓyMçËâܛìW–ä4
Ú<÷ ˜7=V+7§Vyßwûk”m*½b9—•F-§ÄÖgåv]zèÌö¨!j®º6ŠÒCÓӺD¦BoY.f«?zX«sN¨ÖÌdM2]qZnzf×0Œïß?}ùèKšÈA´üLtIîvyó¹Kt†ÐmÚúçPâê…CBréJ³÷?‰v!—{
q‹&,ðϢ]̧‘siö¯+ž	OÑQThÏ4ýNs|A¸‚éI‚h^ ª”/`CBè>M&q&MV8tâèúށäîD<s$þΡ…;„Ž)„¥|ìÛZ3-ãÒd_lçÊóñœ1!wSÝk»PH¡ºð“§8¯Ëm=غ¤l滽,}*Rö¦Äé7Ì$ë3Õêz–åämÀìkó¦dŒ s“%}½jèK®÷ð-ÇXŽª¬
>ë7Å*?pËjÐª†T¬Š‹ d.¢R])×ê©o̪Ü^(͢02«ëV³Ôîބ¥µ!wªcC(å™0×(£ì¼¹‘nÈpX˜w‚p¯.»ŸwìB¸ÚLª³¹‘Ÿ1ŸtåysWÈ-,»Û%Cc6—š3f4ô;ÁM֜º°[ö` Øóhc3֐Ðb5_sLd´ÈX¬UNl3ÒÐgøÅzÆqӕÝcʩc®‚£luúÖ+Ø\Ž‹êfիnŒÁ¯ب(6`Qäì¢ÈlŠ"‹h›Ðv“¶yÚnÐöH¹¢,2UYd÷²بËb_YmäÛÝmPmP£†P‡ Äåj™1%„Ú!–cÄ6/ŠÍ;£@lu±ÝÄ&Gӄáf’
żÙ볣m¶;DCšʂØ+³sžq[‹WM¼§Ýþ•áü•áü•áü•á¼{†s1"žÇþ|æ·ÿ¡üç͜½{vôfÎs§ãÙþåÂɨµ¾ó¼¶s
ö›Š<Ïk:(˝sž…>$e”)ñÏ+×T0€Îcu%Nã± e:®KoAªÜB'^_ZÆU%AêÕtž8Eñ÷Ɇ	z��„‹է—+¥Oªpה¨’ºa¢²û´âücÝê±P{¬Y½PƲ3ÏñK”#7Š_•´çgÈ3ÿ¿à7ÄU4è%Žs*¡]ï£éèէ³Œ<®³«fþ˜žFN.—Zí]×Ðí…ڛl[éRÉíˆ÷´Òö‹Ú൥Á'e¼'[×5â}üãöéÈqÿÒöwæ`˅ÃÜ]õZy—)É%`VÉW)™Ø#¢],ž£þzV;ðᕳ¾ˆú3h
¡ɼvyÖøî‹Æ+9~aÀUÌ<Ÿý*äK3÷ƫgÿaU…
™øþê”57v;r55‡Ž…ýjy^=ÀEÉ] í?}‚ݫcóYE¡tØ÷;Ҥ1ÞŸÏú\z·vvÅvˆ=ÅÃÉ1ìÛgáézzvˆ8œÜ3‡;@äPòŠuv+xº§|]f{ÕFu¶ÒãlíöO'p¶è߇ÀËùwÉ\¹òN¥¿gÉŤå•ǀw4ãk(¼͎¯¡ð;†|™Î-Y)=µä±}fÉʏûJºáÏ
¾ñï9>¯|ß%÷٬橁q§a;[+Wé9çKœ@Ûéo= =	x	P=­ûž·XIš¥ô>õç´wtWx›缂Àï8΋dþ›~óÖÒÅU¹ì‘áç{ԥSTît„úƛX<jì	‹Gà‹±¯ÿ™õ÷?-}ü›¸Tô¤t­Øð|jqÙÆÛ]/|ꝗV­xñy*9*e֏¯ÜלÂh’g+4§¢ƒNDÒÓûُ^ÞâÚï*ߕ4ÞGÀÔyßU¾ëH¼Z¼÷8?/W&—I÷?¹o:»n"[ã&²­ã•Ө3,,vŒ­Ì"2’øõ€k„ñÃ#/f–£tÆu~Íçh» Ìäâخ—(^Ès
c°Çâ;º»舘ÂwC–7`;OTgPçíUNï4*ý]½¨µ@ßµØuú{>¦±Պ‡_—z<Û0x.
ç"æ۔ž™+ñœ\LD2˜4ýa£þþE<ʃk±@~ÐHo/\µRÚå­jO“q#¶¾×mí&©ÐÇyåíôuEå?ÀkRš?ÞÉ~;ýÿ´k|ÿ~²á»Ôþ¿՞ç¬ÂÐ6þ
ÿÿ2Hr	M÷‹4qIN÷M¯JÍ5¨ð­41ôtñËòu6¨ðÉJ6ö	q-õuñ,ŠWúÿÿì—Oo„ ſQƒ+»w²҄ư=v·!bz“(~ú¾Ù?I¯½ô°éÁ8ÁǛQ~±ØÔÏt”‹«i“ª†Mgjâ-|M¦‹ÆT·X@S>'±ÒQmßÎÉÀï=¹QÊÖKI£‚Öe
]$¯vðYO…=ôjš>·
òÝÆïs/ù½ÈmБ
çèö¦9ÍíQÖT»Þ{ÔZÛw6ÜÇ£yüü]yðæñÏéß7É'ŽϿh•×	Ý0W6]†MÍÎc‘
C§Š
.»4ñBV6tXtÚ!.îmÝ®æ5A»Y/ƒˆ»€Çè2%:|P-ðŽ6M‚uÈ `íÅÅ#áõ²r^!o¿v¨٦ k@5@ƒKÜß@G^xcّþm˜f*1`1Óvæ:úr¨)î@@ySa îšçCàwJ§èĂ\×øÿÿìkw¢Jò¯¸ç~¹sîè"3çì£&17`&
ž³P¢ø؈üõ[Õ<yÝ$“I„n¨î®wuUÃsުs]«Gœ¢sÄð´AÙD…maÜ]–†öU^Åùú
ïšïáì²fçJÄ9¡‘8ù'oÚãåáï¹Mp8¿@€ü½a!â»-˜ü±?ӆDÄõøxf-ð½¶"´ΞÖe®à5 0³s!Rµý|«¬\ë۫ó©|©(Ã&¥öz€G—Š%\BK1 2\h›Ü-ζÃ.éW»aOwìޕ0(”߉Hø¢Ä/JŒ¢Ŀ“Šº#ÑՄ>·¨K¤cDôcº`ì	¥*«”ÕmʠÓQ¡žջ[ñšÈHMa ÜÃýYˆ­Ä%¯ 
Í/HŸªԠ,±×kQÄp\( ‡	ØïUdy7ì÷гÿÉ5ò„ÙYBe%5wðõýbQýPzÓJgZ±pY-øå7ŠíÚËZíÏúmHhè4l™RóÑeƜ÷urU¸¨Ó2¡- É5A­þlŠ(ó£­ÖþjÌÿ­ßz?Œ¢xDùà<ã
e•Åbþ%«i¤ùæ„ڈžYޖ弞¡-&ÑÌTÛÆ|ÿá\°}yfˆa-_ÍÏÚ*k„Së¨ïÖƗ”Ô8Ÿßv¯¾Q7¤f›’aÝæ9 ¦;Öëíˆæ´Ø~hcPÊN$vü
B²Ý`9Ðí~)î€ €ð¨ߛÂ%#ZRSž¡ÎOæF¥¶.ÚO؎7ˆ
]VD0·u 8è÷Wø,×Ý&ҤÝî7ãŽò^]G],!°WD€£Nl.œ{°©ªö»Haˆ­ÖãÁBHöõý
öÑûrÄniò
ÀÆ9}i°OX´í:Ðã	öÏE<·Oƒԕ”x]ùBí¢Q»p´k:ÉmøìsÓé‰h[Ft#h(4[h®îÐoÆ3Ýf‹ëÏdÔCT=9ģéÏàzº¢'Lô¹Ò(ÄMæ¸Ñ!.4¹[¦ûƒr	`ƒç	3›ìê’í
qcÔ-O·m¶Xyւy¡yv½‰è:m—L¡ã1ñ!]гc-¦S»âíˍÙÃÿ‚¾_ªr¤³±©‹N+ĎÞs7ótP¡S™8`‚Z0úH¡#1dAéˆíÝæ|‹ΣGKB­«?kíÛMyvTTß
½{Ýv¦ãê+KU`n‹ÜÃß<:¡.A˜{,%t)“ô  ²ÛÃgÅy–표'kl@(ñºB8…óΛÞpŒ;äx(ùž´‡ë+žæöuæÚÃïæÍ?¬¢ã}é÷–§ܽþÉc(D’ìτvçA¤±7ÀRˆ	ÌZlvÚI‹²]ý/)‘AÑ	y-bóŒ
E^ô­1­=f”Š®j¨6ZÏÃKm;ÜQªüp·¸é)ê-b¬½ðôðáz'
ζ°xÈ€Ûh8i¼ø ic­rúžmnÇÐ_ºº£ÆÍÕó
,§lqoqÏãÅø™ŸÒØÈ0ÕG—ܮ³œn¤÷ÏZÉWwFG­=C/æf9ÞÝ,ά¡U3;½9wÃØíð=ˆXã+ž:Âìܘ4Ú7ºÇO &SƒwÀ8/ÔÑå½...f-[#¦¿6×ÛáQ¡_]òTDz´³P~ÆxÑßÁ<ÐÃnÁDÛîúöRXÂfØ=ŸMš0Ÿ½6̍À4Àj!²ÄQæ5‘Ö,‘65¸0š¼ÚVDÇвR´em!‡±ڗ%¢$Á8’“œˆw¤D¯¸:gÃ|Æ^þázø 7FŒ×êD0	ägïÕoïl>Å7ÚÑ4ßÃÈÁ…)F;Xà4
@é@¡Øiñoað^a-,"íÅîPÅRX"DAv.D³3ð)G„(¨_¨v‘hVš+®û`\·ùªHT?WEèRdD#¹ˆŒpôgçGÜ…;®’n*ÿï‡{M‡º’zÊO{LƏ1s>éû³öòÜ>Úx9ÔöâÏçõ1|{9>aD€§dJtžFϜI×3€	î+.·›Mz·LÜV	´Ž·ŒöÌ·÷p¯dx»kʴ»ÓÅ÷9tqÕ+÷1]ÂÝêNE$—ÇåpÇÔBܗ+*ùÒx÷µ)ËnÖyÙK|ˆLqϵ\aêe©Ø#Ê?›8Q†M@˜ªpBkõðÚúsfž¥§?ˑ­Iƒï$å›?«&y9°ØÖCô‰ʽá¼Ê%Gôk§x†͞Qy°OÊHú“æS÷ÿUξy`*ÉH阚DÛEH
ðÛþW©RßȂGQHˆ6XlO:ý@Ê(ý ¨ÅƮ°ž²”×O˜‰ ÉVé­Æ?
Ï%TÙè’>!°H\¶„¿,)`€Ÿ–r0pÆIÍ;¾Өł†Ú1XáètÄëE®rÞ>}*ǿæ‡úmLúÜaÖW]ÅhÓ5¯”ùâ%ë­‘³žŠìGK«Î8:RڥçTIRÕ%Sy´%¯¼Ôà@âiÙ>
-­ä^up/+ÀÇk㸲xÈHÚg¸´)Áĭ¶zIÝl¶°„ê²ô¿­ú4ߔ°ο]ÇÊo	l—ÀYJÿRëՓ.-õ$1˜dS]Ž)QÝwJÈù
thžÜå§%gÐ_`«á
ÃÅXE-—”‰ϖ6ûâ÷“TgøxµòWÑYܩ‡õ½ЧûõKàã9è
ž¢Rž×ѐó€Rÿ¸:y¦Å+À!=ê§K½ƞÑ>¼Å~/öñ¹ã@‘€¤A‚üáÈ2²·ï…>=w(Ž4(;'0à#J˜ýc7šŠ>}º]ŒüNÅj¨@›ûÙѻ‰6V~Vø°fǡ<Aý ˜õޤz¨™ÏD¶ásÎã
¸¹éWÂëw'ú
žªÏ#!
ž¨ÅÉpsvñŠ_3ж¼Y«ÀžʏOÀ2üN…ƒ6¶·c”J&9­ñë/ÛÆæÙÜ6˃;Aã’Ûñߥ2ý­˜úhïu–Xê³ôaê³}ÊÙ/šd©©ïDÖý.Â`D¯BG…uéø }êt´ÂÙjxláø&ß$®¶@„“|W¸ìK§èe.·|°TµŸ‘‘Zg<>>’u?¡YFEð£ôMH¥Ê,۹òœDÿ¬üqA¾ÂSAœÕþîrUvÎΒÂâ,Ë装C[wöç‡"
‡;wòöÐ+Pœ"wd:Âæw#Œæ7 °ª{Ìk2Î,	1Îê·âæs¿¨G¦“cceÓû˜Ì#£!2–“ѳg<Êxâ0SÑÇ@ãÞä~–šöݤÐÃ"¡I¡‡½ì6¾£iì¥<‘c<“®UõTÑ}^yü¾ÌåÚσ“ÌíƒÌËweJôwçsø<óƒÃÈGœ;§œk]džð}Þ	döTOŽæ^a SÛô¯9ZÊ֝š½²˜G[ð­Ì^pˆ¦ãÈÏ?YnƒT§Ÿ’WØÜBS7úéÜ܃‰3w€m¾ä°OHœ>ªæD¶IÒt«ª{z¡ém¦9ê øzµFµ²éß)ì]µö'PS´3r¶r*ãIZǠw­pPùìP“g©#Â#íBÂHŽœ¶_Ú÷á^îôo³{¥G¡„¯‹é=îvõ˜=éGI˛/ÂQÎ"ä‰býI¶ä¼ç|"ßËá*î÷PEе%®…˜B>º·…4…;«0@ßNiÒh¢e™BûÞ<Dé±ÑWL¥ƪ«Wo
êçÀ,bÕù½À6«¦|æEhç¤Cwth²èÃceè¸ceè,QîÆ`sÃí·ë~ù,ÜwFàê+򞲽S×gÿaAM]}GyReÿnb›=x\"ƃ˜8CէåÍv¤«ºæãü*Õ5Qå2zÐöì4¿€ž·\=-ìCcOÓÝߘhšºި›|ªæ Jm
;ŽÒY¿Wãí&«ÝâöÎhQ$}ù‰îYl§¬ãÞ÷
'޸þ„	…ߟ܈l´·yç¨i«ñü
æ!ú¨ój퀩ïý$—12ôTRêWM'ìga½!þ^Á3v£æýVà]¶ڹ7L^­S£¦²*J§Qg±$…@j±o>X\¼ÛlòÑê^	¹jÂdnTÄÕ=jݳ»BÁÑZ0±¦ʹ!Т‡wšúK…ô1؍§“ñ<¿bøYjUüÿÿÌ]i“ªJÒþ+'âý27˜{Ùdæ;(«"¨óAVqdqþü[¸t«½œ>gΝ¸ÝÚVaUVUfUfeÖSœP©SV^ºÄÎߋˆ‡)¤"ˆ[o0Ú)®ôdçȣu Ñ=È<¡öw†L›x†.eEpp¤kçRu¶;*~É—;?Õso€“@u&¶Rðàun+Rõ<qæ]ùåÙŸ”¯Ä+·çÃvºN7?	/ØŸ`^t½¼y¬{‘2”ÚÜۗŸȐ@ö¶¾>ê‰oøñ#¢‡Š‰³ÑgÐ0>6!<iêpŽwT.§h²põb‰êÀ%¶ƞØs/ëŸãdlÎ"gü
Ež~_v:م²U/0ýÔçsSâð,ulÉÏpR†\ÓÅkz¶Ñy×g¤Ï;‹”wåÒî˿@¾,íÚÇÀ“êˆƽ@¾”ïC¾Üæ½\Ìõ~,@]=®ÉyÎ T^¨›‘¦s8þï¼3¢Õ_D€Øü¶Ô읦m„R4ç¹⌡փî_¾÷³°2/?aÚÃö¯ÎÎ/¹Ò_fƒóçWOÓ/p߸k
÷®€Þgñ¯[Õÿþí­îÝÓs÷À‚<NEė\a?p¾î?ÏæÏÝ.þUú¶oá1¿7e_9ošŸÓøgÐöLÓۮ{ÜÁ#î"h~’"ô¯aTYó֯Š˜ˆ7ðökû`¹_Ø7è¥ÿ|­Q·Õö~ïéژŸñ|AÇüú=”ï7ûåþ$?þ„ÏúGFæ}_ë§û‹ó°!AüY^÷ÿ¾Š‹þGè]¾›OonÍk´܇οÀÑékDhð°i†üҋ^h^¹¯¿ÿ²k1„„‡ë¨~:ó—N6ïÃֽ†aÞb>ë%föÑÑßÎñ޵äc	„(ŒVÇ]Õ[Àï(ý†aÿE äŸSó„ÑãúÿBü¯†	ù„÷ú>.¬÷|‹T¹Ýã̾à=ÞÐï•XÛÆè=ŠþHò=´öš[µG™Ö¿ è3Ç+ó;†ÿ3lúûnL4Ø,Žº½+Õù¾;_*‰\ò…Jï¡ÅûK){˜óâœïü¯`Ñ	rÆսóŒ/x–Ìϲë/®´:×âsùÎâÇú(=ß:†Rs¾\~===àAzº{÷‰!rCõrBáÛõlÂE¿·¹õp¬áåÎññé[Ü!ùÝ /6²_p-ÐOw0¾7ñ=üK§½ÇÓ ÿþN(#Pj¾ÙýÊÅ{—Ž»m–¾°„_§O€_–Â$]‡ER]ÒnêüCâÛ.>'÷žX`\õÃSõ°W÷q»ÿØÛó3Ïá*¯>@2°ÞϹµ?-#úª_sz~HoüsMB?+V÷Ph—Þz[úœ[‡ƒõî€5pŸ}¦Í+ÂÕößÎo¿÷)÷æ»¯Cò䗺¶üôº;,ºáoW"oVFßùŸ«»ã‹"Œ“+2çG¢÷ä."þ0z}m`‡³w7Àê´ΊäÔóÙî÷ÊûçõÓýñéÆ^|ìÅ{>üNöƒÑøµNù’Ì<ŽÜ-êëj^*öûåô.ùÎh¼åýQ”>˜6výŒ{!ïÅ̑ßpۗç±[ç¾[Å}¨îÇÜðÞäú¤ì��€ÆWù]õ^»»ò·DÇ5û·+eWމ‹U÷ü¤w{æÒ\yÖËvÏB÷·ãíÉ7r¸(jÉãÕýW’‡Â˪ہ¶&€ßÿ9b¶ïÆþƙo=ïk‹áMA|¾‚éó½ü@ƒ!ž§ñMWL֘4ÈXŠ3üèÓÙZ˜Åà?­ÿÈ3³ï쓹Oaæút‚(LQâ>iœƒ3šâ,ԋ
ó«Bt|¿‘eØ.燵ñœ‹3‰e£Ä`7Ù4!n<6ÁÑ›L­º¬ò—³)=FÉb±?-öެ³!iC	híI}OÃ)W¡@”8ɥv2Uâ¥2"ڪ§ÙÃ(ˆ‰ü2€hæ—6e£.)Ò˃–2Géhަ”
Ý&èûÓ2C)¯ç0>‡;x0»b …-ÕL¬™GuЉ²[¢]åæ&kDr1Öèw`£Ó%ÎbxS$2ºD›õAšñCSãh7híƱ¶sÊOÕ?å³ö$²”5VšeÉ©,Ôk‡éü™¶ÎtÔ÷§8ãGû0÷1n7e–ŸÜVÈЏ ¡áiÃ5pÚ&w,§1ó„a‡±µaÄ0Gs,Ț“`ü
FAƒ#Eà@Ó?ÿÓø©[ì:báëÒi5P£]ŒԮRúH\·ø0’U‚`S=b^	ÓQ„ÑCJ?Ùé‚
xm<×pT Tƒ‡¦™ìTE˜­³.`μ¼¥ª˜ã¦Ér¸°Ém”¢ë¶%éUÕéҵ%“·ldîß0¥Í.`iÝ0V¯@âi®aû}ۤuÊÔep°¶ü2ß3™	>ñsyí4Ðȝ‰/NÒÍuÊ!JCSæëyAÚ?Fj×*[§ªµ, ©JˆFØ#†<£*a˜­µZ$l³,ÆÒÒ&ٲqÕôÁ/9 ƒÎĵåš\LÑI»  £[Ì
2âH£8HkÀ{\^{ҩ—ž(zՙ¥hçCö²cו"3m”­çŒ7'ÓBÚLpr²ˆ--1žå;.ŽZÉޖ1câ6‹iå^)ü0ðùxÇ0ê|: kÊ-%]cUaV˜5´œm¦›†ˆêù
¥0ͩ”š¶M¥vՃ¥GÓõ!·sfœ
§,é¿adnš	{8Ùm˜›¶!´\¤R—ÍVã5˜o”ŒpÆ
4rñÀH§=ª:*‡Õ&®ÏètHE	W›β\
[žGcUDCvAW§1éˆÂ֬TA÷ݞ’”¸i‡'‚#Ê=mƒn½µ[ÓÆ$²À;¸)­JŒW³ŒHãK'žƒ^=hmG2šÌÝ24i]¢”Áb|ÀD Œ8D*y¢-5*iµy‡©’´›-æãG¦‡½7ΐùãW(_<CR÷‚ã/ւ{ò²p_úùR_K¼øs!¤‚¥N‹àDøcîFͮ³³ ¡öÀ8MPÅlYTlü“)h™îàò嬳´g8«iîù³Ó¦Ç%|¢Rg…1¥óÆì˜Ï`ßnÇ{ Ék_¹áÐ=Z!A7§ÔåŽ&ç¶ä2E˜4fV¤E†¥áÕv.µª<3djX\T،mҙ[§¥£d~Ôf¸¾f¬$x2â“y:D5•4FDO]‘
­˜qDܴ(ÀÞ0µƒa˜‘tXó80­ù¶º§?GÐrPLs_= ½¬)ç\Ӫ5ÃÛ㤸ÈHccczºFGv®J3#uÀ)Gê!iÙnNÅ@Ò\©geA VV­P½Ã:ßvؖ©cùP³QŽ÷|IŒwòœkչ-ưšŽÇFȺ=&–3XOÅ=joêªDcVóü°Ì¤VcŒZ¯£ÓƒªdGO˜`ëîz¸]m[Ë?Msuaët6÷¦¦$oÝhÓF˜3Ý3.ëïâQV®q’×(·B¹b김„ÑæLć0]䱸)F
·bYîd‘Û٭Ǡ0=4&c£1×)_‹]ª6„¹v,n£&Áq5éÊX°›dnOH£ÛÝl¤Œ—(‰mڒØVs»l‰¶íôuÉ^ëÐæŽLŸJ»vÄ,QêˆX”TfÆã±H¼$;”q[ÔT³`CÂ(#«<$Hž°’gìÁM #ÛNhsOJ*œe~SE2ž3ٚ
ÖB¶j¶%«.VĚ>.°Okéÿ MXpþã²>ã*ØBlZLê#ê¦W~ØÑdFÅvǯxºOºØ%$Çﵺ7yïFÜ|þ]‹ã#uý¼]rë¸�||+}J½l´Ü¯ûm¯ü%ù}ú¾ú²§€¿Ôú›}ï!ûç[æõæ¬üò=POjô/šô_CWÆ֯ºrPն³õS&<¥tǞ1ˆ”$óJÀó…ÕÄF.ˆJ=_3f«è6>òH j;³‹Mò ->œá+=E÷(SÌáñàXU Ð*ƒ£è„'”u¨ۭ ôœÏô=yazîWž_˜³8ÄÏ/¿¨ŒxoÞ+Ӓ֯ÃÌåcEµœ´K8=-kŒÇm#Jý–çrÃ"¬”O0Ц(Œ`‚¥
Þ뛝àö×ԭ7Ó#íá&'ˆ=ªåRÌeÁ*Hnñía0¶)Þæñ$Ûò.¼œÑènkê«!©ÅLêѾA§²´‹YÔÞ[­{AÒ՘ÏåCacGáP~Ÿ¯É
¾€…1tX0XDNg$Žañ˜3ViET2{j°˜€†
 oؾ¹Ö¼(
̬¯	É#ÞV;lԁÎrnãËl;ˆŒ”ݭêyꌠ êH³8:b ùYI‡ðJÓýʋ-F+Uz"H¦¼In>ævPTÔPèé{z8ý_ü§cµ7¨2¨§%ð]޵jh^Chå£+z©yAÒà‹6R>nŒ„ð¡ ļu‹ÓQˆUdèêµÙVÐj?Zã¾a+Û`8²NêŽZíR^‰Dp¤	$˜ÏÑÓp¹¶û…?̃ÒUÅI£X'¨®Z•#dÈL¤#ŒÐ;¢”NK6À>ÀêôÃä@þ?ÿÿÌ]Iۣ8¾ϯ¨[x¦aG °¾Ü ¬fI€_ßηÔT}UÝ]=Ó53=<Y2°¥W¶%•ýˆw!` Ã)ª‹¾§ÉÝæº!Ýs”œx‡giõʓž_—{ãê(RÈæ&¾< ED*u£ѳ]„Œw§ΛÛڡô}™Ãa2Vָâ	J‡wÜYA‚–¡
tD	éŒCŒ«ÅB)\§´SàðF'CXuް|=ÎD|˜5GìÒ#‡»H+é“Ùèh<”„<¥í²÷eøñ˜Uéaèƒ(	înRËOÓÆêB¤Ġ”Aq|ÈëDˆ:_â;¾Ùƒ¯s7á6Éo1hW/]ȌºSwçýƒ`ô涒S·ÞùùdQŽ4Vt%	Ǘêȳ°™•”-²¹hrõ757¤XÏevÆB7ǝ<•ò|ª5’½»£P½å~$˜±—)ç‰Nî}Tnjg{·š‘´
è“BŠÊêp^mѼïg;}þh=Žžè©CœítÞúçq»½¸÷-†$«¬¹Ùò“Æ8F+9ýÃ=œŠŸNv£F¾riäew‡þÞc½7WY<.ÀxC2‚y‘RiŒ¯pþÇGB´ˆHœÈuŸ��会d£œO՝¸ÅCÚ`D¬LsÃ"/„Ҫ©9Œ|̲^íUè†^{¼ËnÈW¥0ê¢éö¶iw¾Iº²UáÑg\é&îÛHææöÍٔK8Ä
K¶&œ@ÎÅçLèô Yˆµ•­PŽçXúïG5ÅﻍLd¦©ž&Ys%.¶íú)_Ñ<lpžŽá¼0L:ùé@ǩ*ÄâxÙbY.~$úRYð®m£ÀiP¤˜M"O‡¬‚.¹¹´ÞFôª„zK}†CsXçH`;[“ë°1—î[hHp&^»Xæ/,·b5±~ÍÙwÐtõ��ܵ÷6PÉ25Kc7?cGŠ÷xPѷóZÔ1{

wֆ3Ç[bí\}«URÀ+38Í:ÌÖ!öŒk¼Xº”p_dƒ;µ±›C)ô~{Ðc¾
žz„
¶Y֦›û6¾«ä€@{¾K5s…¼Œ¹çdÅW+ܨY)Ã,“¡ÿ Žª™§ޥˆ¡ö葚 DžKVw‚•Öøšo%mo Ì: zç*%ê€LýarôŠΏWyS%½l]¤kœr©½KA€Nƒ'ÖcO:´_äžfUh¯üò1#9¨@˜ˆê„V.¥­«cB²âƊËi¢	ÔéÖ¡ݮb]Š)zéAjwéi´Z¶¦ØHãÈZá-Y-éî|Q{ ÒÙé’㼙¢ÅàÚQX·öùÖ>á´I×ìCs±Òîê+f.ei‡J(oðæ1h+KÑܩ³"»¹K+çGm[Œ¾Jž6ɶ¬Ynl
÷xçž*Ãrm/±¹ï)$`-[šÑ8×j³ £Á٪5¢½6zÎt#t|鰫?-©öê±7蔾ª;–Ì6Æ`ˆ©ÛIռ§´Ìԩ}=õx/*š	e|£ò$§P¨ôš
f`ggŽ-@Þó€Ÿå\‹˜Çë0Þm§ûx‡y&ýaš,{‚¬Ïwó(ßñò	Õ\¬î´ó-Dž^É’ôí~ª÷ÓåQñ-ï‡?¬°›ú‚ìß3a}_îÙЏy$þulâs»ÿyñŠßÝítÍOÏÕvØȯÿøóðʢ®Ó~(îé˾Ôߟ_úÃó(6úí¸ÇçLß	-wߍ¬ÿ*eÿ{B¾×m”OI›PX#ìc\M—·{Ÿ%-êh~}‰¿þ|‰½…®}Žç&hìÃiޯ"þ>—§@¿îñë°d¾_ËâõûW9p¯{#¯‡¾”Åß+‡ÿÍ~™Avþ™NñE*ŸOϚ,ï¾0õ§q¥ÄםT}g6οÌì§Lž!̗/ø’ùò}d=C¡ԞúÜükI”/õÄ{«ïúâ­ÈJTUiÿ	j„¢~»é‹
à¯6²¾>ÁôË_t³Ÿ:–Ý^ÝlÖFt >ÕsàT‚á„=ûB‚¥çÊ1J([æª[Âí0‡j¸„nRU1aòf9±•ÑÒ:X9­¬¦uúd¦¯ô#ã%Ù3LVè÷ ë^×$mïs¸ㄸ㙚Z̵!‘&¥ˆ-ƒ9¤Òn¦ìŽ½ÚàêI"n®óXÍX"­¬4A…šà6˜ م 3ܑ¡ÍÌ-;Ņ6ºŠBPGDXG$‚†WÚÒܝ:Š<¤,\*˫ꢫêštë¢r‹ꢻ`Ô\Y÷}Z;ƒšàp;™0£¹+˜CO¨÷ð£–ƣnƒŒ…¢â!ål!qIJBGPÙ:@WŒ«Jk^€¥N“ÒO Z7ÑpÓ1+ßÒà6ѠApåTïH+æU!Õzå³OÌ(·ÅƒÖƒºð‘qd¡ºB¼B"®€qõ
¦ì¯Ð7QeÙP…êuÇ9"§“Þ¨Ó7fó—»ù2¶^Òþ9¿z˰õW'×ÿ°`Àƒ“Jýóù¢ä…×ÿ
lýYzêC@õÝl¡»ïd§ÿy]øy%R©iÞ?èî;2ùfm§~Z§ÿÿÍ]ے£6ý?¦B¶ƒ¯y
ƀAÀp·7pl0ˆ›m˜ªý÷{<ñŽ'Ùñîì־R]êFªnI§»¯ùÈ÷c²w©XïÂ{Õj•˜¢÷Rš/ó/ѯŠ–Ð7å^>Ý$.|{¹Šƒ;¯íþ²ŽýÝÆܑ1ñøý®$ˆ·ÊÏ\ÕÁZt«Þ{	½´÷Ã}åϸSüÓ<æ#ÔÝá7guÿQ—à-áÃÛŽ/.ò×Ieï·»±wý½:l–«Oå¦Y¡O'Zö©3ùëÇõ[Àü¡YPž!sh)ѸƒÌtÚAfC4ŸhaJ.Å3ã'ÎTòRË}$¹‡ƒ³LVŸú”¥ù€r5ŽåÇÈ@þ.‡ӆÎñ„7<¨“ÅZ‹u-b±EJ숝9G03a¶|©붙%(MGAz§€ü ‚@ج¹Š7ðYäD2=w‡	SôKֳƒՠ6=2‰tÊŽ	`%*ç(T_Ël!Šå ×MTZW-õC=0àœGz‚¬LJ# ̇%PÛò5C8b³i¥ÎBli¼%;½_™RD ¢ ¨ڦa€9kj`)¶RPÂC‚˜	ˬٙ„D˗%[Š6p”­7</TJEÜeâC
>b;¬½ÍÛû†g
v©hC‡ÕI(,DHˆ)z4l§åŠj+ɶÍGI0ʎó:”g›r‡¸>֛Ràs
~•­k4klªÝª±äMm5’	Bw~uÝQ~̚6:¦ÜÐÝù²ЁA@÷Æ2kVKīð‘¡ȶI«\²Ÿl-ž?!-Ž{u»Ñ+whN*W¶¶eý:2ÔÈæv‰’îÙ]i,Mr<A†HÄpÕ6JE²µV­…,µÜ^àõv˜hˆ'`:ÄëCÓJ´*.4bÏܾª_Aû·Áý‰+ÚëOŸáØç/øñ»úÜÎóDÓÜõ°àsӇ Ç^Ó݉íÈŸ™OY®.½Ak<@G­ïí6Y‰Oµ狧.ªãp:?óõχèwDönÄ;6ڛæ_ͪ&O©PEýêýü|zÿߌ²+Ë~ÿãÝ?q‡è¯Ò×üÕ|ý/'´²ç׋½VY“¢J~ï_‘/7¢ª-Q\¨÷M—RqK!T 'æ¿O‚ÖÖ}«§¢g1¢Š<kžü¾s¸ï@!Qcף ^ã;`î! x1	p)¥‰“G ù>(£Å²¿	ÄÔÃ	HH[XÄF€‰.ÉP"ìrlªՄæ>>¶PȨ)°`v¨Èä4´™¡®hcSöÑ#øÎ}û–a‘§§*)Ë
ýj€l¯bB1ÅÐÿ(ò€¶©÷Ä2y(ÆôÏR硢ö”IX	Ÿؑ|Hq†®zÇȺ|¿è’ȇùp|t¾ªŠUõ¯Eü4¯¶}ÊjròªEX}!½†UQh_ÍÐÇnXÅ	‹CÅ®î{‰¿ÃÂ@‚/%Ž	¢€†ˆb‘¸؍–©
¤2ŒN…òzì’¾3Bv°}?˜‰øftf©c ÔjlU<ÈPo´n^¬¿š^s•¥¬H=€Î뀄Ár>½ø”¹+à®ÑU&Ü3ÕÝ_«e'&—ûÝÜù¯Šûû—üÜMväjqdô­;ññš‘lt²Óýž´n\4
CÖ'ñ 1“Æ뉠…)#ªv•K‡Í7xl$Á±”þóKýU}·= ‹n
÷7½ñÖZp—°¾ ·Ö
`ìâð­8±utò‘C߉·>f þñ±‰ß4;ۈ¡’½×To±¯¹¾\m‡îkmlôh‘ۍaž0JPAç÷`ç§ñ]³àóçÀԿÂ0F¡,uՂ	­b6?»Fآi\Ròºdž7ˆ«'´;`Z…Q„ «ÜBývºk•¾‡éÍ#–€wåOoÔ]óÃ|þկü65/Ä×›ÙéCs4^ä7ö>vS9KM†›Ê"úþ]㽳5JËÇ `ãÿ7ݏC¿0ò(÷eÓý6Ú?µò
ØÝ{z³ùðò÷Øî?™ŠδzŠaô>O©,o܏wí€w)‰/{”:Øggž‘¡¤:CnêÃø˜,A•½±ÃÖÈ%¨x”Rù¢ìBþŒ¯ýò…a¢¤˜¦ÿ”¾Ñs—ÄÐÆ){OÕ_<?#ðy)%ÿ^ʝ„Ú„ÐdÏÚcûþÿÆ_‹ا‘Àþ½®~±×ë¯dëǗÉÓë%WЬFzWn“Æþ
)|*õ\ºîØ˫%<à¥ü<;Õ=—Hì76ž¶pÙJÞ²©HÅSvS …BZÍYM—âD°ZS&CۘiÝųܣ¾ÊëRM›ÎRN9.úSE"¸ÎR(òfÅȯäx;zËÌk‰Ük/c5öɶ­›5×ÛÀdf$gCT4)›dˆ¼•Çg¸ÒìÎ&xk.¶È·9ÊVÛQӅ6UÕôyt²¨¯›XžYÞØÒWxyìe#Q¯[íclŒÓqdkÏ0Ym5’c“á¼uÔÍó1q<7Õ\	kõ¯ñâ²Ý5¼¬.˜þqӚpYg¢֞ŒF´1Ñ|e–aÅödÿ"ø•ƒM…Zo.’Ñ2ºœz臲²Æϖ§R<£–»
™Ðíêî"W5!z·ҟ\އxŸ§|oo…³T®SI±“ºJó¤27θ
Òóhêº&è.—4ȶßÒ7ÝNÐm¥²ÐêÝF¦IóÑh ãP›ûËF%ŽqF§!,͹ÛG-éåjÛl_¤U´	x!\óÏøäeÛKouYè³`ãî
9бil7ÝF,U<݁öl=$¢Û_ÁÈϤs0Â)Yŵ^²ˆ­ú>q3³~èö½ó9ŸE®¦lU1ø
gy£es¹l,EgÍGÆf«OÕøTiÌå1ÞTnŽT™'RkÉó¢×$٘-šZ|0\×ýë¯{?y•üêÿ¿œ½é:
ª:	úâìNÍצ˙PO¶¾HÔÍl/uKùd
ºLÆÎi•óãî¥lo“±·²{n̈́¸>Þu‡{OưÛRІhۮØõw‡ÍÚìö¹Òé[)/r©HiۀêTúá'»Ө¦Mþ¹y™¯æKm±ùTì8-ÔYT��K'¼1٦†Ê|%ãýµ«ú¦Uˆ؟ÌÛ\؀*ýSýD‡™2®½ðì[­™fû~ǎSq·R—±rR_¸ê-mߥ+u…ѱ­Km_ׅñóiàf®5˜lNäÂ$	%IÓYيư“VòÔ+€œº…¡PiL,T‡YIf:ÙXˆñê×ѹõ’[˜cÊdî×òÿÂW§ÃÏü]c^s<P\¾œY»=q¦òù°¨ô–V}pâVө+÷==γqǩ*.aÀ÷Tè-ìÈ1$ÖÎÅZÉVms΄{6ü,!|os	Î
5²åBñ²Ÿ'۵^f—¡̹†\©ìëð²ƒܺ.¸S1ÐÇg¡söö1Ou¯-Çíä—!ûöÉ%÷§ÞUÜeߝˆÂ&l–¨|:aÿ@§O¼‹íWÛrÚH}÷WLÕV*vb9ºbc×V-–0ˆHÂloºҀ.”.)•ß!pÀ޼ìS@3£žÓݧû÷/HŽ–EL\/E§öâYî<Œd/Ž’¨•¥^'¨åû¨2LPŒ¯°sq‚zL0Šf(õH‚’(‹mŒìÈÁ¦n´ÂqˆdÈD·C…IÒÂÇÈ'6a[ê™)²ÍY˜"͢,t	a#M•ÛưfÄÇ_¾œü•,I☙Åf€ÑرŒ’’(¼F¦•D~–âXõ0ò­Ìø”ah¾Y0Kúeei…LNœÔ;GâÕr}FwTóßِFËk$±ŸèØdzôu˜±KBf³f›¾}úèú†¾¥63?ʯ‘G‡7'?·YWùš!	ÌMÂv¦&¡tÄQj¦qRã*H€Ú›18#!Ùçƒc71ÖÙn¦;.®ÍYZ;:L,õ‰C@úŒ>¿²ÀðÒ
/³5-¯!Ho}ZxÅøwòËõÖg=‰7.ê™ÇÁÎ4v(W¦C²d7w¨Gó-Xó€N&Yš6¾Fa”Çæòf·$L]yMÛÕg²°zl*³oådq]AIø Ù›’€„.3ËB».sf›±pIp|Ê^ˆ爽`éޏ³ýÍß›±AHú¶	vg3Y0Üù›þa†¯ç›6¨+ýn׾+Wu¿¼mˆÝhꊱá˴nL_²Ùy÷Nb[#&ÆKl¦´²õp'qþHKT‰³ÇêË	‚ðÕw׬j½N`hÆ(ÎÍØI>`o§ìZÔ &Çւ¤›)“àô”ž×(‹ýSÇLÍëjý[²r¿®ÿÆ2ÜÏhs×	ž
›÷W֜%úPÌUrë[±švülZ²Äy~´‘KîKñû½ÜNµámw:–|;¸c-Am¨�Å÷|µí'V÷©tº=Ïé4UiKÚ\Íôaî>rӮÚ~mXwäÛ؅ڣŸ©²¸yw7õíÐXZ¼ØP•I¦+-w>-­ÎÀÕ八ÊlzïFW¶0
Õî«mS·_uÍñ ©.Ö?Ïe›¨]/µ:Ry?ìEN÷!•#8‚ڥ4‹iqU€\~Z¨.îp‰ê
ÜY/­ iªÇ:ÝVC+š°ËΜRÏ,¡je[ꏫÚü¸ÃmŽeÀÝ[Qu£ĸœ>;²%Ð÷-ȡµî&®>ZðÀ/pä'S°½I°öµqϛðihMÎ

+xTe_¿Ž³ùdlø[nOåô¹ÇO‡êWy¾Î'Ï‘Ú1’ɳAs/¥EÔ冕úrÎöŸ'ì¤`C%Mi¥†ò˜èópȲÆ0gAԛ”­D¹ðieÉK½yMQ9m¾H¥•õ;y
}"hŠžžkóv¢Ë9<UxŠkÀÍô‚ÎïæڈbØ>	KmS°)«ù֕[Åÿà{­—údût<²©o:–ú­¨7(¯W1”ð~Wå­êÍféöWÙýûï3Ämn;Zٞ1p»¡¿¤TR‡~#jR=:û+“y9uþ¨ó:_kC±“þțƒ’Öý!(nÔ^ksPg9U°E_M°Úü¡R¨¸V»UÞèEyíïòxO™éV™Ôþ.üÌ(ØR›O}¤Ú|Š×Á瞃RSÚkP ĥ×qէÆH­T'Gýy‚Xƒžm8!t¿ð¢ÖÍx!b¢®hT5…^ýO
­nG%Êo%úÏÕÿŽäכ÷ê*€~ 46Ã~sáڹyu*4X»gèçŒ_o‰
Ç_HŸq‚T!WlP÷!+þ’}µ.a‰ì®VG°$q‹Õ8Wãr‹uy4®+n‹uu4®¦¸Å>`qìÕaNwNՊLö“Òå^öËÆîò>ʁ øƒ`8Iú0
æã0vp~žüËfþî͉PNG


IHDR22´6@:jIDATx^í—_h›eÅOÚüëŸ4©]׮Ý跑µ]ëæWél§•¶*¬xUôÊ!0±âUŠ"(ŽåƉ…Qo'nµNJÙ?l/4R”*N¢Ž^¸±tkeh¿.™íXº=>yyßôÅäM®„}‡@î~œç9çI>¦ÿx\šPXTP&]x)]E;qé*ÝÉýY*C9ÜðH¹QŽ2–«Tˆpò7ýƭ£9­Œœm„r•‘¼¨X¹»@ü$(N)"Öú's{ä˜â!҃ïÊãÙ_ˆ&h˜ ¢9to5ñüS,D ü_uÞ[uh@4P‚13KL‘ÊáCà·ì<ÀÒp»ɜF>”ÃU¤T%_$ŠH0܆C1‰'¢Ó]¨‚eE@„?‚«gœ<‚èÆO§¿?úÛ4I?CþúAø¥cˆU¨û{..!)Z[F?úÐ×ól63%Ñt÷æhXz1…ˆaU£áÖw››Iôb?«7q’Ȑ"Z>¦¼˜C¼¨AãÏո"Dtr6ì^þýR®11Š2*NÙElѼ˜C¾~U->D9—¯ŸÛH?qVBƀ(E>ÑãqЀðíë)IމdM­u%" ·çQ‡J¸M!®\€Qßֳ+XJ¢¹çطeæ®@-v c#ÏgI¹²l饜ÆC¨^ ù­`÷üq•%[xg	k¥<э€ðbxVܨDZ†MHzœ1ÙLrfòȱד3ú ³¨•A6¾]A4¡íÚy¢P¾÷çÆð1øýÇÄP½”¨A6»Âjù£C›+O±“Kïžysi–ÄØl½”!éÅ"îBhF»sّ^l1² Âî´A²ÔËR@Ôq©ǮOŠ/¡BÙ,%{1€H/µ9/‹d÷•ԘôA.ÊR@T«±»°/}5·èa
À>XjQ­”f²ÜK[<æȆ(­-ÿ09y„(*»¯—Ò¢eÌÂÞõ¥²)"ÊwίáIVÿÚrJ+%»A6€¨½ˆ¾´ÎŸÊg鋣âץ=ÓïˆRÊúíó¨Ï¢¼lÉu?›±d)חЅ½,{á"‘‡|v¢-f½û­×Ώ糔C:þür³+S´‘ƱCˆîÅzíà¿K™ÁVçó)†ÔãDßK›ôRèw…}¼õ4šŸvR cC2¿FïC، :õÂh'ߢ{نð3}+?Æ)B–t0̻ ÂØh©4ï‰—º­xäÄ+ù𓾺4»4ûó‡ƒý者­òo«9Dy'¦Ž1at¢Ýx=üُG±mhA‚ê¸9Dr5»نìF;:…öð÷hF=jP!N½«hˆz_A‚ì§MØ.ԄF„ïWˆâ!êÍË?ƒŒ
¡–?AÔ0دz!*
¢ƒ¼ðÁ/䃗ÁÀBéýuU—K %ëyùB
ÐLöc‚IEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`MýIDATx^í™kpUÕý†ß@’sr;¹‡„B\$$@¡*X­…ÑÚiíX¬X‹Š"¥8t°ढ़*„QükۿŽ¢ã࠶Öb¬ ƒB©w¢E”p“[ˆ„ÜHÈ9'çifÍɚ=ŒÄÙ'ú¥óÌ0¾¬g޽æ]¿u–ø/ó?s}ÎOL?ÃÃ
æoó¿r‰;»ôpÅ)^yûI0ÿz¯8źÐp/`—öÌó™۵6°½ïa >Üuæ©ã?½/CřD¬ÄPœ¡›ÅÿYÜQno#ÜֹöµÑòD’²€ÅÄ«ø»2Úÿî€vêyˆEÌç6îe#'$Z›oW‚É!f¨ÎåãäÝQü L=sˆCNˆa›ÀÐõì…>Å…¡
Øåö\nØE-:/WҌQX¯$«0»ü3Â3
J!û8ºHIŠ3{aˆ±òÞ72t`ún(§èk»¯P	f;F/`v¾G)­ëþŒœpki`/°ž9È}œø£|ò˜Ï­€‰?±n\ø"Y¦³œ°™+Ìi Ô<3O‰æ3D'`ŠÇ#ßá‘åçtnøìå¦7më‘eMwÚ¢ˆU¢2ºނéV Š6<Q0[iºfTý°ý„cüô½_¤d)Q±Q
˜¬œP3|Œ,¯ð×û5U“U©‰š¤šWV¬C–gøè:“íE·ù”G¼†,­@G“jU¡ñ*Ò«<³¦ç8t:ršÊ0D)àUšüo"Ë pzTµŠåW޲•§B•ïZ°Y6P?K)Šװhҕß{!ËC¼
”-ŸR”¡<×LuÂ1GE_@ÛËJ7}µÀÉz€J+0’^ 竄QÊP²’”ªuo]Úú	ÀîgeÑh6룕J6ÕH•ëçn°õ¼{ƒ²•öñ%íÿ:çrU, åq¥Ék
ɵ@¼|ÊÍ+ë9]dX
<ØôrˆÝ ËJ„0¥Üqcaä\pÝqJR¶Š>¬ûÖ
f—y…”cÇr3[Áòõ½Jµ¸,¢e¨`zM¨Žo¾†÷YLúV&ñ΀âÉrm.š Wã¾|à&dÙ
-hbX
†ƒ˕jKم€ùÊRá‚Yá |†,óØK”µ`ö²L®†˫TTɑMWZ8Žp2c
·°œE|XdƧ‘l)»†E6â˜Õ?؂,¿`b*Ñ–#\‹,—<ªLSÊîL¦Uzê=€*+FÁ_ ‹i(6ΐϔ²+{&ª襅Ï!Ë#؅ƒGßýÛ—ÌÕŵsßþÀ	¼VàzZ7(#RÊnL	JW~|yç>ï@ƒ@¨ûµ3çhšjT­MՌž€Žýò5îý}™-e¦•¢*~k%@²làñŪQ¥ÊUªrUÞzu_/Àd¹“Ê[ʮl!Vm6ÇôWÀ7ï©R%2³AÝÜîý`pŒª©t}­W²…äBÀQH»X‚,ÛhÝþáÝۮÿ|ië¦pà
¶!Ë,³…äF 2fjôœé}ÝpÐq=Ç1pB‡NS¬Àh‚@ïþ9&·‘£9Oã›6üY²yÄJìãQJâG<,øt¾-$ҰR^|y8GICNÁh|ÎäK H¨ û_vJt#à,å½Ïl!
Êí¬F–·xóvJt!àÈ`ô¤Î&€ŒDÀÃýt8r™@û&[HnlywͬPÀi–Œ΅DnÅ8–:Žç/BÏLQ²É€½)*S*߼´³L£\Š˜Éíl¤mMá vœŽ7Ðò¤Ò#…äBÀޕ5BEIUÝGÂ4ÂyéØÿUÞÙ{ëæY/'p÷ⱑBr%`ú r6–ì\ë˜É:šÀI¸óО—[¤iýL_r=ÀGç^Ý9xÏ@!¹°[qRu°½‹t„ðQËrà›ƻL¸\ÓT­*UôS©êæwf["º¶G¦wö3˜Jú÷S8'e!¼ðZUk¢JU¤Â~ƪü酯"KÐצ™“ѥ€³’n¸40W1b™H¿ö¿¨TdîŒYÊÖH©âÌAèA–”gѽ€³’¿w0Bxh¦¯g^üÊTŠ’”¢L_hÓȲÓÌò›£ٽ€sN|ðøYVûV®R• •ž|ÀSÈr8{XùJRÀ9'¶4ÀeV “nB§~S®4%*AÉïÎîÞ	ÐLžãºpâUåG€sN|áxYV_-zaÂ]þ¿W·=ð5åI¶ß)¿™¢°s¢Ê:¿;àwtƒåëÈ@–‰ôgå•)×ÌÈQ	8çı[—A=rÉ|êx‚¸šäÀÇç4¬T‘²e“(ìœ8*yB[#܆¾“vpr{|¹ق	.šp°–Î	´…X€e{èüêҋT¤œ™ J›Aºü*©»îl<wދz6kÐúÉU—j¼üöw£¡˜’•¥•Ýteó.èæ/\F<²¤rÏrÂ{6ä֪T£”©$3E>åh´Ê4ùÅe­Aö°×ÙÁú BëîoT•JÍok)v4^À>äxBJ4Qտ¾¶aݡ-m_vŸœî>~ªq_ýæÕ?ûñGÿ¿v¦¨B㔯,¥ȫX÷3áyg£%¿ŠTª
MRj5Õp¡¹/NV¥&¨D…ÊS†’í£ÖÐl
%)MÙò«PÅ*Q™.è§\e*ÕxkŒ
4RÙJ<äØå‡*à|MLP²Ҕ©åɯ|ƒ_#•k~ÎÍ0‹{#¯i..§nrˆ—W‰J–O©JSºҔ*_?ÉJR¹OšÑþ¤;ð¨kðDžtͣ®]ü¼ÿ+è=D¦,âIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`MÄIDATx^íÙQ‹‚@Fá“eIȀPŠèMEA ±ÐÿÿO-x±6}ÂÔ.Lïeˆύãy|xà´@ÏoĈ€€qgAû½“{Œ˜1cþ»!“á ·‰/-BŽ"b1qY`ÚÛuÖB·€ˆ%+°bIä0fFB¦2fŒÝærc˜¿P(€bÀ<À<À<ÀNM}SbRJP’3e¬OòUvjê‹1¬©@ÍC¬\kå«ÔÔÔgôéù*IMçÉWX©éfv¾
@RÓù$_`¥¦›Ùù*IMç“|}o¯¿ñÈÐ}
Üì§@Î*öœ¹ÒèãÆ7÷×î|s£ÑǕ3{*9:'!*¶ìùRwàąF4\8qЯgϖŠœ„w†9…º’šGpdGMI¡.'c…‘wAçmȂ%	F)kJv
`Gɚ£„%y~´>\Dÿ:J=À<À<Àr=5Ýô|uÿ½%_ŸSÓ!ÀÎW;5ú‡’¯ϩ	½
°óÕNM‡€á_NuÀÓMÏLÈyIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`MIDATx^íØ=K#QÅñ£Nތ/‰F#ɺA
[‰,ø)¶Y_š-+a]A?ÓÊZY[Ùm/"kgc¹½{ðž…Á3NFb3ó´üȝ¹pï<ïH) ¤€@ gÀFl‰}‘7€Èr†þ~Á
!â¶Íý¤€fd6] !’ ã:›È" c  óYî·\Ç9#$€yn
;ç:÷[(AB@ç‹wÛÌóÁ	™H@†Ð1HøóE#€Êßìú<eŒ"	Èq«ìœ'ÜìAtþÔªGž,ñ0•çVÕñ9
@çá5L 	(p«öŽ$@绀9”^(aÎ4Á:o€ú«uÐè¼æ_
˜7€ @ä4Á:o€*!pHL–4 y,`%
bFPâÖB"ìÁ"o€øƒ‚D>1@ôoŸ|¢	"ß7‚?¿nw,ßÂív÷l
¿۶|ÿ<¬ó¬SQ¼Þ#ô
pò¸ÞC‘ud1Š©«ý§Gú–z¼ÚÇËYxš‡žПüÅ!š]@E”QGëüèeBȟ¡ÅbÙÿ‡Á,Ÿá­–?;Æ2kþý*è¾FN`Ñ6B€
|Æ:Öô`[,½œo³4âÅíž(¡öÁø„U´±,¦Un­±¥ò5Öì¿P€´°€æÅ4¸ÑŠãÎÿüÎsœ& Åø4*(‰©p£–TÞNCAHö> ó„doD:oEHôN¨óЄÞ2hB/™4¡—‘$_±?͘ÿõ]ç
 	Kþ¤ŒõqêO¼%7€&4±xyà:±>Ï;—XDSç
 	U̢þû[œ
n×1‹ªÎ@Æ1‰
Êq®hˆ­`ã:oeM(1ʉqIî3^ðùÈNô5ӹ8×tà>ãA¬¼¾¨äĸ¨ôÛÆMHøÞx;½-O) àŸôm‹
¸tÍIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`MôIDATx^͘mˆUÇgæޛö!$-X-´¢’`/ë–”R¹õ¡Óò¥¨ úPFŸLÒÕòmWWñK`-ÅÊE`A,T¢D¡Q°‚©»¾ìû:sçt8ïäNw{.ØüØOsï>¿}þóœsv<ÍõŃëÊÿH@a¸êª5”Á3øÿŠgP^ªŠW[‰‡uVq–¾!o(d’7ø…jŠÀêx…ƒWž!‡‡qœxy]×U]ÑåL*æ3u¯©¼ñǿ©w¤Ë:NLÁ3ä¡eòx†T|r€?uߙ•TP†…֞
äš;€í@ÿ¶=NLÁ}»e
øx¤BÀ&ðg‚J"¤e|¼tܯx7¥@
i}MÒàAJÿ¬٫GZH€‚ädÈtš‰ír•&C@¢ @¬ @® @® @® @® @® @® @® ®…P@„P ­Ð%P8…OÒ
h—}&蔀XAӀ–i£€XAF@ÍVsÔýj¾Z4.óÍý9jv" €XbêԨP" 8.%*Ԩ[T!‡GLH™c†+ãaï–(S'r+œî²14¨Sn¡ej„Įr…YŸ^‰DԩRɤšÐÈè€@¡a%²
Iyð }
fuôÝ@f´éº ^	å
¡Bz›ÁK*ùNÙþ–¢Çå°
gžÂGYÚ#Ðޝø²°ïFžtñÊ^ç0 AÓ
\lLéRËÔµ8ÙdªªSݧîUw«™ªcÚg¨6E°‘€
à8Àenö·?NH•’Á-±v•‹h Û6†ëÙZ³‚éÐ<¼̮üÅÔVPv{\à%¶¢t_ßð¥kÀÑM̭SߚMÝö hÚh*®Z(ð";Pº÷sG¿„Õ á4x¬~MHjz«!$9pV±Å7;Ÿø”`C1º¥i¶ÓçΚĄ©Í&)/Šàyv£ø~ے>JQñÄϰƒüFÞ;²ŽŠ˜X7®"¶H"x–½øíXØK¡øþ¾yt¦†qÖ
&S°í<–?Í|~ÜõÀnƒ²?ΜkÆƸqÊÁÅäÉáµK@ÂçøÞy;)JöÇ0pD³‚HØ,}Èã)¯Èq²gn·-_qOxùÍ//†ւã#4ÓîéšNޅ Ðħzælu]'ĞóJI!x¡iQ꽍I”T@0Üs×fʮ|d©S£úa_™Ž¦a<ܾ|Úd|<„ڍ왱	W>9¿E„˜(ú>kóGègŸ´‘PÀ)4ïx;I½†]N´¹ÐDԨP8Ñɣ¼ʯe9èáSÛ×?v¬=chÿҠš,§!¦¼»Q¥´yp$„¶p'åú·Ç:×Îذîb À-ªMå±wìƒxvôäwøktǡ©kê¦H‰*F<Cd±ÍOÇC…àЁ¡¯W½ѱîåϫç9Ï—(R%$wÀ'h­ÓŠè=þà¦ޟ¸€)ÏF¹L@Eځ´‚F+N€*E.sÁpΕ/R±Ãê¾ãhó+š8	aŒKŒ2’/Ùò
ƒ4‚l\5ÊM/¢֊ËH–¤:Õäð鎒ëoÒ¹¸ÎZ>WIEND®B`‚‰PNG


IHDR@@ªiqÞcsClÁ0`M	4IDATx^í[}lVWçýì[úñBûÒõ»S*Z¶“¡Ø1†ÃA‰‚K±¢Ý©Ä"$$‚’…„¿œؒj•Ď™!I#! F‚eP *ý²¾Jéñù%¿ӜÜÜ֛޼7Ñ'ùårï9ç9<¿óô<Ï}îy'(¥þ§álø?–ìã]Æ$ ä†ј´Œ¼=Á	§ÑALd2ø<Æ~aÏÿ_gƒsÒGÕâj²ì3Nã0níڵɛ7o¾vï޽]?þxxxx@‰àŠ{<G;ú‘Œ¨I„gǤmh``à{Z)ÉùE€cÅã˖-Ëéééùá“'Oº”A?é߀qoz„7h<Ýj"õ‰ҕrŸi(
3Nò§Nš)«û‘¢œû×Gê§m›Õ+ïÎW•¿)WٿãŠ{<G»҂q§OŸž=¦7x% ã¹¹C7nÜX-mYn$؈éyœ;qþüùâÞ}˜øjÿõÝ÷kUôí	*2Ў~èÁxè!	1M‚°úp¡”¢CW¯^}Íq®|[[ÛâÊ=˜°µ³U6N‚žþÇ?‰^èszÂXDØ9)(T”m۶I‚54~á…ùƒƒƒç1ÑŸR?w7Ò×vŒÃxˆèûz5	^ÈL”p4øCWŸz²oݺõ&¸ÜwI¥~Eƒ¼`ã?éíPè…~ÎC/›€<A™A€_$èÕÏ\¼xq‘¸l7”¿þçe0Šz CCCÝÐOۢ^	(7ð‹½ú9/^|JÿÑõ!°'€€>ôcí^¨0ð®>ÿäúúúöB!BÚx}þþþ÷0éŸŽ{Lb7åáÇ¡q}<	˜ßR­ ¢ÿŸ˜‡óÅì°'Átÿ\A¡„¬;P„äF`#ZGqS¾‚@?æÁ|z3´#s$͈c†>qõÌÃù2,	°'$rKe§¾X1?<ú1çKØ`O‚I@Ùýû÷;0øå–}Ù<xЁy¬	°'ÁݺººÞÇù±/Qú}ð{1cÇ~„Avµ+Ð9~üøöQ ªªêY)nôú‘	B/ôû,Hpä‚Ϟ={ö€Þö] oGæȻ€èýôÛä~63AAYii錻wï^ϷAèƒ^è·É}!ˆ3GJ0uë֭¯‰Ëþþré€öÏ@Œ£ë@ôB¿ͻÀx’ð¦&A×õœŒÓ_hllü>þóÐÙ•Oƣúkã¡ú —ú'êÕ÷—ï$d€^³¹T¦o޼ùõ;wît8k‚ˆëEy0WÜ;k‚JÆ]Âx衾)f=H8o.]õiŸŸÿ¥#GŽüLÊó=ʃ úcšúr]+BöؓI$$IBÝwfyyù¼}ûömíììü@V÷²¸÷=(À÷xŽvôCŽ« ž¤Y´!Àzݶ”Øt6[€՝«ÁûÙlŸÎþ¥ŸëZ¶'ÀOà}W±Œq|š JðŒ隣½Œýó8Þ}åí	🃈Æï)ÌäJ¸Âe¼–ðùöËḸ»ñöøO£§AYté$
ÕHòy–«á4>
ØGùT_‡J:	°O–h”Ýù{ÒN‚WãÒ@@ðI>öå5‹3B€„à°hÑ"e)æù„L3ÄŠ€ÚÚZ׶P(¤.\¸ l…'Uðz›6mRêêj×öuëÖ)HooïP2™ü¶´Õ¾*xIð¢jÁW_f~?ƒin93½ÆýH`ذaƒҲwï^×>ÙÙÙø8© ïŠHÛBúEÁ,jâ9æùŸgŽ_"HŽ€õë×ã,ä£
£Š‹‹]ûîرCVèáÊÏ|NðÌe‚+^¦ó|ŸˊN,Ô×׏ßÒÒòÇk׮õáfûöí®ý+++ñP[¶l©Ã[,äsN't®ŸCã3±	®Y³fÄøýû÷¿#mßinnþܾ}[ÅãqW<¨ ÖÚY´(¤|‘q…Î÷cNãÓB@]]6^Iù©YÚ^,F£+¤:ó
+W®t%@Ž©èƒKO¦N:‹‡ÝáÌùÓF*U«ð•UANœ8ÑĊL5wô¥òìïh;sæÌh!GUäܹs`å&W×꼐–LpŊ#ÆË)ÌfîàÏY–,YòY]™;w®+	


"ç{û¹	¦èæáÀ°|ùòãÛÛÛßaèšƪkÿý‚ æʕ+]è·gϞQC¢œ?Vݻw£RÄ"H4h”goõ7¶ßkãuá‘(á®þ’l†¿•耵***r%¡©©Iqü@'ë/xrîv—´=¯gèÊÑÅK2;++ë’²þ·($ÒBW3NÄüÁ €‡¥££ÆÏ0׵;€$²,½@ÎçžÀ89Ã?jH<|ø°Öýó¤þj›n‚I‚"qýúõ]Œٕ¦ñfèâ˜<ÖäçÊyýzÙäԨ!‘…!ñA*•±y$3œFxjƒ&º»»g¤¦Å.Ƈˆ(ãy	SÜW%Ü݄'Ož1:#P@F¨´:tè
ÌG›€83³I²cðCkît{ï=RŒó$÷o֛gMMڸq#ÜÝüuǰxWÇΝ;8¦ (Di$ëðsq‡ñ„yês½åy‰ߔŸAeãÿ££GþmΜ9õÒo	?mU‚¼ rÔàŽ\|¬ßEHR÷Œy­­­m‰ú-PBäîD"Ø_+ø:úðµ·ä¥}0kï4(JD<üjLoÌZ½zuüöç¯r݄&wK¯°èñ=&E‹¥› d ìñwxæŸA6½ ’éò|@¾&x™†?ÇöF,soI'¶ˆQä)VsªŒ*OŸEŽLÇg-PÌßи”ñE·HPÀϱ0<Ð8#ÉD†Î\\Ǫê‹{˜›¨‰ˆÓðtðkl,M^LݶIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`MsIDATx^혽®ª@FWl|ނH茡°°¡Š–XÒÙp{mÌÔv>ƒà;Ý¿KwL”ώÉ|«¡ ì5fàËããããó÷ÏÃú,¼€ð5;$°¹Q“ð+™‘Òâ:$°¸ãDKʌ&슟h(Y!Å’†S'~nì¹Jì)ˆ‰„®NÇ1{‘¢s¶8ÎT$*÷C@$Tœql™O<z•?²&ÏkŽR˜´¹Ê/‰^	ˆ¥r&K¨ækô¯ÄZ7"œªý-ŽŠè]Qáh§¹
©žü¤§@¢7"e|4þ‚¨€(ԃÑ	4íÄbMM#“áhˆú
ˆGÆÈÔ8ʁ%ŽzèJ·cs[Ü—«{Às—Å}sÓuÄި߃®ïã蝎Õp…cgþ˜Ïæ3¡ñ·Àükh¾0^¯	ÍWÅÆû㝑éÞÐxwløÀÿ¢1ð^€Ï?ûÞ9vÆ~2IEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`M¬IDATx^ÅÖkŒ]U‡ñßÞ{n½*†ÖRK¸¶É(ŠB‚Z41‚EDÃ-š)Xl´ÔÄÐhhE¹©$Rä¢I¥ÃU ´8,:#ˆM[¦Îíœ9ÊÎJV89ΜÂó~›ù°žõß��¼·•zyïHÆSo‘†zc­TTîžD*•ÉԅJ¥IyŸ'¾’$É×ät7ù«G­q¡÷çI’¼K3ä'ÊÌö¤Û-t‚c}ÑÕÚ|L®™ÐçL^I¢oðÍ_Öj›/ZRJ¦»ÃԼY¨4ɒ¼-µ
ÄN×;ØW,v²÷©Ïkžžìnóì¯Ña®KÎã`ghÔàp,բY½LP¨E „íPwÛâN7ø“nK4ht<-‘³áS´J‡[üÄ*mtj.‘HjÇ?b~s²܍–ØoŠ•–j2é"̂ƒüÚés’nu•“¤G¹ә²Ê
¤UܿÞ
^â~ä|×yÆþ\f–)ʘÇ9~žç|Ç9.ñ ¿iLüØdY­	dšœxˆ•Àá–ÑèT™J4q•'8‹išeÒZHe¦k˜+™ÍR•
#Â0C&­5>¥ÿŠp„ŒٕطÌlÕIkA=m
"Ma–LEÊGc+l—„ªa%ºúuŠp$¦©ÈTèפy%a'T)PBIID˜R‘ýD ›^ýêòª—ɂJùñFtð¬GAմ `+¯™æ{÷²
~fN˜‡¤zv#’jZðª“Ýç‚ú¹Ok˜ë›Ö;[]XLÒ*Žѫ§Ýp¹€j聙É~`›n;ýÒä?w´Lú΂@Qç€v‘}ÌD5	tƒÅ.·/&Yìœ+ü>T“@Q1ŒaUì[ž‰œG©«2A{…1¬:&Í"{ X@T(ê4²¡ffõ"OÀfáû±Úvùw»A‘9Õ¡Oˆ°ž©vˆS0dS
	ôàZ)zVXr•’PPŠï€
"8@eö٦٦ƒ.½y®H+|ÿ¥a]†—2ØT>†sªxݘêH‘V%žɏ/)‘Vøøœ­Å>oŠ:™  K1&ßpJ¼-`’k_Þ)QžRÒ»TƒÜæ«\ï]¾eª:)Júü«ÀH‹{}X„&m–JG€u[¯¨ˆ߾GxÔ‡¦W¸ٹg¸ÆF'
:ڌF£ÃD »l^ÑÅ&»Cb™©֘u©N߷ȯ¼d¡t¶Õîq´L¢“õÆÆIî5_d-ü]1(A
!þ3¶ÀJ
€™nñ¬OóYkÝìp/Ðfl|Î)¦”<'€44 SçD¾-GkµڜÔ|��ÆÈµôj+O@˜þ©œÄiÚÝæÐÔG˜n<¬÷OT#Hœ©¼ª©›ýÞ\4þ+ÄûÇ$ROs£ʐùªv§÷1b]8>¶¥¼îòÆծ´wSÔNvÚl	R”PR´ÓE¥í˝§`âáxØpܐ‚EÃڜ£çf_²ûÝX§· Ø#

Øâë6=hž×M,ƒZyÅKqŁ!ýöxÝùÖmtœ.ÉZ}<V~R ä
;]êÎnŸÔjâ¸'4 L€( ~ý†úìr•ëw”N´ÆÄ0â~vy2”'Š!…=¹Äo,:ËM&‚G¼Î:‚å”â(æ}ta±÷|?4~~‰ǗD…8}öxÊbÛ.·Ìø°†ùŽ’@xŽoSèÓe‘׮u™ñp—^Ò–*D‰¢áð"öØb±­+ýVí\«
+„U@hİPB·e†–ԼšZ=ÇÏ+(Ž> ¾‰\!ž·j‡‹ÔÆÕp«áÞY >ˠàÿ\ícçq÷ÓéaCq«7Cފ]¾kp‘vccÈp­¡8Õ
ˆÈ:­Øíþc,,×ÎCž4h(¨V |9õû£Û^ñ/«–_ø)[­0(4€1	ÄG®q×Ǻ݀Ñ)h·Ѕ¼éboÄû5ð¶½p¥ë·
Í$ɨU¯٭ôX¤݀ÁøÆ,‡1,¦UÎrŸç½8jmö˜•ÎÐaO.î_‹@P“Ý6»Â-ÎÞk-°ÀR·ۡO¿Ãñ#¤0	QaWÕ՗ß?ÎÍQa (ôêõæ(Õk—ÝùýÃñ㈿á{Áîü€JþÂŽǏO@ü^0h ¯þJþ7X¾ý*ó?ÄP°R)ªŽÔIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`M@IDATx^íÙáTWÇñϹ3˲%ÄPjڠ­ZM)ñE«DŨ¤Mc‚ÚVcKB¢B"ÆB@Û465Òؔhզ‘j©¡"”Ä,‘•‚e»ؚ¡A
ڄ¢‰$twggî_ô$—L®Ûvˆ/ä{þ€ç{~Ï3çœÜ	Ñÿ–Ìÿ»À%KU‚7%€ˆ 
€€ˆ”„àüE¡51Fã#´ۂT>S5Ϸm3h—
–š¢GU÷[î?òcûºëTeBH ¤|EÕýî*T}Þ7Ýá ,S@ôCkäò Ʈ¤ò·[5ÇZ1Ӱ#~ê'sâ+,›k¥w™b²3þfm8¶Ân»ÐQA4ŽPµøo£ß|0Õ
n0պ™îf/)¸Ú”ÉDQS±|6ÈÞ43¸V·À{Ép=¼Ódð¨ýN:唃÷!i6:H	x•c­ÖLÒÂ[ ÏMv[Òû¾¹ÓçN»bÚä÷ø‚gÜ*)t>™ÌëäÚ$sï¤êF‹U@n§ÏVF¾£¹<±ý™N˜áÊOúœ
 â&72Ë;ôêѣª"“	ã%¤¥}¦ñ6Зû´…úüÅ{54EQlh)š%ßéSÂz׀Zâwîô9ˆYkÇUT]ë>Ûüڃ®W´Or®ù¸jÜÈGms™ŠYë̛å	Üm‘…–ù­{Tµ0Û|嘤»Ê$Ÿð¬[˜o‰™P¤C×ûÜ6'{Ô+NÙäªÌR7káJ´Ã­ôˆ;ÌÖ
SÌT=7«ªB•¢¼ë¯ôÝëzÁíú˜ýJXd‘a0Ï<˕ñVWÃU
¹fÈTL÷D¥o³o)*^n“ªr¸L»×T„¬è¾e޾ÆgÀu–›8Ó¼‡dÅ¥þûŠV¸Ï4á‹vø•‚à%€*¤¦2³4¾&­@!@îøÆÊTü™§•±Ln1ìOsNS2@Àfq•3Zá
ïÖ-ž“s@žcYñ ô’M¯”NA·€!¹¦fjA*Ÿkxȑ-s1ÙIÝ>¹¼H€(×P÷ºÕÎ}Í‹WᠳRdһMؚã֎XìÌÅÛ?¿—§Àù-3jÄvOðU‡íð¬†4ÎP7fԨuN<iP÷9g¯yY£5¤jFµŽïê>F٣QŒ`!Ó ŽU3èø€“ºM?<“öß2JFmÍmÔ]ê¶sڋI H UAݘ~#ë5u“½Î0¨&	Ð*@ÊùÍ	Ow¿»‹òåÅïa£øîõ3ì9ñ€fjÃQ/٭[üÁIžw.(ˆElà~ÝbìTא‹å-éXn3ä𠽺AÓVFìIñ/êƬïVûœdÈYI€rPØíðƒ&ÎÏa‡zûéfð=VŠ&ƨ§8[Ö2ÆÍàyCû=iblsš]†%Æ€”šu«6~ýêmÄóŸ(Gmü»U.œã8n¿$ËÊ3PSóˆ¿n°مò}M~a,ímÄâbª9ku<·ԀÎáeñO¿,oU(W1ePqÔ]êυòÿ6¦.c»Hs “ÙçN_6KÐ)u{lUSOû׶@Œá92²RL¦}R†F$Ú­£˜^Œ´J›Zˆbh?D䈢†šªLèH ]îÅþu$Ò4Td~7ŒI!ה‹bçD4“Bgå!&‰˜Êw.€(
.Œ¢R.ýw|Ià?ñÛyÈlNªIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`M/IDATx^í×}¨–gÇñÏußÏ9í8§ÕY´E؆•Ô2FÖ‡ 7Xåp•4
Lƒة
涃­|	k‹¶^d:ÉQQsj­li#–8¦é*Šƒ
ÜÆÈô¨Íóò¼ÜW0.¸á¹9p{Eõ½ÿ8ÿë{ý~×Û¢/™ÿuÔ €ˆˆz"¢¡Q2AQúb
‰Ðk!r
óÝéQû=á»>ª_.Yz NAɽËcæ­´ßr£:âÌ/ 7àá|î—ý٘ӆ½—Ak5dB3*æÿ6W-s·…Ì5èqWð1/×0ó	dšJÐo³ÍÑÌxAf”UhÉf>T‚*äò™O€0å éd˜é
 ügÞábÄÿòëøÿH'D "ãÅÈ5ô™-ˆFE…Ò+áâ¼Óç]k³Ï]žÑ!ˆñâlÑwµyfiÆf\ï:owRGˆuo›¾õցÛm˜ç6i+D¢ĺA@ĩo¸RÉ
6ðVïp‹%æih:f§uþ©PÔJ 
–	.·HÇgeSP(™K|ÜÀ|¯ÃÙþã'ô>-DQ¬
¨¾þ\ã’cÂf÷«뻆Í>
xÉGì[â:Oië¤2J
d•=Ýg•–.̿à³æ_bȰµô[`¶÷Ã[,s·5ë“ËdB%}ŸÏÙ0Û}V
ØhµÍo´Ër“j2 (Éàk.÷ÚiÈ?t@„Œrþ[;×o­%²†+lóÓç²ØáA‹Yê	säBw駇›å¸V	ë|’«¬×Š~õ¸ÜNKÝì€å¼ÙJ}2j}²L	y‹tq¯·ºTÉ"²Å*Ý,ð
а>¨!„ª@î$Ïé¦ß6¯VåJݠ$x“6êæU^	2™ê.s›¨›×zÐô)ž‚crUø‰gvZ§Êr7š¯÷E«<		Õ
¢¨Ðt›3wڣÊ×]âü¹É7¼À8ˆÝm-Ϻ«SÜdD7op«ވ2êo
Q2Êùkkš´×ý'|ØÝ\¯79Á!E)PM`҄	[ìø‹µ]X~ûuJ2(´^VóU‡öZãÂòsÖÑQ¨&2hš0á¬Û=ÿM[]8F=ɈçËá«	D…–IãƼ`±!G\(~¡Ã~mmE5 *¤Œ;jݘ
†Gaö”	”E¤Æí°ﰟêÆý’ž–ª	¤í˜RøßÖ;ìvŽ=šÒ`jRaÒG‡ýQïl‡_k§§™Š
?恨GZvqÆﵧH ZCڒM?ó÷­á¤ÞØg”aIUՕ ­éœG^r_Ô?‚Ýݰ*PUh™ôCg¿FMŸ¦휶_;)Ԑ΄–S¶¶>ö²N±۸V*@½bRhÚêìý^4]]eõJh:åûcáK¦ǨÇxÎÓZI¡¶@,ׁ8¾5œæü'x\3
º婨tÎúè3EÓù³‰Âö4ÿ(Ö¨¾“v;'¿q˜½Ži¥[°¶@õ~\ïøºðQ}Z5µªýC£¦@®á¤[⦡yCΓß9(-@ÎW©„Læ¯>eµ«u‰F¬5©YYµb© xÖé7>j¤—ž¹šÚ
‘úÕGŠô·O.ԩ/ݩ-qºi.I )—êP¤s¤•æoÚ©†BG&j&ŠôïI€Hú7!}uˆé›bpøu=cP¶®„,IEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`M¯IDATx^íÙkŒ”WÇñïÜﳷ™aöÊˊ°[V¶ ´KƒTӆvA[nj(	ZkS_5!ƘTIÖl”¨$
	¶oššµ-
ÛµA75¥7ʂ\Êì2?ÉÉÉ83q	'ÏDßx~¯çùæ9×çyÐÿ8Èæÿ|”R¡tÏď¹byûOû“
A˜9ʮBa"D"DÃÐm~‚„4yé+„	Àç
°×黸ëÏNü¹ðúø®Ó÷DZˆ)¦|„¸¤És#\"Üyñ!¢=\xSUmbäø‚†0% Dœ´$iòÔF‚ @x¤¯p@’.j·6k…úµRßÕIIÅk#÷µ„)Rd,yòýÍXÂü„ˆ]’Æõ¤b¢,aí–4ùÁc9C˜ JyIz¶Šp‡€0ɟöêU	訤SO‘$Œ*@ŒZ%	G‚í€iòc/JCB1­Ós҃–ð5I—_¦ž¨éØ)´€;Át!u´­VñŠ~ 1Éf™,–ôñ12$ÝÐaÎÛiòÌ>H¦¼µoòcÙ{°TÒø;L#EÿԀéàNð"A–Î6JÿxcÇ«/¾'ýÍÈm’Æ^¢™´	à3øžfºön`Ñ××^;#×!”Ш¤7¾íp'Ø{ÐH³»Ÿ”þ¨;
_”tíݖ9]àN°3!E–Žc;¤J
¡z½*iòÊsщ„'‚Ÿf2_="=jøYýURáüÎ/3‡;
nŸ]Κ'ÎJͰGÒÕ÷¶¬aÓɘßûÁàBPi5ÐMÉooKúþFæ3“i¤1ÿßà@°3Ìzú®É
ݬe¶¹ý1‚ø®»£4ЮŠ¶óKöö‡LyN„ÒUê;cÒ+ڦï骤׿I+vø
`qšö?$*PZ/ü¼]€p¸AâdÞÞ.í³à^I׏“'åPM؂%T~·N:lk%]>èá8|Ðt÷œÉKҰ´^§$<ëàB(kÚ<U¼!Û.éžKŽ$!G€;A`ÏEtý葏ö_9wøðg, ƒ&â„ð9Ü	²;"M´ÓÍ|ú襇äíè
p'ØÝ E†V:™ÅL:ÈSoþ¿p¸üø	%IYrdi"MÜò^	b$H’$N”-ïðF°§6ö™Ðàa,Øøñ™®ï„êæàààa›ªˆÀ;¡ö€Ïëö;_°ǯË>ÜáÜc„kxZÒ@a›¤ó“u²Š{XÎÝ&,e1ý, ›²¤ˆ¨	àIIÒóe€¤.Hڳ‡ûXÊBúX`3ŸyÌa&­djø†ŠR±¨	µ”vJ:sŽåô2›L·頝VòdÌúª`«)ÿ«_~ðOiG K7oå™MôÐNŽ&Ki Žq"5„_5å_Úźá_Kg.#ì—ôþQ撧ޱ²D‰²åñؤ¢¤W‡YɚàúËÒãe€û%nÎê³çÝ@Eü&>O€
š”thˆ%pk–ŽTLÆ’Žý‚6Òñ‰ê+ázSþ­aòÉ[égÅO$-)#l—4~Ùdˆâ¯)àSþè.ú覓étó)Vü»´¯b2^’´wÍ$	Ö
Ð!I’Þù¹)ßF–,­ô°|ø'EÝPsaHÒÙ:i Œ¿†é/»¹˔o"E’F:éO|á\¡z2U,#N €Ú$it7lù$"$Éó	V¼vH:]1+iôک#„Ï>d“>ÜÍ\ºly3HÒÈ,–<¸u\•“qƒ¤ÂõL7Dð{ø‰&;ö3³¤¶”Êûð$E+½¬<qZú“øu¿~£›’¤—7“%FÀ+ L‚údŽidi ‰ÙLJݓ¡›e;‡'$­ҷ4jJß,~8úãít“« H„iÒv-·å>BÔÓÁ]Í_<Smã7\´•ø4]d¼|&j×òÊoFâä˜˲߿V4;áðÞèYÍ2æÑF½÷1à+=P	T53#¤éômÜôæ+ŸfkYý,fö”'@å׾êH’£‹…|†ûøŸe1ó颕F¶ünûä?™ô˜³O3i!Cš˜}üªn5ø#M†<­4“£‘ÔÔÅk(}Y$Išdå™ç¿ 4HKÀà_̃J°%‹zÙIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`M…IDATxÚ홱JA„÷-l–IH  ÆÃÆwÑJiõ"B@½&öèƒ(ˆÅIÔb0N±ÜÑRÜ6þ;,÷ÿóOñ-lš¬ãZKzÃC´]±ÐV?•¿”¤[¯M‚¸EÓ94õ]x¯:€Ðn³ÅcŽùNù¸ÐV=–×Ò,ä*Úcæϙ©ön€ !¡­ªz€ œûÅð¤¨úòóx—pĭP=ªôºòB
§ø¯J‘k‚òÎ4seUà!zøSH	ªïAÉ8Z:-|`BP½‹PsÈ	ªàJ?NPr``````````ÿ
;KÕÖb€>ðD‡Q`|ܠú$Ϭû@M5(¯QkÎýP=÷~”7£Wްã‡Gþۑ—W°b4 ´KN܇Ë;Îû¸—	w™þñt›ÊOªX¡Ì?^gª#^Âo¼`†Kt]±ÐU?“ÿ½9Àš¦š8ѫ¬IEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`MUIDATx^½Ù_OiðV†°X” ¬„?Ò&¥½©-AaC‚÷
ßGoֽÞMŒÊzµ›¸üù<«1¡ÔbVw³êPµØÚÙ3=ÉäP§OÂ;¡s2!¡'y~í̼s&ó֧ðò»–~ìÞ/õTð·¯׀>	€×ø¥ñ+<£¯w÷0ôå¡/ۗ‡‚GŽ?ˆáÊ#߯Kù~å†1¨€KüŃÇAüºT@8xŒ‹Jp¸ÇCŠâx<%¸xüOÇxKxbÇx­µ®„øÏ	ñ<žñ”àpˆ§‰w"¸l¼l?û‹å…ï›Ï ƒÀ<>ºfC,ßm;Ü0àñÍZ¥X)îuP:(5;ÍãàÿÚô6k>ÿ,€û{ø\ƲԒÔ2V°zô¡pô«X	{–?—}ÿ>9,€Æßõs
¸‰䑓}·¾¾ï|}[XÔé¼rz:’¡6 úJ¢3HaNö򑀼éÈU_‚°øÁ,~8ì³ÈÖÞujï5€€Å+਄”D_B—q©H@J>¹,—„:*)€,ÀÆn„ñ0‡q‰ÿ^öq$#IÓ1g„ oúýè/`;€@ãÐjÔß6ޜüTãMýmë¤Ð:éèh(€@ãà¸*ÀÖ]%üè±7+}*².„€]:<pBø”ƒa®¥„ʆá)¡ª˜¯g„!I;=Üi>>EžÚÇ“ÿü®„Þ|ÿÿ$¤Êy.ÿ©„ó?	÷7‘z0$rÅm%œïe¸·ƒ’’¨‡@OBŒbJT…ÝC0€æqõ?[QÑéŽæ±˜øÝ–´Q=	ÃËc˜FBˆXŠ+¯ÛãƏX–}·#’ۦcµòÚlü‚¤ÌHZx†®`Æ,àÓ~{Ü( /û
,EÎK¸¡ÁÈòi_‘ñWìBÿ[¶%èD$ÑY7í6Øˆx¼™A’ö¸qã²_ë:\ÓéÌê@Âã
€bގ×H¼Bœ„Æ[%ÜsÉîküvt¼P‚>˜T_Ö^ԟ7þª?¯½¨¾l5:­Æé}0aßÞ¡¸çѬ¸Eâ
€ò{›àYNjö6‘'ñÀó¸^Ú
΅µ³ó$ÞaiBàñiL“x`„1!Ì#_ܦ;ûê±Ïc^ðc®ç]Æ.<ˆOàñ“Àã''¬Ÿ!þGwðÚx||8aÆÇp‰w8h||'ôN¹»…‰	à÷ˆ\ùYùr§×ü½¶Ã¦DZ*‰)„k~_\b˜”šÀh¬—p~u‹F¤äÕmüâ/¯1(åaÀ=þ¡Öъ7qØIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`M¦IDATx^íٻoUÆáßîìeÆãY|Yvm᯽+ãKDbPšHHD‚††(¨nґŽ*eþ7(E¢@J4q$
‰IlCjß3Gc>Ér2sr¤¡Ùy¥mßGs9óÍYÔÿœ> èú€“N#8
QŠQƒ£¢€5  «ËTq£x™âR¥L)FX¤~£sô@ìeÜõ¹ÇƀAª”ì|µåýM¥î(_‘!âS¦h4€æõK»[BÈ¥F{e<êŒ1uíòζRMê¸8öOC•€aÚÌ\½òô/!¤ڄx¶9CŒò
½Õ!¤&,)„¿…@uF™bî³÷„@4h2ýñÛÿü©ÔOª‘#@nƑϗŸþ!õù*7æwïK}ޗ;9»wOês¿	oužU_°P8ŽN¯?øýôúwÕÊa€6¿ÿ&ãú]%¥) 7Žlt(ãÄ…yýNL\¥ŽÞ폦õ?ßúð£'…`бøðÑúž²Öÿò
¹øÉ²:šªFMø~þ˜^ÿŽ®ÿõkγÄ"ç>}?&¬+ßààRc$¬Ç×r3!88Iý½çÕÿöKt™æ,^[]I†€ã1ÀO· J%Sý&i2N‹3ô‚Á<ààÒÒâÿß-ܜÍP?M‹a2&ó‚) ­J_ž¿1¿w?SýKx¸PGÏW¯ìh-c€ö·v7²Õ'÷##3×.ïm+Å8
Ül€	Ą;`^/_251ÁÔõKû[ŒP3d¾ †£¹¶L¨yE€Lë
Â(å`^/„*~—J4XÖ#ßÒT¨ÈËÍ`Sr7!yÁc5‰NZ½ ’€=àÇxiz²ºB—I†	RëŎ5@–¦í/ޢIEÈ «ãæÚ2C¸8ráàѷKÈȒ#@·djÊ ™šò˜ìæ{@[™z‚–õÀàR§©”9án79V€"UjzߣÇ9.ðæ3óF”¼Î"]ÎÐ$ħ‚=€2>!/3Å=æRÒc–³L2–[@úӄQš´™xnÚQZŒ3BH€›º$¥d„ð©Q'̔5ñ¨àØ4RŒ0،×ÛñRo°ÿCú€>à_#:„¤¡E€{IEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`MçIDATx^í×OKbQ‡ñ§n×?WM¼é YŠŽX)%ô6š†þ¬Zͬ„i‚æ5ML+׽Þ@Ä³i´¬œë„ýˆ{8Œýnjõ|…¿CoÄ{3ý>´‰`“ƒ©Ÿ‘§B` âS¸ûû¸L)ÄLàà»ÿÜ{ê=ÝÃÅv:ÁûsäûŸ§߇xD‚]€Î'îŽûùÁú„»#Á*@çoOT^ù„Ûc` ç‚]€œ	–r^&XÈy™` äß'ØÈy™p¢	ƃ¼@0ä%‚@ÊLBޔ`0ËËÿ!rޜ Î
âêWøðjòG}YÇ'K8@D=c€ž:Y"aQRä(Q§É:›l±M›vÙ{À»ìж͛¬ӤN‰)¢8&€,Eª,²Ä
Í`-Öؠ-Úl°F‹¦Ú
K,R¥HÖàâ1M–<Eæ)QV¡FƒU°JƒÊj%æ)’'Ë4®ÿ£x¤H“ÁŒ*4@ƒ
røzҤðˆ†ÿ#T\¢Ĉë%ñ)P5
ø$‰£GŒ¨>ÛCÝŠ æ G„$9* BŽ$œWÓO7¡CŸ²(ãǑŽÒÑƀ1`ƀ1`ô_Ç#>HBŸd¶Îò‡OŠþ(µó0ù{ˆ‡kx–ߜö	=v¡ò7§ú,7{˜\}yVƒüËóõӇÉ$Ì0G½ÛQƒ|·C9fHè§Y¸Ç)iòTY¾:“	rþêŒeªäIëÇiøç9>Eh]ž1yN‹Šø&Ïs™`œ7¸‚QÞäKÐùŸ߇óf™*æ™"o
Eóæ€9o ÞÉ[È9o ļ}À0¡ÙÿŽxyþ��·&Ìò‘F·ÓíÐà#³BÞ:@Ȑ§D5X‰<!o
§	i²|–%'çÕDÀ?ã@ÜeÈլIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`M¯IDATx^íÙMoUÅáŸ=ö¼db'ÅÉ;Â-qjË4IEP6HH ñ"6l€+D°ƒ+–|‚nUbÔê¦^ƒT$+¢M[Ú5͛“áf®¬¿°p|ÇS
çìsžѵæ'Dÿs&€	`˜=9•¼Š• y•œ
‰€Q€¸¼@Ï(®ŠC1fäÒt½*ÿßÙn
!
 €ÃtRÀÑN·ƒK1= OŸà€Aü¨«‡w¯nàcc¥8”©*€qýÁýÏ^ ԀôG`á2K¨†õ{}ò2
˜ţHz50¬ÿè5V©3G	G - ®õ»®\¦ÍST™‘çÏ`RŸ0²þƒ7èР*§™‚èGøûÏw_b…
SRŸ@»|¼ɼ|ø2aÿ÷ÏÏSÂÎ ©Ąƒ߾<‡—É䆮53øúэè•!„ÞhB®Ÿ1råìAyóði=Z¤¾·7!.·(n7o÷'KB€ÝT˜Gß~ç§kI	ýys«u|;Šp±±¤~÷Á{o±ÅÖÏߤÞëvŽvâ*i 1@êß“¬³ÁÅ_¾6%ôë¿?tG¯&¦q̺^_9ÏÐä,+´Øøõ+#‚…¥ë{êé»0OËtH}›3,±HÈ2M֌6S××zwOêõÄd‘J@<7ô…Ë3T˜c‰•Ó?Äõv,Qún½_,à™–tý‡¯ë¹Á,S¸x”x„p îˆ/.êz?¢¨™\*,žLMµõVen`éÁþo«Cûۇ÷¤>) Ìüá=µtÔeíèWŠ9¡_/ê&€|\¨²ÀÜÀØÊ¤>1 Ÿu R¡$õˆ õ‰ºÀÆÅWñp¤>)qúòÀƖËL	隐—oü1+!=™Â:•ÐdCÝBH’„á„s,Ӻr¹÷(Šnd
€<<*„Ÿ¾¸w_¿t³È1¸Ì\Ý<”—nF™Sßnôv¤>#€¬ëkRŸ!@֎Ôg¬¿)õê³X8ݎžšIB-%@žÿVKêÍCÈ,.騸„œ¡Å:Ïr‰çTžšK\ Mƒ*eòi–°À2g9G›Έ´Y¥Sø
Ã"G€K‰€yY¢¦R?55Bªúk	ré6Ӕ©e–2¾ž7i2Y\ó?èÇå½®RÒÿCc ûLÀ?YrtÉÄ>ĊIEND®B`‚‰PNG


IHDR@@ªiqÞcsClÁ0`M
IDATx^í[}LTÙßÁ)3ÀÈÇ2"ˆbT]Ñ-®µKYݏV³‹ÛݦJMëvuÝøUi¬¦MMì¶ÑhHmq7Q0.d5²Y?𢬶Dc4l¢È"à–ongrîd¼yÌ#½™¼IړüÂË}çžÇù½wι_óœâjÃÿ	b±1BLÀzã¿،0“ºR>|œž؁o)ÀÁ÷ì¬2®ÿWQP™ž000'
ú3ª%f޳ӵµµ3Ÿ>}úûÁÁÁó###mp¤tt´ghh¨	mŸѽ˗/ϖdø!”€É6چ?~ü\‡ú°k êÿà¸xñâ¬þþþ“ô¿s&]êÃDØL	ð>—F»»»W¡-5"ASTçå[»wïÞr¼å'220 ¾*ýX4ä­Ÿ/*_„>'ªg${ÚZËJ=:$èó”ú’
¶%_œ9Ü!ˆôe¶µµu
Ú"ŒHÐcçÃAúNòm•âlò4=¿ ¶ŠrÁ2B6ȖB‚)`"àV?¯æææuF$hìø’ßÒҲÎó"‡‡ōß¨ŽŠs³RÅç¹oŽ~¾ì-ºVï{úP_²A¶$	2ü0³j/XöìÙã—@Wd腕——§Ñ', ¾ÎWÿÞðžø¦¹Y¨Bmt¯B!A†Ceeå²-s‚¤$
\’÷ ټB@ZO–©oVÜýðˆ½¯ÚÚھ@ÒûZ¶=8W-N…{õɆԭ ۀC†‚ÏÓ|$	2ïD?~<lS2«Jˆå7oLÂððpÿþýûGVqqñúúúR{çùϼ}ªâcdb>zôè<_s’ôH0ûQíí퐖’b¯ÃÿzïWânÑߞ%áH‘—„C‡mGß×òòòV€„nj§pº÷Š	²MÏðý
̘®H×ÎI*Ÿê?äòOßñ:Ðóå—Ô4&	õ>|x3ú/<qâÄ鶴÷î]¯Þåw"HÈ6=ƒŸe× @“ãÏßÄaT×! ŸNLxj<‹)	EEE8ÎW1z�s3SHÇc‹„lÓ3—-ôI`8ù	È؞€­´yµÙY‚¤§§§b~<_Âýû÷멡vÉbN%ÀÕ`ž!“¡>ú$Hœ@4(	øÄù,„]ٷoßÎñÐÛÛÛ懀D~–S}Tb€©˜Ô<êÔéτ%7|ދ8°Ì	5È6=ˆÑ @‡s=zT;V¤Gٞ²¾	=Íͣj$ۚè“`·nÝú³Z©¤‘`Àӹjժw ÷
HØê‡Ã2H¶uB  $¨Ip÷îÝo VGԁ7’„.kw"<xpÛ$<;ê��m$Ô2¤"‹* 4½•ÑðöAÍ9!…J]GGG=ªC‹a‰d
²I¶uÊ`@HPBDú֭[³ãßȍ‚ÿýd}IÈÙ$Û:¡€ …¹NϨ®®þ­œ7~°‰bpu¨[šMð\«÷7½ï“-²I¶u†#ÀÛÝ@†õ½?É‘Öò“ã^‘3@êK6ÈÛt«“!
´HÈWHñ“d`nYYٯ=¼$FՁʚ\#Ð5µÑ=ґŸ}oiié²v&›L‡uÐ'agò£9Rȁüüü\¬êԌB„‰P!]êÃΧ°­h“MôI°û®1LB20xiíڵo_¹råpgggF†]pvˆ@×ÔF÷6lØð.érŸd¶£.‰YD€9	IB4‡C'±9À<`ð2Aàë|oë&qßh“EQ
OBÇm,‡Ät®å3ù
§1fs[*ë$pŸH“eqü×ÁíQìT;˜Le$r[é°n„º1(¢M@àIðÝã°p‘1Œhns±Ž²5ÆÎ[C€~‰ÔÙXô	°’›þö¸>֓ !V`=	Ö`=	ÁO€þʒÆ!¬'!ø	X²d‰Ð>Ÿ LhlAEöæÛm6›¸yó¦Ð>©òK
… #   @dffêlڴI<|øp8**jÚr€7€EÀ+>È~Èœù>“›IÀDeNo=۶mR°a¨ãr¹h]^CÐöcvô% U0HãIN2÷ÝAG-[¯SŒBhRL™2ÅP{ùr…¶›ßü÷€ïß!²$ÓØñxv>R™ÚZKÀƍ½Î;vì(Ne}Mº{÷î5ÔOMM¥½;víڵm/°“r÷¼bxv7QNt‚"	®_¿Þëü©S§þжŸ~L
X¡¡¡†$œ9sF ¬]CÛ, ÞgúfƒÉNˆ¥eKSÒyqá…B´e¹v»}å“'O†¨[X†dggˍʑ”””t&`¢¬ï~ Lx,"`õêմâ*Hêêêò’T&gô\´}AúW¯^³$޾}[\¿~ýC^Ј”ãu‘àʕ+½Î744rŸØ¼¾téÒ÷ñvIFF†!	›7o$ØÇÄIÐ-7+ƒ–€å˗{¿víÅ|:×ço“_ȹsçNogYqþX”””äór–°I‚…ÊIccãé<¾“‰œÕ!þ9‚60EBB‚!	ØÙœ0o2‰1r„|0nܸñ/=Kçc9¹HŸ™ñ†¬ƒf%$F1„ÎäRLøĆ`ijj"ç_Tœw†‹3úlàuW¯ã³yc–ijgÏJÛe<ˆâRg³š§ܞl5}Ä5;Õ×y¥t99lR€Œe˖mD’þJ"*Š,‰}n·{÷w!V žؘÔÕÕUä34b།açpHä!nÊ]»€Ô××{		ñŒNŸ>íJ©ªªZǹ$ŒìZM@(̢‘±ãx‹i‡…Ëw2b:n“…ûÊ䙓“#¶oßN¡$Xˆ:Êބó>›¹O\P ìÈD”±¸Ñ/Fl¿ÑüµÌCxŸA¡BcàҥKÿ\°`ÁFè-~Àá嶚õW¡êƃÉo†&0Iqœ3ÖÔÔ\¤l/g(‘%8àDµ?x“t€4Î-ÑPl»1f?ESO|ÅpÞH_³fÍZl[ŸÇßš0?r/ްšÀ`'f|¿´©'¾x¸ü*/€,^cÇçòýDÎþJxYF€Œº¼ Wyø:™+Š[ÝÂf²Í$˜	à’È{ûìd¼²…ý<0QÃñ &7’¨[Ú.“U "@jŒ·®­$à?
“!<…R/IEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`MIDATx^͘]h\E†Ÿ™³®Ò4ÊV1±^ÑÛ*‚ЪP(±6±*j+¶õ"*("*5â•B(
‰š´MŒJJj„–ñÂ"B£ բV±Á"Es‘ìž=û¿ã0v؅p‡3Îs±WËûð~ó±ÃJ…_$xå$ ÐXÄp	bi–YêEb\’@"Ó,>D
‰LFA6Å\FpåÄ|úÓ($Ü@@
®>x¡×*$' 	H\¿ÿ|"
­—P’€ sÔ*$y	€×Z‰Ä
$« ¡E
SÐJ²
ü*Hð« o‚¿
ü*Hð« o‚¿
ü*Hð« á?+ôY…$¬»ç¼%øUàWA‚_	~$øUàWA‚_	~$øUàWA‚s…^«à@ÀÁ{uÀÔ%ÙFჃ>ì9ÉY–8úÿ…ù-Hg#xžC¬…Å0ðÏq¸[Ü%ÖǬkE·¸MÜ*n"sÍ4ÂÑžå-àì™dŽU‰È’ӄä‰(R¢J
ål
û¥ê=,‡˜	àñÍDäȲh!KHD‰25êv±¡>š;•b7öS熍.3„¦ÛB¡тjSàIFêäЦéO>…¤!æ7Ž!/߳…
%Š,fe*¦…jCà	FœÚp˜Â³ÙsM»0tn[)©Q¥BÙB¥ßÎcÁ7ûîœ$Òf§ {Nð©åGî:NÕ,ªnhgÛ8@Àé‘;&ˆÈk¢þ™êBÝ-˸bGü4wû*ÞÊ$ߍ®#oˆ(ü”ýýHó2Ž“eY÷Ìj# \	(€	øþ@×ÛD†E4ÃSªÖCÆ.#ï붓"@8}§øq|õp#¼¤)SšûûË4OcÏ>Wõ¼r­é	€¢pn|ÕÞÆFW¨*”¿8;š–ñ⊧±´' 45øs|å›Dq|™ªY)£ðð×ᯙ¦e<d¶ߔvрÒè ùý7ØøxŸëÓY)Ø›oä3‚^ƏÖ#4¨QYñ2E
qù:^郊*»¦«ÝÜËsüÌq6AåâÌÇ=]_¹ÙêxŠñìu<@£ƒò¹¹£pŒAn¦pqöžû3/ný¥ÁÍtÍoÛÑz”FÞW5Ôü驗®{àö±£Å÷¤n$Œ@ÇLùÐ: Jƒ̾þê掝}Çs‹ä‰âa)
(ê1ª5^c†@aÍäg	ɚøxU©·'Ъ P€ˆß@¡&o/«ýŽÅå³Üޑ"òDM¿üX#P3-”æªÚð$b\Ó(C[ç_¤[ ™w/–HIEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`M[IDATxíױN"Q‡ñ³»ÉV[²Yz¶#XšآbLԇÁ)	>%‰–X°Á0Ä÷°(Ð|ÍßÌÍ$@¬ï…âðu·9¿03÷Θvœ`p€à ­,/îm¶¥XÞàüJà/ʼŸ Cå°0¢ÐDÏaÞ?!ލԏBôùÀ!+tæ
11º¨júbL?Q†—h²@÷²POˆ[£†¦ÅE8֛ˆ\_¿ì²¦BÆ
UIm½j."”éIg²¢#,üg‰Z²„µ„XRÉy„.“¿y,¨°@7²„µ…XÿCô°uÌD„æßïa¨®Ÿ‚zú§ ¶±Tõ!ʓˆûÀÝmîÝÔ;á+tæ5„˜¤?®Ѹ¸ˆl'§á¼8
÷â}ÀðO3ÿ<w€à8Àø5¬¢Ø Ô&°IEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`M¶IDATx^íÙkp\uÇñ'÷ͽͥMLڦ÷@[Zjah‹€ãTñ‚0ÅQGp†‹8¨3T±
Î`gÐñE•¡‚µÙ={kÒdJQK	¥”n’†Ü6ÙK6»¹oö|=ýÏéxv§MO¢‚/Øß$³çÕó9ÿ˳ç"|Èù|ø b¥œã“e$[%çlÔQ–‘ù|ìÌÒ9’'ùR Ž{¼V׶êϵâ0R y’«(Yÿ€Y:WòëÛâOûSý`f2ùÎÄÑ;4ˆC1ì!ìÌ3ϓ‚_/ùqªT˜ LQ0Ã̔³{‡J¾
„}€*nœùgˢê1€nžf
d™Ê".å.ö1	ÀôëooU#‘£àÿ)À<wGۥÉcÛÈFΙ
î'ŒýâÚrÉ7WÄ<Öò…]7ë£pŠë¤„Ý$ɖ=uR`NÅ|fù¢¾ÛHÂó” ¶r5=Àôñ½ËÅa%ؤ•ïØÉìBì‡:ځ©<Tkæ°¾û2=#sL5§€±}R*j9ΐ+ŽË+§ކ½HF
¹‰çéBÆ9Â#lÊ$°ŠÐû=)–|sìÔùçKéÀ.8Eq ‡Û€Ìð*gnRÃϬ–"ɓì¹Ôì?А!cåWâ 9šèŠ
¶ŽÐg`Š;2ûÈsRfNƒm@–äH”õÿ´Œ™}HMÇN[[†šU†šƒ‡B¯OܟXŽ>þø)6ÇÀ6 WŠJ«¦߇miƒï’cá#¡æðp?ì{U|Æ÷ƒC-ñºΗÒ¯=»¤Ü{5ÿeþÐE–p:ûð‘ÈhoØu‡Ü
FÈñD|¨y´BTZ7“ǤRŠ$×&@M@¡,ì
ž²”/&Œ¼9ó&´¸+êr)CÆ÷˜6â��qxÌ(`ôGÖI©Ú6yR,ՉVØa|HÆϔÕƜ‰¦HSŸ	ès…㸖pGý±cП6n߷ÉqHŽ=€ڀR“Â2àE`¬#êKåǚ¢MýÎNMèÔúѦ„3nŒBğš„Ë-€§€îݖI°(òO.‡‰´39
¿1썻M±f­ݣ´{:´ AŠ;‡ÝßÄÜk|úƒT«`ЅßßCˆ%)t¢þ¨;êLjöŽvè<iì¯Éb)µ	PK°âgW@·
èzØrÍÔ½‰÷tžµ¾DR#ejÚܼbˆ%㤈
i³zÝAOütŠG2oè/R«ú¡m@¥£AŸÖ)²þNŠᣃî>­C{ËsØçly¹Mx¹ÍÙrØwÌp÷¸û½ã¡·Zïÿf®€
Y:~Š´߸'I1ÚsÐí:î>âsµìkUöµºZŽøÞötiÆø§f¦YdìÞܥ¶§Àa–÷ÝÀt’Épó«Ïթµ»[ý®fÀÕÜêowwj½ZÐ=˜GX~÷e©1[‘Í]°@êŽ<¯ –¸I1Ö5ÚN¿3 ½éiõ+­þ7=­×èŒі©dŠ/X@r¤j­,’û۰@ʤöŽ­úÌ$À&0'ƞ6Üÿîw°)⌻§â)ö§¡ú^•åR%ŪÙlÅ%†xeäPæÏë×ÐÑõ©“	§ê„ÚqO»÷¸§SësEœ£þä°N‹-€BBÀ¿!K¤B
%Ç. WФR–½ômf\ÿ€ =vöj]ZÀm,=-ä{wf¬Iß$NÈZ˰CªV4ƎÁn$-Ÿ#ŒN’‰ёÞPGðdøôHx2•Dg?iØzbwÉ
sØd›“°bϭz*ÉU„
%È4“Œ3Æ8“LqÏg@sp~Ù 
Reù%°yET(¥^Oüz¨G2’ËV¾Ë<ϸ•%ç¼=сèÑ!çå‹͋²,û¥ùR"ղ|ÁÆÈðÕȜs—"$^ڰÐr—dë²<W­ƒÉêk®Nà$+lr¸Æ$|Š›¸`ìÅM,÷Š6ÙêºÈèˆÒxãö‘w Æ-¶õ¸йÇÚJ&ÁޝQŽ9
Kå¢ÍW÷zö³aV@!÷©b s­
Â,“P ¥a™4ÊfÏÓqÐy/â8 ‘Ÿ0@w[ð(ìDf%Ød«•P¦Fa­l¼áúš™˜ÀËnîf'7ñMb/ {÷¹ʶ.܉ÌJ˜N(•*©“•²N6_á_FOè:df:ÞyàWw˕r…\yl/Ĺ꜄„…0ÀJ(bY(5²LÖÈzÙ,—úúßß߶çä+§µ_—«ýÏÏûVé'd‹l’
²^.)»ìý$äH¶ÍgDj9I™TI­X%e6-r™ÊµQÖÉZY!
s…4–Ü!ëÂë8”K¥,–:Udµ¬1J6«e¥,—%o‘TY|fÍ„¿Ÿ0úBU©ä+‚
ÀÙqÈ3ER*Fµ©‘Z•U¸BʤÄ@«±Zb¶œžeúï=۞mҟ•ŠÃ`23¥ªp¡ÁËSqH©"4žðU`ú””«Û5»a2T¡|#ê¿ùœ؈š.³,=!›ðÀ*Qc``…˜3æ±ùQÄÂÀÃëԕ²
€íØ%l’ƒ…õêÁÅÜó'ÜBÙl§xïi©›`þ„¿Œ Ҷôbu¿8Àü	jSÊ&ïccÝCGŸ]t‰4HõÜáü	õ²úLÿÌö¯“ͲNVJ­چ¹sنó'”H…Q°Á@4ÊE¥Á8Z(EçnDöcŸ¯Úx•ÔH‘©6ŽŠfiÅÿåd©6îPMºÜH™Á9ûNE>€X߶©X^m}0³‰gôNÉ|Èù\"·ÏÚçc‚IEND®B`‚‰PNG


IHDR@@`¹UcsClÁ0`MŠIDATx^í˜{pTÕÀç޻Ù]!<"
µ"iÇ vÂCªíŠSe:V
íT°
Å)´#µvZ§¶±P_VßÀ(
°J ¢ƒ”È#˜˜çnvï=_»×3sf§!܌Íø¿oÎÎ=»™|¿ùÎs®¾X¾`¾øRÀ#DØ^>(Óì ¶u±`S+T.nIŒ+,MnÒÁ]#’€2ᔻëGöŸåuN!DÚýý]©
ÛVO:B€Q¡Ë(éhlÑ]œ彯¹¹èûÎBҴ’¢Aæõ#^K€t.`ŠîLJ<1§÷|UyŽשæ##ڃaŒäR&²o}0ïœwŒÈçP(\Ü7Ï:ÿ/޹°–{X¦#úpó~ãýS—¬M ¹ø&½Wsåà?«Â}ÌáU:§ˆEÌţ}ÓÊko>Ne(¤Ã}&Õ~oÈãªð¯|ã¤顅ÛË!âßøê£ñ̊‰„Óqúý߸ïn®£…hlä"v;{Ú3w”…®
Øâ¯ýú©Ëp±˜®PËXöQðͅÍZçúî=ƬTE±„|’\ÍԠÚx‹ÅTO“h¤Çw݄g"GüðܲŸV,.7°„2ò—XÀ,0'џ>pÁOjÉ »2	Ãò/(í+ÌÉK_Êk,§¿µå@ýŽ£ێ¾Y·­aOêˆWðO~ˆžbNïëo³S1jñvʂµLÀҏCg›kÒÇ­ƒvœXѐD˜ϽXÎa¤–VÜQKÆÔ zzô½îÁâòÃðÛvdÆü\ij¹È=9éæš÷#K¹
Ën^F%§_¥VÀT॑±AX‡e6•èlã»*åŸ	¸AØÂ'/hÿ¸õ€b¥XVý¦˜‰H4³ù­„ç²h٧RŸ¥ô¦¤ùÍ}™‡e5)â×áâD¯€ƒƒ×óBX‡e
}ñ›ý:7Léh/puÌ47×rߴÖÀ
6íluùEÑÌ釛8va¹h¯S:""M†&×Ï}ëAƒn?…ó±ìJ‡íB¢p.IzÒÄr>B¦^Á­Ì~aPˆ µB2
‰²Q¼…ä ›>¢Ày½ ÁRŽà·!¥8!Ÿ¬	ڄAXê§¢	¨\HB
‹ƒƒ_èX2€S€2!ςí-PŒEӆV*ÐY%"Â'XzAчÔ-’íëAöPSHú_odðÉ*­°î¸Zy…ð>–¯©º®ž†’ÖéC±üˆ—ŠrpÅ!÷iÃôEá8nIÀkXÎê Q+ €4}<c$;0ð$·/‹ ݕ˜…'ŽòH–»îFŽaT¿‹ M@>¸uÀäKyo³žK¼¢ÓÚöHy(î߉Ä`ÅﰜÉéøMsw£‘0"V@£W¼qÞݓÜ>Ôc`.ÛHTMكŽP‚A”£µ£ÜøÏ[ÃX®Žm8ž1+ Ñ:ò˭}FßdWª™ɣ$‡Å¿ÆՎ`(IÄF¸=kù–$³€MÏâ£ÑHÔI(hüuÀ<а<Îmˆ*š¸À)QÿÅ!J9ž7$1Êëý!ã8ŠåGô¥eﴭø¡BÄ!ŒÀԍŸîpî"nÇòöò¥%ÎEÒ*
’&«ª§ÓV1z,å,ÖüÞ\È4D_>Y2U÷Îzt®ó"›°¼ÂPneý
U!a3¿æE,ಂbŽl¸z£)?]!È	ÜüÎûxTQŽêYÈ@.æîã,a:ƒcÒ[F1ˆ»ïðüS]Ì&õVìàQ@’¢޽ö?Üç¼jÆQGW™Í&c˳£fT§0ó ʝPÐá ´Úvռ–ýÃÙÄiDÅå[ü‘±\Ãš(š²õ¡ŠDçw‚|Ðá ¤Io¨›>«齡lçZ¢PÎjÖñcÖó43™&zLݼ¼"iN" ‚ ɒ!MÛóWΪ]WL¯0œÎHrï2ÅýŒÇÀæˆ
D”²(@m¯+ÿéë׌™=¹ç$^a«I“œÉṳ?ppK<9 ¢?ä)¬¢×Ô͌ž±#h@:°ËÑ(2®jâºßÞøµ+/_Nš-¼ÍG4¥œÉh3GßÿÛʙÿ¨YÅЩÂIDh|̲Ä_shÍÒËVÜ5ùì	½‡UªJòÉ6ڼæåÙÛTS-üŠj6u °‘1¡ 1tþ†ÄÁ
e<Œ
ð*Knqک¥eñ"×ó³-õÇþ½õ½¥{›3øN¯øîŃ&639OFçhy&Tðt´wD*§JÄÂÃÃ%<ødÑ.Ņտˆ  ‘“½¨eR„»#^..*Aç"Ѐ‹ß(ÃﬖA“V1¹ÁØ™q\òç‚lj0&qM8v9Yóï\¤‘á‹vªÁO 0m×ցː<“Ö\Áa³¿	\ Q¸k')Ìà)úÎa%A”
äK€6¥Ç4ÄFT…j¤c…gh¤øŒý–&@¢TÀJ€tø¶<ÿS0t¨`Vw,Ž‹ˆ,ÐAŽÐ8ø)Œ£ÿØ}¨ˆ¬0“§*y¨©J	yxЭ
ÁàoW±‡" ~Ëø‡îÈW¤Q†ÜùÆÎ¯ïõUH×í}ú²eÇÚÌ˅|n«‚ ÇVñ섒B÷ù㴓¦ŒYV ÛÄ\pb¯µ¡ðɆ
ÙV@ý¿Ì5ÂÒgÈ⣻³VAa®ú¸˜ç0Ìu½»@Ðf̺7}éÎU€Mg¿!%|±üiÞå2ÞàIEND®B`‚‰PNG


IHDR22´6@:šIDATx^í—Q‹‚@çÊÒH$£0D_¹(
‰ƒþÿêÄ?ï@\„ãÜy“…ÝutyÀ—L¨… |”ÌJæ5³’ê?Ò[R	¸x¬J<\8•h€D¥àÝ•H4$.¾H|\[’֘J@M50¬Y0³%q	EàڒÌñذɞ
s[’†H$†•]ÉQ$Ç$“DU±ÄgK,’˜->ËjŽ6­["jð1ìHE’²Ãà׳¤im”BmZ—DÕG¢Më–H£ú¡Më’H£ú Më–H£ú¡Më’H£z¡Mû]2xãU¢Ë5X¢˥OB΍EÓ/^’•_<)ÜÈIЍ×#́„9Ÿ5g®Ü)DRpçʹ™—s"á€a}1„ì‰8ÖĤd\Dr!#%næEì	1è˨YaMÀӰeGL&’Œ˜[Lƀµde„@ސú?ÿeœ$‘6ʦD›fý7UšÖn”
‰4­ըþiZ»Q6$­¦I£†Kì_L›Wì˜$½ø¿¤Œ1'XbúIEND®B`‚‰PNG


IHDR22´6@:çIDATx^í×ÍNQÆñ¿2JÚf S§Öb´°|„Tl ,Ýo‚—À
°4¬X»æØhÂçZݱ	&š@pìÉ“)/‡15qazžM“'é/§yçÑ?HùÃô‘>³®&ɍ€DD¾$Eê¬@Ê@ª“Fº8¤÷ýŸ‡¤qt»ûy¸ïÿîzA‘ÆÝ»9Ž"<pº‡¼(º9ÞÃ%-L2¢	oçñõIÔYäC
$¤AÎt×';ñ„ID4±]¾2„Aòâv!.ƒ䥽:Ý.+Ǝhⓠ£<ÂÃ	5ÝgÅ$ š)1¢J¦£Oб!AÊÈv!Y
”M‡•ш…„§øäpIKpÉáóT£!ÈúÂF}kümù]Iò¶¼5¾Q__ÄÂh¤›ø(„ 	ÁÊÄ+!9O÷1qD=E3qÄìÃÝ-i¢wf·„köG¼ÍàÇû(:‹žýò,:ë ?Þox8ÝHš,ù×—Šéøvøz‚<YÒh„°Õüz|›IXЏ8n5	ÑÃԚ­ó“8“Œtç'Í5†õÏ%SµH™©ÙW_NãŒY¬±B›åXڬ°fº8ñåtöS<¡(S;ŽÈ^2áS¡>ӎ1‚,³È³ÌH˜eŽE–M'fÚԩà3DÆì}3Êø¦B#ÆҤA*	Uj4h
#T䱠oÆûAT	ð)Hð	¨Ò0ÐR1Ï忤F@Y	9
ÔLg#,£^3æJëõŽ$>êÍuaA4Ól]„ð·Vhº‹£/5aG43¹4o¦€ýñ{y°4Ϥ&ìˆfBª«Óß?Øß?¬NS%ԄÑL‘1‚7Uۑ¨ÓŒQԄÑÌ Ì0b;ܙŽa5¡	šÁÅãa'™;©Óáá
Z
±¸`@¸­]2¢IÌçä.±c=4’ÿ᝱ô‘_m¥J¯ÇCIEND®B`‚‰PNG


IHDR22´6@:èIDATx^­–[hU‡¿3{Ñ
E¬XRSµ55Å ©Š¥Zú …¶V0‚`…ú`Ÿ¤Bƒ(^ÐW/4ÄËK¢ҒX£>¡ÕŸ*"˜ZŠ•ں;÷ãáðgÃÀìݏ}úÏì7¿=g{<¦â¥\ñ -”É=C£;S¼â÷çEÃÐ2´KhÌ…òV
ίE‰
D¡cê@û%f[H$øußü8€קÆ3´ ‚^ž¦ÚxÇâÂ:šÕ;oҖP¥Ц™'±Ë×ox롾4öŽ6TЦ±2‰ÜҼíñcÓ×Wj”<tŒ¢˜øÉhvїF$¹5‡2‰ķ’­FӺµZ#"ʲ¯ðŠÏõw-MEÁ+X5šœªZqÐ8$qÐ8&)×(åž'{w*P!qӸÿiUo
 ˑ+Dâ¨Ñdô ‚Ú'HԐQ£jLÝS`LšÉP.©¥ÉM˜ˆ€.þ)СK@DŒÑxPKs‹hX‰O—ˆK.ºøĤ’ÄIš”ÈjʓøD$d’ÄA³ŽšŒ„ˆ „P¾¬^!‰“&%!.!1X…HÜ5È.+%3h¸kúmhÜ5e- KèKò$ºÀy6‚i§æ
ÐøOI’Á,ÊÆr€ZX+I\$8ÊÍÄLgÕýj‹ºזÆ]j“ºݔÊ`ëîíËV¡$˜Dñœ> cÃ}ۮ$'ƒo‰IÉ\«^Zë8Ë1¼ö›ۥ§LmH;Å$dèÚQd‡ßXþåvÈà=`ø±թ-ĮÔFHDJm©!Åg¯íZüî</ƒãüÆëç6Kó†ö“ЫŸDG_yâ8~¯’Kw2
@Æû&ÝdôHóâHE¢û•hÀ*æ&§‹¿tñÌ<ì‘ñ4«·¼ÐdºgÉæµ$:ûòåñ9ºj†lk¸À,xOÔ?PˆDŠÎ(¾}éA£IðöÒò÷«x,ï×éÒSû8‚o	ÑÉØ#Ÿøgi¬ùhÜJ¨+ÑV’ž޻ùs+¿C´óëè¯!¶1À~£ØܰËæPJՓ`sÄ#³’ !5$$è×Oaš?x•õ¿Ÿ~ý…g]wÚn̈ÙýBBô֌NiöΝøpïՏŒLO]D;HdEd÷Ëޗ_Ä'çþ<üóIñÁŸ9‘øDÈÜiá
©%³
Y'b›&‡ßùx‰Žô•£Ö5“ˆ&ÿø•+E˜z:Ҿ6‰"§ï$+AԲRRŠ]QH%þ_§z-Y"BdKT(œ$²ü$ý֡*á_
¾ǔ˜t
IEND®B`‚‰PNG


IHDR22?ˆ±àIDATx^ݙ[LTW†…¹ãáR@¡c©5і҇ZMjÒ'Mišx+é[_L4Á¬%mcb¬ØÛ4áAMƤIû`ƒ¡ÓJQ¬ET*¡ˆƒ Ãeõ_ÉÚÉqÇáÀñ8¦]É2Ì9›ýÍÚkïu†Dô̘GÄ	ñёk¢DLEtQÃäÀ	\ $*äµKÞw()}¬؋ˆ€àP“omm-}ðàAÝäääoÓÓÓýàŸx}nttt/¿or¨1ž—ˆž÷Ž;Ò>|XÁ;nϞ=é|Ÿ–˜Š%œ áäɓÈ„˜ž™¦SWšéýSïÑÒ#Ŕþ¹Ÿòkþ=¿O|=ß'Ùq*™ç!â`‰
6¤G"‘„è
ߠ5«yòQá÷ù:¾ïG¬E”„x‡‡‡¿V%G–<&`£_§dø~G-³XŠÄK¡zNœ8ñòÌÌÌ$/—µo‰€¹àëÕ2›äqx<ʉˆqI䁁ƒ„hîlbS¾ƒÇáñ@B,EœÀÒÆÆƸ6hÓïZáû80Îï<ðÄJD-+/LMM
bé—EÚÄM±ÐÑâÀ9æñ€7v"²¬@ê#"“²$’u0@*x<K‘Dà98þ±##Èì0üQl]$ˆ–ã;jã´óxvˆÄͥs5:vwwµc×Â8_Í+#3ë\]À
¢| äîܹs-êdêiξ÷îݫÍjd®í·K–ÌGà¸ÀO`¨çÀ_ ü*AY9Nˆážyì|=Çõë׏C Èt×2„™ÄǀƒAÊÌÌdÓÇp»݌z=>ÌÎή¸wï^§È̩×R÷ï߿\PPð
òÔ9bUDÒ>ПœœL׮]#,@>ŸîܹÃˀwjnnV2œ¡6H÷uttDôîwÙÑRÞbywâ×\ª-¡‘‘‘®7ò’*‹ÕÉnEDec¡¬ù΄1xÒ,â÷û	¡/þ$ËTRReddСC‡¸£¥ق{³®®®ïËÊÊ^‡@	‚4³^k¶gj—o*ȧ¤¤,bü=gE	:N:{ö,ݺu‹®^½J§OŸ¦üü|ª««½téROЏ~úѣGwmmm
•••ë!°\$rA†ÖýšŠ軓lŸ0d&b”a‘@ ÀK„éöíۼR||¼^[ð)x¬e`	Š„oNÏ#za¿
ºõbž¯H^^óFCCCÔßßÏ
…OT[[K^¯WɼB dIq{çü„¨KH"üÉm۶šššhÿþý¼=Qäüùó´yófң¡¡ª««¹Žhbb‚ð®j‡xs ¾¾>ª©©Q™ùHaûGfÌDœ"‘Â<é3gΐ1êëë5$3ªf¸È9;,’,‡yP"µR‹išDœ€ÐE¢ïN[íڵ‹ôàÉTTT•`ÞÍXÅL,E(rκÙ2õš˜ëtzëý }ûöÑB˒5!%¥À6ËS`ÈêRóq:Ö`<55•z{{Ÿ8;[®ÚÅ.K}dHm8ŸF$e»¥òòríð²|© êãC’$sBXI‘b{´·}ÏTdë֭Jd‹zސ¹8¢ÌݴFÜRdé4៚ ¶··Ûo ›L–!զË\⭈¨í7I=IVjm߾ý™ˆ´´´¨lü
U›®
ݪˆž•B)ü»Üðñ~owTUU)‘jo8?œVEôCÑr¤iûÐáÇm)..f‰	°ä¨úPËʪˆ~0.’íp
ˆäæær›a›ÄŋU6ZA±á tÛ!§ï`’•;vÌ6tJdo”óâHô¬¼փ™ÂÂBn+ñԧ;žIԲzäèۮe=+Z­”ÊÎB°s·ú,‹Ëʽ‰ô²²Œy<ºyó¦]‡`•ù²².-+%àÀðŒÕ�§‡ŸßY¢,ӗ•]"ÑZûÙç_RKÌê´CP[VöˆèYI–u\–ƒzéV»,p|B (j’ZVv‹èYñÈÌE²$V€Uà5Pn†\·R>ˆRÉð"c6x.vˆèè­ËB‘Y,“(–	…ϐÔYÈÉt¢I6lÑÿC둃2]Nâl)֠r]¶ܗfpx{EÌe\ Q²ã)¿dÊ¿\š KÄBd¶-$΃¹ϥÅc—ˆ¥öXEaAä?ÊÿSä_nÓä/`¬IEND®B`‚‰PNG


IHDR22´6@:ßIDATx^핱
ƒ@Eÿ™€‚	àJzZz¸@,Šk\Ó1°ÓÅ!¥¸Iœ\¤øýëš'ˇÙ1ÈC>î@ü‰IJ´EҬ\•Pç’ˆÄm{åùT‘W:Ô"™f®ˆO½.DÑáâ°d!þ:ô¢ÑêƋB÷ɮñ:ã&¸¤Ä!€4®@B‡*!‘t ´oí(I³ºmš:sHÎL³ۚ5gžv¤st“ÎW$x™„úáLjƬƒ׿ÂùFýµ¢¿ s®zýG+ÿókü†a7§kÝã‘0ˆIEND®B`‚‰PNG


IHDR22´6@:¨IDATx^íØmˆ\W€ñ߹sw£1ټTš´¢…ֶAH
Š´Fˆ‚Ö´DQԨ¥Xƒ´”X•¶V),é
bã‡*HTT|‰¥*¥Ii%ÑÖVcJÚYJ´[ll^šnc­ÝÎ۽G¸\¸p`‡™~ŸÃý¸<óÌÿ¿g˜	ÑŸÌü_’ÑpB@õˆ ƨAÇ+	!d2¹ܔ‹] ג…,„‘JFzí™Ì3®ÔBۍîWˆ!ŠÔϸ’A†P+^g¿©
.òl<´¾ü•͎*•bý@MÒ(Z2ï·ÍåzÙ鳦nw#„½®™t‹SÞåϸ׌ŠÅzò!Š–nã<=óµÙY®lµM÷*V:ß܅ÏÙâmŽˆã¬p¦åµnYã!'œöUÎõδ¼W;©mÞXãz¹– Œ*	2¹+L^ë­hùº•R˜®TKMÃF2ãHZºLz£.L$	¹LF“´ÌqÀz)¹%€Àó&+Q«ê	#”Tç”ùFr©”ež†óýÐ~߳©é.‰"hϛ\&e
Àßá2›mô	÷ٖ®@f1¢R›ºÅ%R–7\iV×]Î	f\ %¥¤TzŒ?ÖY¡^ÕHp§KMú ϳĦJ2¼eu޲øT–5+¬ ”"‰J…ÓNөJl”ÂãòôÎdˆ
íÖüÕÅCK¢ã>Xðsž[l…ƒ %·Ö¼Ç*-³ÍTRÉJÀI]oüA?C*iþÇ_iÚßìs·'M[-x¼ù›·۫áZӀ§ñfÀýð°RÈ…	{lYk«ŽŸ,ßîcv9ÔH–û”†o5±Ökû)=¨l45ïµåMھé;žr³e«ÜjÞ…a\åà„#<á9E­iJ„J2áÝì´,w›í¾a��h+ù£B!"-‘›âÕÎó]ù¤ur£ñ[ø]¥Xäíʴ٣.ñ1…œu¸*‰i	À>§w¹>€ÕFã!ÿä÷:éDÈ@¬Î>ã™;|ØKÆy³u	©Di`à˜O›½Ë;œ2>w3p¨zZ"Š
='\çà#®0k<Ž™刳J%‹•tu,8k‡Ÿ?e“‡Ã/a¿z·R	D…¾Ž—-xÑNw<_¾Ó=FçG”î10H/r©Zš%Økþ¥¯]ïó¾7k–=kv@N¢‰õùµ÷f>ž?êõ†߆_èW‹JM-Ávýë†mîgÎ>NºO?]ßT"F1DÍáÇ6¸|Ɨ
ç‹ìÖÑO/”TR‹B	ÕùŠŸ޴ê"[†Žü7<égzê±KÈH5J…¾nµkÇÝTô?âNQ
”v»ŽŽ›-è©KZÒÔè‚ÌA7·o_z«åR8ãEzvxTW?íH%©¦ª©$Á¶Ú~fÙ%RXpÔ��«Wu.I5ƒz.Ѿd"ùözº::ºuÇð’x” Tè¥ÄúžèUŠjŒQ‚ˆ¢¹×ä²T¢¾½õ+E!Š£IRM²º#•D…2ùÀKBDYK‚@"©kÄú_QP’( 62Cøßù½ë?‘.Ø?içIEND®B`‚‰PNG


IHDR22´6@::IDATx^íØM¨eðß;sîѲ$uå*D!"	ڴpQB¹h¡‹6EYdT‹ÚDTØD„‹4%+‰°MÖ
?ˆL­0Ê@3ͬ0K”oçcæ^.ÌÂ{ffÓ&î3Ë9‡Ïûÿ/^&Dÿ}2Sf™F¦‘idé¨"¸$aÔQMb…ԽAdBŀX=ñ(Ô!T„\îA÷Y pÐ:KÜbžÂ/6Wˆ¡D$ִ
Q•"*“^ÌÍ7ð; ‹>Ñí>Q¦'*«V[
>Ȍyd¶œtÊ\é7==;^ö‘ï±ÇJcrYÈBh»]ÑÑ5k¶…àn促e°ØÒY¯Xàf›<ªkšáßdòDÌpþ< G\†ŽC.8ï<æ
«]#—֤	Iû$7ÓrOyÀL#2ÏõàZW»ßÓºWGž˜šíš·›l°Hmf(Ý`½Þ˜ñ×û£šTÄ
ã٢•Þ÷’®*_Z`£;T¹Ç«<O×r¹¬¾I&7ÇÆîظe`®gÜh+€‡Ta.˜
… ˆuM–¹êñDÀîӔU–€¯àû晤­âr¹4eBá¨L ~&™oôÖ9àVírÆaŽš€æþÃëgÝiÚe’J¥˜ž¤TÚâó/¬Ö>°öJH]“˜ˆ¡¾çüùšCڧ°“*$¦ê9mma­ö9à4{ýX‡P*ôõ|ìÌ{Îi›àS…aóqE¥„¸èÃ	[µÍú>KDÃq«.¶¬Ñ×&ßú‘¯3T(©kR1}}¿ÚuÒmò.ìLDšI3†©ÍÛâ«zšm§o·4‘fDudŽÚuÌMÙçû­z4"q²KšËZ¯øY}6ÃxêÑ
©º¤ó“õÝëVù¸휲ËäaiwïŠ1D…žŽ­ï¿mކ¼c¢šH+¤Ú1¹g³ԘQ)ì·Mß@ѾIÕe¨'Þô–Ž).;&›ГC$T¢¡±$­ˆž4‘ uDˆJƒ©.: J]T(Ñ©æ’C™l$R*P$²=R1	)„)	ˆ$Ž ¢D	¿2Šàÿó½ëj
‚sqûIEND®B`‚‰PNG


IHDR22´6@:®IDATx^íØ]ˆTeàç;çŒK™‹V^H)Dôƒ E ý\ÔEX›X`åE!Q‘AaáÕ–†?•áE$JþaŠ.†B©i¨%Ê*J‚æìÌì™ÌA†Ã,l7Ñ;{·ï÷~ç찡ðï'Ñ{þGd@ @Ï#ÝqB$(®}Š(*6©&R5/Úç¬S¾qŸT"„`\ɪ	©׼“š¡åܣxÈڊ‰>HÔ,í÷›ӆ­§ÏËjãï’T™šÉýnÏÀ-jR‰mrù2 ENa"‘Tè‚SÉD7I"p˜8$€¡'‰$Az¿a2ãKÉÔ(BùôO82Ó&Sµö™mrEh£ 
Ë*ÖH"›ÜèÞIhζÀ¾×î|
íP(ġèíI¤2™TڽÙg54l!x×V¿8l—ÅjÒr­h“‘¸ÛKf8îäf€0—ɂ+³ÜoŠÕr¹¶H£¬‹H]o•g<h±åñ¿×!sÈ8b¯˜ëœ/ÓÖF?® He-º=lsÞZ7ôyßÍâqS‡`¶„™žóºƒÅ^;IW»<=ǐGL÷¼ïL
2ñèÐv§}>ÕßgÐ,©„8B"3Ÿe¦æ[xÀjO`À<K,g’Ç:H´I(›¸ÀaÀ=6xÁ¸ôC&ë !Þ$Hìqá#»ð¡éªÃóÀOp¤j(üíͼ½ÐӼ­:|ê¶!wT"C
Úr{¬ö¤zËE¿rT−ÐÒ4èÇ–zË.m†´ÇÈ82ª¥¡î-'×Ym|Ù	{Kbˆ²‰†½ª¾Ì1½'·+ÊK†x“B[KӈºãG¬Ð{†œg¯‘RÄ(ƺ¨Ûäâ×.é5ßÂr£ÕÇU¶)wi¸jkݽfM»;Dü¸ˆÌ߰Qk¥¦^ò³ß9ä’Q¹6T#cÌ;N[¯—|Û;D=®“kiiú\±BCu(l¦i§V¹Hy,ÚqÂJÕaŸ?Øï¯xâ]ŒjjX¥þž?Ug
lëô¨Dâó7òñU‹ª«|Òf†íè ‚ˆï¢!³ÁÜýOSëԻ‰ ñ]š2©7œð€šxÈí·QSK^Ѥb—† øÄZYô[յÆuñ#:HPU«@Ê+҈/¢ANùÚû¢_Ïhكj$¾K‰ŒJ$q¤\¯䊊&•LùKB”€¢„ʟŒ¡()AU
ˆðßù×?<Ш³w+†#IEND®B`‚‰PNG


IHDR22´6@:’IDATx^Ö{lUÆñï̶…ò¢@y¹Z”DP „’j¹Db¹)	QD…T‚*‰Ѣ&(`‘Tl!€XR( µ ñ‚"‰wAŒÐjMKÛݝ'¿œd,óÇîìy’þ³Óùô9¿í™Ñ,M%©åøƒà÷’Zš/ û>OÍҼøa<àzo4t¡’,(×ë„ܤIBèȤº‡!÷:ñ]_ôdMÓ }e×úüžh~®¥èú´òž¥¹ËßD'M6²¶¦i‰i+ÀÙ{"ï•\øi­ÝÖݺ©wåü†ÈÛ½!}<D)Œž3©fOrŒK-z²s!ÿû‰÷ÙȾÄÉ켨ðóJu››„ÈHúÈѲþ	é1¾¼Ó숾‘AŒdÏRÄ8†ó¡Ae¤«.þ&pÆeæIÀh‚¤5îzVP‡·~e*Mtšôí}^ݫ/“\&}HBFºTÇsxÌJ˜Gø“2 {ª7[…¨.rIòÌû÷Ýð25œc«ØÅBd7€Œò-ëØD 1NÑ^«u`E/Ÿv,Èä'–.„’d7¶›ø'-
lã‡Ý/,ëÞ_§€| ù‚šˆ¯I0&ŽI¬xû’Y¯~P¼¦kö÷Là`,³n¬Á’¨֑±±01v]-½øֲÌÞ'™H#0š*2¨ߵ²NúzHpFšXH—Y}Ƈ™Í
`2Ÿҗ¦Sã7ÇÂÆQHʌL…xáôZ®¹TӕK5¹K/·#.W($5Æl\ªKh`™\<vç꺘‚€#HPÊÖ`¥n
€¦:3BCšXÞv¥Î O
rxÒÍÝ@º%€"<$uF-ZÙÀêî}01½
	ÄõTúæÂ*VPÌÃ@ÿ°±Ô7Ëñ ÌàŒtÉè	gøu—ۃãø›¤ÎD®A¹@ì*¾¥”p~:kÙÃ6Õ8’Ğ|âü»iöž¦'×jflÆNñ3¥.ؘwm|aæÉõ§6íx¼߲ۈcùT™GÞ쇆EŒhɹüм²E_ÁÀÄñ!©0ƒz£&QÚiuÓF˜¨ 6hPy87å:ÀŒ!K«6ÿ‹(aÚi£]5±4yH!ûùüA#}èS‡vfabqE½IÏä%r1vuµÚdm¢6NË×ò´±Ú(m¸6H¿­Sþ‚¿°ä 1%–""B£ñ´K±8aJg"„eçè¿Z=WÔQâµHŒá8ð™4p=㵩²ó­´pCM ¦& ’Ĉ"ì½ë›~ëÁÅnrfÝ'B;2dicÇò€dET¾2·öË*X¢cÔÓ)»ú^b2b³Ž/
ñ×Î>FdùÇfËhÆ`ó0j¾ì~œ˜&qïPOª‰ BTÏ<L;áÍu‡a±âË0¸e⻷¶cIl7î‚@ˆc´zzµì{˜ðŽ}ØsÈàoöƒ>í1ÿ[$‹8ظÄ'Ï!HdŦo2Y’­@ϼ.„Ð	ŽaaZ~aIčñõ>X¬îxšBY;§BPÄ$þË3÷P@T½s…Ǎkƒ˜B_^¤¹ÒC6,‚ôˆØOD"¯fÈAÑfœÿÊøƒud¹øKÉÒE¨Qo¶QԷ_ÅÄx}ŸcÞFšu峲¢n3F”íhÆ	Šx1eƒ¼CNýG”7^Ú{vû£Ӳ—/üÂc >Omð6q‰-„š1¢wÛTQG꼒kpœ€MãÝoRDå¬òž|1¤‰†—$›tŠV“"B»Du$Þ.£ºD%fB"8¢ï©ga%à_¬ã>™w€)ëIEND®B`‚‰PNG


IHDR22´6@:ÆIDATxí˜=‚@…·¢Áx)öXÒRh§7ñç&ž
+hwv’c¢ͬ	Éó+|ó(¾mvpü(„8ÑӍZ¤~zb)Qî‚&[‰Æ{¾†q¾/“¶Æ¥ۇ&c‰Òñ‘‹X’ZÎv&»XÌÏd¢"ncߢrég(qé|⿃H H ù$Ð&ß5•çì?/Ü9W‡NÛLKгóÙXR²çs瓤RÛE-¦‰ámÅ~HðÙ’ÊÄùÉþÕÆXIEND®B`‚‰PNG


IHDR22´6@:´IDATx^½ÔáJbQð{EoD+"—Ìe¥XZвlSÛêû~ÙÇé	z_ w±,ë
zòCZpwîzàÜú39,;ƒpa~pçœAü°GW̥’Ckψà“dÐ/ö‹’3Adϗß.Þ.Η‘E†„‰°½^Ư—½!1gåÉ Žïã;a&ƒ³21㫄¨H&ÌøÊ2¾×S’Ìx"LÜBa<•ÐD'tff„ÇM„ƒq#:áÇ0â&8W‰q DPÀ$Çøš¡qϊÜ£"|£’@‡ø‰ãŽ¥zˆn‚T†gÃÏÂ4ÛGK~mBÚÓ¦83Œ0a›�š„4¥ZǎêM³ˆJ¤Ž-|Gƒ†T·P·83Q	Ì:x×NS/Dßi Â/uÆ Ù^4$Ä*þÌäª!k&ƒáéÊK?Žâ¯ÿ‘.‚¼ôOW"˜"̣ðëÛó€ây𻆂tΤ”;ÑÐ2¾ƒ¯þ%Fãm”ÓH€yDXoþx¼5Œb‰ÇÛÖÖ!o?—(¢‚Z£c˜‚IžD­[b·ƒ*(bÁ~䰈¾`³޵ŒÝQ´»¨n‰f›ҩ„ÏÈ%y÷¥¸”fªé•Þ]\gbIˆwQgìŽÒv—©ë„]Ä4
3ãàU‚W=3³"*ñaf¯ýtCÏSyzO7{m&afƒÀ
¢2UBG¹iL˜q넎¨7­J„6n7âf܄q3UáB܌“p#nF%„™ݎ0f™3á‡0SkŒ†£aë5"¼fJ¨`­Ó8ÚƚœJiÂafED(KFrZ´„¡P™GA2/§œ!Aˆ“É"ļdˆ,^3	 #$:ò¡h·Í.ÝMIEND®B`‚‰PNG


IHDR22´6@:ïIDATx^í×AkA‡áw»»Ùd7MÚM"I7¡ml¡U[­ ^¼ø��‡z1zñÐ""Þü ñ؃'R­‚ `z«JA
…´cücX’ŒèAòÿÝBàaf˜³¨ÿ	 ¤ÃIÌΑ@/ˆjB`aã$Õ!Il,4!¶.¨†ê:5ÄÄÆý|¹;CKq&¿¾ô“YVÄF›!}¤@ø¼¾·+L'$ ƒ£‡‘À#G‰‰ÕÛÂtBŠŒÄÔC,Rd	§öôŽ0ñHˆOJƔµø”˜dvõjN=)ë"“¦@åä·×Jm¨Ê!F”ˆ‘-sñÏîÿþ2"ô)̝s­šˆÎ¯^Ù^û(«Zˆˆjl'…‰Ñú•äJiçE;ñQɽéÂÁUJ56/’"!+â^1†,÷ظddíO—ðd=v'bó퓇roúD¤@š„0WHãâÅoԗ7sg8ñè®0} &I²?…a>\ïW∯ëó§9Âa/7™>.£IŠQвô_̻[ÛkqÄâ)f8À~jÌJ4‡±^Ÿ1AZŒŠ#ŽŸdŠ*!cT˜¤&¦(2Ú+
Òbâ‰TÈáS Ä8ÏëªA@–doH9BPõNÄ>²x¸¤ñ	(®/‘gXª¾_„ND†$6¶Tg–òdp±µ‘踙jXȆ)<†›qq°´‘ºÔÆê}f¨Ê΁44	œ轢‰ ÷fo÷ÙMBrxØB 1¢7™ÀúHë޼ºŽ+H4F[ÐF"æýUÒRm£$ DŒtÂè#¡ê2ÒÐ)äu$#Ò]]™Í$´©úUjbÅ(ã(óÌ1Í!¹ۦb#OªүÓíá SL2N‘|„´§;b`á mD‘r{¤u‹­ÑDd-Fðc3J6*„þ?x4aŒ^>݄èù[ ä‘òü	¬%OAIEND®B`‚‰PNG


IHDR22´6@:ïIDATx^íÖÁNAð®."
ˆb-B¢(µÓ¨6ú¾/ WO>ƒñ	<“ZðÜ=«¨‰‡²ý`6Ùœ쬉‡¦ó]&3òËî3çòÏ"Àë,"^ ›ø½6Bàc\Í\ÍÀö#oG$1†Øi¾ßî·OóˆaL2úˆ$Ì㹗ŽÃöÒ>žƒ)}DöµãüfÇî,&,"‰"#}DI€‘Œ>¢&Œ¢"Œ&¢&<族ÑA”„šÑ@Ԅš	Šxÿz7Îg'=
Üx#œ½L0Ä@ìhžO!ÜÈ	2GóˆÁŠð93öY¿Ûïöz/ƒØO~Ä~rg5ƒZûì0>KP$
)°„*êøŠ¾c׏`—£-ÎÖYµÄê,Dƒ!‘’ÇGT°‚š	Äj¬¨°2?B"_âH ,
(beTÑHƒ£eÎY•euqñº”…‰	$‘"5Cꪩr´ÀÙ4«’¬6¯ÜÂdCœ”E,M¦"
‰4g-VÅYM"ø&B1&†²(	¤ÄÑg
ƭŽ0!/-2XÈ"G-oº´þ#ºo^xÃ[xÝ-l2‰̫[8CÆë4·0ã$Õ;w|͇ˆôÎORZ§0âû9ûB±/ösòXQãH핞/—Vف"åá¥õ|¹WB
㤋 °S{º’Œ$ìÔP!_—‰)äQÚÜè¶}Œ º?77PbõL½S8†	L£ˆåzë®ã1’¸ëÔ[XF‘Õîõ«õ!$rXÄêúöíµËHâöz}«¬Ê!©õ!¡fԄÎ)¬`ԄÎ٥b”„¢d\bmK®…>"™ê—-î´áŽZû†ªŸ‡Hf¥Ѽo߷M¬""™,Pi6š
TØËúˆPˆd&1Y™Yö&=""ã2ñá—XšI²"áï"3a1¦wA½
‘Œ1.@"<¢‚¼°é ï?ëÂ=´‹<”íIEND®B`‚‰PNG


IHDR22´6@:ïIDATx^í×ÏkÓpÇñw›¦I›®ݲU
ÝҲÂƶê`þØüêŋ€†(êa^,ˆô0Aoþ!¼ì8^vÆ…y/Sˆ Tcú,ãKI41+¤ÏçÖˋäI>ý÷äÿBúH‘IyI{Ñþ´$å%l¢2è˜äƒ‰N¦›q‘D#Bx€=ííEa!
ÑÄNjäÑÑ rv 4ËBl,1ÂFRĠHE!Aâ珵ë8”“#&ƒT$Vo1Á(ÃXdI'CrØ8‚„+wh2N…92{AjA¤%û^}È“ŒbËuÈFzˆÔÝMù²~j:e
Šè¢˜¯/ÏMa“—[¥&¥’¹îֺ˜o/Zu,tµÝú~
i؈Z÷¦[ïb¾?¿;Љ¬]ÙíE·í—M|Ä'$Aæ~U¹²ä¶.¸m×%Ñaâ"ê¡}´õúwŒÔdëÃ%ퟚ�MlÄ'ßãäsŸ^…ß4,òÞ_‹_6é¸/£O–Yà0GæÏ|ÞcZuì·W:Ä]Aä%5Ñâ c;ÄÊmæh2Å4³ÇOyÒÞÜÜ!„*Cäâ CTýŽj2I1̜8dd„ð‘1ì8ˆI‰ŠÛ^k1Á8£”±¦Bé0F…81©úF6–p¥‚M<%ö…3­ Z<D'O‘ÊS’Խ˜Ã!òx±ÈI
¦åWŸaF=IuV1ȒA#µû+²-Ì>}àzÓJŽ£ÎV)…£c1ŒóìÆÏ²îĈ0*mÙë×ü÷bO
V‘¦ÍRxwU½DaIG	ÑsÄ_{Nš6bpö‚dåÿ"r¨2ˆ™ѤÊ8Lp€ƒÌs”cWaC4iP¡(UŸ¡Ê8“̰Ÿݑ®nøG%=	F¿l¨P•V®u‡ªßtRIU6%†°C3Ht"ä¯?Œˆ‰™8Ÿx‡»ž§ô‘_€½ü<0Þ5IEND®B`‚‰PNG


IHDR22?ˆ±dIDATx^ݙmH•gǧçxRóøî1Ï|›sÔtî…lsîÃƂƒ  ö­·ɾíKi
[ؚŒ1ˆ@–µ1èC'¶„¨­1êÃh†Sږ³Ü5Ò4³2ͷô¨çÚõ‡떛çôðxd»àÏáÑû¹½ÏõúŸ!¢%“a‹­‹E•¬	¶Dz‚h‡w°œ¬Ö
V¬’\ÇÈï
j¹AL8Ôᛚš֌×ÎÌÌü6777@DÓøäë+cccð{
ʡöX.Ó®ݻw§NLLÔ‘Ÿ7?Öí۷/
÷éމ4ˆá„NŸ>Ïø¹9êñùèʦMt.#ƒ¾gn|â?ÇïaXûÄ;N³ @lٲ%Íï÷_Äxw7]Z»‡*üë`¸÷Œ#Ò 
ÂÅJ9¦ Îy< óò¨ëرÀDOÍMOâ?ÖÍÃà~ì£Â,’ ђ¨ñ>Ÿïå@ 0ƒp¹TZ:‹‹iêþ}2mft”~ݸ0X¯Âlû`?ì=¤X‰ƒƒƒ_[ϩS ùù€0aˆ«ؽ;wî´(¬îƒaì‡}#	┧—:99‰ܘÊÝǏpø…`úûû¯2L3.fÁ}0Þçì‡}#"a%1홝ȹôt€ÐDoo×Á`¸ìÞÃ'r 糲Æ}fûaßȁHX±²8?üQ¹Ć-a@\.R†ý°o$AbYɬg¹Ü7<¢žü`0ñH@÷{vûaߠ6š	’Í#ǟFެ···…sâ÷`0È%=GxŸVìgHT8“«žèéììüʬZ¨J0T)T«…`̪…}žÆ#¸5¹ÆHcZDq,7+•³gϞõœ'³zw£›	£÷ܿÿþõ¡r$Üñ;FBæcÖUÖCÖ ëk«†u…õ«u‰UÁ*b¯à±ÒXW—Þ٩»¾9ƒÄÆg€¯zgÇzXww÷)x>dÕÒ,Ä',r8”M™™™ ÕE.—R×ÖG^¯·üѣGí֬¥ ?~|#??ÿUÈU}Ä*ˆêÒnÖ@bb"uɁNž<	r»Ýt÷î]„*544(x¨™¡ûÚÚÚüæôûƒ׋‹ê„käÄüô;::ڱuëÖw µJuv+ Ê+%æGá	Ýph€$''Lšž¤î)Š‹‹£t.ÁGŽÁDK‹f³ŽŽŽïJJJÞd€ÕR­RCÍZj“‚@򦰼¬þ¤¤$2
 úÏáèt:éòåË(·tóæM:{ö,åqÔÖ֎]¿~}˜«Ö4¯Ÿ{òäÉC¶¶æææúŠŠŠÍðŠ@ä°ÒÚ~53«“›õësV5k(ˆǃ¡ ܢŒRtt´™[~Ög¬·XëX%¬à	p‡õ>"f&ö{¬N3™Ÿ$77—¦¦¦ÐÐhhhˆ@EEEÄoTSSC			
æ}V«€•%á”ö¢	!^ðãÉíܹ“Μ9C‡B5Z¤¥¥…¶mÛF¦Õsy­ªªB˜Ñ4JìÄÄ|¯ª««•g>eåKb'³âÍwöp¾kr
Dk‡¾xñ"éVWW' á<£rIFP 5’‹©D”‚¢W§í,ڻw/™†Ô——“ª€8™©½½PÄI¯+DB¦™á~ûgŽÞ²èàC´€é^²¤ ”¸Ìb–UÌòÈÑ Âqhëk¬©””º}ûö‚±Ӹäª*vCò#]ÂÊiDúE¶”[*++3š—ýòù|*¬¾ÖƐ89ÌH’$ۋ¬Fñ·}K
²cDz]½oà,VA#.I2Lšo³`@lmmµ@Š& ÆXEjL—³D9{Xå7N½‰WªY´k׮%illTÞø‰U Æt•èVAL¯Hâ?Äzo·UVV**VžÖ?œVA潢q C۷,:zô¨í ………€˜f•Êߓü°²b6Æ)‡ï²ü9993lƒ¸víšòF«Pk„.;@¢Ì
&^9Ϣ'NØ‚ÉA@éA‚{å9ÖfV   c…`½»ãDÂêu„•Yv-ƒ˜^1reT:|ø°ÕêyïX¥‡• æ™ yek2>>žzzzìj‚•¡ÃÊ:H0¯ W¾`aX-ǷnÝÂû; XÅfXÙl´O—:ÿ’
1T«7A=¬ì1½’(q\ _
ÔɴÚaA³¾‘‘$[Õ8Vvƒ˜^‰—?˜%sX±týu¬7Xe¡$ëJåA¬gèÞÀYì1eŽ.+f•¢PT°P’u«åAä°<âéXÍKbþ‡6^eštb¯$kv(É:¯ܗª ÄãÑÑ`ä[ñŽ[ ’á©0”,ëݪ+LˆH€,ö¯…Øp%ë]àÐ!ì±ôÏËÒ÷Yù¯êÿ	ò/-nJ"~
Ü{IEND®B`‚‰PNG


IHDR22´6@:1IDATx^½ØÍKTaðǹÎÜùþrœg•QSS̔BKˆ„ZþA!´)‚"Bˆ¡…µiµ*pQQ‹ÒÂ((7͌苐,¢…˜9s:óö t3sñ<ÜÍ,ÎofÎÞ{´	Ù<DW…ŠUmpýрc1GQö#À@e~v:…J
²aÂ	7Qîåd&CÌ؍8
üÄõ{îNܚ±qG(ŠÏûn'®Y¾V_{‘0RÄ·`ì@<ˆ"C\°`ìBêbÁ؋X0v!õ
±dlF䌑3rDÎÈS"g䈜‘#rFŽlÌÌ™29#G䌑3rD̔„È9Rc/"8o„ÈA²*ueÂ(҈‹¾nÀLfÔdJCF)O͚¹ÀÀÛGÀôc7z±ÛюF¤N5~1ÂD¡.i¤r”ûµo›wc:с64£ÉRMäóDßɣ™	&§/£[åæuÈ …8¢ð«ÑKMän-Í
kd‘•…@2H †('Œ |L8åƒ×ÄÝóØ{ÿ"э8è3O‡™Ã/<ps\Š®°&îbzVíÐÌ#?Ÿ õpa¨è‡&Ù͝"œCo÷ü-¢qÄh…(w½‡åÜ3ñðºЊ&Nëé!Ê-ST37‰hñ*"pÃ(íЊ ]  ÍȠ)ÔcëÒÑ)ô1²ö­/
_aiåˆ!$imê¤ZÑ4ªf6‰ƉDo¨B!½gæõ1aÊL›9Š:Ô"‰(|ððE­¿}åÑ~JÒYZ B-?GXaBÄ	/‚ˆ¡U1k©àšf¯}¢տ™±#m¥"•0™	p|ð0a¨׼…u8ԟg!¿öùÙøqgšPƒP)H…bœ09.¹zÍD	d?ޘ»vøzЉ-È a‰å3ë~^ÓêKŒ …,ZÐʯAuP‰Ï̺@#L5þҜâLú™pŠþLЈEô¬|"Ì	o楏[»â¬ÜàÀ.D3ÿ˜dÈ?âª;GIrIEND®B`‚‰PNG


IHDR€ jû§&øIDATx^íqh\Ùyö‚@@ ƒAT²Ê*ë­So¼Qc‚…íî÷mët§NÝ8qªT­6JÕ(Q£T tò)Ÿ©6Ûhëv[ïnš֩o•¨U£֩[5NܪÕVE ˜>òïÍÙså¹3÷¾gÁ珇¦²´¿yßóž3÷}ï{ÎÉýÌ/.7«ç¡]¨mBÐ<tjƒrJꄦ [МðódxÒ@
öu@çäYwÌ?CKò¬ ÏÜgù£Ђä·¡:tmCSçí’[ÌAëòªò¶Ä'sÐ錸mä‹ý7„Y7ù•iþ%þ7„WÝŸÌÉï2ŠÿqÚ(üGì/Aãñ)ڶ(¶î
»*ìWdnŒfƒ§Åþo
³"öoÓ~áA
ãoÇ}²qüÙþí‘oü¯¼þP÷Ä'ùנËÂ߲æ¶œ4þ›uư€ãt(¦[!Øpð+²ÉPR?t7bÿ<ÔC†'õAí‰AAAAAAAAA}’t]‡.xx¹×#IOÙzÆ]P´¿døU¡
öW,®K—<ó¦SäwK.u€(Ép!¥ñ_‚Ê	øe‰ÏÞøEá&委ÿuI\ÝKÀ߅¦RÊÿz˽$㟢ÿiÿ|Âñ?5£/~¯Yú:Åüûédó_êâÿµž0þ{²*]$豏ÿUýÿQÿà—öëgçþµþþ¹©ÿÜÔzý=ýÓúÏ<óeóAf2¬ˆÑÁõŸý¿+õSW¾SÿïܩÿÜoüÍðÙùU򕾴¯›x÷¯üí7ü+ʅ˜NS7ö+ퟌ�‚‚‚‚‚Ò긘”äãŒ'þ¬éòˆhF‘?å>û•ú{~õώžuýÕ?¯ё1î§ù¥ú£¯×OzãèYô÷þóè™{øŸ<§c	¹Å+È1¾{”oœýÜëüýÿ©~ñ¿ð¿ÿ~¹¼#m~å>ÿ™?`nÁvÿËÑgø…/ý÷Ñg8û»;ôÉѿ
äZ%…gî<t%šø2§ Ÿö?ñِI¶ɿ(;ÿÚl!÷i‹ó?m¤­ä‘O=9—>¡ýG¿ó³ÿçÿ‘_k!ÿÈ[þgü3þh#ù`þ(Âÿёý§§ÿŽ¿cøUhšü⏢mˆÿïÑVæ¾d3ŽØg^Øæܠýd·ʧÿ/X…Æ֑ýOÌÞþIü-¾Iûÿ´Ÿ|®
ôU4ÿlKÁ~{üíø£O›Ñø«A³-äÿS6Ÿ¶Ùþ§FvÉwø¿å¢ðàƒÖê_øwú„ö3þLý¡’bý£h֠SŸ¼I>ý?ÿßü[;þéÃö´@#|x`·dQæ‡y×s_­K—NwFmYe:Þæsbp1:¿jø}dd¨¡ó/֟üüýœ¨°ÿÿ“¿eª
Z6;ôËȀÑæµKðmB×Tãý)((((((¨Ã#»ڶ
/ç•ù[Ñç(&]g>óõÇ.߸+E†,UŒt¶ó’I’½½è3n
ÉFG†]?ÛQû™Xßàáwèk™ñÅ~“ì§ùSŸøë´ø	ø¶*_ùN[k]?QþW™K±àÖ(Ÿù“a&‚'[?Ž?kÿ†Äße2ü®_ºJÖZ˜ÿÌáȧM‰ù’ÿ݆z›å³ÁqÅ$¿a>‹,ÔJþ·ßmE⏶°ȑhüÅÿ†ß×äúGû¹þ%Æ*×ÆNbûEç„OÌú“Èÿ¿åÿס®ºê#—¾‘dþ›ú‡ñÿf
ùwª ȕ$þÅþøñoú=vù[Ï´×ÈyüS·XÛc€Œ4O‚S⾜ÈgEr7ã"Ä\|Tì¾ÍBÌ=Ó*›±npÂJuÞØOþžñ¿’f¬8òO’áA…c}Ô­G¾³G”ùƒ䚎‹G?ö“v™ÜV⟌ðñìô†éò0º穬ϐÜ7|°ßÖ:?rèŠÈÔ~vtߥ}è2”{ï¯3-þ	h7Öþx]‡
èŒIÝÿ’ø%Ñ,þ&ÿ5ëÿ{ÒqÀÜÁ$¾͈y@O‚e¿ñ?þÎòr!FMþ1˜0þhBÿ»ó?$ÿ9‘týûÓâŸL'ÿYpniü%ÿäX’?Ø`®tWìOiüßàXî'Ìn@,¢µêïZÉ?ûyþëµ&ùŒ]úв¿9¡˜yŒZbû»´%µÐ#~9U€¡qh
:t8‚íQ¬dï¦Ý	Çæ0A:À8­“Ãg52Ó"Ú¯€UµÙÒ"Êjàž¹@çQyŒãツ6t>iü>«ñû¦©¨§"m¤;ïÐN¤      ahÔ»'z¸¦l#ØñÀç³
·5D“‰õ÷~ü/5:oߴØGµ
 Ë;Kþ¾ézpt¶W UhÊePê%_º>Œÿm]“gýPÎ;4øeÉ1¦ sP/Ôµ™ρbaþ'ŸþãOHÎÓmòùÙ%è,”c¨‰N±n‰?æJÇñDŽÙaå_%+ÿšrïþÐKIãŸñǿ*¶~›ð'¡—â^ÆÿüÌ?´8ÿ
z:õ@}âó‹Çð¹]‡sz»þþ1ütMì?)1×±-&A§-äӶÞãϵþT…oƿêmÀ~òÓûd4/ÙëŸ=þãÂÏC&þÄ7åcìßKÐ	sÛ]mþ!´b­?†ÿÔ1þG÷æ?±“i¯™üÝ?ä݄ýí«1|æ4¿¥úºù¸®ô
ی>²þ\}ÀøïÙù7MgåЖFDÕ	-@UG[ÏÇÙHûL¼%¢c¿ÍC5ŸÛFVgám‰á¯Úl³O­²–ýéoA®¸ø+ú;k¾è*+Ÿ6_F²/Y­ó§±–¾¯ƒaù_MdZ­ˆAAAAAAíҪ^mBÊüm²¹•­ææ;/ûòJü-òñƕ\»ðqI\–ü6y6à3Šͧ–%ÙæóU–þç3š½ݧÍA]䋸¼™	_ì·ùP/¹Qásæp&EZüMˆÏiÌ\öw’'tà3Ij–Ÿ·üŸˆo]Íؿ.þ··U%§)4À.Hq¤ßüÛ@’øŸó?©ÿíüoÎʿ^‡r˜×ÍÆ_Uø…ä|;ÿøZþA||Î8~wü.hA˜®üç¸ü릋/ZJ`ÿ|Œý´mëù×(s%¹íñŸM0þK>çý«ÑüK,¨ރv éíªÆø+iþ‡ùÀb;¨Z&?ÆþMò[ØyÅÏÒLüKýãō(ß4_™âäÆáC9TzsØÿFGŒ@{ŽÁêvêé±–oˆðàb1íÆ¦RdÛA›Cە±ÿÀ„X/“‘‘èòG¡CG’¯qaªž»>+‘™Úoœ5òk¯±ÏÇñŸ6Åϱ¹6ñi2´ä,€å¡3·)OCu
Ýæ ËÚ|$‹vòwߙ>ù{ÒaÀg»,ùSÒù`ó aò)ø&‡AüË·‹»Ð٦³äçûïs85mþ¬t>ØüÓÕb„nî£g}$3|Ú?ô–ý{G9:ËsèàÜjÅn›Öùñþ¶øxéüêQ΃\æ~þßñ"‚ÛÆtþØñﲟãO&óžhþ…³RLþu¤Û§­øµÿ}¿õ÷´Õðé{±ÿ5Äæ–yß!:Ò%Äy“pþ»ígüsËáðGþø¨¸…|‚>grå;òÏÛè„xß5þ†Ïä›ñOûMg:KŒý“ BûŽü“1þtLº房ý¨ÿ™[’/ãO6ç@£öÓ6Žñ¥ã
áȗnFø;Žñg¬Éø—Œýü}Ãß!(&ÿ¥ý
å_8ðš̨Žbû}ӛÑõç>Ÿ;êÿA螃OûgÎMòPøÿç[¦ýf›'c›1ÁØ4ü!ò]ãO~‹ÇސmƟc`ÖŽ
Çßð÷\öc¾Ì[ tÅÁDÖ>°c;VŽËl+þ:¢È	ìàW±heÊg È ”µí—B”©Fî:ÚÁjàg}(4ƒñ„küQ*ÿg¬6'ocBØþد¢W̞ZV÷1?ª`_]'îŸJÔ	݁ê¢WW‘ȲU=ú=9…K“oo{ؗg>dfÉï¾½í`ê•“œLùHdím/ûÑä[ë™lgµõ­ãÿ“’x²ã‡ɎæøÓÿEáó™žÉG–ãϘ·ù}™Û/|ĸmÿTTàwËø³óÎÿ^Iü™Ó4üGعäeMüoÛߟÔ~úˆ¾Šv*`]k6þzÄ~òi[>}÷M±e:³–õØ|ÛÿÂgoáüWb÷ÍĜµ"Cüúó鍆íg¬ˆý»Žã@ŽͿðò»ӲͲ]Ɵ]mŽ??+ùý>oäZÛÐQ ,¨¢.Ǘ8K)ÉøsÌzbì¯f˜ÿ± Éï
ò‹>çX¦|±ßö¿ÿ3)Ùç¡â4âj‡BezŒŒùk|c3ìj‡Â„ùìù/³Eö´Ë~´Ífm?'2+¦ƒ1þ_ʘω@ÿÅؿœ5_ŠqÎñÇb²@†’6YÙ7m˜˜<U~ÉC’±#	Nš ãáSPP’wb¦ɽ,‡Žò°á£-`)óùd·ÝàP
þbâ›Oüªðùi¶d¥99pԶD¶9ñY2K~	â3‘Í–®#>KfHðlÿ‰ý,¾ùàû³ÿyÏ÷ÿZÖñϜȶD)þK2ÿRµŸÅkvê°3	SëO+ösÌì#Jb¶‘ž³ù¢³-tý1ÿâÜá£bÏ+<ÿÛ6ÐGýÈ
nûÔ×Êú#ö;ó/VbóOŽ×|ñ‹/Íð9f´?.ÿÊ:ÿ#Ÿţ˜ü÷
->ý_sð—4ø¬¿¸ø(ٟS(0·ƒUÐnסPàžuœŽ]?¯1°uÖaÿ!ù
þwڏ…¦‚V²¬ùlÓãø»ì/+Œ?3.ú.û˰_ø™kêÌÛvüEü¯¢— ºì±g²S~t]’¢t]’‘6åëÎ+¼9íÝ÷×g´™ŸSÜzVÁ÷´}ÛÉ<ĭ.çä•üY“|à߲ö?¿|&_ø·¬í?tðçÅ~&YÛÏgaû¶Ÿ%ÃGA2kûqþç3´Ïñ׈¿²ƒ?'ÅûÑYÂñwşFüW`#s‚û_ô±þ̙ñÇÜhi»Ì³·s´qÛ{(Úñ—†ÿa—iXƒ^N·5[ÔȥRXh?}èʿ®Áæãò&nÁâ6ËV^1vâòo®9™ç_°‘üŸs>ï±þÀ5¯5_ü?çÈ9çȼ¦ÚN8ýéïMêð׺˜ð;ª`£
|N¤ܓý,BÑÿå·ó7ƕø.>Úä&üŽÿwGµÞnãËÇåÍ.œ-&¨æ›\of$þÔÔ+…¨mhþ¡?‹$((è,T§X„á”`h®Kdñ»Ⱦí¤ ]YkÂo@ÝHȲ.>Pç >‹Øöw’¯àƒÉ>Ÿ™4ø£¯;·ýÏg>»êØ?ýwŸþ'M7þõý?îŠákÙÏ\ fü×|Å?s&ýøӷÿ´Øïä+­Á,tŒÉ-Oû¦ø¥ÒùÆÿ†¹¤ˆ’y›°³K‰ll•J£øIç’}ÍsðyÎcþÅ9¯•ÿÒþCOù'ù\Ë]ùߤRý%Öÿ¨ÉvÉqGþ²-WWUÐEþŠÍÇö¬’_ûß\Rä—þ_ò<þ‹Z|´—ûô?u‡—Ùö/+òóÑ+†EWÈ𦠠 vhڔVüNe~	bKºé€`22#[4´ÌëέsâJ“
þ"º1mþª\i­Á_@э¾·íçw¦/ÿ¯(òi?ŸÅ,ûÕü¿ä°MÎüPáÃ~¯þ÷<þŒ?;þWå–5ýñ׏¿’cü¯*Úß~Íòÿ¢"ßtŠ˜Ë{D鯻ix@1vð“©)ÚÂó`®CëÐys˜»çüsZkÅsþ窱(ñ9—\ü’
\&·¾d©uEþ$Ü‹øoÚü
MÿÃ~o||ɍï{üVÿS“Ö›Ԧ"ÀÜòÁBZ]ف·E†²Ơ%h4$ÿAAˋVQöº2oHíui7ªhñ×rù\«ù­ÄÕæóYŽjð7Pèrð÷ø¥ÁßôíœÕáà¿Iû}Åߤ"Ã{ü_¼|ßþ÷ºþ菿¾ýR™Œ\–ó:TÐä‹x³oyâ¶+…⣪8—xM´ÀÅó™4óÿSŽü笢ýc¨?øÌÿ\ùï–çüs]õ*l«͐ÚWä÷áV*Ÿü~œ+à•ï°OÓÿžǿûfÿ÷{¶ÿßtc?ª:߾ê7¢i2<+(h:òÀÞåí'ÜÃ`؊ģ Èßw|/ô㍝ßÚ~BñYEŸÛü“¸ETîl›ßû}úŸÏJZü»°ßóøoØüèðɧÿ}Æù^ãóϧÿûãþ֠nä
ªÝ7آ’·ÊQéoO
âö²3ŸùÇnš˽÷ã©ÎGL]-veè¤É/bMñš9òßÏù÷æ•þª&•nŸüN¿¦Éwø¿¢Èï@…Ý'¿ðPûßüpž…OÿSûPqȇ.¼ù-“¡¬h@AAÏYEÉKÊüš]€ÀCb§&ßљةØTµ®^¦ø¬â“ߥh
×Âúô?>ý_yŽA5þç¼Ú_sØï{þw=DëÏ)Œÿ}ø´د&òØõ$WÆ+ti+hø#ÌñJ“߆ü³ìqDQÿÖ<×_jª œ:íµƒµ¼òQ}˜ù‡ÿË^ãϿÿ+¿70x]WýV=$ûd֡[P¯0ü+¨êòÀ݁ê,Žâ­\Iå[°jVWUP|¯¢åÞæwa­òÉçw…O~·Üü¤¡šƒÏï
Ÿü‚æø?ùù»Æߧýü®ôðÿÃÏñW¶øU¨
¹ŠW~ÿ æÓÐiˆÝ8fû©ªÐ!®ºíK_A]¾Á-vGÅ>œû§ÜµúTäJô
tF‘Ÿ÷ÿaMñZêCU×ëß|,n¾ù^[àpÍßQä1þ³ÿO8ìßUæ{ÝՑløjÁì‚*PWþ2ác•¯
j‡®AuQI™¿½øјäÈýš|ëú_Šk•OþIM¾uý/ÅgŸ|ÚÿЌ?™–Šªþ_|ó6þ'<ói¿ïøóêE~Éâ¯@ì€QíÌ`RN®ÒáÓú

zæË,<õ ÆÏA]&¿‡Ûù—ïú‡¦Æ`]‘?éHÀ7”ù>í÷lÿ˜Âø+ðüÿðÄÿæôþ@u&û&áÃ5Ÿ·”oa+Ij†(lÁb‡"cŒ³Šü­'çdßÎ0®xֆ#›TL@Ö	×
5û|®>ù“xïsüéŸüqßñ§Èßôìÿ-WüãeOûÇí_wGÇ?¤t
Ì[ДÇx0YU?$xäÒ7o¨ÒWPÐȯ½Æ7:y5¿v‡ۢµÎL+ò'ùז¦JޤeEþUG–oþÒCÄ_öëòW}òW<ûű«¤È_ߧÿKžÇ0“{_üY¨Ñ”†ouH7Tچ†Ùs<W¢r<Ì5äªë‚c×
-þ’ƒ¿ªÈ_vñ·@•üÒCdÿÂ;0þ®b­öéÿ5ÿãÿ5¯ëgû—ùs¿ujùŸâÏ`ÞWv`ñÐqÜ|©¾Ýϙí(>=Çõ
:iò/;òϒ¼:t]÷¨˜`º®;T´¿ìàOhòá¯|‚åuü=òä{ô?ùñß•½ñý¯?]¾ýO>oaãM,BñàÝG>üò Jº݂֠cÞ*NíAZYÖ,ªŒ«ÉÕøŽC«ZüQÇ!°œ«]ZöãT¯|—ýðÁ#ŸkE·<†¯eÿDŒÿ;=ÆíWããl¿ËóúSðhÿ6¯äVâ0þ¯÷š€rønT=ûgæÐÌÿËÿ_«¬   ÞnçëìáG?öª½ΞQÝþ`]CV:4ß~[×`û旡¼Îe¿"†|\·ióJüi¿¬>þӛÿûãkۏ«U-ÿ«ÿ¼sýño§&ÿñO½åóðIÛÿSÐt3å-b—ɏh×ê>ºÉóÁè´Ã×Ï~îßê<ÿõ%­â ®@·o‡àZ1£Äï<¬Ø|ülV‰ŸǍx6Ÿc¡Å]ü9­ñǺ`ó¹VhÙ_ˆ±^küq
÷á;,þø¬¢éÿ²ÍÇ5ìjëçøÏǬ?Sçÿ~F†Š°þ3k‡dkÈ^8Œ8(((‹. ^8氾©_Åê“7Ÿbqڇ.B9ÕóOF¿ø_ÑE~Ò`Ÿ„jH0l~I‰?Ua?“›(N‰?
ՅïÃþ!¨æà/+ñ ªŒ¿7>öXÛü%%þi÷·yÿy%þ0Tõ¸þûmÿ/<€ߕÚúcóÝ��4h ­ø‡ê¸‚ç1¹ª£Å~(Â^ÄSQßÔGv鳡øÝÒu´• Ç´Â5b¬ZüÌDþŠÅg¬Vµøïùè+‹ží_Žá{ò?ù\3µø¥·ó߬á S*ü‹×|گ4þ¯.9üÏøôoz?áx²ŸëÏυQâ_°^̜ÆKÕóoxõ8¸<™ñ¨ÀUSPPPº×Þv
¿<Eþvôö#¨Ké¦EÇÛï*TTà÷@»1ü^$7·~æö÷¿eÿ­(¿¦äÿÞûü+߱»/züß籿OÁþ!¨ì1þÉßóÿ½Ð>ù,0Øã¯`±‰ù?nþڄNfÄ/Zü«æš|JüÄgÿ™[Äø·=i¬xûåóêñ®H«{¼ª„ 3€cw"
~DK¶
H´86ŸkíïO¡wìv§¹8øo߫°¡üšƒϹ[̞ÿ•¢Ã~~gí*ð9þÅû÷ÉWH@ÝöO­Óÿ'ƿˆ„ßwüùâ‹ÿ÷â֟“žâñ¿F»‚ÿ]ëÏmnG"CaþçÀïsê†rØèãí¼"O_AAAál×Yè~ìò·rZ`¾eêÀÂþ,tꂸNƒ½€ëÖM3_˒Û&	·3ԭ›¦ ¶žfÉ?c’_¼á%3ª9ûÉûmÿOClƒ˺øpâ•۶ÿ/+ðG¡'_â	n–üãÜì`ógì‡*Ǎ?•â*ßnÿ¿þ §¡Yèd“ü]§ýÂÇÖ×M]‡PÝtíI
·d¿ÍwÛ-©vc÷^“@öü³ã~‰®}Fßц¡Vøè¤`×Ï=â֞Ç
7‹™þ~“üaè6ù¢KÇـ-ó6Ÿ>þ…½éÓÇø8c>×"×øsîîj
Î-Oÿ“OûG‚uÆ®h&ÿ”Âø;í—ñ̞¿1wÀcüIP=þ„ÿò
ö_´^œË2T„îИævžŒo£




Ò<è•§Þ_äÑ⯵϶ˆä¢Ý_µñªŌošè‡ê8q¼Ž·ÝämAíä¿뗮fÅ>E6ëÖ-·¡|†ü4c¶}ðäqÚoûÉEVþï„æ ù°ÑæoCíì~ÀØdÁï†æ#WK;ù´ÿ–U×Ñ*ْüÛ[¯¶dü3õ”¹þ¶ñO' 1¨³Aþ¼‰?0ìøßh`üÐ]¨.ªɘ“Æ|ìˆÿØù_$‡U›¿á™,`sLä¡•cø·ÉwŒ;ÎÝض“þ-üD_NA
Îÿiñ?ÿÖÉgüG×ø‰>¹mñ9vÜ.VŸv&ZÜü5Gá•cXÜpØÏ5ŒüE¨ÐàøÏBµÈ`ªvÌøq-pÚO>c˜ö7èÿnñÿMèõF‹7`pLìñçÜeїËPYˆãïÿUkü3áçaÿ†+þÄþòµí§ÿ%þç¡þ,í+&þjӅ¬ø`䏉úÿJÜן—n’‘5ß(Âjt¦ðYöùT„ø¼e¨||÷å°V*1ƒ‚‚‚BH­Õó½—þ‚‡iÌÛÝ^é<š4‡½¡½?û›wžùrպá`ê!?ÓöZé|¾ð'vò»3ì>:íGŸXþãéÛV¶±”£ü|áߣüñ?ÄJ³à5(Ý"×[:¯\ö÷¥äö@Ÿ”"AUø|{èâ÷Bà¿Ñóœ$—ÂìˆØ?A¾ñ¿2ØEbÇ_‚ño³|z­AãÂ,Dìƒ^‚­â“ÍïnÀÿäñܤ‘KßàVS„¡6 ÂÌGøŽø³‹{Pñ~
å;ÖYECv"]_”xï‰t»Œ¿v¼ýn¾¼…퓉ò9‡ØÅcü_‚&ÅæNJì
*EýϿáßÚó?&þ¸&]|Ú@[¤£ìj$þòþ˜ÄJÅæÛñóf›>éÙþ7ü²ÄØX$þÛÈÿ—¢ãÏ1CuŸê=rü÷ԺÓ~򹖋oW §mÿËÏ^ŠŽ¿¨Üà6>ÎÉXÿÓ‰­Ոÿۭø'3A±ÒúÏQˆúÿªÅϓ/jåPwÆdÇßmÿËÎõ§iž;þŠ1|v‘Oѿ—R;#̶ÿøùW–B\>^¢ù/ëÏeÃPäsþU®¥§ÿû­ø/iÞHÅ-àQ,ñªäfAAAAA¡ä_üòfdz¿Åî‹À3{»ï@'ÉÇV„¬÷WñÀH¦|ʛ¬®šÜ5‰3’){ÛÇíÏÈÿ+äF·Î ™`µ«øÀ=iø¿
Z2	¯‘Ùr‚dÎåÿø=Ð-r\’®#Þ"ââ›økfü_:Žéð¿‹ߟpüÏ
ƒ] u\
˱m„OÿÛñw/òÿcøÉÏÿ8ڎÏ1e7@c|‰?·ýÂw¯Uv,â˜6Äçï`KÍߧý2ÿ]|þŒ±9èâӗ<Eüòé;èÿØõ'žÿÓ>m¡O{ý±ãÛÁ\¾gLrlX ½ë⣓”¶54þHælÿ߁
ùH"™Ä~Šö7ä®?ô?ÏqÂá¦,ÞL8™îñgüí»ÆÛD¸¶шî$,OÿsŽì69þ‡Ð麔Ɉ‹¼H"ßŜ‡Ú\Œí—õçÅhW⥔»´ùÝ;ÿÓÿ×2ì_>ùíÝTXÉçß
̥¬¸öøÀ;
A¹ÈVY‘Å[jdÒQPPPPP(eØbÌÎ#Þ8 vضÕö˜ďBG€Ùz’¥V¬Ηm¨Wn9Èê˽â›JÓubó‹ñßê¸ùS^koy¢6-ÕiùÿÙhÂÉv‹œyáûäÙڊø¿խ_7¢\Ø¤ðˆØf‘€ɊËÿ}Âofë_¿aâ­ “K°^%“lc?~¼ÿ%þ“Ø?ޤü§|Êî$ðì."“lc?Dàoñw\üná7ÒbÞ[nç’4Þh%ö—È7öÇÅß&T”­¯ÇÆ?ìeŒr¬î¸Ø[úokïÓíBŸÏdÍbÿq|Ž
c„¿{Ûŧoy>c63!¦h?˜ã¿ÿ7µþÐ7ÂßpðÙQF#ñW"ߌ?c…¿cóïß@üÑ~úˆ±²íæï1ÆȺÿ3òéÚÏ߉]ÿäm~#öoÇøŸÅ=®5¶ÿù3ƿ=þŒǓ֚×ÓÁglñ–ÿ‘´FãŸ|n[4Åʡ&¶pŽñ?Æßæ—È7ãq‡ŒfE?qüÝñç^ žOéeùE_Dÿ²›LŠQ©MûíùoûŸ…¸|ÞÞ2/yüoZ»Yñ¹þ®H!ô¨ë®ÒËÊÿ҉“Í9AAAAAAÁ	
‡Û񼋟î氕DƒËý엥…øy(/ÉgÖo“nZ[^ªÐÔ.É_ö@LŠȳU3|+ùKC‹HüxSˆðºíÿ#Qo•»ˤŸ×i»™nû…߬ÿû &w£!þl„ÏÜ$Ü9î‘ѤÊд‰E¶	~»ø®Ö4_üŸÐ~Æ}eøÕùóP>ÁüãA~ªö'X8F䷁q¥Eû«Æþ$ñÏ)º¿hÿ%¨ܢýsä›õ‰s£öóofSðÿóP’«Œ•¼Œ]¥YßÃÞnØÛL̵º™øãZ\iñY{þU`²;çjZ]­b?ãڊ»ÇBй˜vü=hýÙG¡µ-Ë.‰ÿ¹ÿ„_Œ,ì—"Œè‰Ïþ@óZrn¿ÊìY-(((((HĎ;ñS¸U"úÃÖ~&6YŸñÔ-oÎ6¡¨/ÂϪó¨
Iåº#ñ_¾Ùö—6çY‘åÒ=貹íN¶]¥åÿ%<Œº¹ñöÓÿ­¿¿W$b‰ƒþVý®
úp9a"~-AÝ~¢Ã%™Ìñ¡_ΌZLÈ7þï1|tE$²Ÿc…šü"ùMÚ_l6þø»ܪ%1´œ°pOŠ7]ͮ?äs̄_Jh*Eì§/ñ+ǚ!áWšÿÞ&×?ÚO¾åÿÄö›ùŸ¸ðK>cVlX‚Ú®…í+ôUÔþÅö¯b¬òÜã/ñ×Ýàúóücÿ«T;Q„ßÍÇð NlM‡ëžÿEhÉð%ÆP|ʪ“ڎÿ4µË:ªv 1Ÿ¡X4?óÂvË]ÃAAAAAA¡¤²ŸœíÒl!æƒ)Z¶U¸Ü+/I‡9L‡[fù°Èmy9ä{š€:…Ïø¼:÷Y9Xú´&‰ʹŒíoG'9��6¥Û`êHÛ~$Ͳ¬-Jw„/öÛü7ÈoúàxvîH0J†°¶¬-NëòÙÎBmÂçÙ_<ܶ©ø§Ïè;Ú 6Š7\öÿ\Zþ>cˆü‚øv^X;þ]hCøã6Ý	iÙ?!Éð+boUøûâÿ%ñQ.
ûY„ùNû-ÿÓ·Èû‘ùגýè°`þ„06ÈtŒI|Tˆڏ-3Mñù7œ;âÿ<4&ükÿ×ȖŸ-¹Æ_
MòoñZfÃÿ¯CwcâʋﭢkKñ×)¾]qÄÿ–ð§ÉÆçMí;T쏮?óÖúsºµakZ«L;þ¹vEã,ס(›ÃzÝëÏ í”nÂÌÏQdüqî/̺b‚‚‚‚‚‚‚þ~ó¿pßú¿†IEND®B`‚‰PNG


IHDR22´6@:¾IDATxÚíÖ=
Â@Å񩬴׳(譴W´3G‰7Ñk$]¦y&…4k“õ+8ûðƒ7Ãîˆ#Ž8âˆ#?ƒˆ6Öñˆ6ßE‹Fûä,FB³NÄTdC„ª0rŒ=ŠÈcޝÂÈZ¤1 !ïä$0Ò²	#cbUqYÕB…Æad¢R,//AJMžÖuxԕÅ׵~ãà·íàߴ³û
ªüZ‰@úüžøGÂGqđÞ!Wϫnú”é
IEND®B`‚‰PNG


IHDR22´6@:®IDATx^í˜[hUÆÿsÏ&ِ65ِ4iLҤ¦¨­õú`4ˆ´E(XÁE-‰M)��>‰ ø$hLšGÁeݤ¦U,±¡酴ݐæºIpgIö23Ÿ'v]—8C O9ߘùsöÇÿûŸ۬àè@¶!ې¬ÍCådÈCmÞ6‡¤ÃÔÏ?$¹’'R¨UÀ^.ßµeˆðçGZŒ³‰_¬ûˆÙÑä­ÄÏÆٱ6…R ­@ˆ`[cƒ0‘ÙÌØàÅV‚rS÷ʡ(t̎qà5ìF>¼håÓß¶:&E*[H
Qîƒ£	’¡&\›î“bqÑF1}¶‰SìbÄìé
CÓ\AT-ІÚmø¢UŒnœ¤ºQœÂ(ӆ÷Ñ4ÖÆDYU eýøNrж–Á^ŽŽ0.HGÐ2ÇeUÉ×ûaÆQ«ÂlXˆ‘ÙÈìºaÁ&ޣb~Äó«N)Q–9ƒè<ÊgÏý:ÞK„i.ޘ¾Ä¦/-Mš¦Ó:zÀì9)׹8„䲐•F8ª¢EˆÀÂâä½ѩQö15zotqÒB”¡Ž0RÉQ¹!Ê,¯T%çz}‘ˆ5ãîÈTðf}ÜNE,F„ªœ—*Ž¢aN!,ºTÛq @EO"‰•û#ø&ɈPùì„T«â;†ŠOü„ TCgBø&‘‰‹Ÿ£
Ý@*¤6±4«èˆa%r=8¸`WãëUHÝ*Þ ¹ µRá²:’*|ܙH‡ܙˆ`Eþ8€Õ_ÝCh×䧩)܃(ÂÉ[Wäjàöµp2Š>0ñ±¶Ë]áÏ<c[©Åø-þÆB‘Û3·gB‘%ö¾ы±ËþþÓR£VJŽ«),Msß:ƒw1‡e,P˘c/Gã°vïðw½¥þ½çÌ5 7mƒìÂÛx]idâeüñr³¶Ëãb[‘jiþá4l“?+Yå!Bð<>´Íl.¿U—Úòn²Cê¤}ìXÀP–C«…F%Хz
³>vªF
õqìt«—]Ò(=fˆ£G°y(Á¼Ža²A}ј€øogªSG‡–øhÙéx³{ú'ÛFF³“Ñ „ÆM0ŽŽ_© ¦QÚäÀ/]þbñÊú’´ëKócÁϏ¾²·+|-¦·JoúN/â£iuÒ,û¤S“ƒrˆ:(󙽎g—ÿú/fõ3V4_˜‹ã+kSÉ|ê¥IZ˜S;Õ&­J�ó©•ñṭÌ9ñ)Ë<..wR"åUå—ZÊ/5”_ênï|2ãÝؑwlÆ.¯©4Θ|RAù¤œòü°4H›Æà|øÒ¢¿ÓâR¡a[¼p«çb¢ªhäÞ‡‰ÑÍN¿ê²ù§•GPÙ¦õ‰ýñ°•Xýóüqf·S¼ÎìÚ\ºb
³SͿé¤öÉ#⧥ÅÿSx-ç˜RÚÏê4Q
âgϻ±R¶ù÷üó´‹ÚÉ,¼zÍËÖ ™Ó"_
	*¥¼4ªÀvâ£óÉ#*?ý3ÏÄ-(ÛëöŸÔ6äY‘¸ªȟIEND®B`‚‰PNG


IHDR22´6@:¯IDATx^íØ]H[wð'™£Fªv1¢Õfjý€*ÛêM÷ŒN£]ÙÖÁØÅ`;-…Þ
¶Áv±‹Á`W£æ´^öaSevc­CAº¢֏dÚøqRc¾γ—?2'ç ôÊóܜ“‹ü8Ï{Îÿœ|y$Èr€ìºÙ$öœØ${o{#٘úúǐ‡|8PhÄ!Gyò©PûF@¾~¢Q»’M/qG&g?kW&›¥ } Šȃ#д3Äs·ÔÎP I ¼c±©spΟշÈ8ù°€n6ÉÞ ã$umþ,œê|lV‘áZëgš¡ŸȉŸ×H2½Ö—ÁXCTQB,œ§žbñ?écŠÔÎ+FJ³„¨Y8‡[tü€0âb7{$ÝteUÚH+œj6æU•%šôñØÙË(i$*Gvƒ"©]C	ª2³ˆªªè›ãLÅY­›`”$µ‡Ë—)<m
ñ1N¦¾nG‘ªÌbœGéò‡ä€!_$e8ë3¡›á‰ðDèæƴŒŠ—•«$—?D©q.&‘<¸pH#Ï(ÂÉ-êŒL‡‚+Áðxx|%
F¦uFéTÈi’ÚE<“ˆ*ˍÊdˆ¬UHӌiKÁÅñ¥ˁåÀÒ
ÙƶÒìRH-Éd•p«ÂL"2txõ8éPH“ÜXÊ)X>I²G!$õ¼jø¦‘Bxà„Å’`$‘OÙH>xPh)Cu"L6(äeîpcëÞØÝÀìõ™љÑÙëw÷Æ6¶vح:’É0ªQfYŸÈ~QޟÊFîOE1Žäú¸uDêšù,s	÷r››ÉÅ;s£KæF—no&·ÙO¨“üë«u©Á_~^OgnÆAa4F6WV"›š ß7cÓ2öϡJÝ)vK—0ü+ߓƒ†mg0ÆmILözh7øInϝ찆7#jß1µM^ÌZ »xA°®¬²qR¢ýþjƒQ—Ͳ/~¸D=Å÷ˆ]c|‰sžäö­wj2K¾Éå¨AËä§L“û<´¥¨O)®^1±ɾ*c³K=£mƒ½©(çOóóYģ|“#bSò‘ÅĹìÍ0¦Zð£h{»{á']gΦ'£‹ä<ë÷`L=~Q&L=šÑñÖ+·¾üç×تžL'b«¡Éàg^;vjmj7æÝJcÑ7û"”Vƒ´¢Oá:%'ð´ìËQÛîü—YÿE(€Tfú•%8/jáG#šÑ"iF“JŽ·?¹Í<I2µªÌfáåE(¨R(ª%>TI|¨¸¥ý™ȟƭVd”C=Œ-¾¦Â7JàA™ăR‰GàÇQ‡fƒa'=üŠdô7©¸RØ>_¸վK¨JÔâXÇIaŒMOŒ¼nQ¢r“/P‰bšü3ñµtbý«çP‡
¸ÍֵwÔÄS¡®¿6´KZñ|(ƒËÜàÍ3Å(‡uðKê„(‡[Ý){ V’¹þ<–T nãžÇþÜˢ…KÜpÁabY±ÊµåUý3ÏbÚíë_’ä_ºlœøoêí>IEND®B`‚‰PNG


IHDR  Ùs²õIDATx^íԱjÂP‡Ñó¢讆¸8ƈS •F@‡,Üñý[ÈrÉi‡򛿳Ü?×÷/÷×À¥”‘¥JD³§Ç‘zx:ǀ/ÚÍ]䉻›Z£Ö.ŽNêŽ浓£‹õ8ÀBî ]®t[˜ÊúD?—™†D+‘hûy‰F3ȣ@HTªAB¢Pô򗀹½\ngoþ*°rUØé¦pµzH´*…\&“+TZ	q{OL‚»ˆÒþÙ§•Ɓ01`æ!a3|„yHøØvùŒpf±%°ìå!±Ŀû•ßÀ®·¢H³tIEND®B`‚‰PNG


IHDR  Ùs²áIDATxÚ핱jA@‡ãýÕ_PƒD;=ÄAP°H‘VT-ÕÂÆN°N@IaDð­Dñô76s·˜9ïnƒ.ÄaaÙñ=֝ÙØ/ã/	ø‡X‡KŸÛä.žýAÀBL3"Ë|6Wy6$p<¾¨ö¯
+^íÇV}% §”œ¥K½‹óB„g˜VïJ8+\´"L{ø„-|ÀR:5:\Ax£#`‰Ùm|޹¨ãZMy%x…	)Lø3%yØj:ïÀÍT¦͞=	HÂL¯Šo|Š«IOböŒ«*s;¢OW¬s^Ŭ0ã^e3pŸ Œü¬I!FG>Îë#(#)6¤ØË{n"cRŒ1|C¸P`W¤à	#Åq^ֻó‚?1P0bþԼp—€ðvÓ5‚<
¢1ȻFí&)Ä꺌qóŠ7æÅ]àl,nºS\Fª»þÛwêN5΂úB\FŽ×z–¶¡Š ¢Ö#…c+׻<Ë2·ÝYïR+Û.S¥øä¶m,݉׬Ò^çÇ7Ž«"ñ.¼ÎL+–u|eÂI±2ŲàAÁYXO
Ò®ڞ4UWÒ”‘+®8åHA¸¨‘‚,ŠÃíø¬»yövõÿ¿‘Á•‘¡mªóA»IEND®B`‚‰PNG


IHDR  Ùs²ËIDATx^íÔ1„ „ѽh#D.€¨¥çØû_eÖLCáÏd-
ú½>¸9®Á8TÌÝ`F…S
ßsT3¯|·aèŽùÑ#?Hx¨Ì',Á&«
$†¹Fž	%h6B<m€$
ŠÊ	hBæ4¡sšˆˆ"' ˆ€éÁÎ5PE‘@€˜B@ÐS¸¿ˆ÷·QçUü‡ÏÿÊÉÈm8é㜻Ç9ëãì°ÿu¡ìð½5Iè+mǨvÁcå푰Â?~­¿À">ÙA˜]IEND®B`‚‰PNG


IHDR  Ùs²üIDATx^íԱjÂP†áçƔ€h Á[rv(•‚w¦"(jÆ`TÑe…€’ íÐA¾ù}–ós|ÿr
¼0’R±ÔµÀØÕYB8‰³«qðé¢ppyìä pñU
¤2k[»€ˆìl­eÒj€®™…MIPæ6fºÔD¦OD™›Š¨ž‰½Xlÿ˜7´K¢P<ä
@Häò{®M3+«2ˆLÌï3½
ôd–%°”é½Ďr+sSSs+¹£¸¼{K+¸‹ y>m%!©Â<¼Τè‡yHèWaFÕÃ[Þ!œ΍R0¨ȡc€÷+¿8>
4y%·IEND®B`‚‰PNG


IHDR'€ՆLIDATx^Ó1 @Ÿîϵép	0ö@Oê¦U“½4é䁤65+jFڌ´™i3S0P2C3Óý0^Ùþ.¤ÍH›™®îú+|û懝B:…0IEND®B`‚‰PNG


IHDRØqIDATx^íÔA
À@@ߜèÏmO¸(RèmÉ-0 "Z~Ì\ƒ¿±ö=t$ò ì{HÒÊÑC¡•M£
­l„J•ÍP)Ù’’í¡ú’‘.!YȆG¨L7<CeJ¨ì¤=ŒÂH7·z2ö€H¥ç§Ör?mIEND®B`‚‰PNG


IHDRØGIDATx^•ձŽ‚@à
!<–µá] ½(VD^acI#X,o€>hHVŽ5rÃýǐ;þnÂÅ
¢¬̓e\…:è‚.Ôq%¯™§,¼ï'²yhWÝïÚD*›—ETÀ%ª/‹	˜~l5ÌVgÀó& 0“ ;Ž`¾Ü<°Y?óå*‡¾MõA€õ¨VÎ&’˜¹ˆrõäÔCeQ
ãˆ{¥5GY"õ
a(0JêYCŠŒ"KW„"£Äwj"H‰aB-°ñHf¨¾¡â`¨†_5®8V@sàǑW†as°©Ï3ž¦>2žš‘³͐Ÿè`L½x¬
`Sõ¨QÎpÝõ²;^»?¯Ž­Ž7¥§òO3 yᨙcQ“»3yßN¡=¿	gž¼Ã_Àñ!o™7 Êv´6^IEND®B`‚‰PNG


IHDRØMIDATx^•ձŠÂ@à%HÈ&…‡i$Ú.˜‡H8¶»!²U°Ú4Álj>‘¤֜+zãý—	wù»!IœÙQŒ!ÆӉªâ:´At¡kuЉñð¾Ÿh”•Ë˸ûå%+͈»©là"›ݴê÷™E€™YÜ~tÛϘÏ߮ØL®ùüOßfnA€uÙÿ³’˜»ˆrõlƒƣÎ%vOñÒã	:ÂP`
UCŠŒ¢*ׄ"£Ä'Z"H‰aB+°ñHfh¾¡á`h†_5®9V@sàÇQ†as°:åOuJ#‡Œ§näFnÈ÷t0¦~x¬
`}uÙÿy£Érô²:6뿮Ž͚VǃÒSù§9н°l‡˜lóh`!/.}hÁ/dÂ:QÇÕùù°:«£NžˆòòºutUÔޣIEND®B`‚‰PNG


IHDR  Ùs²4IDATx^ݒ۪Â0EWN¤ñV±⩈¢­ˆwëÿÿÛÙT‚ir|uåq2+3dóÍü0"§`L1>²åÎÃ9;2þE—-–³'%BÊåÕ
=GêFqÏa¹7­¿t$L84’Iûð¯×-.`˜©Vcñáì~¥Ç;C-sÂðF_þ°bªjÞöþ
Ë%¨Ø=kç·Øèß ThRRFjéBDaT›ãkTlž•%¸‚åSPú;ˆ+$¨Br„¸‚ê)Xã0Vƒ¸‚“þˡãä<¤°ü9`"ŠR2ƒ™Ì3)¤*ð°WqRH“à!Uœk¦^ŵdïJDßÙÒjwß΄º‘\ذdI©S;† V×}çJF9gOsA¤ÌYQR±¦`€á[ù»•:¢ö”gÂIEND®B`‚‰PNG


IHDR  Ùs²_IDATx^ݓ?kÂ@@ŸŠ¨`·‚Z2èEAPì"­ÁÁEpQ±uQAmüƒ½p‡G’Kºún}¿w¹äÂ3“¦B—>rü‹ÎÜ֍%±xaÂ=d­°ˆ ÀþaàĊ®*q¦j?«ÑOòHÈRg­"ð‡߫|B’7¸P$íìGÞðS–‡ْÂǻÚݔhJ«¶ÿ‰Gcb)¼:¤åëû^	[æ-4*r$‰avÑhË‘‰±p‡h¸ò¦#1î¾P¿PÐ4>„¸‰¹pGh8B»’‘Ø	·‡FN^ :D$J2h_5ɈÄTxžßs¤ÔC“–K?ò_(›bý’!K^ç+ͧ5B¨*e‰M%¦j¼‡%3`À\|85N#E¶ÜC–G¤h±vÉ,º™±`D›$ÏÊ•ã’Íþõ¡_IEND®B`‚‰PNG


IHDR  Ùs²IDATx^ݒ±KrQ†šEÁÉþƒš«Á6ÁUÃE7'q°٥àÚàæîâ\Ї}`cîââ`“Xt«Í®Áápðpï=ÜVŸ³½ï¹Ï=?ø±Ë쑣F“uòÄù'ôX²Ù:k†Ä>wl|Έ$f8b¾õÁ'#™°Rɒs¤øVŸ^’@BŒcÙ8”ý?W§\m˜:kÑþÆmö7q“•ÃL‰àâTýݤ¨ȶŠ‹žœ=ūQ1݋{m–¢¸ŒŠŒì’hädœ³‚Ñ4Ш‰ð‰Qq#ò×rÓ h‹´FK„O`Pè‚"œ@Å‘tÑȋpE,€b&¸\ ˜Ká™÷‚Œ	›üÛ}¯ Íu0(l!hâs¨ÖdM
qމâAR®󊊧–‡">œãÈKC2„Pp̽ê,”ùQ]pK›6ÌTæ`ÂHš)ŸcS$ª¼¸4‰’4èÐg@‹3Âì*¿#ÀUÕl·IEND®B`‚‰PNG


IHDR  Ùs²EIDATxíÌÁ	 ÀÀÎé4Ý\@  ›ü/zµ6œ`BˆfHID˜Ð
`B÷h€øpׁV×4	אm@£IEND®B`‚‰PNG


IHDR@@`¹UpIDATx^íÎÁ
€ À@æt6×	Œ!÷@’¶Üx«êºŸ@,Cç€0‰à€1à$8	@‚à$8	@‚€à€ïÀN @€ @€üßT=Í"ºÉxH!IEND®B`‚‰PNG


IHDR€€¾P‰X	PLTEZZZZZZR¤\¯tRNS€›+N‡IDATx^íÎ1Ã0ÄÐt)ˆ¢1ž 1/.ÊNzϋzršÿ ë¬}F3•ÀV@#™À €“Žf+ýÜLø0aà̈́.&0¡€	L(`B
˜P&0¡€	L(`B
˜Pz6 







ˆ	Úkã	ÆmãIEND®B`‚‰PNG


IHDR66ŒEjÝ&IDATx^íԱjÂPÅñØÆvtÌfgߡkVw'w7ǂ £Kž@G³:¶ƒ>@ÁÉÅÑQ\ԂÅë>á4dð’›x„9¹ðG®?DDDO¦ù5ô¡LE$ßùy
a掄y‹êÀ?˜$²éä%ªg°„ÔD–*î
ףث¨”oìÞa¢v{\¨¨9¼&lßàWíû.‡-TØgŠ}]í.‡í$ê/)ö¶s9Ì\Ùx‡aK¾#c؀yœYÉ2,cIœeØÑbØÑÅ;eÿÌâ‡1Œaæ
ßpgµ(a?`”YQÂ`”1×ï˜ÄýÉóƒÿŠ…cöcÉ:˰®Űn–a%èÁöA[9³”>€ˆˆˆˆˆ¼š8בÃSIEND®B`‚‰PNG


IHDR66ŒEjÝ$IDATx^íÔ/‹QÅáuwt£ѦÙï`µڍb]lvA³à'£S»A?Éb4ŠÅ? ‚Ìõ„Wxƒ#x™;ãxã…rýàCDDôf~†¾
ÁTŒä3/­QuXy`õ´Euà&Šl:i‰jB¨–ЂªhÃRŅÐt=ª{åCþÎî&j·‡’Ëa5‡¯ˆmþվïrØB…Õbìj¿p9l'QgøŒ±/ª°ËaæÆÆwưè;2†
˜ÙșÅ$Ã0–I†,†\¼SöÏÌ~ÃÆ0lÊðy—³öF™e%ìF9ósýŽIÜQÞþ+f2ŒacØŒ%ë$úúI†å ÛmåÌÜDDDDD|®*:}ŽˆYúIEND®B`‚‰PNG


IHDR66ŒEjÝ%IDATx^íԭŠQÆq¿F›fïÁjµ˜Œb^›Ŵ°{^F§5è,˜,F£XüÄwŸð.¼awpÁÜŸòxàS|ˆˆˆ^Lëmƒ&aª†úY.®Q
؀üa¸EõàF7½¸DµánÖЁšêêg¢îÐö=ªG5‚ü/»"LÌîeŸÃ>MÔ²!Û|™ý‡Ïa+V`ß4û•ÏaºBæ}Ʉ|%.¾Ã0†…ߑ1ì@žd§g–¢@	¢»8»øx§ܟ™ü0†1ŒaØT`'}W’61I	;Wþb¾ß1;ë»ÊÅD†1Œaۂ8²2¬ï0¬eXÞaÿĠ½ž™þGŸo\…øF֗Ì6IEND®B`‚‰PNG


IHDR66ŒEjÝ$IDATx^íԱNAÄaAВ’k ¥§4ötô&ú<–ÒZjö$T6–”„0!$xãSP\&lvïœK¾lr÷¿M~¹ìù233ûg~>ª5êҐ^d¨{µ¢Fu苐GÏ:E‹êӎpˆfúE‰êQFOº¡k¹Õ=HF½ԣš´"È#Õsæ.é™ +j¦ö@w:?0{A‚ܧ6%Hûˆù.A¦)‡-µ¥êó
‚,Sƒ ä;sXþy¢9áDæڳ3lDd3l0l“ڙ
¿gùÃæ0‡i®E¯´ÖÚ*KØaϸ,akž­¿XêgLqßZ¯üW,e˜Ãæ°!Y̰A0A̰
ÝÑâ„AíYùC€™™™™™¯_Ÿì´<6wáÂIEND®B`‚‰PNG


IHDR66ŒEjÝ&IDATx^íԱNAFaQԒ’+Á ¥§4ötô&ú<–ÒRB¡…¥	•%%¡L‘ìõ·  ‚ÉNvfý7ù2ÉîÝIN6³GºDDDþ™ï·Ë*Zèaàz~¯šjTŸ°]üY3µ¨6°=6è¤ÕFs¸U»õ{æ2´cªcs8Ý1wŽg˜[ sØ̽âä—Ù3¼ÃÜ}Ìac˜»>`¾sã˜Ãæ0¬q|À|
ææ1‡™³ï(La{ÎȦ°œL}ÏZ‘a}X ý"ÃVÃV1ž©ð{–?La
S3
±ôµQ–°lËKY–°-k}±ÎØ_¾^è¯XÊ0…)LaX “"úúE†Up‡YŽA3߳ò‡]?jòãê{l’ÁIEND®B`‚‰PNG


IHDR66ŒEjÝ%IDATx^íԽjA…aÿ--mDë\B.ÀÖÞRìí¶è
xZjk©…¹€€•喋ԀÁÉ)>á+T¶p˜™ÍäìŒ9~ˆˆˆþ™ïe£ÃBŒå»R¨Qm؁y`íТðæÙB‰êÂUl¡o¢[w…®ïQu8ª¨	”ïìª0S»#Ô}©¨O(>ÙVàKí‡>‡mTØ{Š}Gí7>‡$ê…ûš
;øfnl¼Ã0†=¿#SH<H"gÖ\†ÍÁX2wv¶vöñN¹?3ü0†1ŒaØ4a	'y6³¶£¬³v£\ø‹pÇVð#Ïÿ3Æ0†1,cIì2,²¹ËÃì_´—3ó鈈ˆˆˆ(÷›ó»?RÓåIEND®B`‚‰PNG


IHDR66&L¢VIDATx^½Øoh•UÇñó<wmÞæ 3z¡Ž4X j&HٕE¯F*kZæÀj«"é´„‚1’ÞôG·m仈/ޠÈÒA ‚¦k•l«ý½!÷—ÆeÜ{îsîî½|_>÷Ã9ç¹çÞçâ•`#]¬ÂØ~#Ë?Œ2Äg¼ÌzLœŠ3Ûèc!Ú#lå4AX,I'çí"ýlɹr°•éåHl¦›déØJn"~çmÖ`Šö5bŒV‚R§ñvƝ$¶s!NÑ胵ñÆ?vs1Ë3ñ°Yš0%ÕÀ Bì*Ž%ø‘áÌ"zžo©-†–ša¦¹±÷-õ°¨¡…£|s»£´P㸋=…°Mˆ)ÕÌy”ÓyšTÈ/dÙYhd{iwP]ÜBºE—síčù0w­d-p–çX{»vÎZ.K«ƒD|ï‹-gÆR}Ü1Ï×ñ•åfXîø"\F´æbI†Ùçܻ߳ԏ$09Õò«åÞuŒmâ2ÉyŒ—#NlÄb›1j±؈8èŽ0B. ¶cM#2yvÉz‹Mcµð	k#ŒÇ:1ÙÜWÜEØqD¦X‚IÄCÇî$4lDüUpëéçŠÑ5ú©/H}A†u†upS ȣÎÏé4¸»á…Ý(ˆ½†è5^kUú)ÄÏÕÂV#Æ‡衮âX=âºA¨
#²XFføŽ´aq¶‚“Ìr’¾s`G4zaidûÁB4{a³–ñÇz¯V|dó:º{®Yš9Ҭô"íê^š+ü4üX_¤	ûËR¬ч±wÓAX1,ä"aœC쨶q0ÂèFœ!ȃ#ÆóbÏò/¹R¯ Úò`¼°˜¼-eI„Ùö!®Ґç¡=ÈD,h‚ƒñÞφ_bÊܖ|˜¡‘9ÄSe¥ö#>̓م YF*E†,»r±Jµ‰)ÄaŒ[Æ#‹¦eÑGàƒóûEíæ&b€DñC—#1ÈҒ±'Èr˜0ÞqÒÓ\G\¥À	¨‰€&Ÿƒ²ûù	!N³,&ò$#¼QÚ`À^þœùM8¡5ô0%„.ÌÕVGÀ[\â8le
j#èM."Û(ԹG¯4ZÐGö!b’c¤còÄl ›^N1ƬŎÍOá˜8ýª;VæîþÝIEND®B`‚‰PNG


IHDR66&L¢V´IDATx^½Ø}h•UÀñsž»6osý¡Ž4X j6²+‹þ©`¬i™­­6”¤h	b$ýӋnm´ÿ"¾P´ È'HÁ4›´hm¥ÛDoÈýõpxî¸õô¼ºg|¹pßàÃy¿ûrñʱ‘NV¡l?SâOFâ#^`=§hF³•^¦„63HES8åéà,b»ÀI6W¼r÷±…çèá¨4ÒE>=¶’¿ðkP‘}Ž0F:¦8¸‰mœANQŸkåuTŠ4»˜@˜å©x˜Ã;%P©ª£AØåø¡ȳ¨ô±Ÿ/©Ž´¥f؊LšbÏÙۖzˆU™fsÌ|áv̽WÝÁî lB‘*k2çŒTtÎ4…`?RbGÐÊöІ
Ä:ÍMKTvÓt†¬l?Âê£æ̏µ˜’FÌ3f­[›±\ɴ„ìY?Â7I±åfÆR½æ¶y¾Æ|f¹³<«ãW„–J,a/:{ËRߙœQU›Ÿ,÷f ¦؍¸`~ãy„áPlØb¾h¶Øp¦9ÐUÆÎ#lݳ«.U4Ž«µØÕÐ9kæ֖±G.á„bbSþ,&ñ‡úB7j1°ÓdŽݎ£؈ð;NVkNšI#1štßYˆ}B‘uŠuôq8pÎŒ$h @èˆê뉰ë؋=Q˜ØTŒ,ˆ~X,l5˜â0ÝÔdŽÕ"\S’ýÊÐb±¬WfûŠAÅÂ]‰°æk3ëÞV$ÀlŠq„úDؠ÷ì·ɱ!„¦Dج‡“c=3_٣¼ÄýŠN„÷“í™Ë͹äJ?õqu7
8ϙæ„õ‹ó	ҀýfY¬¡eî¤'3Ìá"B¡ŒE؞¶á<NëB8ƒƏIÐøÿbOóí•?R'Zñc‡a‡öl)K<̶á7ê|˜6o˜©XДûNïÿ™fáS–"*ÛìÃlõÌ!<ZÀö!|èüì#¿€T"%vú°ÚÄ„#¨plÝ2õ03½èp,áoöݵ‹}ä¢]Ž"ý,M=F‰#8񎓞䚝»Vt"DSå
IÊîå{á4ËbB3ÌËéŽ5{¸<ÿç7
­¡›Qa'f[Âjx•‹œ ƒ-¬¢¢ڃ^áb¥šè•E7ˆü§÷<ì]„iŽSð­)5–c]ôpŠ1f-v|þn ‡ŠÓ?IAe±–šyIEND®B`‚‰PNG


IHDR66&L¢VIDATx^½Øoh•UÀñsž»6o×AfôB8Ò`¨™ eW½©`ܦe¬6Û(+h	

¢$Wþì_ÑF¾‹Þ.(rB¶A ‚ÿÖS²Ít›è¹¿äp—î½ç>çñÞË÷åy¸Î9<Ï}ž£WŒu´SgGþ Ã5ÆâÞb
¦âŒf3½Ì -F²š&(§³ˆé"}lÌyŒ'ØěôpÌè [Îm„|ÈJTѾE˜ …ŽºŒo³-ì"±…Qá4õ>X3¡"¤ÙÁe„9^	‡GÈЀŠT-ÂöâXŒ/ҼŠ¯ó=ÕÅ0m¨Y6£J‘;l¨§@Mœà»{ ‰*7ÀCì,„­GH“tPœC²:G£ƒ
øÛ
Íl-ª»ÈÿºK»sï„ëÔçÃܥÈà¯±ê^-œ1\†”ƒ@øÑ[ʬ¡zy`¯áÃͲÔq#L!¤²±8ÃìF;°C†ú™*«j~7ÜAÇÜv"L_À؋0æÄÆ¶!g¤É`cL3‚Ða1Î#lA9º&ÈÁ»rÔÄg¬²Ï!üIàÄÄäqg±n„NT%°3O•{@±á˜ «Hˆ®ÒG¢ õiV+VÓÏTN"tþN›ÂÝ-/ìVAì]„åµWѯL"üZ)l„âԔK Ü4U`fAV™)~`P1ðˆ¶ŒSÌqŠe¾k ˜D¨÷ÂÓOþØB£6g±´?փðNÙgö<ûyRюð©çž
2Ï Ë=0û¸z”‚2ßgšÖTæ	Ҁùg©։Ћ2ÓJP6,àBÒbœEØZ6l+Ây‹с0Š΃M"MæÅ^å_Z³_R/#4çÁöyaûPy[Ì"‹™v#\¡6Ó`:4Ít¸ï3ÍÂר·13Õ3ðRI©=Ÿç`v#û‰—J’&Ãöl¬\­ç:ÂQ”[Â3÷M=Ë,B/ڍÅæ{î‹ÚÁm„~bÅ]Ž!,ŽŒ½@†£᎓^æ&šÑ^ˆ¦Ê
>eó‚0’PŒñ^´#@Í.þZøø9¡•t2nÏo̶ˆø€KtÓÆ&ê¨E£¨¶Ðû\DLã´Rify_r²ûÄb#ÌÐEÒ1'O,ÆZ:èá4öU®ka	×C…é?ªÑǀ=‡­IEND®B`‚‰PNG


IHDR66ŒEjÝ$IDATx^íԿjAÅaÿ§´´ÓÚGðl··éíì}Ÿ±µ4E’>`e³¥¥بÌ^Oq‹[èbÀaf7gácAŽ?d,ð!""úg~¿Jˆ`s5ÑÏ*YêBrCݬEõá’F7ý¬Dõ 1+x†¶zÑÏD%Ð=ª{5…ê•ݼ™Ý!‡MÔ'”S¶5ø6ûQÈaKֹc™ý2䰝F tǾnÂv!‡‰ßaÃÒïÈ+l@d£gÖ}†Í@™ù;:;†x§ܟ™ÿ0†1ŒaØ4a}7óöb|ä%ìbœø‹…~Ç4îGß-þ+æ2ŒacØđµϰðϰ"aû ­žYüCŸŸì´<T_p-IEND®B`‚‰PNG


IHDR66ŒEjÝ'IDATx^íԿjÂPÆaÿwtt‹C§^B/ÀÕÝQÜÝÜz^uuԡ:œ²dt—Ăˆ%§ïð	ß !ƒ‡s’¾ÂC@Þø’
DDDÿÌõë¹}˜ÃZÌå¿FQ£zQ´zE‹Ã/˜,²%j©
a/b¡ŠKaà{Tµ€æÝ,Õ.ŽÏa3õ	õŒm¾Õ~êsØN…½æØ÷Õ~çsX,Q¨åطUXìs˜¹±qÖý޼Ã̃ä̶˰KV.ÃÎÃÎ>¾SöÏ,ÃÆ0lØÀI®AY¶`”²„À(ÏÃøÄ‰û‘k—_ÅR†1Œaۃ±dï2lb1lâ2¬
op|`ÐQάæ """"¢ÊjòãêËCº¾IEND®B`‚‰PNG


IHDR66ŒEjÝ&IDATx^íÔ1jAÅq5kRZÚS{„ÀÖ~K±·³ôž )ÝÖÒzÁÊÆÒR„ D;¾â¾B…fv}?ä9ðGÆ""¢'ó;y 	C‹¡|d5ª+07¬ ‘µ¨üƒI"›NV¢BˆUÀZPmXª¸Bߣª°WQ_P¾²{ƒ‘Úí¡êsØ@EÍà%aû
sµïû¶PaŸwì›j¿ð9l'Q'(ݱ¯¨°ÏaæÂÆwưä;ò
0)Ùș—aK"—aG‹aGï”ý3óÆ0†1›Là ïZ^Â~À(Ӽ„À('þb¾ß1‰û“÷ÿsÆ0†1l
ƒµ˰®Ű®˰"ô`›bÐVÎ,>@DDDDÄç›ó»?e„IEND®B`‚‰PNG


IHDR	~6zegæIDATx^í½	]ÅyþÍHšEH#4£}C³j$¶–Ù$yÓ’f“fF!6Ɖ7L°qlâ
ۀ‰‰	Äþ¾ωc›9ñ߱Í.i´¯#„)ãÄÆ&€À$¶B „$ï×OՙªSoõ½}ïísn÷ۙ©:•x¸º÷üîóöÓïyߞî?Iò‡ˆJÔU£®&uµ«kµººյY]]êêºúaºzÖ.Ú1ݸô ­Ç}4:Á[Išk”º&E\­êZqõ3®
¯þÍ(\Ñ=¯Öpõãw`ŽØ竫ZWµF¯׿˜^íxm»%s•D\óczõhôê‰éÕ,D¯ɑm½ÖÄÆW8lŽé՛A¯ձñå¥opŸgzi}>‡Bâp4`¾¡Ók•@Ÿob>?׋ù|“ß0ø<.îóà*â­|£/Æ%i^®Ñä&ߨ	Å7Dä‡<ß0ë…߭šˆy٠®¡ùaËx>/1?Œå½k
ù|[Ì7<÷ys>Ï|>ò
>oxþê—Ðü°%æ‡}L¯ÞX²|^‚o˜}^ÐóWM,?4úË%Äa[ùa‹Cßý°1–÷véâPh~Øã2ä‡Q>/ k~ãš,¥nc¨÷öð
S}¾<Ô{Á5?Ÿo”âó<Ÿ7Ôç½÷yôz>öZÀòî\òy߹ZÑZÕӺEõ¶'m§Çn8JŸΔ
yþWù²Ctqó>ºiæNÚ®Š­tâOî¡7ÕE£ï¥×2Ô'û®¸šöÒMÐkâ =®¸Ž—ÞKgE«ä^z¿SÌÿÙrˆ¾.áùkÉA£¸V)½5÷^¶…^R\§‡¹ðÿ+®Õ;
võڛUv5¾ßõBÏXÝóösé¨bx
sº‡ހ^×n|ŠkݺS™ÏzệàR÷þˆÒëe¦×õ»“{ÐT}_Sñxþ­Ï\êÚ
 46J£?ÆÆ×‡{àÂXTwù΅ï^iðU¬a@FãëÓëeh©^³Úâßø‡¸7¬Å`>ÿ¢Òë͘^g¡!˜áöÑW0&}÷H¯[b>ÿ"|>¦¸NDzí„Ç`LBkß}D>ÿ8W\/Œ/æóÞ×Õ=o¯„ÏǸ“Ð1ŠXÅwÀ|^Jߡg8?Œr©Óð’hþڮØoa>ï̌(9߀\®
Ð÷:|ÙBÀäð–ô¾©Ô®iÑòF=‡ùš·›À䠄{7ÄóI/®Hëöè;å	×t[½À}73—zõYpá߶GïUâW¾sÛ8ôH¯’ˆ«=½ ùt��oà߶yæÓòVèåŸo؏/¹ÚàjÃ{ù41ŸI¯V[ßðP¯i	¯6¦W(ùa‡g\ÓY¾J~8“Åa(zÍP¯’¤|žåQ¡ùüô+ûŠÆ5’NÉ3/õJ蹲5´ü×BË7è5’ŽäóÞ>W¢÷.¦—øü\o=@—¡A9Võzj÷ÐOCðy4PÑÛQÍǽª‡u
½¬øõþŸÑ×%æ‡èU¡½t\¬w÷ª)?ôi|Åôz%Æa¼–¦-¾æ‡Ð\è5šô2hù‡¿~˜>à™oüzÃð
.ÄòâƒôxO٨{¹��…ráßbáƒúŽދ÷ôÁñãžLãËä)ê=öÃðž>è…ïx†ò
,ΰÐë4Ƭz)®÷cq¾s›ñO…a|yâ—̈|ÞÖ7»0.×yoëûþƒ¾f©×5Vÿ\>÷í§Cyp½ÂôS2pÂøœáÒ4:ZýÞYH¯Œoo&Èʭt+ÝV¡*\¥ÑJÃ.ƒñúí)º«Ñc\Ïc%©n¢#½™^‰\ßûº<â:G”^æ«3Z9Ú×|vJ\Ý»àr‡Í)quEï=ڡv§ÄÕ䘫3E®Ò}£ѥ^)Ž/p•
ð
)>?:Å8ìv¨W)ó
zÉð
>¾õyèUà¼®1¡å‡.Æ׈Ϗø×+Ðü°+àüp¾C½æ§ÈÕ¢o„š†¬—C.Œ¯Îë6óä‡#õCæó!ùzöїÑûøÁSô‰P|=ì´1NqÅ{<cUƒîÌt‰­^®òå‡i<zØu"[Ãî¢ûéû’|qˆÝi*cz™®s¶Ñ¾û<zSÐ=¸B›åþ􏙸\ûFl|Y]Ø!æé×è2׾½°óÓ+‘ßՅèZWzE\/$ͅ}°ó
>ÃvÀJ‰ëìp抻$a'¥¤¹ð]ÁkW¡jG\·ÀçÓÐËõz€séÉ4|ƒ­ßpú\ùó—éƒØùÊ:™^¾=Wªò‡…ꅱ‹ԕ^ù<Wæ1¾N°8,Ú
¶ZÍѦ«?¾âmÖ.zØX¶…N¨‰ìZ¬p+W]\}Ã[›óë㿤›3p\´Ÿ®JDÿôâlæ×->H»cz]_D®zƕÖÕÅƨ"Æao÷9PÀ_OÕ‘«¡ˆz5S¯þZy3®<ÿMo‘ã°6P½êœ¿
àšç¹o€i“…úê`ê��½úqyîóàêÎ×mâÐ缷@Ÿ¯e\^作ÍsŸoÈ{^æZä‡
#ù¡Ÿß½,|ÃW?°_Áå‡ôê/p^n1?”0¾
䪐o_ù?9ÈGæe–ÚǠ¹n#`|mö5?DMù²§…Ì_>çàB/`¬ê	÷ZÑ`.Zù<a7“…ûèe[27̿ýú”n^. »ÁU,½ГRzý¦kÙ!ÚÉê6^ú<zl*?c†ò\(tZ5ÙÿÛWŸ‡^*¿¨‹CÓñMpÝúkú´cŸç\ŸÎW/­WšeǢú=ôù!_×3½¿T¼ßÁü°z}!æóæ+:º2v4bN¼	1Ï,†Ï7ï£X¦rá3ðYð*Ÿ|ž¯|¹Ð\ÅЋù¼Ýe^¿q¾Ëb?§¼ý>º+ÇØà…oæ˥¾ÃÏA/×ϕSvЙâ»ÀõyßÖo\þsúâ;bq²…^¾®èǼ\€Ïz¥
5A]«sHêZ#QkÔU/ƒ}1ËÓ;a
svÑ6Ó$s<Õ뗦ÈUeâŠ^{d.SÔUη^Xk"áۖÌn>鉶!jMY¯59r5Fg²W2½J"ÖÉWk¼©û‹“ô,Óëє¹&æ51Æ5%â*eqX	½¢XmÉ֬ÆêÚi;é§EˆËLã‹Å!J˜^1½Úrh¯Åwš2ך}\“3pUFÿ­1âêɁ«Ê1Wwt¯uѽW0®҈kJÄÞî|c­‰+æóÕÜç¹^9•³\.|žsÅô*ç†1®\õBŒŒw¬WWŒ«ziŽ *ù!^ۛƒ^<È7Z"®êz!6«ÙüeÐ+]®|£œ'˜±y¹6®*ÇzõF\
ÙòÃH¯†H۞œôrÏÕ›—+Lù!Ƥz­Í3?§ñù
ž:öù‰ù彿ü0G®µEˆËrôúù|)ôŠåm¹Œ¯´óß+y~8Žå½òîHƒZÜ{l^æzM…^žpMÈ5Ÿç>oÈç7ÚçîóØÖÍ«5q8J“öÈç™oä”v9öùñ9ޝö˜Ïkõòf^æy”ùèµFVàù!´l—ùaUyT¼<b(Í൞ä‡U…䇺z÷
ùa4`ù¼&?Œ|>·:ÛEˆCê65,?dõ(–G9ÊQKFMºýÏÓ®Lu¶Qæ‡ÒäR=€Çu
ãgèR–f¬۰|¾ÃuÝ5r¥×QS3NUt%î™Õ3ù|›k®ÖCÔfâÂ`8nOõ¶®Yvˆºº ©š|£<Ïúüš´õB¸N(®A,†P\¿í0ÍS¿çz•Çò¨¨nãN¯ö!jQz=bˆÓ‘^×-9H:†hnüÈ<0®8Lµª—·î¿_¥&òCøÆâsãë%s†ETêÞ{”^
`‰/Q¿›­þ[7šýø 1Ž&u5/G>ÿhÖfwtDY³Úå\J›F¥sEœz!FN˜_ì~^±ô‚oT
үz½<¬×⃴\kï§qñ£1æf?ŽæÃ_†¾ù£w?CSÒäBÛą{ŮtðCå5MjFylŒV€ÿM½æKˆCӢ$Ä>>;Å8\nâÂw.,؊â°VÅ^åð{€¬êw½ÐǴ™Ö9¨y2M.Äø÷ŸÂ)dtÖàóÛà‡ð<øFüHJÄdô»^ŒAŒEÓâ8̙øN‹Y¸ÿEú0î2®í‘^Ýð¾¸ÏcQ􂖈ÕÐ˰Hs&æN—Ï_Ð7q´aĵqŸÇ!洖CQB/æLx±'}½ú۟¦™ð>Äa|aæð¼ŒX…ox²ŽhMŽÏ_µÈmy_Ú!6‘‹`±¸rðù£Jßö´ j³üÅ~¿Él!«§«\=w7ݝiÕÌ
“×<W«%×zÅuÇè\Š÷¯¸ê²p
Dƒjj¡«ݣéšûé{ôzýüýôٔâp ‹^àšlɵ„ïv¦4:8¬~Ràª7p-M‹Fmq˜…«/òj‹յàZfˆõú"û!¸[rM6põ§ÄUoø̥	pµôª-²oô%À55òžã«?E®pbbžŸOÂ7–¸ê\åQï?ÌÕç‘^l^NC¯GzkŠż\ãh^®O9šÄâP«—£|£¯µͣŠ</7|~	¸lâФ—£ü÷4Éfþ
4?œbš—Ó_æü÷h™9çã0ý|¾ց^KÀeé‡-†ñ5¯(zñù˞k‰¯ù!b*¤üÕÙ$åóu)ç‡àZì]~åQ^æ‡öu€«|Ü6$Íõ·ÓJC¾aëóàZVl½Pó7ðT³ñpÂù!<§¥Øù!š:™v.@¯àª_Ò{yÚç‡éû%dj,£·£z!w©æöZ4îlô*v~ˆݕ²é.Õ|»Èb|9É¡z™zSŠëN4W¡—…Ï3®ôõº`?}ª4KbqzsàJ+J˳õHç좭Š«¿P®'_¡).êèÂç3Å!paqh҇…ç`Œâ»SÍÿ-Ū۠WÈ␏¯{°Øz…nçí¦éúËʏ¶§åàʢ×ipáÞÀe¡×=™v-ÂgûŠ=/£—.Üc!»ˆ!†‡ÙÆ0²¤Ø×ÃÑy?Òqaþ²áÂ&>ٸðÝ3Ÿ_r±¦±Tè.˜ðRp•dÈC}½%…æ‡Ð‹ßà©Ð+æP}=C>oŽÃٻhK6ÏM+M}X›¾r0øFÆuDÖãKŸl/Î"Ôê›Ôç­<L“öҭ™1Éa@&ĵÔÀU–àVºÓ÷Ò72MdJÔÛÁU½ÎWÂzý¶àËÀuW‚\Ë2
¬¤õ"¢1êZˆ÷¾á(})e½–fáÂ=ŒMšKw|ÇoOÑe [±:Ï)1p-½$̵(Ëq¸0a®²ˆ«?ר„¸–™ëƒ^£R_›RˆÃrpeÑk1ãJÅç™oÈÑˇç'¬×X¼§I/ió2¸L~X$®q/iû<×KH~ÈõZèb|ñ8LC¯,Džá^JÊ7Z>Ÿ4ׂ,z-)ּ\d½ZÔk‰A¯Ä}ޔ
ÌçËØüåÀçSÉçÁu!¸’_#ùa
~8ÖU>Ïë)p-ò@/p•§áóŽó
Œñ²óÃóå凿ºMàùá˜ô��xs
µH캰ë]©ÑkAâ\éç‡à*G3RWS¾é	úlŠùaúzéOAo=ô
’®ۤ‚Kõf~˜©a®zßR¯©IX¯Sš—¹^wfà:…ÞGÒz¥Xâzý Ss=8Õۙž°ϟoå‡öz®ÝC·-?L3Šèó‹Ó_hú‚;…ɹ^wK/xЁ¨ÕaB/øá7UdVÍÿOÂgLØF¿;vš.q-K‚½Á,ó¸þ	÷’¤^xÏa.~á;Nª_ù¥ÇèÏFáØ?ͱ¯øn“䂷FëNgâB¥ñüuâ,½gâ =ÏV÷ðIÎˈiŒÙL\svѽà’V·i¢™õ{èÛðZúõ^®Wiqâpq±úz_J¯ïdÑ뇉q™×9”%©ri<+ô²~X^™j…º*ÓÚ6
ÛÓMßItpê÷÷áÁВ«ÃW¶ÌÀ5”׊\ËÓÖKqíÏÀu(®åY¸*Rܾ¯|á>ú×4‡	¯¶”¹*ðßwæ
ºDM?×ÔtĒ«4W;¾Ó4õÂgdølÜS©m:ԫ=‹g•Øú†#½*žU’’Ïw¤ÌU‰ûOQ¯åY¸*RæZ™å³KRœ—+Ô¿—æø2Ċ5—‹<
c7K¬¬L•+}½ÚÓòCÃحp¥—p®6ór›ã<ªDp~Ø`~X	®´|á^•i燎ž+Çrkßpà‡,Ÿ*?W‡¨üp$?lwv€«Xu+)ÎËrë6æùKb~ˆjáÃõÈÉ;è¿pD`‘òÃ
ƒ^V\ªy¿®æ:S՘±ÀMÏÛs¡žkŽ®I3ß0äQ¶zÉPû?€ހÄü\YzPÑˑ˜‚½‹L½å%1?üADžøđrŽ|Ã>3ë5¤ôjvô¼ܑ’‚ë0Ɨ£|cEZã½ß4¹p$Ž üû_ÑRˆÃs2ù<Ž2Ls^Æ{ÏÔôÍqÓëoÒےÊû~B·Åß_}—»ñ¦Ņ9Ÿ‘ɳÒZpããônÌËiraŽLqÃrÏ)˜Cpÿ†õipµ§YßÀ1—Yr‚Iġ½Ë`îLq|-w±Þq˜eî<.‹•lZ±úÕu^bæ-[?ŽՈD] ×rû-î�jO7Èæê+²^W€KgŠ\+2pÍ)×[ЕØÕ,Ã$6:ÁbԦbrÑl|—Øþ–¯„¹ ׬"rÍÒýU’Dü…@aq¨ç*²^s#&šQ	úÆ&\}ÂFIõ
Ì)¸:,¸:\û<>s¦!“Ê7æ“+M½x¾!\¯•®óCŒeèU?ìƒ^"¹ÌóòÜb约J
>?»Èzm24‹D懆yY^~hŽÃßpžÑçx0­´åJ?ßɹo8¨G	ȝæsGòCk?œ+>?tŸGÍJr^F
«yýàÁô¡òC԰tMXo#9?T÷?FDžšò…èrwy”}¢Q£ãRÍë9È7l|ƒs
i¸N+½>&+?4ë…^ÔùûéEÕKÏÕQ(þ@_£¸>éA¾±Â*õG;]-4?äzqßø”»|Ã^/ôuq¨zˆWy0//·õ
¾k”.›:?Fml†yù”ê~¨X\jNù0>3ÚÝæg§þHf[·áyï[О(ßøH¹>ªë/ã;G®'µ¯‡¾9ƴa=€¸z/r€ë7†,¸:=Wò#’O'̵Òu
9@®Ã"×™õ:XÀk ºÔunžçÊ~Z]ÿ¦®íêú®º.Wה|î¥õ­¨ÜJÇt۵5DÃխ®ª<¹>qáAûÿ¨ëÃùrµQKÅVzA·][\K3èUUl½À5n+=«Û1!½6¨kBïѐkjž»š-S\ÇtÛWÀբáê,€۞ÿ@];"®+òåºæš®¸žI1׻àÂg"V†ïI"þB‹Çáø"Å!çêÔÜÏ2.›8¬Oˆ«jX/v-IhþÚàÂç‰h"¼X·]¶…^IÏ_—ÈխÛÞ<!½:ñÆ׹ôZ’ ^]Œ¯”õê—Gãkq‚yÔãkBʾщ˜p1%èóKš—?ÃóçåòÝ\ãÔkiJùüGġq|%•:ô%:.‡yTgšó—C®î}¾+•<Ê}~؝—û|ÞQU®4óy‡\)ú|—‹zT4/w¦åóîçe{®áãq´ÍÞçé
–ZäQnóCUsÜÊëu¨M.?LK-ò^çù!ôÒp=‹šrã˕oèŽÇR=硗äçJô`t\èÙȪ˜¹T¯æxÛµ:¨ÛòC»ñ…”_ow”Gu&¤׏2èµÜÁøªJP¯»uzµ¢•Žò¨
	è®Û5>ÿœò6ã‹ÍËVzݣñÃh^v’nHê9E-$ˆ{³žAO´Ø}=|fÝ:øôktYÏ_¯þ‘ºÞy-,6bD×_V‹Œn-€k™îùËYß\ß_¾=~Þë:ëh¸îv×w°÷yx0æNƒ^Öuz½]éõ‚a]ŠUÝÆE?Eåíôº3_¨Úƒ«2ÇŽºnSפÿyE]ŸWWI>[¶Á<4[=~.®:
×z×\j}Šsa%_z•û¦×Â}ô…<<çº8½ÆG\ofᖨ¥yp͞°~c‡µ¸Êóàú?Y¸^U׵Œ˸5§âúµ†ëúô*sŅÏÆ= IÄ_$‡	Åá«ùÆ!b��ZË8\Ÿ°o€«$ϭÛ×kî«^òü…XÉð6/Ÿ¿þó«2W]Þó²=—Ùçí¹jëe?¾ì¹êÅa­õ¼ìžëâôZ—ϼœÒøZgðyûyÙ>ßøbBóräüßi®†$òC‡yTYzՙãÐ~þÊ?߰Ïeåò¹Üç‡æ85?t£—ü<j$?tïó¶ãË×yÙ&?\°®ײÆo£ç¶<K—&œ^[캍ªÉ}ž×éP»CmÒaÞ[‘€^ׂ…5—ÿµd‡Ï)ˆÃu–z}N£×oÁ%ë¹Ò̅š?¸äå‡f.¯cÁå:ßÀ.%ŸµÕËb|¥¦jù:._%8Ÿקu\8*P\eöù§‡Çæåõ)øü¯q¤ž›<Ê~^æùáæéŸGÝCo‚«}ˆf:íëÙs5dÊç]q)ϚïÃÖî¡ÿí)º,¡ç”r‡}ó]ß^ ù¹zéÖ9`®µ¨8_—‚\G·.ρ®#ºÆ—åøâz™ÖG™W?0¨NeÚ-ã”ÛÏ]ùšVìñ­\ô’W«÷3®®<¹Jƒ¢aÅçÂ_—äÈÅõÚàƒ^0E¬ˆå\Xٜcr½:ó˜¼&åÁu7¸ḷä^:‹¿.Éñ¯\ú5zU8ââ“Ø1΅ÀqX–×/ÓàÂ=à/×ë¹r9ˆC›ÅDýw?CSráòÌçùCX'ç‚'䔴ê}¾‰ϛš¡AU~Øí‰^àê.P¯	–ó򤔹:¹^9rU¬׀GyçêJP¯.ôêÒée•º_eãk‚°y\sÊõzU¸ˣÌó²U~è^¯2‹y¹ʐo¸_��¸÷ù„óÃnŸç/½º=ʣºÍ»uz‰¬G™óÃñó²—·ù|§G>ßUˆϣÆش—Ž<|’ÞҼŒ¢JUíJ³#Ö‹<Êy~ˆ^P“³XÀôò#?DMXÃuÍe|Þ2Ïð{PCöø¹²ª½Pë—À:×ë4ß9
=ë6U¹캂š7߉zIÎe_ÇÁ%¹ΆބÆŸu:¾ÌùÆø\|£”ûF~óò¹ê½9åQ¥½°¡‚ÇórU!u›þ‚¾˜ç¼üKOë6>Ö3ÑÂÕ-gޠKbzÙÔ+=è›ÏFN—àz€.èåúŒu‹þ²—õ(p!WխK±ÐˏuDšuˆÃÔõâã+ýuDg±#X.çV®fPÌpŒ`»b7Žmÿ¢®5êZ ®Uêú[Á÷å|·kã‰ù¤íôγ4p­՜:RkmŒë6.˜„†둁!¼Y/Îå‹^XÅϝ8H ×&K®ïF\ó“à‡ââz…^Äáø<¸öÄîù
p'ÆõÏ6\0?~ÖtÕ =Y„ñµ‡éõ¯1®w+½NŹÎ¤£ŽâpuL¯oÛp!v†Ïr?vš.U&¿]Åá£úF•ôZké<qàgïãýG¸Öh¸&&Èu›%W•æì}h1Êb^v«ç²×ë\K.¼g³—i¡îê¸ú/3×ÙãË^/>ùä‡6¾yŒ/[ß0ÏËöùÆj–GYÏË	¯ñNó(ó¼|ãJ#?ÜmÐëێÆ×ZwãË>åçöãËC®þäóC÷yTB>ßç—…^^ç‡I¯ԸÜç‡ã=ŠÃ	ùŽ/Ô>P;š”ǿò8]'`^6r-9HcP³Š×zTMëԶÜåQöó2j:¨ƹP[m¢·ºË{íë6ÐKq=xN¡ÁäùøZmÒã‹qÆâ"ϟ+×äâ¼!ˆE‰>Õ´\f½Ž2®Óèax—ÚëuÇqz4¾Î-ÐÅýNùÃG¹oÀ%Ž/îól^>åÞíëóêD™
JŸmŠéÍá8Tÿ{±
ϣöSÜ÷õìóCÎuQÒõÃ$û°×<BÓu\.êØI÷ÍyyÚNú©ôº
<Œ¯s`}XWu€ے悇Èu®/z!÷1¬#²èë¹ˣû”֥äzÇÜ< 6°E)3¼nºÎF¯;CÄV{›·Լ:Ÿ-͈¨֒k}1¸p¼£qk=óV•³=Ó[¨—yKÇ9ypuæÈuqŒël¾\o9@Wj¶®¼.Ïñ5ۂ«7Ãë.b\sóáºð}TsDçóŒÃY\ý)q}˜s5ï£òŒù)ÄáE6qˆ×ÿý¯è¶ÑïØQ–½óùÆיB¸Œ[/›·L—·ϛ¹֥ÀUŸgžg¡WZ\çå³e;´´äêä\iø<Ɔñˆ3³ϟçÅø2—ÚçåõNâÐÌU«ãr4¾ìõ2ç‡îǗÙëìâÐ}¾ïÚìf½|á2ëåžË2gå©W­ƒ<Êb|Yùüyò(£ÏÉçæ™68È7Î:˜—%q5¤Xg[ïi¾Q+8?¬K3?tøœR›åȥ/Åk!8Âç?£·¹—íó(Ԫxµ:éù!×—ªi}D^~h>ªMÕ¯rûœb¯ŽÑp}ÊÂ7åQf.Ôø…ä‡uùpḽ4|>…ù«Þpä-Ï»_öó2zcº8”^EI7	Éçå3¾Ðkr7¾ìë½üyùFµx~ü6z\^äQf®:‘}=sݦ1¸ú¡¹PŸ4WÚ}så	þ2}š8¯د߸B³àzCz_B® =Q¾^7=jÖ˧<Н#2® ¢ÑêêaPy՝1°›
¯ý›ØkÙ" óÏôt_¬lX}„ª2põ2®v_¹¦i¸Ô*Äs4ŸS*L¯!
×DcÚëu“áµ7XrÌQ/pmd\myrÝ»ׯäÁuM¾\³vÑî8ר-trÕª¶ÖËÌõõ4¹fL¯—‡Eð›RÖkÓë÷àÊÑ7VXp}=MßÀwÎîµÚä‡Ë=æêÐp•æ¨×JA\½žèuƒ%׊ãzm‡Ë-ôêð˜‹ëÕ
mì}Þ=—…otx<¾:r_c4\mÞäf®àÊ1?l÷˜«Mãc\ûçJ9ßèã‡z½Fä‡þÎË>¿Bžϻ÷
ó²°84ëZ…gèŽ!ºÍ	–oˆ~þB­µªxÍ`j#.çe{߀^5Šëdœµó¨vc~Å!j:q.UËÚ/(?„^ct\<UMõ€€ùËä砶ȸKȣ¸op®Š­\/ºOVMq3®C‚æeøF©fg‹	_EÔë†ó
î'¹z¬×Ê\}Cç‡RóCîóL¯=òòCsÝæùӴBP}£×"Ÿ÷32×{ÕÛr¬–
ê§`±ÿ¿Üp”¾ZÝf†šƒ,Öo¬ð˜‹÷ÍOfê›KâÂܚÇ:¢RÆrWãz€èƒæk¶Ò+Ïì¹ØÍÎ5­f½v{¾`8§“Ÿ©ܴ—nÒ|N£†«ÂS.µ×ķj›¿ńk“ÏzáüQèŸþփ8œ{편jGç¦W׫€8<»×9ÅæjÞG7k>§ÙR/ε0®øÆll/ÌôúZzõC/Oã\ó°=>[½ü#—½.LÓ7KÃ[ÞþûKôA5yÝqáºÖ䇑^•\‹ŠÀŷ^nÌqþªôX¯
ÍÅMFŸ·×kašãzi¸šuz	_ã4[Ñ7ZÏËîÇW¥†kþÿ6½x~èñøªW.¾á ߰åâ>?ßB/wy”Ùç[èå“ÏoÊÅçÌ_öó²Ù7šæQú|ì×8߸¸o8/W8ˆCKŸ7ǡ®¾òM–\‹<É7šä凿8T5/GG½ª
Â?üͫônÏã°2½Pó`G.½Šڈ°ç¯ù®[øÑ_C4×ë<ʜ"ÿŽ‘…š—{½P³çG¢ö( ?4Åፌë´ҫYXݦQ‡73®³èÅÈóÕëLzë«üÈ@ø†Ûñe_·Am›/åóuëU™£^7rŸÇü%'Òsýà)jU;ýì-A0ŠCpɬc›û)Òêl’ûzæú¼ùyYXý°ɢŽ- Ÿ7×Ù|õ
x?Êž.½_‰¹•ùˆgcJÓs[Gt‹ó>¬ýúFèÅãPwve'[TÀ`þ9•ãëOE¯ÿ?)à§~}'6n+ÃY–Œ«‹q-ô«vÝçªÜJ/è¸êõíôê´Ñ+ºàz5I½*¸^D%êê¶äãzµ\{éœ紛âЂ?¥ypý¬®†½ôOœgû2½4\^Ç!ôúGÆu|ݏ©̠×¾ŸÑiûƁ¨uùaڂ	ÚࢸS잻À"]/x›Žˠ×ù–\¥i/ܣ‰Kãó‹¼Ð˞«S ׅìž;s_p]`ÖË~þâãËAæ¢ׂbä	û|·Á7œæQî}ޞË|l=9š—Kz]('2ûÆH~hŽCO¹	ಘ—¥åáç‡xvF퍻¿f‡®óyÔ:*j"nçeûüµ)Υj"ÿ  Òå‡\¯ãõZ-QÃA-'ΥjÄÿ,à9e‘‰KùÆóq.Ԉ…Öm¸^ÏŹêöÐw¥ç‡ð
îóèUäêÖšÍø>¯áú†È<Š륙—rufʇŽÓåËюX(T¯„ûzc<©o”ˆìëÙ?W.G-Ôø¼I¯Ä!ç괯º÷
xöðbäÅi÷÷þ‡.¡Å×`Æ\,¼½¾Ÿtýåniý΅zñ,ÿ€šUzc,{9Ç׿½þ¡BÀV¦é|©· Ëbï?]³Jo¬ç\ØõkßõKȟÆÞ璠WûÍ,ɮ×L[."šèƒ^ÊßÍƗ8.eÓÀÅΚ_½ú-¹¨H\5l5,皮á*ó\/øád,Žbãë½Ì7¬¸ðãB/þE½ÔUî;Ɗ毦™âP×X
×C¾1V¨^3ù†®2Í_M7å‡Bâp t½ô¾aŸo8ҋsÍH%?tï‡ә^¡pÍ4ä‡cpi}^\e‡B¸Æ|ƒsõK͹^"ó(³ÏχËìó¸ʳq]ó½åøºT`~XËĥž1ßÃwKAMDz>šã:…ځÐüpfŒë\¯UGhªÀ|ƒÇᥜµo\\¯÷òݣÀ€^ªÙk¶ôüëUÂô’šÂçùn_¨éK×5mÆߘ,=?Wˆó2|C7/KÈuy”©O$U¯¤ûz#\©úüLÆL=ÊÔ'’ÈÅõ’X‚g¯¹Ÿ¾÷‹“ôVŸ—އ6Z³ÎAzÝzÖ9hê6þ/ä°\/<Kf;Gv)~ïûB"üÌÙE[ã`³vÑÎØû·2®%R¸Ç ?›g,U¯mYôj³ÕÌ.赗é%’kînº‹땅k™%‘ë¦×þ,q¸LŠ^çí¦qßÈÂÕjéä0weñù)\ðîáû~ú5ºì¯¦°ñ%ž+ºÚù†®eìÞۙ^b¹ի…{ž!ߐÈÅõê°Õó—/\©ä‡îÇWG z-1è%2?„Yôj<//ÎC¯VÁùF«!¥rµËÌ;ä¼~~ˆZՎ1[è•о›ž kϾ!j|µfáÚæijuùáÔ:b\x¶šGq½v2®;BÈ7f2½T­qKù!×µüô×nV«Ú&x^nû<ç
¡ÅõBm8„ü=ˆ ¸Ì>gù¡ʟp‚ћ1®»­³-ŸêóùÅ!äQ˜ËDÖmÌõù6Éu6ë:€üúaK(uÁ}Ø;X¸#½0×2®ÝL/‘¾ÁûæÈ	ãۘmd`“òjV×êú«×køߦ+z~~ýï+òÝzqÙ!êbgb¿‚-Úe9·F
×҃Ô͸þ€mÚ2pUâêçza»@"*±äZÝÏçâZd‡\¯¾P¸ðW(l|Ùpý%ã¢bqµ¢5L¯W‡ôš,H¯‹™^¯Ÿ6r.Kߠ"ùôZËÇW–8œš×'ŠÁõä+4åƒ?£¯×à/C
>_#E/x»w°€©Ēkã*ªo 7ÒséýP×dvï}1®œKÄøÒseTãkJ\“,æ/×q®C~(«&ߨ‘‘Gé¹bzm´õyp	ðù)‚|¾:ŸŸ,4ßà~Ø—ü|£:“o„ÆeȣDåÜ7ð¬‚g–ø³YÛ­–åÏñÌÌwdzµ 8œ¢‹Cp¡ÖxV	ϣJT–+®Sq.Uk\/:ŠÆ×Ki¸AŽ^zŸGí¾Áôêêýzõ
òÚL¾yPT¨ÎÕç[Q§Ð|ƒëõJœ5TéùaÄuŠÏËRÇÏx‘>4ð }G5žFBÐøšªåÒת¥ç‡éôõÜ×{åöõÌ}‡¤úzê6ÒóÃ\Så÷¿ôzIñy<SÅv|}}Þnz€õõ$ÖÙ5ڰÞFb\ë×)äPšD$¯‡¯+Õõ&%ÿó׹ÞÎâ,ÛB'âp€Õ<˜uyÀuu>\c·ÐIƵZc(ݒôÂ`*ÓsÕxÈõ©<õú= ^ҹ0¾؃ñE:߀IæÈõQ×\Šc”âz‰2à\WúÀU±•Žs½2><÷
Îeöy÷z½É|Þø®|¾׵^ùriÎ1Ÿ¤óCã‹ßGOp¥ÏËøќc^­óyIq%î½<q7ä‡R¹ÀT#.Í\ÕÒóCüè¸p鞿¤äQÐ+Gßè
Äç'鸄ù|Wq¸Q Ï÷è|^Üüež—'ê6!Åa—4.C²ùKôøšÄ‹¨ f ‰KטÄ3sœ«b+½€gPáyôêæzyÀõ)Û|µ6¦W>qøQ_ò
S¢v*@/ÓüU£ãBmXøó2âpUœ5|ġôº
|^§—ôüPãó/b|I¯Û`q¨tŸ×q¡6êá¼|uõIžåóoZŒ/áõ(s~(¶¯gÖk²Èz”¹P-µ¯Ç}Þ\·‘ŸŠ­³™õš$¹¯‡¹VÍÁw}ü—tóoOÑeÙêQÒú˚uDëCèëéÖàæٞ-û4¥óóG¢ÜÏÄç[/ØG_!¢&ÆՖ×k>pᘶ8WÓ^º‰ˆæ3®VizÍ`[ÏßG7B/éq½4qØÌãЮ99s1½š÷Ñ͖ãëŒ3.îæñÕ.Ðw±ñõ5ø|\ƒ,¡W“×k>Í_||‰óyó6ÙMpµp.ñó²~«ÞfËüð5O¹uó—@½:Ãü@â°]§W€\ЪY\e_M!äˆ1^Mpµi¸Å=/›õjÔæóò¹æ䇲¸ÖÜOQ»ÜüߎҗP0͓ë5_ç/Uãø2;"a0„üÏ`Œkgù††k{ù!j7ŒkwyT³ªÝ܎êØ‚¢æ˸öÀÅǸöKÌMz¡Æ(Ðç[¸o(®¯r®@âûá¶|=ƵC(—¹~(??l
´nӨ«ÛHå2?WʯGÙöõ|Í©GµŒÔe=/‡èós#±u)"û)æu·肳>¦ÓðÏsêúnדýä³ÒX%ƒ×ñ‡cMpÖyÂ՝×��ѫN ^¼X¸X`.÷…«\öz¹ç2Çá.]±T חxqW£Wƒ4®…ûè9p5
ô
‡»5qØ Íçí§Ïsßa^þïW©éÖ_ӧÿü?è;†hKë!úÿàóҹàá<4ø¼h.éã÷̋4¸Ћsµ†oè¡è|C&—y|	äªÏa|5Âeï‡î¹jsàjÀçÁÔ`¾Ñ¶¸—¹o´ΊGÝCo.;DWÀզù£ËëúF£F¯q.õŒvMù!çBí4„üµ‘\f½חȣÚù'6ËäªËA¯ëC˜—5zÝB~Èç/ÔâB¨ÛhæåkÈ7گxˆ>Ò>D[ç*·ҋªÖýEÑ\溍ü:›üçåÆž+ëBÈ7ôzÉÏår™ëóÖÙڡ—·ýʑ~
çj¡¯‡‰/*×èU+l|¡¿ü9Ƶ7¸†UçöŽØMú“~{ÏÞBϱœ´#¢Ռ«F WOœëÜA:ªÑk²p.èõHz-9H½!ê.®W\8Ú1Î5q×Äá”Æ×cèu1ãÂøZ€vçà5ÒçåêíôŸ_âò
óùíkÀ%=5Û|ƒiMzÕp®ò
ÌMš8\T†¯_SÕkr¾±VÃ5ÕK®½Ÿ—åûaµ.Ì7ÖâŒ#ÐBâŒq­€k
×µ\S¹^ªÆñDœG‚…‡úñ%??DMŠéÕÂójˆú!|þh zññµ^j¾aöyù~ßàÇûšÖòœ²&Àç”UÔ'ú\9Åô\	®pô’_g´~Xãº5¢×H?eùazç¬]ôð[ÐÞ
Ð÷®~˜®¡Άg|Þ7םç^!
lÅaªåç´Q·t®Ž!š˸Žk¸Ê°&ÆuBÃU)ëm‡©A£WCéz•m¡—оѨñžâpÓë¤Æç+ðùãè5;‡ù«<½äÏËЂ1tiõ’ÏÕ¶ôª`Ъ'D®@Æ׸¸*rUªçêÑp_ÞrõòCÉzõ‘o˜ã°|d|ù«jñ\9zõ"§s!ça^Fƒs…àóx¶€kœF¯—â\¨Y…à‡||¡ÆÂøâq¸ò0-D¯Cô
‡CTWj£Ì7æ’o¼Àôš;’Žäóê!Ö7ºðïC¬Û\gë	©¾¾^ò¹Fê6òóCo”Kï/ãYo6ÀÀFIxJßJŸˆúã\x4®wÜGåq®Ò{é,ãÂU"k´†k³ô8\{?‹s•„£Ã3ÐK:WûU0½þ¨ѫT׺S™F¯ázaåòæóo„àóàbzÁ7Ë(6¾^‹t½071Œ­>éó~C¿6?”¯×æ|žƒ^%Aè…K~–r½ôù†|?Ôæ‡òÇ׀A/É>¯×K~ö˜oô-À|có9Ûèùsé·3vÒÖ„’"§ç¨„àxfŽq½‰g™|~3ž™Á»‚È7ðçB
$½Pkãã+½Tr®sBÈçUí&îˆoÀ7øø
ÁçQkãz…8/ÃçCÈá‡\/©qÈ5´nÓbýPW·	´PH=j :ÍæÀõ’_?4ë5*PŸ/ñy9}=¼Nzv4r^ºI"~ø27©\J¤ײpõIåB‘sÅ/Á\”…k@2W¨z…è(¬Œ/9\¼ʼÌ
<aL‹	uš\ª9ùߪIù˜-ô*æhÎ%U/þ`Jòîóaé%?9¿Á½„pÉ×ksˆzñBèȼ,‹‹ÿA˜`®MY¸N‡2¾øN…âóüŒBÔWˆzá
Q/Äáˆ^¢æ¯3ä‡<ÿè¼|&”8ÜuŒ®Üú,}ì[¿¦Ï|ã¿éj©u6púüµ)Ð甁Pëê‡#u€‘zÔÈø’Í՗…«/Pßè™—=î/ãJŒˆޥ®G£×ý§º–§†¬a”H®’{
8„raաk.Y¤FâÐÅÂ/©\(þ/ԫ?Ðñ5 x^>eXÐ&’‰TˆqÈm.üPfBoæ’U¸‰CÁ\ò¸ì¾ê5¨^ý’õ’Åe߈EMG&—yA[ˆ\¸Báâ;KÎCÔ,†ˆb¹Õk³8?´_0úÇýór qxZ¶^áç‡Þ×Gž¿úGê²ü0p½¯o„¯WŸw\#¾Ñ'h^ɣx>ŸæmD4]]¯ª+þó²ºj’?*Ë|Ğ4.¾E[)㣗ù(º³º-+¥Ç!Ž•‡üHD~t t.aÉ5!è…#GyAC¤ϛæ|]ë‡ò}þ´aKsÑ>”^¸˜ÏËÑË|d€Ö7äs
¸òy™[.›¹œ±'?7ËñCû#dơùˆØ@õ¢^à
Áçoû
]}ýcô¥¿|ˆ¾vÉOéVä$!ÌËÚ#ŠäëµY{¤”|½úùÎÒÈùCˆC®ž©ep™l“¯—ùˆ=‰B¢†ȸF‡ohŽæ,!Ÿçq(4?,1‹y9½ø <H¥!ø¼~A€|?Ä`Ýf ”ú¡Ø:€ýQt¥!ø<جÛ„¯—üú¡¹>/ßñù‹ú¡4ŸïãzoôáÝì—	‚}€ô?ïKìm‡i^<y¯ÜJ/h¸ʥq­8Lµq®Š­tBÃU)P¯ٌëÅ@¸4\=œKúø*ÛB/… ×òÃÔÄô:Ž/ÜáL¯—¡Wh\ø<|ƒ¯ôꢹšñÕ€^ó4ór¯t®îhê²C´ó¢ûéûïÿ}ýoŽÒgBˆCÜ3cè
”«GÃ5.®îò
Ü3ç2䇲õ’?¾Æéôò–kD¯Ê¸ÊЫϖñµ\å\/äˆq.ä!Œ/•ӟŒs!‡A¯J¦žÑBÐ9=‹úòCŒ/‡ÍÁè%ß+¹^Ê78Wc\ÐëEî‡!䇨Ýð8d|½Àõ
kúNzhînzè‚ý´_->¼ó¦'¨*€y¹7|¾<ð|Þ\¯WçÑË[®ސëlÖ7zÂÑËìórUêóú|yzõ׫Ù/k{w1Ànšf^þsúW¡.ÚO‡šöÒv"Zø¦HãZzÖŶ&m§G4zMÈÕçš8Hª×cÐ+®ž8׹ƒtzIÃe‡¨‹éu4„ñµø m価ѫz$½ä‚^Øòs•ðy; nÈÁç«úÆÅŸ퇜Kz"ÆÚò
hÁVkãP>×Ú½¼暢_kðɁê5UõfD/9\Èéãs5r’æeäˆrA¯Çâ\¨„‡œ9dóòÅõ(ӫ/D½‡!ä‡ð
¶#Qoˆzá™:€ü>ÿ+î¡ÌË!ê…Ú(Ÿ—Gž¿Då½ՁÖmjˆÃU¸‚ˆC³^“‰C}_O¾o¬‰C1óòê@êóSÕkòÿb½ªCÈÍ7Öà—íì—õ	‚MP×3êx
[´Õ3†V\ìw
Ҹî£/ƶf�DÔƸà„^ҹì£ëâ\3wÒ^è`î€z}™qíÖpÕ	亞qm—tŸoŽôb\­êµ38¼.Ÿ¯î‡ðù=!Äá¢ýt
×+ŸÇ=‡˜"ÆC›Øüs™õjà9¥]?/Ë_p5æ0¾jGüÐ[½ÀÔ2ü¿Ÿ|…þüëÿEmøF›š›wÅçj•“|!„º
rú8—Ê!¯
a^FN WjŒëË!ø!r_Æõ%\µ&ßÀ3u ~È}ãú¸PCd\ׅ0/s½ðL-˜Ë</Ë÷Cîó×ÀզÉ{kCx^Öõõ­ÔZ·i©Ûð‘ú¡T½êáj°ÎÖjÒK~ýP~šçeùõù@òÃZ®~ÙÄi	Æ_·@]XPñœº¨ëBü>a°>Yi¸ÚSäڟ—¦Xø°q.izñ‡þùûè–"êu,E®m¬¨v)¼¸v1½¾ªó
¡\\¯f>YK㚡Š…Œëæ|lXވñUD®ýEÒqØ$‹›öj¹ZÎ_ƒ¾á3×ëÝË´8|ßЕ·þš>}æ
º$–rßèƥyˆl
!?Ô<lÍ™G™¹šp‰Ë7ÌqØ½¤燬¨Æ|Cϛ¹æëŠoøaã‡N½‹öÓIƒô”šÓÞÄ'€˨rþÇ8ø|rDÆ5žÁâ\Èùġq^ÖýñT\J¯¿+–^Eœ—ç㙙ÿÑJy¸¾ÊãPdeöÃäQÐëy>oÎ5zíè‡Ù|¾r+½¸ò0ýmù¡ö9E¾Ï7Ú×kSµ¯´‡ZjS²÷¶@êl͜+„<J×OÉe_­!䇺ñ%²eî;´êó­!ôStۀõ¨k”˜ñ'°ƦIüübi\Ð7§ì 'F©‚u´½òª¸*¶҉øÃqË!ºH³êFI\Šc¸Ø6úë5\=¹Žkôš̹ðr)\RiÙz™oˮѫ[8âp5<Q2×;î£Ñc·ÐøvóðÃâð%®—†«K ×I^5Òõ‚Ïs.¡¾Áçåã\­‡h-ô˜oð8„^¤üã•Ú=ôӏý‚„GiÎÕSu\Ý<Ÿ×qáµruðüU-=?„xmzuÀ5Ih€smäqˆgæøœ†¹[ ^=\/ÌÍà‰5c_PÿW|݆åÆÒçåjäôŒëráó×$vì9r¬ßãYMøøªQ5Žw1®“Ð+€8\ÇâP"×k2jR}ƒÇa·I/Ì_ý°Wõ^*ϣ¸Ï3®àšÔõµ]òSºõÎßÑÇY~(=ŸŸ$½n£ó@Ÿ+'ƒ+Ⱥ
.ù}ØîêQC¨GªWµ®¨otK®p½8—ôºM zõ|>èúaãLÕ!æ‡øe‰º6q£$Ø$]bÁEW| ýüeú ڵâkª(:&×T)\¼`=F5cQ(”®
OŒëԺSY4¾ú¤rñÂîè{ét,¹oTKåBƸú¤r©ÂSÓë5pEq¸Q°^]¬ÿæRõêç¾ÂøBaWçóҹچh׫}ˆ*˜o10/ó|ƒûÃ)óC\`óy¹ù<çÒëU#ˆ«ZÃU‚K8WMzMÎU"=?„ÇéôÒùüíOÓLA\“uuxýåùüWsõE\嘣9—d?Œéõ
_X/Ýç‘ӫg1®W¯D.>¾øäà4.>¾¤Ҹ¸o &Åý‹-¥ç‡_\/,š’žoàÙR¸Ï×dñùW™ϯžo”‡Sòè§TKÏ
õ(±ù¡€çʑ:€™kªL.sV2«„ÂÕgôCùã«/0Ÿ/Áå¥^#óòÔ<¸jыûü$‰\¼Þb}>Ӗ-‚ò­ó²lI×*ˆk‰æÞÅë5w7ÝͷÐgzI広mñ½+‹^K…rq½:×2A\÷ð#²Äáb©\Øj^zòãõøQÐK*ל]´•qí@/pmcã‹ù¼X߸Ó0¾¤rݕE¯VÁóò]½Dr]õKzïñ3t)Ë{CÌç;Äç<Ÿ7ëµ$P½–
âZ–‡^‹qµdájÝú,}ì]GèG¶ѳðNA\­™¸f²£´ÁBb.c\·ŽÃöLGŸ#GÁç¡ãºW°ϷgⳚ`®Ö×.Áq¸˜Ça®-äðùýÜçñ݌ëIóW zµäèóXÐö÷¢¹äף8林ÿœ"Ÿ«éb¿²5 ®ö,qØ*Y/ñõ^žšÇ×2ñù†žkI q¸DrÀ</˯³	֫ÕàóÁ饏Cùó2þãöûÕ5Öw0"ƒ{e÷>#öߧi¸ÊpլNžžE¯!\c–¤R{éõá‡â· Kbÿ}º@½p]
vÂOŒëýÒÇ×ÊÃ4YÃõÞ,\}ÐXW)ãZ|þB:×òÃ4Cqa\—ÆÞo&C©\ÊGÞÍ|^œ^o;L³•žå\†8+D¯Óypõñé<ßr€ÞÀü5
>Ï|ã=†|c¬„yYéÅç¯Ëùa¹½p¬Rë!üÁSô	Ä^ù¼!ïåã«O0×L6/‡Â5]hş¿ú¹^Äa™†kÚðç}Ô÷Jx're!\™â¹Û÷”®r蕉¹×sƒ´ñŹð̹V¡©B¹fÄãqÅ3€tŸG®çÂ3
ž¤×Q›âzµÑLéõCÔ:׌/¡q8#“oŒfó—0½fÆâð’¹Ì>Ïçeù>#T•WlÅшÒóC¡u®××+Ð|~zè}=0Ñ×3s!f˅ÎËÓLz	Ù¡ơ©O$;?”_2êŹäÏ_Ӥr‰Ë7FòÃþ<õ*“ —îù‹ŸoÙÉ^pé/”b7ñ2พ‹½ç†ÀÎg÷Ü	ÆÕ%k!?,½Î5÷zÿ‹ôá·ßGw;HO<H¥–z-M™«ÓÄո—þ!^(ÜJǰ•¹k¡®ŒsUl¥8*À5Èw®†½ôOL¯˜^%êꦸ¾ɹ4zuZp9ñÚ=tãz¾a‡K|ã§|GØr	Õë|ãëVÆÅôò’kCž~Ÿ~hð}Cø!_ˆCáù!æåoä0¾:¥/x[yo7÷C\t\¦üP ^Ý:.qz™Ÿ+K8×îcÔ*‹Ç!<÷Ì
ž+/äzq®
•äº ›^È=àýŒë›âðSr.ä”òüЬWýúŽˆºÙ7ž‹sÕí¡ïJã⾁ÏÐL¯oˆC]ý°„qqŸ¿5„ñ…÷yyz™}£q/}]f~hž—¥ç‡_ÇÏÐFžϋÌ7Ì}‡EóCϕ,òy‰u3—ü¾ޢÜõ’Ïeß×s߇5Õ„Ö78W7XdÖmÌq(²¯g¿`¡Ô:€)ƒZ—~~x¾.‹üPÜóQ“fµ^¥auíS”ÎÏIuk€*׬f›¯y]£0®

Wc\ÐkS\ø.*qýÞÄÕ1Dsùn)M{éÍ}Î/€ëiG\؍hޘ-tŠqݤ¹Ïf
W¹Ç\³¹^ó÷ÑW5÷Ù$H/Äa])ãjÞ½râ*÷t|¡ˆV?ZÇeöM¹Næ‡ͥl·¯ûèË&½"Ÿ¯ð•kÅajԌ¯u¾!Èç¡WÛíqxsŽóò8ç¯:ü¥µF/‘ù!Ÿ—×-Öz¹_µŠë5ÿ|Ã~^¾é	ú¬&Ÿ7qmòb^¶N™/"âù¼™«™ëå—ýså®ctå¢ýtpìz9³¯ã^
0=!Ç绋ÀK½òC3Wæ´8žm —Ç\ã
ÑϘÓ=ŽÊ\Ææj‡¸Ìqˆ¹Z³ëW³ßõ(sÝÏd®aõÃ&
×ë4žqŒ/ƒohÇ×\aùF³F¯›¹σK\¾aÖë5ï¸̾Ñdòùêíô$¾™>o®cËÌ7ÌÏ)ÒòCÉ}³^öuÏü°9½ôõqt_¯IÊø2ç‡æ:›Ïó²ŽKh_Ïìòë‡6õCiÏ)2ûzæ:›üüs䇞çQ•Æñ½p´ºzØWä°ZïW	CÁdߕÃj¶v¯=`м®Ô®§Œ\úóD{U£^Ë]pYèUjÐË%×ïԵÚÄuããôôôpá¢l½¤«LÌ`½Œ«Í5Ô׬]´;^qRàÊ1Ûp=“×̝´<&½"®RôÓ뤭^é/³oLßI‡™^'×99úF‡§~®¡<â°W
×ÔtD§—ÇùâpUz²Ðk¹Ç\¹Ï/?Lã3Œ¯n!y¸ð8\}„ª„ç‡ðù=>ßái‚k´˜òðþçé
–šæå_çeäš¼wŒE~è&2?§@“ÑÞæ‡\/ûçÊÑj×â‹/ÞFÎì×øâ\æçJx	¼2î13[úû\¹"—çJä œsŸÇ\Ë9W½^fzí÷2íõºOÆø2럆ÄaÞzMƒ^bêlz½3"Çbzð8Ûòðù—8—ÛyÙ^/pá&΅œٟ<ʬ—.?\u„ª™o ߨ%%âù!÷
üñÑE÷Ó÷Oœ¥÷àߊôys ]fe~®Ä՝¥ï°QJÝ÷fÓ'ò9?´èë­Ðÿéë9®÷Úç‡fŸP’R·yÆ&?Ü×3ç‡f½ÚüꛛŸ+%öõÌ\#ù¡ÇëˆV䪗äüû<q-^Įó0*:cö¼®Ùê*Éj®æ>볼¾NóúyEäšeÁU‹ÿ&\¯ٚûlÈòúzÍëçxÈ5÷†b…*þ¨D5í§Ïâ°®Y	r•š¸.<@Aa‰í*rm–{lÐpÍòë-èCŒæzy‡짫8×Â}ôƒoHäB^oçî}^yħ4z}Ú‡¾û<¸®Öp}1Oߘë×ùû铜>Ÿçøšç!×'4ãë:«|ÃýøÂüõQ
×\ÓÄá5yúÆ\¹.ç»O\öï´1OߘíK¾ÁóCvÕÉÊíóy®×oOÑe 
v\îŸS0öøx„÷y^®
€ë¼|Æža8rL¹æÙꅜEˆ^
Yôº^—Y/ÅðY
×g¤×ِk¸>ácÝÆr|Á7þJ:Ɨ†ë
çåY¶¾Sz~ˆgΥjZWJÏ×ý˜.;rœ.çù¼?¬“Yg3ç×Eg%6/›ë‡ç‰ÖK~_¯b.*ò9úŠèWêç¯zéõ^pYø¡4®:Y}=ûü1:R?t‡ö¾1ÛKŸ·Ÿ—çzèóóòŒÃz-—|½ê$ô‰Ìzéor5ߺ’m+æô‡ˆ&j¶fÃ=2ü;W•G\4[³­—A¯5š-è&zεº@®	>qñ-n¿ÿ]¶ä 1p]ĸ6ùÄõÎûh!?Jjâ =1ð •J֫cˆ–ñ#ÍÀ½
àï×òô”ÉY5H¿ÊA¯µ>Çaë!jãGµMÚNš¸4>ßç“Ϸ¢•||;HGsÑËg®¶!ZŽ£™^ W¿OóWû½qÈ|ãñwÜG£M¾á1ôjUzññuTº^ˆCŒ/Ο/À7&øäóàâq(Ü70¾Z4z=.é󲊹ÁãgèRžÏKÎñkòù5—q|}ë×ô™	ÛèwÈŠ½äç/Ä(¼…d<h±d.x%¼…qBN&°ÀõzŒÝæ—y|q.<Ëð8D®€^2½Î(½Vø­—Ù7óóÅΞqU%¤×iäd>q8¾×µ·Lò¼Ÿç¾!d^^]ˆ^Šë­>בûå ׯâ\kî§
%?ô¼Þ[•`}~B õù‰"ó
sݦÊs®5…è%·¯g®G…踘^rêó|^.@¯µÖm֊™¿ìýp¼€üPzN5?t|U:/Ÿh~X•O~È&ÿ‡]êªôªR]ìÞpÏ~!Ýquñ€2p™ô*÷„kƒF¯ªؿÝà‰^åš8췈ÃNOôªxõÔõÖ´'V¸=‹ÂmŽ\\¯õê*ó ¹<óœmôL¼`Vr/½Ž†Oz!+<XÌ6·r+O\¯¹&ø‡o;L
ã¶Òs\/,V)0ÁUé^u[éÞÈbbƒ^þÍ_+S£â:Îã
„\¸|Õq¨Ó‹:BÔ¾Q ^]¾è¥üðyæg-ôòŽ‹Í˭ã«ÌŸVçóùa…\³ÇEóòäô_»Žѕù¼Wùa†|~b.óò¦ŸÐw ï°ÖÐ^yÎ,¸Ê
|NÁBîöøq¸ =æzOôê*¤PÏä\È51feÕÌzaŽ÷ˆ«[£×ø\þ°¹‰®¼ÆæÌáŒë8¸$×mócQ” ®\}ƒë5Î3ß(P¯V>¯réZO|¾³ŸGίÑëYÔLÏËàZ¡ázz	¬rŸ?;f½òɇéïBÊ=®÷–%Üwè
¤ï0 €+´>Q·…^!öõ&ª×øzUx¬W•Ÿõù‘¾æR]~h1/—y2/¯×šȾž9«„×+Í˓^¿áùüU%¯¯gÎ{ι^æ-èø óÉ4øÖln¶Þ®õ†­ÙLïQç¡^åÖzéãðb¼·c½.Îi«JóVˆœ«¥^q®¾ŸÐm£î¡7í§Ï‡œ«Ì墯	Ûè׺£+%Ç!
˜	pÕ{æ‡hÌQ‹ôžæ\8ÅÂçYRïl‘Ã3º£Úäù¼™ëgi1¾|åÂq’¹°è+קGôÒû¼k.åó¿ÑøÆç,}~¸/ÆþíªöùF¹ËŽ|^»…~ÿ·ç¾ûßÚü«¿¢Ï×l§G0络—·<K—ZäóڣÀð]!\móyŒEôr\ì½Øâ¹R{´<ž$¹€¹.D.Œ/A\óòàú” ®º<¸®	Q/<«IÒËvþœïÚçm|5æ|¿æeûñ…<
ù¡‡z5䱫ñÇî~†®ò±~˜B{bqo¬Óå‡Ҟ+9—­o@¯ûDò¹FôoHëÃVdÊ-¹Ö{Ð×[t_/{®2ù¡´þrEŠýåJ‘qhöÃrá>_'`]Š…ÏKÎ7Âçâo´Xó&êšèh[¶.Íý,.བjÞï=ÁѶlݚûY½ÄV¯
θôz--བéâÐ×6¸lôZšA¯ñޏ:ùý\÷]’—+½>úú"°ŋswÓ]’ã-ÎvJ±áZ’A¯*Ç~aW	
×Ý	úüDzµêô:o7ý0!ŸïvEÝ3°KF¯;ŠÃ.ÛÑã¯Å‡½~ ^U.ŽA4èeËÕå(Wb÷Ýø’œÂ±kKÊ>?QK([|™—q”Ü®ÛÕëoŽÒõÃG9ã½ñ.Ž­„^ã·Ñs{Ÿ§+bßsÞGB©ïâ°hviñ(Ÿ_Z×ݜž„:ëЙ—òÐiô:†¹ÄÉs¥žkIzanÄÜï‚+©úæ<¸&&UÀܠázs¿#®î„ôúŽ;1yĵ4	ŸGN퐫3	½{eðÃÅ.æ¯4ÆŸ—%×Ùæ좭Ã<ȣ°ˆÞaýp|‚õÃ%ž×qµ$ą÷®‡2úߐZÀg¦Ü'êvÄUeÈ7D÷õR_U"óCs_¯Jl>Ïõrß׫
½¯Ǯe	q­wه
°¿<ÞÌe_ï
0»<ËÛèÅûDæ‡犭ð8t¯W•m݆Ÿg¹Rófýêš[D¨óð™šûXŽ{,«Có~}E暗׊\³‹¬W_Â\Ë5ï·I]sŠÈ5'×
®•è®Mšû=•ð~%Y¸f‘kְ^›¤.þMÝAGÞq•'‡ÅôÐGGßK¯
ó0®ÑIúF±¹P˜å\ÓwÒ!p%ìóóŠÅõ–t¥Ò봆ë>p%‡ýðÞbq¿Ÿ>¡‹Ù;iÒz“ë‚ýôñR^ӄë…]NJõqx a.è5§˜qˆ#®t~(™;æ1ß`~(2ß×UŠë”F¯û1/'•o¬¹ŸþÞ[Äùë#ðÃ$}þ‹Òûylã3Ôg]^ÌùÇ

þÄAzúÁô¡BóCh­ù÷„˜P±qE±¸>ð3z›.Ÿ·à±©ázMqý•›çûç/pÁK9æx¯d®*WÑèuZ͕Ÿ)"×\äIrÁs4zQz}҃:@G¡\3õz½¶h?]íA=j……^Cº񅹲¨õ({½8×AÏãYϽVÚêÅã°È\s“ôÃu?¦2ø¼Žkô¡ˆ\³íæe=ü‹èyýЮê½Rë‡sýˆCû:6¯G‰̣Ì}¢ó„sudàš'¼ÿµÂÐ×–šë‡áèÅëQîóCá}½¹Ś—pm2ġؾ^Zù†‡ùáJáq8LJIæQç	Ïç—ò
—~ؑB¾qžu¶•âô²_Gd6E&„ò*Ùgۙ<çҋ†«]]ޏ:’àr¥W–Ï/¸҈Ãö”¹*²p-g\6I¿ÚðÙ)sµ¥4¾JñŽô*ÇgðÏUÛ;¢Å礇iëõüiZ1~=›a1@yJ¾±"M®Ž!š«:{a±MyJzw\š\XT£ãBÃ1®Ž,c·2E®ºXŽÇáPÊzU¦x¤Þ<4L變w!šÏ$$í+äЫëÅãP`~®fuÿ‡CÓÇÞeòCÌËIúÆ'¦¿~ïY»h¼8MßPþ°/
.ü[]3æÌ4¹ðÞøîtŸݼ~`“"ËąIY¯ÙлÀ~åqºN3w–Zxm¼'ŽÙu”Ï/·ԫ‹82åhðâbåó\/[®,z
K=WvØreÉÑîC—2W‡¡`£×áL9Z¸V¤¥׌ÌzÄ“"׸”ê|þâzí…Ï;¨³YsÁçyNË7v§¬W¥áYÂv^¾Ÿùø»ߞ¢ˊP?,7<ӖÚÄ!Ñg©³•Kš¿x>郞6Ÿ·yN©p‡%)ÖÙƥ<µ[ø†
We(zñú¡”üsr´
©}"Ãw–6×Jz¥=/¸¯·"M?tØ×k7ë%¿¯ÇóCÛ8ׇµŸ¿*ÒÖˁo,w˜o,Oy^®œ®t™¦™o8ŠÃJ˺yeۮ¯²<_]c«®b«Øøµ˜­d³áZ’…k!î%A®2×Ҥ¸Ø6t|ó"è•0×ùžè5&½ú2|沄¸Jð^YôZ˜ÂøZ®”ã°$Kö¥‡cðžٸ¤±)¯þèʒäŠëu£jVª‚웱c¤îÁ_!§ÌՇ±4ׂ}ôU¾«MŒëö¹gÑë‚$XV¦É
{韰{Y®»%ê¥îyZã^úFi½p$T‘ô:–¤^õ{蟳ÄáEÒk¸<žm†âúv|Ç ~bâz¥ïóÐkzÝú®â:[®¥EÊ1¾fÕî¡ÛJ3Çá]	q•èò¨gé=ÕÛéIxÆD’za|!3¯%iLRùáÝÏÐUءŠïZ¡¼ëëIseóy1´îÇöþ‹÷À{é>Ÿ´^«ŽÐTõ]ý¾³4ý\ñã¥ø®KŠëVÜK
ó򫱣¬Ž?|r¸!Œ1A%	ŒãÑ«:.ŒmŒ…ö!š™ä¼ܼ¾ö›WéÝÆ|ޞëŽ\gáɘsŠ˜Ï/NŠÇíeâRz}‹Sàڔ¶^ÙÆæŒ¯„Ÿ+ÁÕ_½~˜A/øÆ71&R¨GõA¯»Söy^½ Hzý(S¦ºͅY¸–¤­×X•ì>F­ˆ4êl)Çaù°ϗÜK¯ë×ô™”ë‡cÁe_%âê½fŸoIˆ«ïe¨÷&͵ ‹^KҪ÷ò:@‘õZ’`.5գÄÕ{ÍuxòX/óCûzTYÒyT‘ôZR̾^ûD‹ôõúëë•{ԇ#T¯eÅäbÏ_á÷õä燳äËäZV̾ž!ßXâr^v_·±Ï“Î7<Ñë‚Æ×ùÅÈM~˜°^eiç‡üëÔ5E8|à$‹/orô۟å3j­Aô\ýY„CàפÌ5/®Z¦ç‚^Õ\SÁeˆ‰º¸êsЫ:E½RŠÃÚ"p-5Äa}zbd¸
5«èß.Ëb„EŒCÎ5ْk±Ž«mˆ¶¡)µh?}®Ⱦ®Vk®(—¢ºfۂ}tm‘Çx[ài…rµ¢5hèŽ1‹ŠègÏßOŸ-ÂVŸ\/pÕÄuR]Œb¦…QXбp}¡ó2Ï7l¸"½î)ͦ‡½¬æep->HיLÍQæÅÌ«=^GÅa׬]´
ã(ÓøW±çeu_·,=HëÔ=äÍ5ð •.9H½à‚ïe_Åðù‹î§ïǏcÂâŶ
\…襾“,XÊÄU’’ϫ¹ñªLŸ	CS³å]®BƗÒkƒâÚÂüs]“4—ЁkJ²sÝm‡ê߮Çwøø¼|}Ò\ˆxm¦ØÇwï1Uàüµ*ۼܴ—Ž;RÐëóYÆôYŒ
åÕñÝ:/cAŰ^«Ð‹ñ¼Œ91›+/Ä؇^…ġ¿«ϾAËsz]Sš%ö£8ìÅ=Zæ½}E¬€ëS™ô/ⱄ˜²àZâ@¯ÏgÌq˜Ï[p™êóR9’›éÅçepYÖ–»ΆgÆÅõºëö§i&îт«º³nƒ܌s©ßŒåó‹-ë6S‡.ÆצŸÐwÏ)6õÞC¤TjȥÞkQߨa>_¬úa¡޻,VǶñù>Ïê‡-–õ¨IŽôª͡n3Å&Mz¥ŕ̓mô¿‰×
õޢêÅƗ˜ü\¹Ôç­|ÞÜw¨sÐ×[jË娯7σ¾^­ƒ~ŠW”úÒ×ãùaÊù|½‹|Ò«ÚM~hŽCÛþ—oó2ϣ„å‡u¶}=3—9?tÔכœf~è J,Ÿ÷Ðç—Zå‡QeáVpԵš} ¿z"ñê£AS™©WD õÑdÜcxO|æø·M«R×ZÃ=t©«-2š0hVB—GAÛm›כWUª\f½º¡AÄ59b(azUFÿ­1G®5ˆ•¹&ä Ww,kÀÀâ°4úݔׯ¸&¦È5Ÿ‘W[L¯
°°8Œ¸¢84¯‹+ŽÇWOÄÕ®ˆ¡„sÅÆW.¾±Æ.hÐiR©ѫ\‘¦mÐ8Û{>ýmh¢VǾ±\\/ÏWû<ç:N—ǛRé‰å‡iiŠ\ã9ëqiJÊcz«G5<	Ý5i;=Úzˆڬìæexvë°Æ|žo÷Z£š4_T<;*¶Ò:ž˜^¿ê¢eér™ý0ÆUÍçeì&„#eÐ,—jtn+ÛB'×뱔¹ª—q^¾é	ªBÓ9ÞüD¡Iƒcٔ^/¸Ž¶Q‹c½zV¦¯`	Î81½ê°¥yÝ.¥×I“^ðbëuçïèãÃ��îu'œ¸wÅXˏŠX{N£¸ÆæÀ½Òöù#ʇù˜×	,æÀØA¬»BÄõZy˜(æn¥ח×^ƒ^©û<Æ.¼‰}®Žk‡Òâ:,,Â1|X¬?öH±6@/Åõ78Z1®ǕϬL‹KÍ!+ðÙîAÝãK8n
1†{G‚%Æ5Z}÷MÐìxmÅÖì~X5HO¦‡˜®“Ð1†{GÌ!ã㾁…¯×ö\|>Í<
ïmâ‚àØ3uÏ_R\}`X{?‹û<4Œ|þxŒn^ÆNf?™>XŒ¼c9ë÷Q~÷Žñ…]Þâ¾.,VD¬Âc†õRsݵž+¡×âsé¨!ODz]‹nðCh_Ø!1ª¸¯by¯“:âzåàÛ#®uÈ- ‘&?¬Žå½]®µÐ+MŸ7¯J5Và󘗑o æ Ïçy=ʥ^ji‡7å2}ý¿¨-V·¥ÑkrÄ՞ãóòø4}#>±#Ÿ=Aƒh¢©–°zø7æ ׄ”õ::¼Ht×1º2Ký°÷®©–F¬Só¨®õ ~ØÞ++4u›q1½|ڀšWŽu6pMÎP?¬ˆÕÙðÚõÃÞáºM¼Åë½Ì»Mz9®÷r.è5,™êl󲋺MG¬~X‘©n«v™âЮ6îóê‡
Q-¿Çuߡ€ú|y–úa-‹Cõâ}=pUëò
]½W@Ÿ¨÷jêë1?ìÍ9ßp?/×eÊY?ÅA~hÔË\ï5ç‡àÚèº[€oð<ª´€¾ÞZ§\<Ÿ7÷õYåQ~hîëq½t}=ùáÆ<óÃòÃ|ò^–Ï3Ÿ·ÈÝø|/ëW–Ûç‡鏯¼ž+Íùa=ËÍó²û¾^-¸t»ûÆò
çù!O\ë5_²éڤ]g¿6¼\µƤN¿‚°¯®ºq8WC¾z1&_õªc\—‘«¾ˆ\ø¬ùÆa\ˆõº"r5Q¯†bÆa¾±Wžÿfchz½åíE3
9FS‘¸æ59Ûü5ð }G×$Dv<öÃMÜ;*±€ÈЄÇb#ϹúUSìêlôºÍ[ß|^Ýӝû#èvº0-."_ôRM˗tFÝC4±ðæ'¸ —‹ü°}ˆ¶šîLùê…&|1õR2.c‹dŒ—~÷óøB¾>ÏÀg©Ï|9Ïû„foä9¾~…;ÅПÂgæs%÷êǖÉ籤Xz±Ÿï}‡Ð¾Q½0–áÁyêõz¾~Ø1D·³篴¹>¯÷
³'Ə+çׅhŸ«çJpaW3øFžzÅÜÌ8ßüí)ºÌås%÷|õ¼¶ú=ôŸê||å£×%?¥[£œw“gϕ\¯k
z½ùä+ôç<ïõ¹ÎŸ‡^œë]GèG)Ô7ÀUWÌ8|û}ôoù>WÀ֛–^#uóU`ݦ¡ÈzmL‹‰/õÞ~Ï㰶.0möÐ78Wwq¸É"ýéÙÏË‹Üwh(b_¯ÎsŸ‡õ)úçšçÞåçβEõõFòÃÏ}¾¾ˆzÕ	ð>_ã?æ½}ϕ^ç½ÎËõžû|?.×pÀÑêšÏV&uuª«‰ˆæ‹Ç՘WWôޥ¸JWHz!;Ó\øN»SâÂw6ÆWsŠã«Ùa6¥ÄÕíp|•¦ÈÕùƒ§¨U5`'ºòù¤|ãéChÄï20݈V$úüÜÝôP†ÝžWͨ¯@/	>ÿ­_Óg8C&.¥×WW¡*Wz™|þ‚ý´?Ÿ†m<ÁåZ/¾K–Í5n+=׼þã˕o?CÙPÖâЕoà3Õwz³v—?{½Ž5�\øƪ#T­>û–ʸÔwuÜ>3ÒëD
\ð[ÔgԸàŠô:–××\ø!>»•¥‡xO¼·£8<cžlÁÀ½¢üõR—ϕø.±[<ن冣ô%Ÿž+¡Æv¾\3vÒæòüåR/Äa.\ù}­çe‡zÝïÒì0ùTBõÑ.ü0ò
ø<m}–>–B=ª4ÐúáèÀê6Ðk¾#®1)ֱ»Sá©‚«3-.õyI¾QÊôràâ|¾›å‡#>ï¤>?Ò×c¾’Ï7…Ô×ãÏ_#}=ù!ÓK¼opŸÑ×ñù®P}Þu¦äóݮôâ+Üf·\7_›¢÷˜ÁV°¹䚎{2­0ÌqëÄiqá^Úm¹<Ôkf‚zM÷„«ßqtO}¯™±8´áêðˆ«$æ6zá߶G\%žùáÆ|c¦g>ßjë ï,>ˆݿ¨Ô®BÆWûm‹5aOáx)µ3ÛûØÎ/Îó
šIٚË8–\>ëÅ㙮Ñ÷Òk8bKÅá{<ӫc»m¸à8Úè­è½>è…݂Ô÷ûnÜÆîтk·/¾{@ìà(JŒ#ƒ½0Խ|ߵ¥^¯â»Qßѥˆ¸p/3 —
Wäójéñž>Œ/Åõ8êÕ2_Åw£´¿ŒéåŒKÝË%à2êeöù]«8BÑß@UcßÖ7®y„ނ¹ÇñŸ—æ8\㥴ù¿=Wr½à{s_çÒo%<WB/ätÐ+Óøºþ1¾OÏå›^ˆÙÐ+_‹öӁŸ+Û|âzç}ѱÉ<WN¡ÀǗgõÃQÍeS\3©òzÔtŸê¡éÅûé5-!®Vϸf$äó­^ö‰ì}¾Ý7½x=J~߁×åëÅûzúÆÌûÓêëñ|¾$°ü°ÝÓ|cSh}½̾1’ú¸~#A½¦û¦W(ëRøø’o˜!k¢Õh­Ñٓ]l˹ÍъµÕHþ
3A¹&E÷ÚÝ{7ãêÇïÀ±7Eÿf”ç\ÕêšÓý.0ƒ½QW	b*Ҡ=¦×f¶'׫Zˆ^Í1½z4zõÄôЏü_1½ÚÀeÐk˜k²½&ÅÆ×êzõÆôj–‡&ŸgzIôùUL/ÏÏäóMÌç4ãkõÑG°³×҃´Z5fÆzîóÕÜ燙v£+qLvæ™8H£¡ܼnj9DhJòé;é¡ѱ£¤p¬vœš´v,S\ùÎÕõµa'ܳº÷£ØÉǚŏك^×.ìv¡âpÏ\¸7Œì`{V÷þެ‹ñˆÿ_q½fõšAìִì­2,Fq¾HEq­Ç1ꞷ«1ô0¦âǶE\ë…8Äb_¹ڇ¨1½ÐHG¬EGO½?Ê\‘oâ;Pz]ì³^ˆCÜ#¼ ÒëqìCh‡Ø³b߃ï â*÷•±½[ÑøzÚÀ+b\¯Gz=E_êßtûìˆ%5VÞùƠâz4Ò+îógpŒþÛ0—ï>.ÄTÌç¡×qxEüèQü.òÃx-4ƿõÝç¡´ˆ|ãd\/ÌÑÐ0š¿¶­¹Ÿ>âi~È1oˆâpGäóÇá±]ŸGn%鹞ÖzˆÖ"çž—á·ý†®Öä½kcu€ßõBîðáŸ㹑Zbyo_¦:€ ç^?ìÎR?l^[-¨Î֖©8¤Ô'ǸÖjõâõè Ṓ镱ÞËê6’뽸zX}^Š^¬>¿9‹ÏÏ—„ú!×ËTïãóf½ºÀóùaõypõ2½ú˜ϋ™—
õC\¼¯W-À7}=CŸH¾o¬ä%š>‘Ñ7„õõژo0½ÄùÆd®WŽ}¢QÒòC^óCîó¡¬ßàù†©¯'Èç¹^ýº¾žPŸo0?œoZ¿‘vþÿëC¢²²Êi/IEND®B`‚‰PNG


IHDR66ŒEjÝIDATx^íÕ/«ÂPÆq¢q6áÍF_ÄêŠÌ“Í`|{F­7Þ«á‚,6bñˆ Ÿð»p¸è@Üaœ㳇'ƒ/²™ãADDôaš‹FBˆà[DòYÞ֨V žXA`[T®ä
][¢êpÓÖЁšhÃR‹»A˖¸D͠ô ¾c-îe[âúð•_€_-nèÒ[3ÔÂæ.…ùZØ޵ÿ:õ‡a{ïÁTJ¶rO?˰	(C&Y†
†z>ô¸cÆð
üÀQÎWÂbPš©+aGPš1ž±Nr®ò­èdÃư
(C6Y†õ†õ²ó`»ƒvrOï…"""""w;B ‡IEND®B`‚‰PNG


IHDR66ŒEjÝIDATx^íԡjÃPÆñÊ&[7˜Hõä"¶~j”™ª¸ˆ¹BŸ o0¹ÚÉUÔNªjâb¶B!äöGÑJ½ýü¸qáO8×ãݘIòڇ1,àK,ä[ß֨b0'ÄØB%M*m‰z†Z$0…'ñ;WË-q3‰úá‘ø{øTqð`KÜ;<6ÄßÁFÅÍ]z5Ç*lëRØ@…ýz.
3cØe;ò˜+ÉäÎA—aK0-YvV¶V:µ:îÆÃÆ0†!܇o(äô]	[Q֮„`”=ÿ˜;¶‚9G|cÖ‚iIÚeXÔbXÔeXf_1(—;{gq{ŸQêKٴWIEND®B`‚‰PNG


IHDR66ŒEjÝIDATx^íÕ/‹AÆñ[X¼¸×ƒ—/ú"¶yv³å’Í`|¾£V£Äf.YlÅâXq|ÂOdĆŸ…û[¾,³ûKˆˆèÍüN«!Ԡ#ѓ{¡«Q1,Ae‘YìZTΠ‘gš®DUࢬà~DÚüuWâ:5ƒ¯Œù'´¸=]‰kCé|s-®ëÓW³¦…ýûia;ßþuê†a{íŒôa*'Ù3²6eÈÐfXj0,õê|èqoÆ0†1ó2Œá kٗ°”fâKØá.ìÄ7æÀKà(ë7¿Š^†1Œa[ƒ2dm3¬e0¬e3,€lsÚʞÁDDDDD¼®Tvôd¿©ŠIEND®B`‚‰PNG


IHDR  szzôsRGB®ÎéÕIDATX	åWMHTQž›q1àb†H+HŠ¡Ùdm£¢v¹K[¸pþ!W֮6Yâ¬jC¤Â 8ꢂ²…Ø*"‚A–›ÁBŠY-æǙ¾ïvÏã>獍&¹ðÂ{çÜóû½sŸËuЛ{7ˆÇãAø«T*GÝnwϺ×ëýžN§ó;×0€D"qjss3V­V»𜭓èä³MMM“™Læk›ø¯úúú
…{øÊ$öڼët`[‚ê‰ßïOŽÿ¬c¦ÄÛ@©ϗËå°<"A|ü<À,‚_£<‡âØNð-”±A–鞞žþ ¯º¢ÑhÆx>ÍÚo‡B¡ÐÓááá¢C,ä¾ååå€HB߮m
ð‹Äs'GúËßÀA%G€±@ p+•Jœ‚l•
6çóùG2 uqũ5ô˜/ÂQ•Žwàøpk’Fú‘Hä6@< -âä|>_ÇÄÄÄÓ×cvÈsHò±Ý&g,ú²z䤵X,‘7›­½½½'ᐅ1gûj0K١;ÝiÇóKì—DøX,æǼ¹ÿ¥™™™o”ëáX‚Œþ%Ð0t+âc«‚Çur–lH’#ðe80Èkì™H¥Œ:ÚÐVû¸tŒ»´ӱcâCjƒk"ùg;y6Èé$«!̯T
ûë"ºa-jÖ>ªËXŒÉh—¶QÄÐß߀Ó9­œ7—äŸ
§úKF_±øú,k•˜>:Ö<
™ƒ¹”^€R©t\„ _ޅ/xä71Dil³We|Mʨ£
mécꑘ+K53×!ò`tÝà¹ÁTÐO™2'“ó-ä|j@­„’ë\ê#­
Ôxü'¥Sû:ó©Y=bÆ4sYCÀóJ†rñ`±΅K([«%h€A’ÜÔÔÔ;1eLæ¹€—	l0âJèĸûôìuéäֲçí(|zDÏX8¤:ِóâb
VΒDO5òl˜áÏ@æT§±לöQÖú„TÇ4b¿4CØõ$ò2AIn£bŒmù:t¯¤_҆¶¢gÆb_ÇΈŽÔ¨W`¬èÚy¤Š1·T¬ín‰@ÆMgkËRGÙÂi c´kãQæм"¶È’FcLÌ6TLm½˜pYL8ÛÞÁXÇ5踯`Û×+ÙV%/¥°áV*eo߁gï.¥¦çn2÷ѹ	º“kù(®å#ÿt-×ٷ„ðæ¯eÜÛwûk&1.ý
»ü[H nIEND®B`‚‰PNG


IHDR&$åõH¥ÉIDATx^í˜1kAFÏ>Xˆ„T!6A‹üA4>$•D	66¦°H%Xi´ð'<¬lK+е¥ØHФT+M²s?araÖÙÙADsaÞLqçî7¶’ÄßXàŸ;;‚–‡—`‘ñê0º÷ðî3dHbbæÊA+×oÝX<=wÆw$@H)ùm ±µ¹}áɣ§ȬCv°ƀsSSÇøöõ3‘
$”¨9uü(Àù‰™Eªªû7/^‹ã[Xºz«kƭ/ß3fm£ÕÇÏsÆV–ïÜ^8qò¸™h‹Ö…ˆÆlßêÜü`Hò3	ä{•	0,ì²ýéÃpmí@ìÒÌì,„ ]‡ ‚ˆ¤„Ì ʌ*‚`æpf Ãâªz‡éÉÀ|W*€jdµ›qˆ”€(‘á0†,ÚÚß÷UõÏt!f	HËRlâpU„s‡lö}mïY(§Ò
tYrU„“Àï 3±•ÁHFd‰±’%!ìHÈ!({e0\qْ9@jɁ2°ÌÊ`Ð6栢j5VáR'l³guÌGb!c©4?ÏÁz±ŒE€œ¥rÒÔk&5D¸~ÆB„ò夥ç©%9¤'×{Á̚§²PHÚx#m'×íö徱µä@ý¯ZV彤~`•–IZ7l_K¾FÐ2˜#Œs-dƮ8‡·>£Œn|d=“V´”û7)‚yRòvҤ•-9PbÌû¼cWHZ™¥PYc’z¾cÍJI˂È
–ð3¨×(ƒ_Idz¤¬1HF	E0#ìv Þd4¥é}ä–B
ږ eIõ^dúÀÞnm~NON ½ï :6´äÂ
nÉ‹@ÜRjEQ–HkëK
ð¦l´¾ޜù³õ‘©ÿö3Ô!Ø!Ø/·†aqZ¥eŒIEND®B`‚‰PNG


IHDR&$åõH¥<IDATx^í˜1‹A€¿÷&*X*æ@üb}ۈ¥¿@=ÁÂ"…µ"xZyÈAÁß`og
ÁRá¼DÐCÅdž›daqÙÝS3Í7o2_ޛ	33ã_lJ†¶ˁõ½W› Ѝ‚–��¼{ëÁ0
ö×^Ã÷o?m3‹PbNeë¯$0X»z¾X9ѯJ‹ sÖ􅭷[œG.Æ_=•ëWÎڵë—}Á$¢ؔ¤1bÑG`c}“›ŸKSÆ|‘ß*˻7¯ÿè‹yY]¬ƒ‹ÎÇOž‚ÐóôÏh*(óØTAÔç«ô¬I"SàsS( œ>w	Døð~»xxçMbÅÑѸ·á`åÃE•Éâ@€*VRQ—ÑDñy/­‹c‹²ƒàØJ hÃÆ_‰?¾!i‡[’±˜$\ÎãDœ.írÖ$§ 6G£Xœ€ŒqFJZI«ÆõÄc³ê¸–XíÓ.†EbŒyå蒱‰g,«\«˜Ëd–£UÌSŸ[®SÆòËѡ”qÉ/Gç=–_®],«œ³UÌ7cN¹®³ÌrÖéTºP&9§uý³l™“)÷QʬrÝK3ÊÑ1c
°l™ëž1ðóʽÖ=6þND ææR_‘°¸­úm¶Ê%M­¹	 6nm¯ö|ù€¨TރÕw"PRƒVß!̩‰³ùQõ1U
‡ØÙý0j>{¹°JÞ6†ÿíßPK±¥ØOù¼N9@¶!IEND®B`‚‰PNG


IHDR
BÆ*+IDATxڅÊ1¡ns
Àà±RÓ>¦²Yhš…f¡=…F¡Yl–…£zb§‡h5IEND®B`‚‰PNG


IHDRØ”IDATxÚíÔ;€ PîEäFo2‡µÐhc#ÖXã§ѝ¸*&vf+&¼@–‰/ë‡O!rh‘ÁPeKê‘ë°G\*À	æ¶|Ða…¸Sb-QwH¬y¢£‘Ñ!Qɮ QÁn!Óie	×ûd«̦§Í!–rV°„PKF´֡Œ©×a‰Ýé³ê0¢ø?«¯á
ú‚úú\IEND®B`‚‰PNG


IHDRØCIDATx^Õ1nÂ@…á1t¸š4  œK8©q
¸Áà*‰8Ä4„˜X¢•+§ˆõd{ÍB¢×Î'Ïڳc£™€˜%	99	+b‚f]u˜“R¸!eNçq ðä(
¾p¦ð‡3q¾’ø’óV…S¾n崄tu¶
CÆì°c̀ÎÚý…s<`!ÛÛbCÕ-0# |ÂD›ÌxL	Œg
%!lP1B
åÙX:m‰Š¹í/O!‡ºLÙ™ˆC]¦dFNá¥=±jòÛ0l‡ÿnÕ÷rzþ—³ºÆüŸÃ1ÿÔGnRg
:KéÆBpPeԇÜèòUÂwúŒZ¯Ո>%;–×
#âò‡‹UWÇìîÕ1Óê½Üñ´&¨D½ìHä[ȧVtò,dá˜5{ý��”5›6ÙìnâIEND®B`‚‰PNG


IHDRØBIDATx^Õ1nÂ@†Ñ1t¸š4FA8—0©q
ø.\%g€˜†psKt¡ÚjSFìʻN¢¿'ÏڳcÁOBR’ƒ¡¦dEAâ׹¨Ü
ېŠ9Ì8`#95ÁgÎؖœ)|ø‚Q‹áõNøRЖ“ìêÙ6±ó;FØèY»?p®BÊÖa[Ra¨uDH¨>!J}&<*¬H„)VS’zT)%V3–n[Uæ·ÏRøhYvB
Ñ ³ԂÁFi¯YL;Lð¿­Æ^N/þrV!ÿ¡èµ
€;rc—yt¬¬¢#…‡ùtà¹Ðåó
ßè“5^«Œ>ïWv¼]+!ç򇋜߯ŽٯWÇLW‡Òö§^®́BÎ1ʎ䱅|jD§ÈBV\°f¯¿€=k
EšorùÅW˓IEND®B`‚‰PNG


IHDR  szzôâIDATx^µ—ËNqÅÇF‚n@ƒ;!¾ٸ{¿L/ô2-¥-_D7&j¢‘ð
PòÞ¬ð	LØ`LÜCÒ0ž_ʹ3Óΐtñ%í¾ïœ3ß|ó?ÿ1lÛ‰X<’I¥/s™¬í­õum.ö<jˆ!^h"Z®•+övck$j•ªM§WãÑÈç̧­­¦ý¢»;¬ræF"›­€b¾Ðm7·]X+å»z³J$”K¥£N«íÀZ¥´ÙSÎҍ¨}+ºƒz<›[_L'“o
fþ²aYöngÇ%€5®)çJ¹o©q‚	6񨏀l:sX0MÛÌdÿêN^©àQ*žX3³Ùóêfy0lÝvÇÞÛ麰Æ5rȥ†Z0„õL°áКKÓý¤Z._Ь7 E3ßß,w½Ój{{
!—jÁL°ÅÁ+»>" ßҝj’‚0Xíְå!‚jÁŠ'Z„ΡµŪWkaˆû£ü¯Š/ü#.8‡Ԫ(
ðK¹ji¤Q³‚߬	ü,\âü9 ×ç¡Úõ-3=Ñ<ܡFCÅ܃ߥBÑеyr¦͊¸¾Ã92„j˜Þå>ŐÿVÎ"¹Dܱãñ;Oš|pÈõ»	8àòõ©û D×@mYõ¶#ÏÓ`x½òٜA®j\äÂ~/1d^þ^P¯YcŨîk¼?EÁni(÷5ã7!ì}Èñ_Rx̆2f4äÀã0jœ`
»—N¦&{U©öHv¶NSX‘Kgj¨u
öq&€€}}Þ!à5¦
P›Þx<[mm‡xmj<Á;¿GÀ`Üր¼õÚ±Z
Öo
ØÂ4äK×\N¼>KjÛgŒ‚ýÛç5´õŠ(wÞOהó‰\Ÿ×І.8‡d?¬jÕF��;Àfϴé<S«#޶GXã9äN؈lq3²[¨j³Úv93ü‘­~!ôû‚µ ¶
—8ëN3º%ƒ8
êf˜	þ.#"øÍZ`7…Îq/X÷¸V\ùtBbÒS{í1Œëž^ ÃÂ!`Šjåk)}¬v­©èœâ0A
µ`€&Øâ8ҁÄÛ4¡+:65ÕһŽulvQ ïp5˜r©Q›9Æ:’`‚
~£c¹–äG¥=r ĚS²hR§äÁJÙ%Y-Àٍî„cùžŽåâx.“‚˜uױ<D`µO'|˜l`dzþ4[žði¶J{gýq‘Ñ\z|œöõq:öãô?ì²\IS—¸IEND®B`‚‰PNG


IHDR  Ùs²IDATx^ÍU1®Â0­‡@œ™?ÀÄÎҁC HÌA
ö» GáìÑü¡_!jå¥öøü^íÔyÉÚ‹Í8¯’f‹^cžÃC’çÍl ` x@Qƒ’wÜOީÛåCÐÁÁvƒªT`Ïg¶n°™ò>L>n¦nÏðX%è®Ï×ÿÒ|:¹¸~$À;øúɻ:P6@I£pþ}‚ð@ƒºøš<a(òC>Eøösˆ%?ƒ¯Wt‘x´Ìâ 	îÑâ¤ëŽq–ܤÈD˜ì&€F@5MТþ7êI¿ÊúË$×ÍuC¡õ7C¡µŠÎÒ¦ª°uåâÚZ
–‚‚Þ&ÑIEND®B`‚‰PNG


IHDR  Ùs²IDATx^͕1‚@E7ÑÄC;zj-P��…§ ±¶h!GáöAÁÈZ¨+ëÃffÊÏ`ö¯jo=Ìôü՘=o€^ù¶^x(­(õd kâéè‘꼄Iû*ûI—=Åf®ÈàDi4À2nã€i4 '2´R¼tŸ.oÃkW9ë>`G¦yc÷k¢ô”º€œPP†	e(¸ŠÜl™ý‡5qdúF¹…%îÕé»EõŽ¥âéƧn±n:R��‘0-±ÚÕ
€èâ±$Qüŋ$^eñaâÇù,9Î6P°þ(XÛ@‘Eš T±.¼XäW[kë	®³zõ乧IEND®B`‚‰PNG


IHDR  Ùs²IDATx^ÍU1‚@¼ÿ€nçÖXhEocá+H¬-ð%ZxOñö>AÑÈY`X.\dfËag9˜S=ÆP/iU”^ªaç~½†åÒëÎȪȺG4é	¢™
þĀÎU:«ó”´…Å
Y8¡X·p¡$œ Ã
–¶žöñˆÿi_X_1C÷ñ¨>ÿ۾è¨\D1åò(vpò4¼atªS¼=ìÉ=!6ãJӒҵ&°W.°g:½hg	ç->Øø̻Ó`¬͕ô,½ŸÖäÓòpO&¢#è(ÿr#ɭ,_&^ç»d9Pv²ã@Eš T±.¼XäW[oñ\ÆKebIEND®B`‚‰PNG


IHDR  Ùs²EIDATxíÌÁ	 ÀÀÎé4Ý\@  ›ü/ºµ6œ`BˆfHID˜Ð
`B÷h€øpׁFÈ	×ÄÂ×IEND®B`‚‰PNG


IHDRC„EIDATx^픱	AX5`à±ׂ©m؁½ˆÙtñ#ë0±]#n5Äÿ̎‰'xOˆ#SdŒ‰DO
Г„Qƒ˜Èaé*jœ¯Ò$mÐk†_ҝ՛²äæ	qañR朽!N4ÑpŒ„80{²Ö۱ýGòI5÷‘Ç҅/¬"a—P0z†Åƒ¨ãžFIEND®B`‚‰PNG


IHDRC„EIDATx^픱	AX5`à±ׂ©m؁½ˆ•üD&°{0ðØ5áV#AAüÿÀì˜x’÷„h12ÕAÆh‘HôÔ=I5ˆ‰–®¢Æù*MÒ}°fø%ÝY½)Knž/eÎÙâDƒ
ÇHˆ³'ûh½Û$Ÿ¤Qsy,]øÂ:!Fq	#¡ð”P»§ãIEND®B`‚‰PNG


IHDRC„EIDATx^픱	AX5`à±ׂ©mXÁ؋XÉOŒ¬ÃÄ<vD¸ÕHPÿ?0;&ždà=!ZŒLu1Z$=5@OF
b"‡¥«¨q¾J“´A¬~IwVoʒ›'ąÅK™sö†8Ñ DÃ1âÀìÉ>ZoÇöÉ'iÔÜGK¾°Nˆ„Q\BÁHèhŠ ¥BýIEND®B`‚‰PNG


IHDR``ŸöŸ«PLTEuuuuuuuuuÖÜ5FtRNSK&QF•IDATx^ÝÍ1
À0À:N ˜d‹'|Šà]1¾AKckŒ'‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HDsM?l ŠbªåIEND®B`‚‰PNG


IHDR``¶jPLTEuuuuuuuuuuuuuuuò¥1_tRNSK&“$¦˜W»IDATx^íÍAmCÁ/ÕL¡E†ðøS)„hN¹dï£}~±ƒ/ø{°‚Ÿê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒ¾HAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁ|¾oÿg¥2.2U¤IEND®B`‚‰PNG


IHDR``¶jPLTEuuuuuuuuuuuuuuuò¥1_tRNSK“&…©¼IDATx^íÍAmCÁ/¹L¡*(ˆǟJ DsÊ%{íó‹}|Á߃ý#ø©ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :èû‚ÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäÁçûö¤A<®æ÷ì*IEND®B`‚‰PNG


IHDR``¶jPLTEuuuuuuuuuuuuuuuò¥1_tRNSK“&…©¹IDATx^íÍ1CÁ/ù<
§P0€€0*Á0Ušl?Úçû:ø׃½üN§ƒÓÁéàtp:8œN§ƒÓÁéàtp:8äA† 2E!(‚AdŠ CP‚"ÈA† 2E!(‚AdŠ CP‚"ÈA† 2E!(‚AdŠ CP‚"ÈA† 2E!(‚AdŠàûýúhêØwÒ"'IEND®B`‚‰PNG


IHDR``ŸöŸ«PLTEuuuuuuuuu4pÇtRNS€ÎGþ”IDATx^ÝÍ1À ÀÀÿº"5­]¤¥
ÎY3ܼèŠñ
Z[ã`<‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"škúʧOßÉ:ôIEND®B`‚‰PNG


IHDR``ŸöŸ«PLTEÿÿÿÿÿÿÿÿÿdÂtRNSK&QF•IDATx^ÝÍ1
À0À:N ˜d‹'|Šà]1¾AKckŒ'‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HDsM?l ŠbªåIEND®B`‚‰PNG


IHDR``¶jPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw€AÙtRNSK&“$¦˜W»IDATx^íÍAmCÁ/ÕL¡E†ðøS)„hN¹dï£}~±ƒ/ø{°‚Ÿê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒ¾HAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁ|¾oÿg¥2.2U¤IEND®B`‚‰PNG


IHDR``¶jPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw€AÙtRNSK“&…©¼IDATx^íÍAmCÁ/¹L¡*(ˆǟJ DsÊ%{íó‹}|Á߃ý#ø©ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :¨ªƒê :èû‚ÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäAÁäÁçûö¤A<®æ÷ì*IEND®B`‚‰PNG


IHDR``¶jPLTEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿw€AÙtRNSK“&…©¹IDATx^íÍ1CÁ/ù<
§P0€€0*Á0Ušl?Úçû:ø׃½üN§ƒÓÁéàtp:8œN§ƒÓÁéàtp:8äA† 2E!(‚AdŠ CP‚"ÈA† 2E!(‚AdŠ CP‚"ÈA† 2E!(‚AdŠ CP‚"ÈA† 2E!(‚AdŠàûýúhêØwÒ"'IEND®B`‚‰PNG


IHDR``ŸöŸ«PLTEÿÿÿÿÿÿÿÿÿ—NîtRNS€ÎGþ”IDATx^ÝÍ1À ÀÀÿº"5­]¤¥
ÎY3ܼèŠñ
Z[ã`<‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"‘ˆD$"‰HD"škúʧOßÉ:ôIEND®B`‚‰PNG


IHDR0:ö™ÚáŸIDATx^ݚMNÂPEÀʈ2îF\:s cE†8qà
JWƒ+€8`Ú5Ø6$þÄçý’gÒ
½ô]gáChéûÙۿ)™\Ì1ØòÎ`FÐåÙdy~YžA–çGåùdy~YžA–çGåùdy~YžA–çGåùdy~Mž±>`\ ÿÐo˜Kÿ¯	X攬hpbn­ß.œñO1x0Çø»€8ү‘•	˜k§p
œ£jÀL0`öƒwÁsîYÀ1p¢œX@&YÀT8`j÷Âð(PX3p|€üOHý"Îåo£òdòòsʏÓwÕù`Ày5 £8¥TžÔOvrYÅ\É/-Š/îê/¯ïþG•Õ7üÍ6Ýä;hèšX‚ú¶Y°ØòÝ&©{£»
®J(¾òc´™g%b‚²FñL@o›Çm"0ó
æsÿQÓGκàdàä ¯žäþµ̿·[ÇØ@þ+ͧØaIEND®B`‚‰PNG


IHDR00Wù‡{IDATx^ÕÙ=NA‡ñ)„¸ˆ¶˜è1<j%…5	˜`¡•Ðmà*ÂÜJ	WPY$j6;>…oc²
ìÆý¿~žd?ޙq'÷«<Ôp#¼à
ŸðEÚ&`=<#…ÏPº€=<`ovÐGlõJML¬Z-àïðŠ$ðŠ]«Th!Q
8B¯PÁ^5 ¯Ð@¬0€W
°V¸‚Wˆ”jH•ÚðÊ¡zÀH=`®°Tðºô¾Ô¡Wõ—x®þ}Rÿ‘…ê£ĥ# .:̥h(Óœò†æNuK¹F`f(0´u+«ÄhX€âÁÖ
\V@“LPÉ
0͒^h,qøw½*Çë	Zp©\pt³ÖYö+¦¸MÌÙ?½1Îᐩ¬׬SÃå`ª¸źàáU¸¼Ì>±Ê1à¢L€"¤ÎózàLqÙêh#Ä3,ðýkÆÑFn[?ÁôÆâ“IEND®B`‚‰PNG


IHDR00Wù‡qIDATx^ÕÚ?NÂ`‡ñ.å6’TWLô€à$‰Î$l`‚ƒN^ÀÊU„;Ð £„+(‰‰š¦úü†&]¥ |‡Ïžáýÿ:Ç7ӯ5{ÇžÐA€SìÂÉ+
؄=4±£õ†;øª©-¸ª©G)˜å£¦ª«Ä(+˜‡ÊfW9À\ªDð•L[=`O9À4Ôzê	|ås¦¨<¨ŒÔ&ÚPø°€‰p3ŒÔqG}
Ô²ªp9‘(oæL(ÂI‚Ù3Õ#eª­z¨Oùˆ¯U²ZŠ[Y.ú[Ї;/ðº…ÀY`ʈU®×RWyا†x۟˜©lhLD8“7þyvüå™õ·
¸ÂlÍ[„kà¬: µ‡[LWüÕàûË|5X–‡&B$KîçC4áåùì±
ET ‹!Æø„cˆ.TQ„“×7fîô߯őŽIEND®B`‚‰PNG


IHDR22?ˆ±œIDATxÚåZTUU>¼
ä‚NkeÖhi-³\=F)S›Y-W&
"¶LC³–	ltÆÖô -_ùŘXBáqF	ð…"	‚—‡©¼y?.¸/Ξï;‹C(÷
T³ڬoÝã~üÿÿí³÷¿ÿý¥¾–””·«!ôµüv‰œ={öÿ“HPPxKeeeöMMMN­­­wšL&³Ù<Àb±¸¶··kdYv#ðì†:
Ú\Ñgú:766:;Ø$´bÅ
â—!’——çÞÐÐðHKKËX£Ñø2Œ£çÀø·@â ϋQ÷&Ú^GŸéèûb}}ýÈüüüAq{ˆDEEI‘‘‘…YUrùòeûØØX§«W¯z€Ä3z½Þß`0,Çlo€Á@Œ?ç€4<ŸA]<p}ÂÑ÷ãææ怚ššçsss8zô¨æðáÃNsçΕ\¸ز‰¿}"¢´ú&*++Áð§&ãÜvKûJ!‹0ô9œҁ| ¨ê€z ¸9ÀYŒ;,[äÝ ¶¦­­í¯:ª*Ï8Þ4qªM}"¢2·úFðÜðÆAñ2Ìî´`íV ¶™9¦£®
²r±ovCv€V«ò“ÞÈԩS%ooo>v#P^^æÖÒÚ2Æh0¾a6™×B}|ÇLƒÅ ®7_y5y"¥쬈¿/åLjor¾{/~E(Ï1ù1hûV¤”že_ŽQÆv#ÞN.äGaÿbÿ<Ÿ“›s÷Ío…6Ò֞‰X+˜©'±I7b³žǚ¯à,2 JKEbA‚ؒ"‚¾}GøFOãw?/Fo{Bx†<B(Ï/ Žmìþñ]вë #{h'–ð+¦¨DúæÃsórÝêêêž0´‚°ÎÁtƒ s›(n(IÅIrxf˜¼âØßeÿý~òŸv“Þ4T¸­ ¤%!ý³xfÛ؇}9†c!ƒ²™,Ð!c©eãͼWQQñlhÅξ©­«ý#öÃg³å;nÜE¢¨¡P„žß*fð—½ÂÇɏ…<*Ûø <ä³Áòݟº§íiü
`Û؇}9†c!ƒ²(“²ÕÒh6[ҡ;gÔØ‰ Âjƒ¯¯¯cFFÆýͺæ…ð*ir»ÜJé:ƒNäTiŗY{`ÀLyø¦abà'áü/GÅPÍJ#…WøXñҞ‰bbċŸYÇ6öa_ŽQÆReQ&eSt±Ì2Z[ZßÊÉÉdÅ)¶‰¼ÿþû<­ƒ+œO…3 J°ȲB⣓ŠIäG?.߻ÆC1Æ}•«p¶®+Ŵ¯§ŠØK‡Dve¶8WöÁgֱ}ؗc”±”AY”	ÙÔA]*™*¼•ÕÕÕSËËËoˆÍáT[[;~}ÅdÉç&äú-Â:æ¬Q! AwÁ.ÕwuYrt±2«7ֱM%Â1K¬£LʦŽ¢öŒÑbnO…-ëáÉ&œ8qÂQêmٲeË@¬Ë@,)’0،ÅbÖñküñ&FÈTÌ%BCîùt ÑId񑅢¡­¡ֱM%¢Ž£Êb=eSuQgGiÁËD$°h۶mn=˜<y²~ì†Çø®°Óɟ.N‚‚Y؉ŽåÜ8«
âºWŒyû?D…îZ7"¬cû°/Ǩã)K]fÔA]ÔÙe¸±­µmݱcǔååééi›HzzºéS§îÃéýg“ÁôO]Xðõ%"<#Lñ0T¨oâg#¢¾U>uQ'u-F—ÍFó—Ž?~ïùóçlÁfº£¤¤d46ÖBq\V<}pRÿ#q¹ì	w	Oõ¬*ï±ë»nã)“²©ƒº¨“ºimMÿ…mo"ôE[mÁfrÆ&Ÿˆ{Ažæ¼ê\±ùÜ&áí+Ýð€̙äúVÁ4LzçÅ’˜óº(o*ïF„ulcöå޵&“ºü¢}äÍç6Š\Ø@[`S2l†ãqH;Û$‚ˆv6”7öÇÔ–ä’3b	6èذgå!ëï“ÕMi
4†̏
׺¿ֱ}Øצê .ê¤nÚ@[žö¡°ñUÚj“âWøì×SEcÐUþöJ|ÿ«œ!q÷'î<ÐxЍÒq©t‚³MC¿¸°ª¾ֱ}طëXʢLʦîþú|ãÍ@S%r¶EÁNÚj“ܭ€«;ÂXƒcòŠvy©§1Ogl<èN¹î;eÃY§VvK7"¬cû°oױ”E™”ýtÜ]Üô"ƳN%R‚ì0ì{ÐØ$‚NnÀ"œäIT´3ü:ª3^b¨ÁSº7¥]npá„ò܋ÙYŠé#I8KâٝO‰}¹ъ8 ²y…lA£;ð.:gbPó.Á0\`71äèM!®èM¡lê .î£Q¡#Å×ÚH•H5p²n=Ypʛû#È9,&‘[--w¬½¥øMg­,-mTZZ•˜äSÀBÀ6x7`16ü²çà~´ÙIä:&ú8ì{°½G²kà§çÃÓߕsð¯í~§+î7®“l;߆­¶‰àÔtÅÝÜ!s$}¶r –ö›ëT”¶#̴ÀVÛD®]»æRZZú\¨Ö" Hë/!
mà¤Ê&‘۾@œå[mŸìÈ'ݑ™™9ÑïBS›I	+ûAÐH8©†C2lÎÎΏì¤íXëСC;vì`ˆ<¡­¥m=(Bè_=Œ7µ•¥¥kÔÅàk€ÿ޽{aºVꩄ……ݯo֯Û4õ—‹l1ÖT×lݴiӓ0Ñu̘1ö=™2eŠ’Ëá²Õ<VIc׫îðÛxÕ®^u©³3υh·÷÷üýýK½-۷ow¸téÒ$ܬ×é3)Š7EæödEÜöäuPu²4ëô%(1.\˜5iÒ$w«F/]ºTÅ
¹.¬Ň°©|jkjCëÍgr‘S“StЩަƒ²ÔtŸ{ÒViՐÆÝ%¸F_¼xñÜןvqqq²I„sø۵̞=Ûwx™ŒŒJˆÉhJ§k65+d8k³öÛHÐmxP<×=AÇ:´ÙNÐQ&IèŒ:Á…HîÑ0gÿþýÃfΜÉ'vR…o¤+W®ÜPwýúõUU•¾¸Ål²|„™…³UÜX$¶¥+{Fxí'~H™Þǔ)B‡n)S†lãaǾž?¤Le5e*ãŀãï
²&Q5µ5Keô”úPH‚dnN©ÚW×Tß[VZö
°³¾®þ"€E˜q̖қ	$¢…šÄ)yøæaX÷nX>< 	%TfŸmì3sßåœËØ)3^ÜX¬î‰Vä™S‘4ÿ“ç$öУG8ßdS¯ø0	¡üκ¸¸¸ÁÉÉɳA6aÂe¾Õ3–6ÝøYÁoŸ˜„åô쎧Ä[GŠQ[ÿ žÁóD€3Ј>!©Ÿó åuCÀ¹-ú–ÐíüwÖ:TAO…ºùàÙKJJšv:ét˜6[›­oÔ×R¹o§ÖP#.×/Ε'Äáïc•ð;JIàùe³'ÄãcPŠȯÍ•úJal7ª.¶2Îe\ÿËø62xßÁh»^éûwo~J^¾|¹¾oçî.LR4rïp«ŸÜzö3«‡܌¢¢¢5øð
’„÷ܬßÇǧ?ªð­]˴iӤµk׾"3ø¨ðja¤6K{±¤ ¤HߠÇbev* h"øª50¿̠7\jªkJi¬oܧkҭÅ[X€ÏÜ/ Iý F£±ï#‘¾¿‘9sæH˖-³C€©¦ö]ƒƒƒ}W¯^½=::ú`VVV,Öv\v".i§q“K.à"twˆtÔ'Ãè8Lž´´´'$$x#ì2bĈ;׭[ç`K?	LŸ>]O*ҠAƒø©A:pà€Õ>^^^ҢE‹¤ÐÐÐÙøïsçc-@ à]úŒ Ü%–ÀÍÇD̈Ÿ°~ýú¡¶úI#GŽ”üqé§’ ™[ñóóS÷kjjª¡k@Ä
$wqw\ˆܰ‘5XFNž<é¼{÷nǞˆ·­¬ZµJÁÏ]æ͛§8”_¬¬\¹ò¶!~³å÷—Ëæh?œIEND®B`‚‰PNG


IHDR22?ˆ±ÌIDATx^íY	pUÕK ˜°„ÆZP*ZÁ(`±µÕV§EÑS¶©-£àR íh­F*"ˆ¸%R!{ØB“	$… „l/dݗ·æ½wN¿ïôÞéã5—LjéL§=3ޝûî=çÿòÿÿ÷ç<Ÿþ)¥²›5¾þúkeýÿu@þdåʕ4C‘‘‘êêê|»ºº†Ùl6ÿžžžáN§s¤Ëå%„è@\vww¶¶¶655‚5GG‡_CCÃà%K–ôy¼ïóæ›oÒn>ÀÀÀÁ&“iBggç“V«õyù=€¼ q»ÝïÌV<ûÐ?Ùíöå‹åÙöööŸVVVŽ€›$**Ê'::Z™ÑHHHðMLL^RR2¡¥¥å×f³y#LSqV ]á¤ñš÷`¥“ƒèíA”Þƻ!—.]‡¹ü.\¸0È •é‹î׿¤×( 5îîb,–å‡c¼Üï–2ÏVÀZ`6i<ø]ì2ÞÉʘ§s£Ýf{ÙÜÝý³¶¶¶;{BýB†©ªªº¹ý+¤Ñv¤K!€Úa愹5¦†×=>ãÒÞœsåcÎÍHÑ9¨¡ÑßÈܹs}æ̙£®½#QYQ1éóc¤Ï+ŽžžðâX%½²ۥµ¶Vv˦ãÇe]R’4ÅÄÈÊ]»dÅçŸÓxÍ{üŽÏðYõŽïjÃd¹˜;Q^ŒÍhkm
ðD£Ÿ4£qÐË3âl‘[¦F²RÖ%'˲6ɳK—ÊìY³dúԩòðøñòàm·ÑxÍ{üŽÏðY¾£Þõ=Bˆz¬q
`ÞGªMî'ãQTX8¡žnµÙ^w"ün•øcµJsy¹l8rD–}ô‘È_¾\d?õ”H
–ûFŒ1˜îK±K™ºæ=õžá³ê¾Ë98çäÀV—۝è,EßUUY9´?ûÒÜÜü#0Ì6€ÈR¶Kmt_½*K·l‘9Ï<#¿š<Yüö·E¢ŸŸŒ€hØ^
ˆf¼æ=~Çgø¬z‡ïbÎÅ9=ª$²)¶TÜÞè,Y³Ÿ9sæ4ºe ËsH'»Š}g§l/,”‘‘t@=ZÆþý¿-ân½U Dê}÷‰´ï_¦OŸ®Œ׸§Rì@PŒ0@FiQÚ?j”Ì		œ“ss
'֬Bš%‚ªç_½zux/ìJ34ìtccc˜$= Ijƒ Š^]f<ô€Ct^Æ
$÷-Žüð‡"wñbqqÝ:Q¹s§¨=xP6¤§+ã5îI|'s_xA¦=ðßSŠ%˜À@‘1c†(zã
µ†>¦µ¹¾ü„Œi¤w۰aÃPÔE(¢±«ÇåºHštÙlÌc2 :¥9‘€”JþÞ÷ęE‹D՞=¢-?_؛š„p»¥>x{²íÜ9Y%óÃÃeæ#ÈCcNJ„!CÔ|4‚ad¸×Äp ×Aóü#zÌŽ?®7;mãƍ£:ÚÛW!¥.êìd®¨ÐkBE"JËù6LÕɅwÞ]¥¥ÂÝÓ#8¼{‰p¹¤ic­®–mgÏʚøxɂgÆûúˆŠӬtëVµ¦6:b'Q+KvìØqKŸ–-[6CÒÓӃ»Íæ„V´†ÌL‘*|ë[é¤ׅŒ4H$úû‹Ôûï—֬‘"D‡Ç *šÞinátÊú”™»hëGEFK3ɵ¸¦'5ÛŽ��¾Ó'¢¢"_ø=WË˟µ:û¸8›¹ž4I†:/ÉP‰ˆAÄÃ.žõøã²øí·eCF©ԓ\`=‹Íáhí¶Zkºíöj ê"B{Cƒ¬F&éöÛE´e®U¶}»àÚôA!q»#ËËËDw8qâÄ@C µµµ~5553QXën÷)ֆ
ݷîða.¤è‹©DÊ=÷(`d"‚ @¦GòÝw˂U«عYzÁ:Q°&Hþ¬‘ÛÕÝ]#´°125		ò裏2ڪö¸Áqm*â@cP»sf<÷`C (&ìžCЇ*g
tœ?//½÷ž<þ䓂EMŠÍ|øa‘&J֮L§¬Ç#:@&"£Éâի[õ´«ÖCHv4Õfì?
!ÝsøI0¸ßI¬í ٌԌµÄñ'ž\›>P§â¿ñ
ÀLƒŸC@K
;„£¨Îà¥V.Д•¥èPuhä-]*À<¢ëÊ7Ӊ‘P ‹
*“ñü¹ßýN‚d>ЭííWñß<0و̤Y#Oj-ô"Σ¢ε›Ž“šÀ<ßÞ›>?ý ü#Ñ|þŒ¢b‹uÀT/86s&kA±
›ÝÅõëٸÜd'k‚éÄH#ÆÇF¨¢FGzÚÚTd s›	†©¯¯Ïï¶ÙLÄ6#5³Ïp
µ־€f‚šAAƒ}
?	3f/PÜ(Pî»ølÔ딊5]9F£[²Kå_{K‹ІtZ,¬	¦#AŒɀÚKä½ø¢l9uJêž‘aš¡O™ì ²©™}†M“u§S{ƃ’¦u åû	ðïy|úAçþz>Í:-“!+4½D©Á(yö	½á±&˜N*¡w�L%ï¾+†‘у£ƒlFvÔçÀܪNö µh)'J4YMØ5,›ÿ–Âð° >Ë=;¹’Ẃ¥“õéé½mœXت&˜NŒ„Þko¹E#£ç;Í
N˜Ësžú´4™>m×»aIãÆId€¤ˆÌ+°á7J­Ñë
ˆR²B6ònv.˜¾CTÎÒi:OCPGKÐ^CÐDג»aÞ@ «O ÈÙ@€لôê-µ*¶öÐ!vn}uô°"M:™.¼Çôa1† ¢µšaD™~LC¦’Ǡ6×H-¦•¤y¥V-2¦ÏÔâÞ#l°ßä]ìÑÿ(vj{s³ÒN,T${
·†ÌBÖeM02*«±	Ä@‚ Q!hs*ÕÌç
Š²þü[3‚®;
½d
(¸’¼Ý+ýÞu—ýÊö‚éìêR򃲃”Zj-Ŷ#Ã4c:1ú„Mª&e“ºAá4Eé¤vR¼ý–wô’…Ø^³ÕHš½†ËüN¯†ÈѬò/–Œ”ÕdR TãÝ܊ŠŠ|žfŸÐ"ÃA ›1
D¬¦ØDÙLÙTÙ\ÙdÙlÙtù›°GCdž‡oðqԇq†	@·
ƒÖJ¶a"/‰"â$˂•+%d….?º(7ÐàtùQÄ4Ã}•f,lÖӉ‘ ˆ(M›QÞPæ0j”=”?”A”C(ÒC¢8{¤<ßÖÁǟS¹xñâ°âââl+?DÇ-`8muu׉F:€…(ð(ô”àパË4£@¤P¤`Ô{k‚éÄH„.ÙYw ˆ)YŽkI]4Ú4Ñhq:¿‚oËóóó§ãTÒXk¥¤¤øÆÆÆN>yòdX[ggŠrÀáP2ž’š‹ÅhDÉMpÜO8 Å9JtÖ%»Öìt*ga³&˜N”ü
·Ü
¨-E)��§¢Ólށ|‰ˆˆo¬~§OŸNï¿yóæiMMŸðÌÖ{c¥Kvn‚(W¸)=2n-—iná½C‚E͚PéÄÍAÀy½רhcó潱⻜­m߶mϺü&Mš4'¯1o޼ “iØá,f2_·Õ
	!­å8Á02¤HÖU,ٌÔìÝì8D©æl‹an“uǴå6šÛi¬Å5õH»&¥ ’7ÂÂÂôb߶zõj_ÔËcÕÕÕëº-–“JÛlêܩ<"‚§zŠ©Èð	ÜO˜¢£e;XJõá­O€¶ÝÕ{÷RžX°¨c	B›å8|àZ\“Qí2›¯½ØÁÎ

ív_}õUe«V­ºî>N+n/((xª¥µu3NË/cBnÄÕQ
l†‘ѝ Qì充QгiRR;ÑÄ5MÜSGEyK–¨£#!ñ=¦#A<jX]98±vUsK˗ ¡¥دO6lX¯µA½¡;v,t÷(ǗçÕviC0ŒLÎìق‡kŒŽ¾9ÄýSŽÀ(iJvà›{)V±£¦bʪHpn§v@çp:˱Š‡bì‚|½î•yŽk55wÌs ÖÏ91€ÎQivG6'BCÉ0’tÉ>£™Rbˆ=G¦{®?2å³ÒãÈThG¦Œ„þ»C­Åf‹G/GmLìÏÙ/µ–2Ïá°Zµ471ÕÔ,¨2™¢›ZZª@«Š-UU²ñèQYöñÇ2Å
©±ï½Wî9RÄj`vÓ4 ˆ¿“x†§ò$	R,±
[¯	‰Ht¢¡A_Z„žôݬÌLß~;v,M¡…¾uFFƝøµuEYYY¬Ùb¹L"㚰p½àO¥ÚÏ
9O?- ƒ§B¹†O‚¥L˜:’ÙøNÿYÍÎûgÔD-Ò)!뚃½§?^™á3fŒ!¿îØᇚ¹¯ °ð8÷ZÞÔÚú!PPÕâhSPt•”Ȗœـ¾r
]ìÄx”UCŠ“¢	¸9;[v^¸ ñ#«S¬
/'$µuuK ufø÷ˆ±?^™Ç8uêԠ¸ØØGQ;kœ
BJVt{ž"˜Ë܌€FÍ‹Ù\ç7çææÎ۹sçmÞ~ ÐuÓoõøûŸîÿáµׂêjkƾ`!óÂ-.׆»=©Ýf+3»Ýõ,V¨ƒÕkŸ&Xî_÷ÅÐM§ÛÍæô֎ŽôÖÚk×V@?ÍLKKcÎôŠÄ7Bã9‚ƒƒ}RSSÕøyzÐ쐐¡Ÿ~öÙ8h´<iq2;»Æ#`¸£°N¶X­û@åÑ ”Hˆ¿
øï‡'%%Í^»víDüvîkTÄ0þ|eßhlٲEٍF\\ܤӧO/,--}'/Bý¾„Z{@^¨Å(âߢˆ&šÀO@¤Îx뭷î+ƒ~=›<y²ϔ)S|þmBRٍÆáÇ}óòòüÁlÃáp€ÄpX€ GùcSä}Ë-@~™™™C 	b€‚ ˜›6֭[§ìß=vïÞí³}ûvŸÿØX¿~=í¦ùŸÄtŒ·QøØIEND®B`‚‰PNG


IHDRåѝ±csClÁ0`MIDATxcøÏÀÀ ÃÀ
dpò±6°IEND®B`‚‰PNG


IHDRá$MŒcsClÁ0`MIDATxcø†ÌœÂ@B†RȲüÏSƩyÎIEND®B`‚‰PNG


IHDRá$MŒcsClÁ0`MIDATxcø†ÂœÌ–2@ÆCWÄƂâxIEND®B`‚‰PNG


IHDR@ø…"&IDATxca²	_8ë2ˆø
"~AF†?@„ø"þ10½˜\%q0IEND®B`‚‰PNG


IHDRn½¤°ÐIDATx^ÍÎ=/„AÐ3óÎ&$ØDá#AK¨”:ñ—E«Ðj*¢ՆҎä)<Å[š›۝¹3ºRդ¹Â5cø‡xR5—ª›¾¡qمu·ýc5|f×C^OöZ¸ëý/\5͹­Ü1JUb¹Ùsb龿þŽc9ø̱<yìŸ#FþZ3säï^¼õÅ/8Ò"s‡6åp~¥i&Ûæ6¬
8yàL	ʈ©‘)«DKë%ʈ‘²DKŽ@ß•89‚Hʀ‡}IG<¾_ٚ8)²¢¦þIEND®B`‚‰PNG


IHDRn½¤°ÈIDATx^µÏ1JQ†Ñó0 ©ÔND+]L¶ì&\¨„@¢EÐÌü‚<¸EF>nwøá.˜Î
£$
föÿ8T -0Ì]>Å~.¾ÀnnÍ62»±´³FþÀíÒ=^E’IÜNܹśµ±ønK箝áÅS§
¯hTïžm?ýòàއ­᧾ŒÂŒb4è´I
!"×E€Ÿҷ« 	
k¢ó:™Z>@Ç=}•d
+ŽEPœãÍÂ#ÅaÂ7D8Ž҂ê	vIEND®B`‚‰PNG


IHDR./“CIDATx^•ÔÏjÂPÅá“yмGCúÞݷu£&ŠKëŸu[“S.CæG.ïýYÄðšZ¡Ÿ±<ôXeːÇðÒõX8<ñûO½{ø`ŸXã&~1}Ú™†ŸÔWñ‹è+ŽÙ2|‡œ?à’øš¾àà`ôìAê¿O|MïvE–ᗘ_Œ°ߍ¯é1œe2‰§´iÀÙù‚>cœ3ÜÕöÕߦÇ'&C¦˜þÈ|Iœb†ÙKàöÄ7ißa™6‡Á,SãådÚã	±q¬ƒFžsþžùÆqzf.@¦!L“ċÆТCÂK~‡/gƻ]A'¼æ·8ÁØ	ےÎxBà™ø
ÞØF4M;œOx.ðL¼¾¢§'Œ׼ªéŒ×<\ÓÂk^ëé¯y•é¯y&¸¦…—‰˿Ëù8è"S=‘IEND®B`‚‰PNG


IHDRöúä=IDATxcÿŒL,ìÜ¾@ˆ¤jeåùPjIEND®B`‚‰PNG


IHDR.˜]ÃIDATxÚíÕIÂ0DÑbÂL À)ÅtÄýcŒ
j‰R*aŲýÜQË=ž÷Çу
ªh wÜÿǠÀÞç·ò`ò¥v :61w @¹ÿ~Ëp^µ\Ë×!_8H9œK9œk@¹œk9œk×Xäde€í¥${éA;"4<Hp`¢ÁG"t1À'#zè&:ècŒ9ÎDÄû!jŠ&âoô0BŠ^÷áX3,("j½ëaÿ¶ˆ("\aO®â2&2Á«¼ëžIH&‘†H%0bû¥ۯbàl‡ýè_ýDžC•qð'x_fJÞsAIEND®B`‚‰PNG


IHDRöúä=IDATxcÀ	|›…‰ñ?Xˆ$ÅpÊeƒþ&IEND®B`‚‰PNG


IHDR.˜]Ã	IDATx^íÕYN…@„áÁ¸\pâë°ãþ—ƒx‚)±’J¿ø&¼‘ÿƒCÒé>–»Â
d8šñóæ>ûðÞðà8
ŒAî“ÁüM&äÊ’¯¡H AFâɉJ ¶Ä(1Àžà‰Ox"Y*èl>Élþ€SäÛ5ìò'T(<`~ÀÞɟѢAéó\ã;œãDZóׅµ1Pì%$Ðá5âý$×qÖùei¤å\5Ì”1}Μ 1'HÊu3~ó¹n÷·¸ÁÕïܝ}äÕ6w Ã^r¸n˜[ÀuÃ܂øÝx?sb 9²¨ÓÅOÑˆp¶xIEND®B`‚‰PNG


IHDR@ø…"IDATxcdÜÄ0‹DøÂ	²	{À±
ŠÈIEND®B`‚‰PNG


IHDRn½¤°“IDATx^íл
AFá“]/b#ˆV[Øl£­ˆ¢íºïÿ8‚¤#y9íÇðgàßGÏ\Œx@L6t\x0¼¾Ã'GF¬½-K$Øl°p0ÚQÝnö¬…¸P9+nã¯sªí”^‘®ýÝ;sW¼Èà
½â’Ã¥ƒƒۈi
Ûâ†Yûâù/ü'Þð\"ÝäIEND®B`‚‰PNG


IHDRn½¤°’IDATx^íν
Â@E᳻nüAíRؤI­L):ïÿ8
A¹EÖ0örÚïÿOg…Olït4ì5ûŽՙmi e`CM?Nzl„‰fà-Q\x;îqáBÔуWŒ#Q\¸|»%ùð£'‹OáŒq£b6†1ÿ/È$/^R‘ˆ>¼Ò×/ôÞî/¿_%IEND®B`‚‰PNG


IHDR./“ŽIDATx^íÐÁ	€@DÑ16¡U¨uˆý—£ÙAæô	ýsÛÃc‰žÎgAüÇœ¹Bä?‹ŽÜòéY4´uzÏ%¿Tq§Ck§§\ãWEã)Žèރ4ã=DSÞ4ç=@sÞ4ç=@sÞ4ç=@c¾rëÊí‡×B£6£9¿iT¼=%åÛ5ߟæÎû]æ/•\¿K›]¾IEND®B`‚‰PNG


IHDR‘9f)iIDAT8ËíÕÁ
€ Dѡ÷J(Xú„*t³;€b<HBþù]g@¼“c"R§Ah±”ÝÔùœiٱµ8šµ“ѱÅɩ<:)H/¼ðÏñàøíHÍޟ¡³fȷH Œ5ýc\«¥•)ãØIEND®B`‚‰PNG


IHDR;0®¢
IDATx햱.A†ݹ²ÅV›¬ˆZ¶P²	¶ð0$t4VP+ѠãtÞ@tû¢eQ53Çù“©gÄLlr3'ùº™ïkÿ)"„&Œ«Ž¿æŒiò¤3®ä7áӫ»ž¾¥&߃.vž¸£êè³Å­5)¥¼€.8]a±~øA8|”RzN¸máñÚÁ[ð0œpÛÃu<§3¼Z·ÁÃpNB8†c8†c8†÷Ÿ_C8árïéòâö%Èôé¥"¸ÊÝÇsg8›ߘ]ܼ¿YÙnޗwòŽ¥­‡k8]adÌS0žƕº¦ψ™63&gfþHn©qÚ等f§%ü¿üÉJ‹ý»ÓüIEND®B`‚‰PNG


IHDR;0®¢öIDATxÚí—=Á@‡IDÊOÐHÌ/‰—Ý101©`6‰0ú&ÁÚ]초ö´çÿû5®I¹Kžñ÷<7ÞÅ8瑠Âх›“g’˜Á%±á‚3Hx¶ڹÜ}ùÜ÷å€.rNÅáñÃÂÀó<Γ¸à†£;nû:Ž#pÁ)ׇ×ÐÃpŠÆzNa¸fX¡‡ɩÂ*¬Â*¬Âœ..óB{0rÁ)WûÇõr{Æ@þéC¸*½ÃBÎä[Ùb{¿)wÌ[©krà€Na˜N‚È:QD‡Î áø7®)"ý#Øjpi~o¬Mc¶ͬ­IEND®B`‚‰PNG


IHDR;0®¢ÞIDATxÚí—!Â@E©é%whšÀ-H¸ܐ8¨­ÃÀI0€¡	¦E´¦‚¤¤u‹æ“õÝ0MjF<9ïͪÝíQ'h¸»ðxe|&dJ†„¼­Ëw	ïQEç˃â8\ìܺ„ËëýIišR–e”çù_`¸àt	S’$¿b(DÀœ®al-
áa
kXÃְ Üùµ8ݘÚ>°±8n삳1<ۙã2ª0€mEàpÍÃϡ1üªiÄñÓdmjéc¸àl
ƒ3l™¾Kسñ …``]žþ$¾h—s>‘:aIEND®B`‚‰PNG


IHDR‘9f)¨IDATx^íÕ1‚@FáÇ›´ ¦°0ÒéŒ&@¸•ã\Áp*wûÝÄÝDþWíúEÿC͍{¤†âÓ2ÉK#“×2qq#nU‰´ª8g´ª¢.’¨*-™ûd܇xHÆCÞð†7Ü%ƒ.ėç,N#sî9sqU‘G¤‘+Eˆ-%‡H%ÖÇ`°äìØhGŽŀ!K~ñ1Þ$2_¼4ÅIIEND®B`‚‰PNG


IHDR‘9f)¡IDAT8ËíÕ1
ƒ@EÑk­ì-R„؅,@bPqV٘pö®*Ì'øàiB@n}Ú÷ð|Ž9Qñਡâ¤ñuœÝü~ލçm çEh4n7oý;õ›§ոƽÆC4|àGá.z:ïË,š!‘eæ¦qNÍÈ+ÐHM®±¡ ä¨¤Àhœ`HÉÈwÊH1$¿ŒâûŸ|/jrIEND®B`‚‰PNG


IHDR‘9f)§IDATxÚíÕ!ƒ0Æñ@á7@Ì/©Z85µÈYÂ%z1\'tˆYè	¾¥ú-í’-Y–¿þÉ÷=Âý;¦ŒõtKԓ Œc1èÉßoòƒ¦ǝÙX¸HÌNÇj†Å#‘ÅR/±Kbwà8‚¿x’…cà-0¾7�ŸÏl£>_^ë¦Í%©x¹lڵf%NoVrx•„U ¿ÿOf[¬Ãü¹!ÖIEND®B`‚‰PNG


IHDR;0®¢ÆIDATx^í–1
Â@E­b“ËxO"*FQAKQ‰‰+h-ŠؙÎ{ã|Ø>#¤™…Wî{SþÕB}a
O™Ì™œ!!…q96áÑòô¦(-)¾8àbg×&œGIIû3Q˜ʀ.8m¸
pÀ§†5¬a{4¬a
kx¿Š0ùþmÀgeØž³ù1Ãñôٱ®áöáW†[íŽ×[]ýõí3ØÜIpÁY6¯ɸŒ'Ä5®úvµ†çnûÊ٭hIEND®B`‚‰PNG


IHDR;0®¢*IDATxí–?/A‡ݜ\±ɉH”Öáîø".قƟܷ…¨P)Dr(0jÊÛ%Ûùú%j+¯÷·™zf³3l3›<ÝÌól7¿1"ª…zÂ>Œ¯7H[Ì“1dɇrµʄ£ƒwºL~è>%+û¦p£7xÍpá"&ڕÌ]E$ÁQÄá4…Ewë¥ø۝[¢õS;à€N¸uáfwó¹8¼}c†.8áֆ—6žœ‡á,Nþ œø°û°û°û°Óg±dxô9Œs‡C '8ᅵǓþÞ.XOŸáè›àê¬>óËÓs+WçH~ÍG’l€#ì_ŸÁi
&`f˜Y´$T®À4}̸:8ɴ™©Š´•#PNý¼UqÁ4!àԄÿ—_½] §q½©6IEND®B`‚‰PNG


IHDR;0®¢IDATxí—=JÅ@F“'ØikþlÁe<!¨Š[P´²+ÅBl„ÄFÔ@Z±‹!
þtnÀ>нñó~aú2#i&pºÜs¦›;cz¡¿°/m¿
„¡`ɧr
LÂÇ+GHË_d/°‚ºÄyh~­9pQû°wÛ
ÎÒAÚðâÖs{ÚÝ`õÌ:è¢SÞ|j޹¶ÓAÚðÂƣó0áê•û°û°»»»ÍÃåWúÐ8[.ËtjÃÑúýùèà֫ORü€®híîTžš]žGWIçßsq蠋NmX¾@˜BaޒP¹“ð¸ŠOCa²#Cåèô/‰?ð2ÜPÛ/ÆIEND®B`‚‰PNG


IHDR;0®¢áIDATxcøÿÿÿ€sxÔbå El@<ˆßñ
ñ;¨YlÄX<{x÷ÿÉëïýŸ¿ý1%lÈ, ™ÄXüvêÆGÿû×>úŸ1éîÿtò0H/ØY 3‰±øÿ‚Ïÿ§ößùïTyƒ2lÈL¢-N¦‚ÅɣZ<jñ¨ÅÄàQ‹G-¼բZèâÔn€Ì$h±cæúeÀæ
Hȵá)‚›>.Ù´øٛ/&@˗«…,þHicdÈ,™Ä4oeؘÊXš‹¡–PÁB¨YŒ£=	nøÕKU,CIEND®B`‚‰PNG


IHDR;0®¢#IDATxí–1JÄ@†ÝYÙ"6Š–ÆUw`!x
…-´ьA¬ì<‚¥Z‰D1Vڥ×R¢ æ!Še°x¾?L=œqÓLàëÞû¾t󦈨Ú	û0¾Q\ô˜s¦dȒOåê5	Ÿmž|ÐÁõݑpÀÅÎSS¸3ŠßK,¦¼xcpÁi
‹¡|«ÿ‹{‰pÀ'ܺpw½ÖÃÒAXª0œpkÃkû/ÎÃp6çÿÎ݆}؇}؇}Øù³Ø0üü%“ÊÙ!œÆðÊîÓåÆqëÓ'ºª®ÁÎã…1<³¸>¿´uŸÆÙ÷ò8#à·ná4…0LȬZ*W`:}:̴œeúÌÜé+G œúóVÅÓu„€Sž,¿ÒKóÁ}
BIEND®B`‚‰PNG


IHDR;0®¢IDATx^í×=ªÂ@†á{!D"hccañ§°7Ĉh䖖nÁFPâºu‚QëÜA‚­ŠÏÑégpFl&ð•ó>é2ù€¯ì{°†‹G7ą8\ÄZ¦<¨tOPŸÜÁ[€ԨA-„{ðHhsާr£áÔä…ößöT}¹N-jòaoÿ„]°Ë`lòá|k§Ʀ|ÔÂְ†5¬aµŸEqxÕÇ7ejQ“ç›Q¹sÄW髏ë_€ZØìsáT©–°å,ë¬϶³™QƒZÔäÂø¸$.ËH.ÍZ†üËðÎÂÅߜÅ5õŸÄ֬էŽÐÛIEND®B`‚‰PNG


IHDR;0®¢æIDATxcøÿÿÿ€sxÔbå El@<ˆßñ
ñ;¨YlÄX<A'fëÜÃÿmóQ‚Áf€ÌšÙAŒÅom
Nþw(9÷߱ìòÇò+ä`^° ³@fcñûâ³`N•7(Á 3ÀfÌ$Þâò+”Z2cÔâQ‹G-µ˜0µxÔâÁ[-ª….þo”_¡Ã 3	Z옹~°¹Òr-EØhÈ,—ì
	ZüìÍ åËÕB¤´±2dÈLbš·²@lLe,MŒŌPË
¨`¡Ô,ÆўtUŠùÄäIEND®B`‚‰PNG


IHDR $Bâði£IDATHÇíÖ1‚P€áBB`bgp0²@d0Â
˜¼à€3‰é«cW.†¼þû7¶Eù-SqçáQCElÀeœ¨Ç8Y'Î4ND߉:¡1 UÝôåѦª´ô»€ހa0 À!n×Zï¸-³s>‡Ed™¹S3òôh¤&7 ¡ ääQIAb@DBJFþe)	Ñü™úŒbÒaLIIEND®B`‚‰PNG


IHDR $Bâði§IDATx^ÝÖÁKaÇñGY÷ä݃©›øDj͸¡֭-w׊Ä
¼xèÐK‡:(vPôðOðR (ˆ‚B^#
ó]f¾>,/ûàevß
"šsü~f†a„?ÜÿH¯ܔÛ2°H‹^nìmg)G–îm˰Q–¦4–*!‘wÁq0È]’®€ĀRg€»”ï¼ä×-ðƒyÆ(q„ëøÉ+&)3Ã4'áÀ/5Ÿå	5¦XÀådz|‰¤™×yÌÎó®À񖈏Fð›×$j®ˆæy÷1Æ÷ˆù„óùâV>Ϸ¼§àXç©ò€„ý&±l9ÏùŠæy&¦5êzާÄ+Ä<òùSÎڿH
¶4¨{b’IŸWxÆŸçJ°Ñ"f©ø¼Ωå9€·?xBçó…/Û¦¿oæ8²¼`[mªZèÞ)QeßòPàB‰ϖº†¡€íïqWŸõ؀Ñݝ,#àHÓÝ1 (·¤,µ€•µ(P”¡€
jQ0 G‰>é—b‡ë—>-zþÿƒ+›ŸBÕ
FxIEND®B`‚‰PNG


IHDR $BâðiFIDATx^ÝÖËJÃ@@áé˜mè+÷D›ª‹&i´VADD,E¥>„”^¬¢âÂKý5=†0tèfdQhþõùÈm&Q”œUTEyÊWU‡ñ³¢boX›§8ótXSkðçiʧä¡|TAøpTõï)¼Ða„^i³Aƒ	Rx &ÛÙL݁w	ˆh³Å>bn‘åœ#'„tx¶pÎ:7†`Æ1ažGyn¹BMÔ :?¡¾ÈÛ<ٞ‚pÉ&MbvæÄéRþ˜ç Ï1IN4qfrvyøùE®	I4˜kg{“ÛobADD:O¸ӹÐĕ&²ÑùqYLÂłˆh1AÜWc/'"bÆH±åÜ%$Ö³0£Ë)³¡ò_[š;P~[÷Ʈ–¯qMy¿ôiӄû¬ÌÿÁ7mäKx}IEND®B`‚‰PNG


IHDR $BâðiÇIDATxÚݕÏ+a‡¿ìÈeٛGq“£ò£µËúQØeÙ"J”ƒƒƒ‹‹ÃPÊañøü.Êa‹”RJÊU2ŒÙýø4Þ[jÌ;ÊÁ÷Ù÷0õ>ÏÌôn»‚_òÎTK‹tJ¯]ÒB˛ÖÓ]Ë,#8–yº+ÍâݿÛ2K°5(1!Ýî3D$^†­I§ɩC’¡I1hóS#C¡C4U $ð„+)­À3–Ѓ$®Â^°Š&1‚a\ëL¬QÏ`Y¤°ìxÇõ7}ŽžCšú£ .œUè6¨§=£tŸÀú0ˆ8Î=}qO_ƒÿ) ˜Áïyá¼ÎV…¾ˆ{Øþ#ªYä¸F‘DÛԧ”>;Ø?J8¦S‰ùԧ±€[Ø?TâÐKd(::×
ìŁJ¥ó`5dŸ	WŸÅ%lÝÀ;vÀõ,аµ^"ÏÄx˜¡ä	~BH‰ëò—DˆŸõWI|ÚO
ÖkÁy3O
Òæ©“—´d’æîZmNDj%&
Ò(Miäî­ˆû×fð"*õwFi4ÅMDxY£AƒzåTi¢æÕê‘%r´îIEND®B`‚‰PNG


IHDR $Bâði´IDATx^ÝÖ?kSQ‡ñCÒ.ÙjÞAw!“¤ƒ(5¨¨S¯&7Á`’Ҋ 5ààà  ÑAD|'.âP‚D(B”()zÏiդ¯àñG¸ü†Bn{®PD¾óóáÜ†¿Üÿ˜Œ).¶oz¬eŠ&ƒÅÍî`:äðL7»æ
¬¦#¶=6¬¢@8”à‡Ƕb£,›°|c.`ÓäeÞâü+zÄW¸ÈyúØd ڗG|ç†äU®QçmÜ| Âò·/¿ÅÙYޠÂ:£ù'ˆpÜg™—JD²ےWfy•
¾Îÿ
$ç!§9Ç
¯pq~‡Í×ø’ô/8s†€—%zÃrÍióɓ€g’ÖiPçezܓüjœ_ç;ÉWbÄo^HÐP¢ç!M¶4O¸„à¹UÂ8oðQóD@~ñ!t‚ðAóƒ€øO”©ó^óƒ=ţR£Ϯ×í¬Ä!j¼ÑÜ‚ŸBô4÷”˜°sԏ´ôÀBⱾ·(P(uºƒ=¯ˤÓ=~Rq¾PÊ&<ü²A¡4Î+@Žc)–S`F,yÅKäþ•ïƒ?Ÿ+R!Ñ|L!IEND®B`‚‰PNG


IHDR $BâðifIDATx^íÖ1€0…á×ÈJzå³é!¬Âs1éLÔÅ?#>ì/
ŠH!(ÞÜ·ް-@݌G £t•œÜM’¨_	$@	<_ë2¢‡å
òÒi»‰x¿ù.t’ÁB½YIEND®B`‚‰PNG


IHDR $èë8âÿIDATXÃ혻Q†W"„O µÄ%q齈‚Š
A­$*¢ñ*O Ջžu‰‚ÝuŒŽ‚£t–b&ùºÍÿ}åî`üƒþ& Ð9û>b" ‰­tø>ôÆ3„¸‚®£mr ««´O&= „Çq´@Ûä —omƒeYZ m:éz
È5÷®H×[@cë^ÀÃõm˜®Hpppp¼Ô×;·^Ëɥdj«áhºÑúarÁmr¤«ˁŠÉÒ|’*/ÉÊt@Ûä —€çE"H‰k"*ÞOáGHðËä69<üàÉ
pÔÞLØ}IEND®B`‚‰PNG


IHDR $èë8â•IDATx^í˜M‹RQ‡¢¡¶Õ'‚ÖA/P	¢è(ÎËN÷'E°` #7ÎBCPjd /Ѫ­…eÄ‘\ÔLfŠŽ“ýº?è,äXÐÅksàá.„ó<Îÿ^õ€¿ʿp {޻¨ðRáHqL]£âéw}ߡÕâÞt(®r@¨{Dù`0Àéé©&po:è’<û
®~¿““MàÞ\tI÷Ÿ6'@—<ge¿ K
¸<[@³لßïG>Ÿ§T
 K³€V«Ç½^‹łb±HñdÚí6¶¶¶033‡Á¹¹9ÌÎÎâððPû€N§ƒ@ @9–––°¾¾ŽÕÕUØl6x½^ÊÕ”J%†ýV¾½½
³Ù,䨨ØÀââ"|>†º3@i4…N§C&“Ñëõ)§PÈ"äêίñxƒV«&“	Ùl–CòP(ÄÏ$9b½^W7$™LÂh4Ân·cee¼Kìïï‹„Ãá‘r·ۍZ­&äêÒé4¥<HܘWÌÏÏs´8߈D"”ÃétÉ].ªժ$ÿã)àËcooÁ1#Còååelnn¢R©HrU"bwwWŠPî”Â!9¯årY’«	ªS©”ˆr>lLÑXDD"‘`„$_[[ããVȵ	Äb1F9§…BAȵ ;;;Œ œ#)ä“èv»Œ@.—ò‰ŠEèdþ·€'?Oêk9]RÀÝÇ^½~ûIÓ&ß9w½OHW®[®Þ|˜{sÛ{ðå–ïZ=é K
PÖ…k
Ó
74bšºFœÿ1¥pIáò˜ážStÐuöÿ€àiJ8(Ér}ÌIEND®B`‚‰PNG


IHDR $èë8â¾IDATx^í—KkZA†›”bCW¶«n¤¿Á6V°Jn¨ÉλI Ô*ua[ií"›P,K ]DAWýÙ.E*DƖˆ÷Û×yEŽ
ëX(=ðpÊ<ÏpfÎåýUþL:3ùxð,)S¾m„%	âpÎ~áñ›jøýçU]êõzBÀØp0×;8¹œq” ïv»Ôét„€±á€N¸‡7½¾B%B.8‡‹Ùj 4·¸à„{°´úêrnp1çMiÀËï3(—Ëäñx(‘HL€N!•J…\.©T*ÚÜܤT*5¿€Z­F^¯—666Èh4’^¯'NGétZ|@½^'ŸÏ9Y,ÚÛÛ#»ÝNZ­–Ün÷ôív3ø­Üï÷Óúú:—ïïï“Ùl†œŠÅâô¡Pˆ”J%ŸŸO”·Z-
CÈå‘ȧ	‡äV«ikk‹ÖÖÖ(‹ɃÁ ~“c!
…éwÁéé)i42d³Ùhgg³¤x<Î/ÍáááD¹Óé¤|>áô‘HR,$Œ3moockaÓÑÑäd2™$r‡ÃA¹\²©øƒ#B€I[é@"·Z­tpp@Ùl¢?àggg£˜)„9ΙL’™H֏Àå|«
	'''ˆ“ïîîR2™„@lVýññ1"¸—ƒ?pÄðܘ­ɷäÜ@³ÙD¿)Í=ð÷ÆùpþŀşÕFGøk9p¬ø¾}}ºÄP)„J½Cp<|þõÃèK©lYþä®âi"²âýr¥ð\“š1„±á€N¸ù‡	ãããCθ?cä¸ěš¡h±̸˜ƒ1—á€αïCT
B–!ƒcTÎ#,
.ÿÍē½Š·IEND®B`‚‰PNG


IHDR $èë8â‚IDATx^íØKkaÇávÓ/QúíÖRQ’ Ádç=(Š¢B+¸p!Ԃ!6ˆ³ë¦ý
n‚Á¤‚**Š÷[ÜÙÕéü‡ö…q$ ql)Yf!ÌóãÕãíýÕùwžÞ~\½à暛7$ÑÌaÀÚðùýí=}ÿѠZ­&ÉàÞ08+²)`¼ÙlR·ەdpo°6 ’úý¾$ƒ°þï€ápH£Ñ×Ãm·Ûät:)“É äpÀ;Ùív’ËåtzzJ¹\Òàr¹xX§ӑF£!µZM…Bq»ƒq<ÞëõÈãñð¸Ñh$‹ÅB———tvvF‡§°}`”çóyÜàAÜëõÒÉÉ	íV+œöû4
‘L&£T*…Žñù|À2!n·›Z­Ö֯†G"R(¤R©èøø˜îîî!Àý~?á؂F£±Û¹ºº"¥RIZ­–Ìf3]\\ðP:f;6âxÎëõ:Ãw
H$@ñBùëùù9V‹ßï`0Èãz½^€Ûl6ªV«4øÖOÁ|>§d2	ën2™øý¯T*ÀýVÌ"nnnÖ#pÌ8®år™á
`³ٌâñ8‹XR*•¾¯ÁIÄb1DˆpœH±Xdø>D'FÁplÞf'“‰äÇ,"#‚dzÙ,å`ÓéXE†*€E,¬ÚÓW²ýÈ?­–‡øZ^äX¢]lõõÃí=%þaÃxýó‹(`¼¤7\ķwÁÕRªŸf¸7Xë˜Wܼ>мÜðüwđ„ðXOÿü™_ƒBaðP\IEND®B`‚‰PNG


IHDR $èë8â@IDATx^헽JÄ@FÍ.C\¬®•Mð¢«>ޏ¢?(ö¢ÍZÙøV>Š ‹…`+n”ƒAfr½Ld6n™‰Í8ÝpϙîÎý+0ëž™}VwÂͳ|Ȥy⸪¯6N³áåÝ7e¹¡¢(¼€Ùp°ëÎ_9Óæ€rci­½€ÙpÀ'Üe€Z?™ ¯Àœe@‹	ûÇicpÁ	wÐ鍀‹óÓ‡oÀçt€H€H€H€H€¼~d¹n`-×ן€ÞþËõÅíPé…Ï/Mp¬í=_U—Ò0Š·–’íû›ÞîÓ$Œ(<Ö̈0¸ܵ<`³Àt™e&fVj&¶³»֥ܟQE6"bS3˜YGè~ÍÜeC:ž€XUånhy&på?ÀJ¦2
-j„IEND®B`‚‰PNG


IHDR $èë8âÎIDATx^íØ!Â@…ajz	š€&pî7$jë0pj°
Y³É
’’®[Ô0/)ªk§TŒxvÿOv:"¢¿n8Ìw!å弚GB{·48oІî'UU%2¼Í
@Ž1@¸1†¬µ"ÃÛh @‰9çDh
 (@
P€ ,Á÷ñY^r­`u
×mÑP)|˜ ±Î?—àåiƈÛb¼Ôi†·Ñ@+vœNxӞ6Ž’‘	†³¶‘èÿ߾!0)Üb—IEND®B`‚‰PNG


IHDR $Bâði¸IDATx^íÕ?‚0€ñ¯M:Ì,&LÆLÐp'¯ä	¸€'àdüUêÐ4]-n¤ï›ßo|ýgÌHrÎ\<*ɑ;yûœ»EÿÞܵO”SÿÑo>zê)¨ýölÑTn«€a€zPo@€ë8xŸõ«N¯f|ËؿŽˆ)¸óðèNAl(R2öe¤(÷™$Šˆ„ݏ%D(¤@¬k—¿bïÜ䊡ËIEND®B`‚‰PNG


IHDR $BâðiIDATxcøO!.001˜°¦²æ’SL˜˜”õ^üpë?ñð⇲^C„a?Üûÿ˜xhC€˜[@Ág$ÀÇ@W0ÄЀQF
5`ԀQXÂÉ(Ö?²„Ã
P²©è½ø‘¤Šå}E¯š܀GÂJ6Ìá1ÄCæp%›Gˆʕ뿐bÌAR4Us
–ö’®ÌíŠIEND®B`‚‰PNG


IHDRëåÖcsClÁ0`MŒIDATx^ҽ	Ä0@á7‚5רmÐZíº,qÃdƒԙF‡#ˆÁEæ56øÿ ©â8 Ç斨þ>´􉓨	@²J›è¨÷¬<ÀÐصû„ŠùyíØˆEAÆèò—Ï`Dé¤û_ù-­zýZW.Y€üçß;ձ¡ h>äòc±9ÿÕ!IEND®B`‚‰PNG


IHDRëåÖcsClÁ0`MËIDATx^¥Ò=
ƒ@à©L „°uì-4 ©ž!©Ó%‡HÐ
édOgí<Ääù°!® Óìƒù`ÿƒdQb‚’îNÇ«ټùı:ޘ3›͉g^„˜X©﹙͖!Ä=¨˜I}¡‡é¨S¤ÓFZ/$SP´5%ZgÓÖ(LYNÁPR2ZýcòÕgžC‰Ö#b=ðoišW\«÷áÆÀ2gÈPZV¯BROri9ú½-KO,]w<æÜv€ÿ°°
µIEND®B`‚‰PNG


IHDRëåÖcsClÁ0`M™IDATx^Ó=
Ä ไÅn³¶Á2XÇöÉnÉ9Ræ¹Gàʐð@'2Â|à/`àºba22wLyéÈç÷†%ÈKò˜ռH4[ƒ€X²Þ`å,<¤4]
â¾]'	ë׹oˆMð”n"£6ò­ê
À’Yÿ0_’¾éñc¿8=’ïÉÈóÖsLpòúbþQ>×ûg2IEND®B`‚‰PNG


IHDRü|”l%IDATxcüùŸ+ ‹Äo\ÿpI0ÄᒐÇ%ECâ?‰šcagœj&IEND®B`‚‰PNG


IHDRü|”l%IDATxcüóŸ+ ‹Ä_\ÿpI0ÄᒐÇ%ECâ?‰ªVr.¿ÔIEND®B`‚‰PNG


IHDRü|”l"IDATxc|öŸ+ ‹ÄC\·pI0”âø/N²‰ÏaÞê7zIEND®B`‚‰PNG


IHDRü|”lHIDATxcüÏŒžÿ¶ýeøÇô•pû³‘›„þŽ
—P&fL	.CY6L	nL	Ff db`„K /%a.W¹ñIEND®B`‚‰PNG


IHDRü|”lIIDAT•cüÏŒžÿ¶ýg€ñ€|ºJ¸ýÜÄÂ΀EBUž4+;¦ƒ!ƒ,¦7¦#3210¢I œÊ$rœðkPIEND®B`‚‰PNG


IHDRü|”lLIDATxcø…¥·þ?úÿi%ñ›KþùOw€RPˆPòɚþó­ÿPˆx$¡ä˜ÏP
‡p)ÞÿâÈa9HJCâ”b²F/‘•:IEND®B`‚‰PNG


IHDRü|”l+IDATÓcùùŸ`c`aÀ¨)DK‚§Žx\vÄ%ñ‡Äÿo$:„6*„üIEND®B`‚‰PNG


IHDRü|”l)IDATÓcùóŸ`f`aÀ¨)ÁH²S<.;â’xCâÿ7î3~ÜIEND®B`‚‰PNG


IHDRIbK
IDATxcø‰P8/¡YA— HIEND®B`‚‰PNG


IHDRIbK
IDATxcøƒP83I¡Úá9ÇIEND®B`‚‰PNG


IHDRIbK
IDATxcx†P8y‘1ÄêIEND®B`‚‰PNG


IHDRÆvõIDATxcø…žÿþÿþÿqJCƒ$)‹<©ÍIEND®B`‚‰PNG


IHDRÆvõIDATxcüÏŒžÿ¶ýgò §¥	ùoÓ³IEND®B`‚‰PNG


IHDRÆvõIDATxcø…¥·þ?úÿqJ2ÿ#IaR„IEND®B`‚‰PNG


IHDRIbKIDATxcø‰ÿQ8/ûeÏ>IEND®B`‚‰PNG


IHDRIbKIDATxcøƒÿQ83v§^em±IEND®B`‚‰PNG


IHDRB|£`IDATxÚíα
@@Fñ'¹D\¥W˜Àz‰
TFCg«‰ãÓÉ]¢þW÷{<6I§i—1ÉŸ5OD—i·B` ¶HzLáØéHÌæMôx­y
5Ž„7®¢ÄQýxÐ4LÑ2žÿÃIEND®B`‚‰PNG


IHDRB|£_IDATxÚíλ	€@ÑÑÈÜÀ
¬À\°#;ó۠\¯™ì‚ñ‹öLÃ*é6Íé=ž8ñYâ„7ጻ:|³¤Ǵsß&£y-ڼŠ’”@a\NFJBôã6P\䍮|IEND®B`‚‰PNG


IHDRB|£_IDAT8cXðÿá£ÿ·þ3”2 ƒQGÀÀü‘鈇ØñÎðÎÿóŸYòQ1ïÿ-:Ã󳿫y¡8‚!Ž¡”¾9_É÷‘ª#äÿ‹äAuÝ öŸ—a`»¥—áÉŒIEND®B`‚‰PNG


IHDRBFÂIDAT•cXûÿÿÿŸt…¿ÿÿûÏàɀÖGׂèds“d˜IEND®B`‚‰PNG


IHDRBFÂIDAT•cXûÿÿÿ?t…ÿÿûÏàɀÖGŽé²AçJŠIEND®B`‚‰PNG


IHDRBFÂIDAT•cXûÿá£ÿ·þ3”2 ƒ5ƒÀ)wßæœՌ7IEND®B`‚‰PNG


IHDRB|£MIDATxcb`9bÔNt‡vj¨žgڵ÷ÿÞt…÷.ePĈŽ¿t…,–‰Ò(Žø$þÑ213°†„É4øñ´œ€8åVÛù°"IEND®B`‚‰PNG


IHDRB|£MIDATxcÀ£`8ÑÚ1¨10¡¸a×ÿÿÿÿÑþþ¶£ŸAÃé}†2Ø	tĺ¿ÀÐ`pŽpŽðDqĎQG@ílA*-ò»IEND®B`‚‰PNG


IHDRB|£IIDATxcÀ£`81”Òæ2830£¸a×ÿ[t†ç?eÎg°CsÄC:Ã;@gCìüÿŒÎð!04J؏©#vŒ:Lî%­i皴IEND®B`‚‰PNG


IHDRü|”lIDATxcüπPS‚Á	‡Ŀÿ8$~ã’ø9€ 6<IEND®B`‚‰PNG


IHDRü|”lIDATxcüπPS‚Á	‡Ŀÿ8$þâ’ø3€¥¶+§€8IEND®B`‚‰PNG


IHDRü|”lIDATxcüπPS‚¡‡ĭÿ8$â’x6€„˜°ÍçϷIEND®B`‚‰PNG


IHDRü|”l;IDATÓcùπ°0P_‚‘‰A…AœS‡òáR«FL	IËDæ¿Xì`g
ÿÃ"DËUL”ú‡*+ŸÑXLIEND®B`‚‰PNG


IHDRü|”l:IDATÓcùπ°0P_‚‘‰A…AœS‡òŽLçtfNL	I§&ŽÿXì`g
c“`Âå*&Jý˜ÆNöä;ìIEND®B`‚‰PNG


IHDRü|”l7IDATÓcùπ°0P_‚‘™AA‹S‡}fLZ07/¦„vZ0//+;8¸ÂØ$@öÐÆi©$“IEND®B`‚‰PNG


IHDRü|”l%IDATxcüπPS‚Á	‡ĿÿØÕ3þÆ*ÁÂÀø«]$¨â=Åà/=IEND®B`‚‰PNG


IHDRü|”l$IDATxcüπ01PM‚‘Á	‡ĿÿØճ@Å	K ,§½ÖöXͫϪIEND®B`‚‰PNG


IHDRVu\ç3IDATxcüùóç0Ððû÷oÒ4üû÷4
¦ٗIÓĤjà"IÃÿÿÿhª9Ì$&P¤þIEND®B`‚‰PNG


IHDRVu\ç2IDATxcùóçψêi¬Á<÷*iNOÕÕ$ÕӏHÒðÿÿÿo4
V÷Y.º½÷AIEND®B`‚‰PNG


IHDRVu\ç.IDATxc|öìÙ0ÐððáCÒ4ܺu‹4
vu?HÓðÿÿcšk` ©‰B(¾4…+ëIEND®B`‚‰PNG


IHDRVu\çpIDATxcüÿÿ?2°©z÷ÿp« Ã߿þýûǀ†§†Ê7ï÷7	031§røáÌ8'ž´TwAffFÂDԼDä{YX8þ32ðÔÀÈÈȤ¤˜•
 w0C1HC!@‘¥
d&␢IEND®B`‚‰PNG


IHDRVu\çlIDATxcüÿÿ?2°©z÷ÿp« PŒÑÁðÔPùæý®AVF—°Ëâ‡3ƒ,¹Ҳ}…8٘kQó‘wlìeaáøÏÈÀGP###bbVb4€ÏÅL !
„EQâaYRÞ.IEND®B`‚‰PNG


IHDRVu\çqIDATxcøÿÿ?
¶«ûñÿ֭[ÿ=zôÿٳgx(ixøð!q~|<}ñÎÿ;wî€4¡cL
ý?–åÏúðÿPÐ&tŒ©áÕÇÿ&@MËê|9##°,ãÂØ40B5àÒ@&YSáËý|Ö|IEND®B`‚‰PNG


IHDRVu\ç:IDATxcøùóçb1
¿ÿþO$†hø÷ïß"1Dƒiöåÿ¤` Ð 3p‘„Î"	“¬Z;±¥,h—IEND®B`‚‰PNG


IHDRVu\ç7IDAT(ÏcùóçÏ"333‰`0j`dd¤±óܫ¤i8=UW“TO?"IÃÿÿÿ¿Ñ4X
v7^ò{‚IEND®B`‚‰PNG


IHDRl=—"IDATxcøÿÿ?
¶®|ûÿ߿ÿÿþýÿçϟ˜d
øTÓêA«IEND®B`‚‰PNG


IHDRl=—IDATxcüÿÿ?2°©z÷ÿp« PŒÑÉwñ錭YDIEND®B`‚‰PNG


IHDRl=—"IDATxcøÿÿ?
¶«ûñÿ֭[ÿ=zôÿٳg˜d
ÑPâA|ËIEND®B`‚‰PNG


IHDRBÖkô“IDATHÇcX°`Áøùóç°ſÿþÿï߿ÿ֕oÿ3à£1¨`þüù£1X¤x¸â¿ÿé¿ÿ­+^¿ÇóæÍ(Ć+þ„i[Þü7/¼7g@˜f_þ?ܱYÖåFi§
«zŠ0à#+±(³à®aŽ9˜Œ£`ÚÛûÞ3êZIEND®B`‚‰PNG


IHDRBÖkô‘IDATxcX°`ÁøóçϰÅÿþýÿï߿ÿ֕oÿ3à£1h`þüù˜1£R<¬ñ×þ[W¼~3 æ͛
Pˆ
[üåûïÿ]«_ý7/¼7g@˜f_þ?ܱYÖåFi§
«zŠ0à#+±(³à®aŽ9˜ŒDQ0
bÓO½ª±IEND®B`‚‰PNG


IHDRBÖkô—IDATHÇcX°`ÁÿgϞ
küèѣÿ·nÝúoW÷ã?.0£
æϟ?#% >|H\@€g|çΝÿg.ÞùïØðã#΀˜7o8´†3>
„üYþGOü¹g@˜f_'™áŒê|Œèÿ±üÕÇÿ&x€ÆÿÿÿG–Æ\# €XˆFÁ( 
¨H÷ñ%õIEND®B`‚‰PNG


IHDRBì
„+IDATxcZ»víøùóç°ſÿþÿï߿ÿ֕oÿ3àLÀ0R£ÄrëÓ~=kÄIEND®B`‚‰PNG


IHDRBì
„+IDATxcZ»víøóçϰÅÿþýÿï߿ÿ֕oÿ3àLÀ0R£èKíȅ{ÌMIEND®B`‚‰PNG


IHDRBì
„*IDAT(‘cZ»víÿgϞ
küèѣÿ·nÝúoW÷ã?Àôÿ?N¹µ/ޥø;©#IEND®B`‚‰PNG


IHDRBÖkôxIDATxÚíұ
€ EQ+—RÙK£ֶvŽì1±P@ø=ÒÿÉ[àä5†a‘õ
&ýv¿6	Á9‡s®Øé×ÁÁuٲƘbg­d¹E‚1!¥T©ñÃ|Bxˆ~:"BŒ2
A)­¢Bä > \ЩÀÚIEND®B`‚‰PNG


IHDRBÖkôwIDATx^íұ
€ EQ+—RÙ£Ö6Îbì11Fù Ð#=ü—ÜN^ƒÃ0ì/²hWAʷûÚ$„…Yk‹íÖà¶ã
 kJ.bù‘IÎy„0ÆÄgÓå<Bôã!‚ª4c¬ˆŽÊB|ø¨æÁ1oIEND®B`‚‰PNG


IHDRBÖkônIDATxÚíÐ!€ Fa“ÇòHÁlµrà
&ëÎ4£me“	Æÿ›yø„ª5-tð•ßòcÂ{/DÔôûÁ2›[AÖ*D¡é™Y1â,B8ç$¥ÔôŠAD
!]CÄñÂZ@|½ã疨ƒT‘ÁIEND®B`‚‰PNG


IHDRVu\ç*IDATxcüÿÿ?)`0j°«ûA’Æÿþ‘¦á÷ïߤiøùóçˆÓì+*/ÆޣÖIEND®B`‚‰PNG


IHDRVu\ç)IDAT(‘cùÿÿ?)€…$ÕôÑ`_ÿ“$O°h`#Í’Ci8+©&‚
$ÎôžšIEND®B`‚‰PNG


IHDRVu\ç*IDATxcüÿÿ?)`0j°«ûA’Æ[·n‘¦ááǤixöìوÓaÛ(XœëIEND®B`‚‰PNG


IHDRVu\ç\IDATxcùÿÿ?)€ˆ»ûúŸl@ªˆc€Xˆº¢l˜ò’œXX˜ˆqÒÿÿ± Å̌ÿþþý‡©Sý!&v°âÿˆÑðï/Ocê Mà ¤j<¤û ™@f&IEND®B`‚‰PNG


IHDRVu\çWIDATxcùÿÿ?)€ˆ»ûúŸl@ªˆc€XˆºüL™ó2]™8Ù‰pÒÿÿ± Ŭ æL
˜êÿq²±ƒ©áß_žÆÔAš C¨ÀSH›c½ñIEND®B`‚‰PNG


IHDRVu\çNIDATxcùÿÿ?)€ˆ»ûúŸl@ªˆc€Xˆºd~äŚ¿aàçüG”“bAйXYىÒ 4¤ˆY‰÷4##ãP‰F=	éÀ.IEND®B`‚‰PNG


IHDRVu\ç2IDAT(ÏÝ˱
€@°›Œј›(RÌ
ùQ¸tù`¸îlǰ-HwۂT•­¿„6úÀ*
IEND®B`‚‰PNG


IHDRVu\ç.IDATxcùÿÿ?)€ˆ›ûúŸÿIÒp hԌŒ P¢•„§‡º,å
*Į§×IEND®B`‚‰PNG


IHDRøԭ	csClÁ0`MIDATxc```ðe`þ‹[žIEND®B`‚‰PNG


IHDRü!}4csClÁ0`MIDATxc`d0f`e`à`2˜A0º#{sIEND®B`‚‰PNG


IHDRü!}4csClÁ0`MIDATxc`b0fd’‚@‚
sÏ=ìlIEND®B`‚‰PNG


IHDR±éÜ?csClÁ0`MIDATxc`dðý¯	’ýIEND®B`‚‰PNG


IHDR±éÜ?csClÁ0`MIDATxc``ðe¤ ƒIEND®B`‚‰PNG


IHDR&$åõH¥ãIDATx^í˜[ˆUU‡¿}Îvtt£ˆ´‹¡“3š3˜/E=hôfv!Rz0ò!‚"©ž,Œ”°—,z¤ž²*"¨—Š Œ4›QgFÇË訓6gfÎÙ{]þéb±pyrÓ!‰(×˺ì½Ïúø~k­Í>©ˆðo,)ðß»¶aՒ».`•~`ëúÏoF,"„™K/©±®GV¯XÖÖÑN("€ "®÷­ëŸ>=ûÍïnڸþõ-/¼ò¬Fì%ò–éÓ'S>é»” „¶‡œ€Ð2m
#g*W¿öÒƒ°åïQßb€á¾n†ò–ISFàh»€­ÀÛ3Öõøº'Ïj½ 2áÍD±‰¯CÛ÷çÝz‰Øp¯X-´%Œ‰XNýֹíýϻŠÀ͸~FýZò`¡&
“DpI<1X_‡ñöª+§’¦åN­Mós/>UÅÄÐÖäljSSSuìð ;¿ýÞîýhmøó"݂Á0,þ·Üôê[B(T­)LxKêڛ:Y²|i¹T€ž‘-޶%Xv¦|Xø1gvº·ˆÍÇÈ~¼bÛö/78°p³YµJ÷î½ܳr5å’QÄL6Ž+â“(NS¶.&1’7Jçˆ:·ÑʐOFïž}Ìíè \05ñ&ˆz\[µÅAjoÑ :ÃVOÑßce»sqzéù¥‡ŽÛï1€¤ޒˆ·S”¸v<11V4VհÙ8}G*;"c*Ëéß?Àò'ç9°ðp¼+-IdÉ۸ˆ¥h4¢ª¨lŒCÇÇ>KO.ô÷ôÑ:>鄲‹ѩ۠%‹„-…û¬ɱù(‡ ´ýôéÇUR ,ڽ¿î£mám`5b5.{[l)‘ú‰L±¹`ZT†ÍÇé?ZøH$!¬1£={z¹wå*Ä*W[h 2kã1×W.F“g¯|’Pƒö0»½‰›°zŒ7æB[úˑÅ <‡Õ
ǻ
QÍí7]-8!"á¸8ã~Ú:z[ÊG)ÁFl©ñÈâàAgì1š‹‘¤b½1­Ùýó^îzxbrÿ@R¼°P½¥ó¡룴*CòŒƒC9Àñ`:p„Y­shnž„è
íM‚¥³èb–â¶
µ…˜§ÎT©šÝk–µõA>Jöõô¹ÓwcŽC/ÖÆϧâ̓;íó'2g+)%ñÇÈO?v³î¾“áà¬ö14Y+ÂٲN‚=ãIåÀ(¥1ØÌY7Ð2e2¢* spúˆ¬þÕSuáKÞ*÷ªŒfWÌû[w&I)k_p³»Qt
¬.|ñGfŠ,y(ãw»FTÎÀ)£³GÉÜùí
“#FSüâ-ˆ±ÐR':Gô90ð1¥rü1’$	ÓZJHmQã@ÇGÃõ`Éo0‹¿ܸx[ÉÇQYƉ𝏑&"£»wµ\wM3¢«Θ0ÊA`4Vx“îº8h‚¬`ł‘Ðpñg µ\ñ}¿ÆXysíí5.>øpû+þÙb¯Ö,óå {ù½¯×kÿoª\»ö±qK¯…IEND®B`‚‰PNG


IHDR&$åõH¥bIDATxí˜KlTUÇçޡ­R°€QyȃZ
Òd£³Ðhâ’‰qCŒìܸó‘ W>ŒacÐÄD>ÄÄD##1&ƨ±b[
”÷4±SæΝsŽçžïÜÜ^°­`:1ړÞü¿ï»çv~sþç˜e­åß8"à?¶Va–QÿéMP‘û‹ rêbÉÿZqúòoìöUnl|xöÕýïÎf­AND#Š<º^qšAí}ê±êÚõkÊÐJ¡‚^+Nž®¾óÚ[óƒ½òúGÜĨö,ë¢>YCÉ{0›)¢¢ˆo[ÞéŸ}ééçç·¸)[Ǝå›Û:ؾÇ÷<X]½úö|Ý螓\©¿eëࣻK¶ÎV½ëŽÙDÆIčï¹,'BaŠºË-…O®‰aÝÆuþµ+/>ùð3r®~áU‘•Ë,C͑–q³Æ5ɮvѻíž\¾Çö=±çþM·®ZGÔكŠ+²đ‚ܮpÙH9ƒUvú\1*Ô(6¹¯#1
­áÌØ8?|ý9½[{K+—ƒ¡W¨4;‰+¥ºd?˜Èi^(š”ÅrÏFaïæFJî;53æ˜à¢¶
òåï1y¹FϪ%¸ø‘7twQ½sÅy$XݝxµN1M¬EgqÓÇʤ¢VԚ–<ïsÛ*W+ŠÕ+Y—ÉZ©Ú%ÖnXK>Ž>âñœ†ÔA´ò®±ک-Åù}Sޱ|MKͶ‚湑96Ä&ZlÝqÇ9î[¹‚•ߜ»Ҡ>}•îw3:¬ؐóơ%Î;×ÌTéP?ešܽy—/MRÿ£ÎÒeKɭŒž{û+m-G'¦0­«aUŒ¼sTòùãð¾f¤fuÐ<·2Çʊ+eéâäð	°VæAC£çØTöƴÎÈ^Ü2´ÓÛ)6vøôńf’„}–¶	.��¿Ÿ±‘3$f®˜³³¡ýðÔù:&MÄN«NêM*Eï½Û9þ»ÔX>>=Ÿ­X֔NêÁÎÁ>Y^±0>;u!¡•ævê6u¼}Ûþùº¥°`çd³eO\l`˜Øiδ¼ClìÛÂøÈxŒ¼;/4‚Ò
'yÓwhŸ³ó×áßfK t¦5¦=pZììàÇBg§óÝùZ¶j
³vááügpB÷ònwZ_+¯šëN“æĦ
pãÀЩëΡYÁ>»Ôôitátê4¡` 8]cç1wª˜¾š¬^×ÁZ¢8cåŒ‘Ó,¯ˆú+›£b§’ûKâJÇE=ruL$ŸV®ì™ó[ҁ#ÃÓûڦ¸%[¹8*¾@8•³c¨yÈØçQ,~NìÔC,qàã'`>×Îf¹îbâÔ8ÀԬ¿ö¸UûØ
,¡½c
xñg¨E°ÿ-؟=¶b#oæ÷IEND®B`‚‰PNG


IHDR@€4ãø=csClÁ0`MÛIDATx^Ԙ銝E†û=·#n¨¸ŨW aPaР¸¡Hޔup\¢‰ɥœ’)¾‡î3œÿ6äÌ×Ýõֺt‘¼÷ããñ^m@ÊȨª$£Æ5’ª‘ôw¥Ò4ýw¤ªFƨ¦HÞ5ª’Qlûk¤¡—„üK| £€ŽÑp0
©f’4ÝFÑ"“wï>næ½ԜçUÕ8Vö%¿«¹Vþ­“6­Ä8…S
÷Rºwî>ZػÂD¸_MôÖ“‰ËCêàÉQ#7x„±2íe$;„päo ±aûb£l£Šú¿àۙâ:Þ «P%7ï<,xm!Õ^²Әkc™ñS\Z§ V…KŽPÛD¯55‡‚ )„‡߾óoUw69Z/ÙàŠþ¢º”Ö•;"QCÕGòԭŽ]81ç;•¼õýCäô‚ë%b¡"->GãÍAú*fª­¾з|™uºÌf)¤
x€ÞäµÉ.Ô\ݫL—yèBº”WòhZŠ5Øá#o~÷ËT%Ü1µ'—Îd»¶ öf(ôR
±lâpª®7(o|ûOƒ £*•]F{4oÊ×RAl…³웇X÷øÊò–nнþÍßìf÷júâ¯DÍz5PêÉÕ›ób•VbÂqxûÚ×÷ƒRô/ŒkS‹+pl À*¦*ô‚l{JçØÁt®¡¥Éج{Ôáܺ¹ñÕ}£Ülštn,ºƚð‡„Û·æ‹ÿSUl!æ‚T‘I€˜xâœÜøò¯µݭŎöšõȯRådAèÍnWóê6wVÉ+v¥1GQ.EX'G}Á:>å•Ïÿ )*5lQŒƒ¶Büã“nÕp¡½Ä"O‚[îÕNÏfž)¬ÿòòg¿ëV²WÇÚ4Ö9ÐÕ#’Qp âÁpXšÙ;u@²¶둼tûb7#S¹ÙG1ض€¥Èmo"	|ŸØêˆ÷ò<0ŒZçˆȋŸ^H§ªlͩÃ28~âIžŠë^ BU†Á~n…yáöÅ؋³·Í–çƁŽlËU­XüÍÛʚáRšzJñü'¿gæՑ=µ¨L~ò…gfôf_µ³ÿ›Gé3½KbõS'˷—zCÕp`vž;='¾½q
aµ£°¡[Ìrš@IǢúg7b!¡1e°›Æ$
†
²¢¡Dž==·çž›ÂÔ$§„ޠí>ì}ą³–ŠsoÄJb‹oƷ<Ï||îܓ~§÷ád›7RTƱ …éÕÆ\”?öÂM
€‚¿òôG¿bì®QÅ`Pʯ?ø-’[a*Á!¨Òó`E^#;š¯F'nbžúð³ͅ$
#ž ԥm¦õp­Ñ0øºÏ:°ýk¹«
8ù¹vdœ)Ec^­W>æ!&
÷õ×MöÊÖ?>å̤0„cöE$Qmɓ'÷Àt8|YlýM€¿öUM쫻¯$fFÃØ³/Ղ«‚Ö6{`&k:ùKn¹~rl_ć)!U°ü§—‹[«Àq՗Wp®Ž©Æûú­3âcÒ(vñq ƒÄ؍xŚNýÉ8›·H‰í—}†T\±UyâÖÙ[Yó!¥ÕîÕ<¬¥{\œ”ǪWøµΠQ’»i¤7Y¥QYƒ[\A.‰µ¾—µ:gù§ 9×Þÿ	PâÔ{ëü*ïf`ˆ+-‘
`!³}X)3ãV©eƒɎûù¯=;6€¨«¹‘c:•Z	6i"<‘Kkãññ‹¸݀ÉÓ<k”ÔoV>ÍÏ/V(°h@çØ!þä?ñù	¬xõZ0íGÈ׮¦]S$P/‰æ²k €|™H _ü(KBßn”ҐïP	8lIà҇iÞYJíIEND®B`‚‰PNG


IHDR@€Œ_ŸXcsClÁ0`MÉPLTE™²ݚ³ݛ´ޠ¹᜵ߝ¶ߞ¸߸޷ࡺ♳ݟ¹᜵ޝ·ߜ´ޡºᠺᚲݛµޞ·ߚ´ޝ¶ݵߛ³ݟ¹߸ᚴݚ³ޟ·۳ޞ¶ࡹ᜶ޢ»⢼⥿夽㤾䥿䦿奾䢻㦿䤽䢼㣼㣽㡻⤾ã¨Âæ©Âæ§Áæ§Áå¨ÂçªÄç¨Áæ§Àå©Ãç©Ãæ¦Àå©ÂçªÃç¨Ãæ©Äç§Âæ¦Áå¨Ãç)CêëÜIDATx^¤‹Ir1ù’Àûìùÿ£ÒSœR9N›’,a[ûˆµãj³]7Îlm>ñW.–ZãÁ<øp¼5%ÉæGY8Šÿc­\Ãú£LbÕk­’~ê9%W•×St¼û^µ㢖ûé¢ðº\KrÓGLÑÕo…:€õDïý~“n®DNÁޢaˆ
™“1'ße“•2žm”1̀'ÃÀ6 l™r·”ŽŸŒm±_¾Ä‡¢\EÝu½ÿéúPš&í€ãð&çÞZíXϙÐ:æÌA£åºªs)³lu«ßZd£‹ƒ+Ú0)4¥Ì]ÙS’x‹Ç 9ì`öâ!È!ԊwôÚl0±a®H×Ģó)¹~éüw†D��{R\QbIPDËx›4%/Ή1nÑçQñy‡
âae	Ík•o.¥b„
Ú!¥B(Ûÿy™Ò޸–‘8ž>4°ǽ%s
ìRU­ú¨þ4¡w½¡¨ŒF¼¸h‰H’/_Y™¾ӺQČ]˜Ílæ&†q‡a3Af3;c.DÄÑà‡@ƘòA!Í0“ôõæB@Ð ÑJ’i‰¿u6š­œW?û„vèٯÙgŒ0(*÷ŽÛ|—ك/©b°Â@Q•ô‚à"²úÿ_ÙÑvÙKeŸÒkÎץù¿7jm´¯æå€sVºÝ滽¿l´ëFÚÆZ8Ku@P™ºP
LU¤#Q••­pEInzªu=
TÊ&’*^Iþ…‹‹{ÈZ.ŒÞ۷ìX;Äc‰¯Èk><7–¤~:<ˆo:V}×ÿ)2³ÞÙ:Ãr!ëƜÔ
' Žæn0Æ3†q'û´SÇ(À óÿ÷!ÃÝ.Ø&8™YÌ|LoeЏ¾“$$O…Xܺª­Bo~‡A;y]ü­~Ù?¤IEND®B`‚‰PNG


IHDRëåÖcsClÁ0`MqIDATx^œ!€@ç	4šTÔâú5ßâ8’{MQˆƒ·ŠŒž¤Ýn¡Çz°uÌhc1°Œ’†ŒS ›@‡œîYð²äVSüYˆÜî¯Â\
4ǧ@?êz¬úáôjèåÛ'¥Þò·m±ºZ*mIEND®B`‚‰PNG


IHDRëåÖcsClÁ0`M IDATx^ÅÓ!ƒ0Fá_1É§¨(¢¾gÍM Gz:4gào¢‚°ekª–O¿¤…¿R+S •Ì9Y˜3â9ÊH†Ȁ£ËpÄ
ŒGHÁLÇ!=eåßX=¢Â2½öØØïŽMö{àÙ?ÉÿÖہVŸ
äÑEÿÊïPþYË\ÀQSeÔ×4"=›áèÓøҼSFHó.~@/Oƍ$$¢=
IEND®B`‚‰PNG


IHDRëåÖcsClÁ0`MxIDATxc`eÐ&U3hÐüoO< ɠ
Ôðß~ª)ƒ1a8Õô¿=TKÄÔàÀɐŠ
"¸5Dî˜÷ù*Ü1!·†T„BdHūÁÅAþ©ø5$®(÷á`¥<â'
òß5R’7É8NéÎÚ8UIEND®B`‚‰PNG


IHDRëåÖcsClÁ0`M^IDAT(Ïc`eÐ&Š20hÐüoO¼fÔ 
dÊÿg Êÿ·‡i` ŽjB}{4¨Ï €[ƒþ«ÕÿϣÂW«��T'Ñ0”HK|Ä'ïš 
$f r¶uٕ¼ޱIEND®B`‚‰PNG


IHDRëåÖcsClÁ0`MŽIDATx^Ýӱ
ƒ0EÑWA
S¸0Åï3Ôl¦÷,“=`ˆ›ÂED}AúJ¶ô¾Ô+ÜÐKáœÉl¬Ž|Î
R 3ac"— a´Ԏ#•`e FŽŠÈò‡:E½®Õýâ±ó¾:vÅÛÁÓ'=ÿtÂh¨Íw™#:Œ±Œ¯Ì;±8R™÷íú§,•L³(öIEND®B`‚‰PNG


IHDRëåÖcsClÁ0`M`IDAT(‘c`eÐ&Š20hÐüoO¼fÔ ýß~ª)ƒ1a8Õô¿=T1ÊApT:0D2¤¢ÁH (N
‘Ww¾
¯îj¡ž’D³P"1ñŸ¼h‚4˜†±ÂöñXkñIEND®B`‚‰PNG


IHDR $èë8âßIDATx^í˜ËkQŝ´L晷JÅE7‰B†.Š¡šE•.„fáNq“…ÿ—Uwn+ЏªDHþ‚l\w¡ۈPB$ ™Ƽ_~Gïˆp“IH2¡‡¦w¾ïüÎpïÌÜäÂh4ú§ú¿œ….ùHë¤(i‹´ʹÅÆ6P³Ì€
¤0)~xøúi©TúÔn·¿ƒÞp8AøŒ1œC
jY°HÀeR,ŸϿêt:æ_À_ê÷ûПÿ­ó¨Ezá1OÀý‰ÄN²V«}µ=^æ¶BU^xØMË$x N§pjžð‚ç,WvwïÝív»uÀé/s	½̣Oxóø3Mó_0<á
†]€0ϔùž{:،Ø0èv:es·TÁÞ`pÜwtôáÙr¯ž_”`€5.ÀF¹\>fWïˆà
X\€`ðâV«UÃũð¬q¶û¿ÇÀ°¸@hsät0ÀâøýÁÛg¬qg5`	0šͦéô",.€×ë¿V,?;}ãX\]÷„i3ñÒé`qA½^_’îӺSbxƒ€—¦y6³Ùì§^F¹\î-`q —Ë%ëº÷NµZ=YöëžäcâېŽI’†a<¤7WcYxÁÓí–"`ØH’,+›ûû©'h\tK8¼à	o0&°ÖI•$ùj4{T©TNæݔ¢77Þð¶ْq!4Q×UUßËd2ïhÿ˜u[ŽÚLæã{ôÂ^Ü>B¡Y¹LWpSÓôûÏ_
…ãF£aö鰀øŒ1œC
jу^þÊùÓBˆ$)"Šî늢ÜRUm )Ò¦Æp5¨e=n>S~a®03)Äk¤+Lkb5nÖ3ûW³i•$’Ì$1è*«™zœÿ>`é'Ʌwþê±IEND®B`‚‰PNG


IHDR $èë8âÔIDATx^í˜MHT]ƛ1æ{G­PˆBD-pÑÄÞQ¦LMGaü¢ȅ‹?6.ZZï®mQdnŒ	u!¸sÓÚEm`Pb¦™ñkFOçÇ;½çzQá%èƒÇóÿÿŸç9çþïœ;sAñ¿âÏ2ð×@iéå"‰
‰*‰»u€qnî:9çiQ‹D™D͛7oGÖ×׿ìííý<<<Ì	9bäK
µg1€¸S¢ziiéõþþ~☠Ùläÿ'ȥ†Z8NcqCCc0‡d2È
A¹€Z8Œn‹J¼xhh¨KþR›6\pš1€¸+zøààà 	üɩ@-pÁ	·ր¶áª‰ÄøMÀ	7FÊhž¶R=œØ¹Æ,72÷])œL&ÅÔԔˆD"¢¶¶ˆÞÞ^æˆ)À	7ºèԙ™O/T«‡8‹‰îînQ__/B¡hkkŒ™#&ÖÖÖw
´ô\ߨØXV­>•J! š››bբ¿¿0ÎÇzzzD:Vîhi””\º½»»çEoõÓÓӢ©©‰­GT€<˜#å*gt{n4ÐÒ3P—ýïÒ5088(:;;‹ëš G>÷ºàF-ââÒF¶He ¥¥…íEÈ䴶¶*
 –ƀß_rßÈ@{{»èëë;Ñ9†ÐÒ3Ð`t†‡‡MïÀÈȈá-@KÇ@q`gg'¡jÂÙÙY‡O4@Îüü¼²	Ñ@KcÀçóß\]]ýªx)dxܔâÄÆÇÇétåc(5¾¡¥1àõ–ɗ‰N¿ÍÍM166¦ü%ÇðtD-‹ÅbóùŠ‚Ò}Rµ€Õ-,,ˆ‰‰‰|S2^\\T®À	7hiÈËêñVÎÍͽ3sÏ5c3‡½ñ
´4€Õjuz½¾¶··cç}Ã)¹ƒh(OCy8޲@ ðDž\éóz!N»ÝQކ‘‹„ÃétU†Ã]Ï)<ë+pÁ	7*ù^p;ÎUUÕO·¶¶b§})¥¶¦&ð.8áV¿’iMxl6[…Ûí}F?ÈN™}-'7ýü‘Z8àÒŒL¸äŽ]‘+¸ãñxON¾|µ²²²,Ïû§b€1sÄÈ!—j5+WP›°II”Ûlö[.—ëžÛíy$Eº$"€1sÄÈ!7WcW‹«
è5fAެP¢4'pUâ`Ì1rÈÍ՘ÿjfòbG."ëh'`Ì1rLðüý} ߕ1±ÃMLëÁIEND®B`‚‰PNG


IHDR $ß5ÈÐPLTEÿÿÿýýýûûûûûûúúúÔÔÔþþþgghûûûõõöÄÄÅððñ\\]úúúŠŠŠîîîÕÕÖöööõõöŽŽŽ»»»¸¸¸îîî	``aððñþþþýýý¬¬¬«««©©©úúúùùùûûûüüüöö��¡¡¡¢¢¢ªªª­­­›››µµµ¶¶¶øøøññ񧧧ÍÍÍ÷÷÷ØØØÔÔԷ··ººº   ¨¨¨ÎÎÎíííÐÐÐîî¦°°°ÖÖÖÓÓӲ²²¤¤¤)-ù7tRNS%#û!ïñí€þ	4ðÖkÅ0ìA»Ù×B

b_¼3Æ \-™IDATx^͓Õzƒ@„Q	-Ľ*±êâĵîþþÑtº!Éu¿Îíü̑=ÿLác™¦(ZN†×Ú1¶YÈ0’Äd
M6¶b9‘@Ó\WÓàE®ôÓ	ۓ@"ø¹8²1Ïa¿€ed!Rú¸Mìcb“ûí_ôó-(¿ŠèÏÂòÙíËþph\¶xÖÛÏ
°žÌi¯ÓéMÍ/bM’L¡€¶Ù5
]7̮q…"RIÈ!
<vûú`.½ÿ‹h!4ãBàíbîCââ.CC€’ðe<HTx…(Â%F8a(ÁyM~<øÀÃM É=o̫‘‰|óv‚Æ<ۃ>·({v‹ö0žù‹ڇ9¿j{ò~§î®'¶¿êª¼ðXŽƒ«R&ªÊֺçÞRª„§íõ³OJÝ–ONØQ	,R=]>ڈJ‹Į"ÆñÙÇ+Ê.ò±¢u¶Ñ
10¡Vƒ­G‰‘Ù|ûùõ¸Z>‹ãƒy0	Ý?Ô75’„=å¼b³IEND®B`‚‰PNG


IHDR $èë8âIDATxÚíV]H“Qî[Îý;§«Pˆ ¢ /tI%ÔiÊRSSü›^X7Šv±®
º4ƒ¢nTؼñJÄÞEP·a^h˜á`™ëÂçOžÞGŽâöí|sàMvøÞ÷}ž眝ïýÎ)Æ؉⿁“7ÀGÌD½Þ Y­gÓ	—y„ۄB€Ïóx,¹qŠÇ6`2™!œM¸ÕßÿúÉììßÚښgggã/˜ãbÈA.jP{,™™gtDdÿðr}}=°··ÇҌŠƒ8rQƒZp$d€Š-v{aéâââף»»»J3‚Zp	KܸxF{ûÃڍßḍ€\ę—rk(..¹ËÅAvš'¸
&¸ü`08)OØ8Á

¡œ\ž۞ðßnhD5 Ñh°ú:ÁJ«§8óx<¬¹¹™Ùíö}´´´àbŠ»nh@+Ҁ„“:00øTiõóó󬱱‘±ŠŠ
V]]
`Žgû±@  ¸Ѐ4Ã ‹ÍÍýü(X=khh`åååøÝ_u[[€ùaóÍÍMá.@Z2ä*uu5 Zýðð0+++cMMMû¢.—+x†˜Ãá`###Â]€iَ¸ÂíííM‘ŽŽVWW!.7œÎÎN¡h@‹ëø$#ÃZŒ¾.2àt:qð ¤äTUU	
@Z2Kf‰’ššÖÚÚÓrjkk
@+š;´=!‘®®®¸w »»[hЊb £`yyù—ÈÀèè(«¯¯i9cccB¤±-™³Ùr}zzæ³è5…BؼnBqÄz{{ÙÖ֖ð5œ™ùþ…´®É˜LiY}}¯ž+4"ôsÖÓÓ#êˆ!G±AZ244fsºceeeQ©cu>Ÿ¹ÝîÃC‰ùÄÄbŠ­ÜА$•𑽠ÅhL»âñxßÄø‰nD1?F^¯÷-4H봬*•JO÷¸R¿ß?•ìÏ18Á

hÉp¨µZm–͖ù'YpS£ÑfC#Ì@„	AGãre¥ó1
{%¸À	n®!E½ Àÿ£V«»š““ÓNŸà©D/¥¨ÍÍÍ{.p‚û@\ɐB0©թ
“sppðà`¼×rä

½G-8ÀÅ9%%ÑLèõ<G+¸Iw¹ûn÷³““ß>----ð¶½`Žgˆ!¹¨A-V.›i	Bvjªæ†^¯/2Œ÷Hä¡	ÀÏCry2q‘	AÍÉÌ+8O¸ðy6™y®µ"q Þ!Eü-©\@O0|®㱔°š$
)A$$[ô	ðfÞëzæIEND®B`‚‰PNG


IHDR $èë8âUIDATx^í˜KH\WÆ[Ú HѦM|DڐDZiIƒÛXpÇNhtpªóˆ‚]ÅÊø„v[wéRp1]¤(ZGÜÛy5‚ ¢£“ñýFŽՅ.ü÷üôžyÕE»ˆðÁáÿø¾ïžû?÷Þñ
ùOñÿ1ðÚ5kYÉ Ká®Â…G
VÀú<ö5Ið¤dàM…;
-–úN·û—ß&&&ÂSSSG333/kb䨡–z/kà“ËÕÑëõz—fgg,,,H$‘ÅÅE9 ÔÒC/)87”]Pð‘uttԫHÏB¡¬®®Êöö¶ìîîjAŽjé¡nKª;[Ròåw~¿ennNVVVH	ôÐ\ŠóF²2
‹ì@`-š—ÍÍMÿè….Åé€;‘†ÆäñŒùq¯OÝ\pF<wuÏâmûÞޞìïï_±¸·ÎóÁ̏gà¡Ïç[f¢c	sE}}}R__/¥¥¥@¬V+1r1À	7±d?~Üôãüü¼¬­­iÅ9b‹EÊÊÊÄl6Kuu5`MLêêê„~	8ɡ–ÎÀ݁1Švvv[[[HEEW/6›M`MŒ»¡í'7hääÜxàõú^¨?íÕ÷÷÷‹Éd’††DÅét^1rR^^.n·[»pû|þZYY9¦§§ÿ\ZZ242dÍÍÍìÀEq­	jZZZè1ð
Zׯg[դ¾ÔM?d•••ÒØ؈P\PSUU¥57h¥l ¦¦Fìv{BÔÔÖ֦n 77¯.Þ-hmmMzÚÚÚâÞ´nßÎÿÚï¼àí¦¡¡!Ž`BÔk‡î@ QZ÷î—zÂá°îAÈ.pÜbŠ“koo×^=œp+1´l6û­¦¦æ8*ëëëZÄ].W¬ç9j´WOn4Ð28==MÏËû :.ñA“ndddDº»»8HOOx<‰F£ګpF4z˜®û(½b6W~ÚÑÑõ“rz¦{€‰££#9>>¬‰Ŭ‡ΎŽÎ^4ÐҾŒ¯޼yë›ñññßUƒæë'uÀœp£ëeÄ:íéӟ?,*úÄ199¹‰,Bp)q8à‚n4b¬3Φ‚û÷¿j¡‘y0ebÐC/pÁ	7‰¼¥ð
……ÛÕÖM(¢3ÎðÆƆöˆ@Žj顗+‡N¸“ý*¾B[ÆL0˜ϟO.C–——ùúe¸kbä€PÛÙÙÕK/pYè£Tkâäää}&—ãcµ~ÛõìٯÃÁàaõqr¤†ë`MŒ5ÔÒC¯A<IoGæßFž<ù>¿¸øó/xló<ç¥X#GÍáL8.ûӌ|š»&	jÓ.÷ÛPßô¶BºB†ÂUÄkbä¨yýÿTðBTÍ,ãÇ%ÍIEND®B`‚‰PNG


IHDR $èë8â!IDATxÚí—MNÂP……
0‘ŸÂ!ÎMtºŒè7¡S¬‡¤Á€Æ=(–$P°ÞÏc¤6Z„&'öÞsÎë{ïö¾˲֊­Í2 iù¸@eÁ!à·}/GŒßÞ”šÍæE¯×ÓÇãñËt:5ßí‹ßÜã1dz¬„#‚b§ӹ5MóM´, ‚Ÿ˜L&àëÿì9±äÇ"OT*çGƒÁðñ±5\AÌ,ž\8ܦåWñz½~*d†‹°'#pÀ%œI/Öj×'’؇@æ…@.pÁ	·Åápø<'¾¤	8áv5ÀÊeñxxíMÜh¸(٫D_1Ûh8`¥¶Z훹ÑûüÐ@ËÉ@Î0úm{ôn4Ðr2PóJA	ÊÜh åd LI¥²en4Ðr2pH]Úh­Ý?œ‚âZa6›[Õ6|@Ë@–XU!BkÎ@$
­ª«j<4g†T£n÷ñ_?Fªªò¤“yòûs'Üh¸öét&TC·§–,“ÑöÆ‰>´d}¸àôÜÊ"¡Z½<^¶)eäpÁéÙ !•ÊĘ7»-7þЖ,8rá€k჉¢ì†eߦØ>º®_Éáãޮ˜æ7C&÷xF±äëËɈ(ŠN§³IÙFyʶÃѬÈ3bˆ%'Ã)Ä6Â?ÛãùÆøD@<-=‰„IEND®B`‚‰PNG


IHDR $èë8âIDATx^í˜MHaÆÛ]É5ÍíÐ!éP¢䡢íƒ2̢C^ú8b“‚ȃ–ZD¡åE¯Ñ^‚>éâ5ˆÀÐ$Ê±µ=Xb­废³:ïÎøö֗¹¼:
ëŽ8ðÀð¾ÿÿó{æٙWWqÎÿ©þŸ+*oÎ:H•¤vR/)HR…‚b¬CÔ8²`'©ŽôõªOåo†5Šéœis|nn^8ÇæPƒZÑã\JI=Œ‡ºÔu=-MÓ œCÆ<jу^xdðC'î̄Fh8•JqUǗ£½ðÀm1 ϜéœU£Šn¶ð"ϣV^zòîL<šœ‡3ÆÈHè…¼à	o³€»HŸš_jxÂ³u÷{f-,{f·Þĸ 0~çmÉ@$¡¡€¬
žð¬…l}4#]}¶W°¤n$;ÞùUé곽
`€%¨h½Ž¥_*¶€÷t\ãÄê•W %:ÉR鷛mà
Xò
´DT,‘ÝÀkáe–àÚԯåº`Iö5ûC1fûC±ú¤{¿u÷(¶ÿûý
'V—ÀÛ0x¬ùáoÛ_D`€%pnÌÛÓ86Ž3Û^Åð#Î5R:œÞú÷ς¶}Œî=Ÿä`€%€
ж{v_ñùǓYÿÓ¼?ƒ±èç˜WioõõQ%šHemC/x–zP†Y)¯üÜËښ[†ƥnɇ<á
ÆbŒgT¸õô㺪¦åËw%ãM)z«›ü
¼à	o“-™ÂS\uû°·áÃpû“	I0ËÛrԶ?àè…¼¸i9D~Ž۳©üì‹6ïŏ㗻ÇøëÁE]©Ä9ÆÒs¨A-zÐKà	.0±š´ޕ»vKÉñ®óÛj_ùvÖz>Míº4Ä œcs¨A-zH¹ÜRùÁt	³u¤"ÒfR	©L¨DŒ‰š\Ñã°ü§™ÅÃIÊ7)OÈ
¨˜sZðYùÿ€¡?þÁ18ô!øÒIEND®B`‚‰PNG


IHDR $èë8â
IDATx^í˜Kh\UÆmSlbkã…Ņ)-v¡âø@ëh¨Õ$â$$1Ç$.ÆAòšj§Qí¦݊!D0>²D¨´ÑX)uj‰Mk¦6M&óÊܹ“¿çGÃ=sn.I@„|p8çÿÿ~ß=÷™Ü!"ÿ©þ?n𿻼EɯԯtFiN)‹¯Î
PCíf¼U©]é÷®l|wіù¥¼X��ÜcæX£†ZzèÝHà{”Ο8mÉB2ïóù<۶cä¬SK½x¬'ð^ù 3ùší€s¹œd³Y7QãÔӋ§ÅÄ1Á_j8±œ§ò&°ç xà¥<_öø¾ª3‰xúܲ,ë½xà…'Þn€qަþ´5øFCà‰7·íŸ^ַ]7-¤5Oފñº9Ϗ¥§“6ÅFp"‘¡¡!ijj¿ߏ¤¥¥…9֌AðĬBž|–1=ð™™ill”²²2©ªª’ššĘ9ÖdvvÖu`ÀÒ<w<=ðC4k<úd2	@*++qÔcg­¹¹YR©”q`ÀÒŒ,}sÉæRð臇‡¥¢¢‚­*mmmÿs¬•——ËÈÈHÁS÷̈́-ŠuF߁£ñ˜•ãéf
…¤¾¾þ_p=5à
–¾G³l‘)@uu5ÛÈUÔc°
Xp
P[[+­­­k ¦®®Î5,=ÀÛ7®»‚®®.Ï;ÐÓÓãz
`iž92wn~É2^„£££ÒÐаfjÆÆƌ!Å:«xº{æÔÙK)ãm˜N§Ùn7#œµp8,™LÆxž‹¦D±Nj|“G>ýËõ1‹Ť¯¯Ïøèíí¥ÆõA– x×ý%OuOO/$,ã. Žn||\"‘ˆsQ2ž˜˜09Ž7Œ÷=v—@ý¶úB?v|9çåeÄ:bìéeôÑW1K€vî~´ôɷ¢¢Wқþ:ÆSyÿ
Ãø:V¿¢}Ág¿s9Oæ6íƒ/<÷¿úÉAn¶(•h
ޛ²hÜè'p¼ðĆ)€s-(íz¸þóöCáK©ßþH­û£”ÞÃáh
/<ñÖx!J÷zÿE_ÇOûG®ÊbÒòüYNmÿW…^<ðrà†¦;¶—>p൯ùÞøùʛ§¦åÛÉE™s8@Æ̱&ÔPK½
¼SƒkÜCܩtoÑö»Ú[y²ù‘à7ƒ‡ÎOú:~¹ñDç1fŽ5j¨¥Gi»÷@¿0‹VÍîQڭô Ò^¥ýˆ1s¬Q˜z=ÿiæñǎl[+• Æ@Y£ƃÏíÿ8ú³i]:Þð[—IEND®B`‚‰PNG


IHDR $èë8âƒIDATx^í–mH]eÇó
§µj‰}¨alµVäÆhz×mA^3LŠæ+5l	-®iÃë,*
ZEAPÔ2û ~0a‚ô%+p«L‚V.F÷nê¼wZ³ûrÜ=>=¿ÃÉsõž—]ô¥îÃóòÿýŸ—óÜsâ?ÕÿRz\½1D1ÍL´ÙÉîqLzû¾žôâžÅ}ÅG#oHԬ”‚(S'ێч¾©ÎÞ¼ãÀgÅ=á'%`ªýEœ8þ*Â1UÄÕeD™:­>ôec×€%-êþ³@‚Ç_\ççU±¼¼¬IUUíôecñÀ+¥ÀåRºK_†N¹,Ôp<·ÓJÆ0¢î…ñt`À9ðfL™aֶ`ç xà%=Kð¶
|ï‘ÐÏkÑÅÙ
`CÂ/<ñ†aøöGßÍržüá÷¸<õxâ
–i€bߥ§^T„ª:-{êہ'ޒqÐ,@Zþݕ®žșé‹ö³‡â¯¯O466
—˥©©©‰:ÚlWo°`&H—'Õí=µ=t~¿_Ô××·Û-ÊÊÊDee%¢LÖ6==m{(a	‘„[îؗK–³D"¢®®N”––ò«ͺ¥¥Q^i£F-W,˜°ÿ
Àm7Æ-gßßß/<hhhР­­­«Dm%%%b``ÀrÎI†d}
ScëI2‹»ÿºŽYhkk555‰pÓôioo·LØ+䕩ÄUÕ2@yy9­èSQQa,“¶ªªªDss³cúTWW;XH
Ut$4g·^¯÷ŠW ££Ãv`Á\àf¿óÏ)–†††Dmm­cú[!Y߮
¹§#ðÎß/Z¾†±XŒUàu³„ÓÖÕÕ%E±|
aHÖÛIg ðЄçðûs¶Q0V÷m��`ÀJ
umÞu{¼œ=²¾Œ³>ŸoåPR¥Íö*ÆFnÞöÍFý"’ڴ뙉ç^ütÆéψ639þ½Ô?#`HV6Lã&ÔW!÷æ[v?ûÛäÉ_ÿ¾êÇxî><5	VâUŒ@¢œ;+>޻¿k*<sÑ؊ÂñÂó®Ç?,‚&`”¸
¼×ßÛp¢ñ±ީ%nô“8^xâ
cíìQâY`nÚY;Øâ~þ—ðøéKÒ,õRÆ0ö¡ÎÓa¼ð4öÞô‹È8H©¼‚‡_ß/_™Ÿ{Äùrşåôíý$ ‹^x&î½ÙG©Yˆ-™›n¸ힺ!_áÓ?¾uV|þͼð_ˆq¥r¯#ÊÔimô¡/cËÌÍàfÌB°d¼³·dfo.ØVöÞ÷5õÑýmã…‡~
íjŸ\B”©£>ôe{ŽGÜ"€YˆýÐäèfùR·Jm•ºCj¢LmôÌÆâaGNOڪ ƶäê€Ù"D(mÆr`Më~ŒFCYȨ3Àh`ç±Vê3þÌ/†CTE7IEND®B`‚‰PNG


IHDR $èë8âlIDATx^í˜KL\UÆ[ݸи™¸²W‰iRKZ1­$„@€B†WÅ&!¬Ô±Ia#$0х‚JÃCML[š¨­2Ìf†af`&`ä58íehú÷ü’±	¹çsíB]|ÉÉÿñ}ßyÝ9pDDþSü<6àp<—§:£
§ºn(¬)ìÆéØGÔP{_Ö~Bá‚B üjB>ü2.×ÊÍ_<rçw`LŒœPC-=ô>ŠÄ_Pø¹ñã-™˜ˆËåâõzeqqQü~?`LìažZzè…îbˆ¿v¦ëޟŸŒGdN‘ºÝn	…B²ºº*ñx\rÔPK½p°-v þƛWþڛT3™ŸŸ—¥¥%lzá€KqžËÆâÇÏt%w§fj&‰F£þ+Ð\pÉâO²oƒÜ[ˆÛ7œp£‘ÉÀϼ۝qÙ×ÖÖd}}ýˆeÚ8Óó-­ô=LN9іĄ̂¿¿_*++%''HUU1r–Fà„
´tN;{¶ÅãñÈòò²Vœ+VQQ!¹¹¹RXX(%%%€11)//§_kNrh ¥3Ð}íëE‹ÅL+++HAA³—šš©««Œ‰‘c5´ýÄàF-“ÜKÆì؏!YXXÐÎ~``@òóóÅét"*õõõ@Œ\^^ž

iWîñ™(­›&§ß5þ¸uÛ'@ÀÔÈ!khh`ˆëLPÓØØH‰n4Ð2è4R.·W{ú!+**’êêj„2‚šââb­¸Ñ@˶ÒÒR©­­=Ô5eeeö
¼~Éظu{Ñrš››³^––Ë-@-“‚+ÆoãÓa~ݴ‡pxx˜+x¨jFFF´‡°(­;&ç{ŒO{¾‰‹ÏçÓ]#Y®›¥8¹¶¶6íìᄻWi(­!“w¾H9½Û\	‡ÃZÄ[[[­¾ä¨ÑΞ8Üh e2`ìË1õ۝º±Ìƒ&íYØØؐÑÑQiooçÀa@:::dllL677µ³pFâîƒcºGé3S]M};âSNӟc-0±³³#‰D0&fYœM}[‚ZÚ÷@âރçÞ7<ƒS1–Kóú±8à‚Sq{Ѱz0v|>}¿ôìådòûY¶ÂÁ#‰Ãœp£‘ÉÀQ…;‡÷/~LÑÈÞq€ìŠÓC/pÁ	7–҉§NÒpöòÝäà·j;Ò/àH$¢½¢£†ZzèeæpÁ	w¶¯âg^fÉØ7æw³aˆƒA^¿.ØÃ<µM}ÛB/pÁiëïpm¤äUurßS×gåüµ]¹úպLþ•_ç‚êdûcbä„jé¡އâY8¸ìÛ+u_ß»ªwï3õ)ã{Ώ
`LŒ5ÔÒC/öþ0Ñ;^‚4KPëÈöoC;xZáy…ã
'Ø[9jԓ눏ÿ? Å߯î³Sy/ŸÚIEND®B`‚‰PNG


IHDR $èë8â–IDATx^í–mHSQƛÛPW–&ô¡ÄÐÞ!HErÓ̠ì*„ˆŠ‚’2!ÃÞD犊‚Œ (Š2ªO~¨~*èKV VK‚¬’ÓæËt¥Íí®{w:Ï8“¶6wíK8ìœÿó{ÎËνÓ!ÿTÿDôX¼š‘ÐJ¡ž°IšãLæÑBSÝØ%
h¦꣒ Ön¦}õƒ±Ì>t€%¥µ&³{?Ø*nI¤©M&ÝN…¸½
‘?„6~ôaƢµQk¾ePp˹FéVˆßïHQ‘‚ý‹ÔÂ^œ.eÑÆóg[çO¢p`Y–C)5¨…‡±Ƶžáðð��’cX	ð¢žà2àùÕÎ%%<£}®€I	ð‚'¼Á<kÓu}A§õÍg™‡Ç$<á
X¦ڑg%¢(!—=ªí€'¼)£L@“¶t»¶À<Öùu(¶³çWÞ`€& ŽžԢªO‡.ºC	X`gO…[®þ©ÕÇÏ^•U,0Áþ·]³}Pæg¯Ê*ôPe=3ÀfIt¦šïýn¯úÀL°ƒè•)Ɋ¢z0ÀpMaׄzcµs`ª¶,0ÿ°úT߫îIõöA‰PÖËñtyÇìמ¼Uýoe]p²˭%•7T¿ˆÀkBýôÔyU_ºzœ>ծbxƒaHÍJâhإsØzôô}‡j/£3ʊç/"
K¢3ÌY–’{äS{ëÇ1Ã3·ÒÖXüUűD‰‹¶ÝÍ/>is;†b³€Ãž‹·Þ6‚ÿ2âWAO5sÅî¦=[,6
'ûI8¼à	o0øُ¡eû3{َÆ}EÇ?¸[:F¨Y䥨AíÚnxSÛ{Áw¨¨R3Ö],¦™÷–;éuJýYޱ–{v‚ZxÀžüދ>JE!Rt	³æ/ßù¨6ûÐ[{ٕ.òøÅ0éî÷âJŽ¡ß}ƒ±¨A-f.‚‹ˆB`ɒ¨æêâ“227ßصrï³;«¶X³Ëß9s*Ú}Úø
}ƒ±¨a{/€ˆBh١IdfiTó¨ҩReB¬ÎúÒ8‘ÕjEp(ܣáƒpÛb`€dlS2ƒ‚Ë́™¢|X>'=“âÁPÔàð+"V43þ%^ÄàúfIEND®B`‚‰PNG


IHDR $èë8âYIDATx^í˜ÍKTQƵ6-Š6C«\´’ „жZ¡	Õ.	WFäƿ 0ӌLP7¹‰)¨EE…¤&ù•–óé|8_9CE¡i£×1|{0´¹ã4ŸäÂŇ{Þ÷÷<×sîÜs-‘ÿª­`;€Ų/£ª[rUµªK5¦ú¢ZCŒS×nQCí?xYÀx‡ªIå?߽$7Åeàu@Æ߻dú“1æsB
µôÐ[H̨Þ]¾½ C6¿Øív$n·[¼^¯ø|>Ęk穥‡^ùÀüxmûê÷;ƒ™Q¨Óé”`0(óóóÇӊ9j¨¥‡^,K.0?u¦ó×ڰމÃᐹ¹9r=ô€¥Ìúl`^Y۞Xõ띸$ÌKô€v¦˜ïdݬCқÌó
&l<2hbó8œNӟ½B™ژÓH=çþa[€
 ¨‚	¼Ò¨iì]—Ë%¡P¨è`ÂÆ¯tºzžÆ(’X,Vô0aし)	6câù› ÌÎÎ(‰`ŽE½ÆMj®ß&§<â÷ûK6x™´I»ÓmÚýÅl<ðÚzN¶?&§¼%_<ð28Ýi|´…y»•,ì¡Ѱ¨״)@C¯q¯÷Y\<OÉCØ}ê¡^wM®<L66ö-ò¨H8.z˜°ñÀËÀX—
}wGGÆB0Š&l<–V6*LT{Z¬ÉöæþŸâѤÅü9†³¹AðÀ+íÛpiu£ªþº᲎ÄX
N8›ÀSÙn<6{3¶<°ý>WבH¼š`)|
2‡&l<2(Wl}¼ÞröF"I#k—Ϧ¤‡^°`ÂÆ#ӑŒñ.Õaê:VÖº©p$Éøˆ2G
µôÐ˝Â	;›C){UGX֍ùr"I àôËæBŒ¹Æ¢V7ܢÐ̜Žå4ÚHÊ1ݹ×ôñùÜг,ÝO¾Êðۨ|˜	èÎö!Æ\cN¨¡–zaÀÊëÄåH­ÛQ`]ë—.ô­ÝןÒÞ¼Tc®1G
µôУ O3ÄÎU𥍵dûm˜‹v«ö«*UU¬-bÌ5æ¨Ñ#WYmÿ ­þSãiAÆ%JIEND®B`‚‰PNG


IHDR $èë8âIDATx^í–ÍkAÆݵÉnö£›/•DQð#‡&,R"’VR
=x1zԳ‡zRðX+(zi͟P=‹ W©‡Z©•jM<¤_Q’šø>ðbfMB’µvæ}~Ï0“ɨÕjûªýð?·¶Mӥ`ð°—t‚!]$Å!îGx̋¹ÂÛ0MàéÂììÓ{««Ÿ_ïììä*•Jé7ôñ
c˜ƒ¹¨AmOCG^=ÞÝÝ]¯V«5ˆ˜¶ªc.jP®Ø7:ÏçóÁ{{{-յ𠾎0ܟL޾Q*•¾µ·x‘g £”VO$Ʈ2€žTOx·`&\¬P(,
ðCÀÞ`ü5N.O›ýîz;à
†mEQ°ú:ÁýY½¸ð¬æNêÜ\ê~W/J0Àó¸ÅÖ־¼áÕ;"xƒ–€RŶ··×yõŽÞ`+Ú@âñr¹üÃé`€Å\wüþ`÷ºÓKàóÆþU°ì\¦-øét02	àÙÜÜüêtbl€%°,ßÙåå•wNÿWV>½'Ö!€iÍÌ<yèôEXBjŠey¯lmm坺Šá
†$É
˜Íw@ažšŸÏ<sêÏ(“É<ƒX…›’eY3Mk<—Ë-õûïžð,!˥ªêP4»EWæ÷~=HàOEQC`BÈ$µ““wQØë“pxÁÞ̐l$àý1TÕs:'³ÙìR·RÔGîÀžð®Ã[€H¦Ëå>®ëæd*•zA'¸Ðé³sÓéôKÔÂ^ì)µ
`B—$é­à¼a˜ק§<Z\üø¶X,nðµ]…ÐÇ7Œa梵X¹· „àíPI>RÈíVÎišvI׍k™"ÝdMáÆ0s¹ÆÞ2€B&¹ØÌ"p”tâ~ˆÇ,€¹F¶…³:mRӶ¸ ‘t–(ñ^³úԤ®äDë7ô7W×?_brsIEND®B`‚‰PNG


IHDR $èë8âDIDATx^í˜ËK”QƋ
AB³t¼Qâ¤I
	KÚJe	!Ix› VȌ›ÚæÎþ[
µQq?Í-qü檢.Üè˜Óû#Ýô©s/<p8ç}ÏÜó]fÎ)¥þ«NO€³Åņdd5ŠÚD"b|0w—š$8)8/ªutu½´ŽŽ~þf³Ùüsss;ûˆ1s¬QC-=ôfà²èÑà eØn·Z^^Vš¦©@ €3ÇRÔÒC/Œt”Ö×ß4MNNÚ÷z½*‰¨
µµµu¤X£†Zzè…v¤ ¼¥åÁ[§Ó^ZZRápƒ”D½0`	³"ÙFcCËåŠz½>µ¾¾0-Ñ–0{a'
pž}›ššv’^gžfX0aãqR€Zìa\÷µg X0fÝI:Gˆ
 ›‚	ã”ö÷›?ø|>F³&l<ð:*@ãøøø4E›››Y6x锕U´ÙíŽùȉ`;N
/]ƒ¡¬s~~þg0ÌYØxà¥PRRj’“º¯;ýYl<ð:}ÊË+_ü«-ÀK ¦¦î‰ÓéZá閫°].·&^uššš[&&&¦ü~Î.CØâ1—.@wwOµÙüú=—Êêêj֍^º{{{ù••ן»ÝiY6Û۱|]ѥöögw,–¡’4žÍÛ1,˜‹u¼Ž|Åb±¢ªªê§333ߥ7œŒÍa	ãFŒóFF>Ýhh¸Ýëñx"š‘9X0aãq\ĸ°¯Ï\ßÚúð͟ZZ‡’za	D.ˆ®Ò`4Þê‘í°	(Î5¼¶¶vâ%Ê5ÔÒC/ß&,˜°@Øöƒ9;ë	F¡Pˆ·_bÌkHQkµ
ÓÌ$^Jõ!vww¯qr¹|L¦WCcc_¾ºÝ?üòڽ#‡ëbÌkÔPK½zóÄþގÂà ïꚛïÝç¶Íýœ‡
bÌkÔÓ#ӟf¬牮MRÔæeþÛPßtQ”/*a†3Ç5gÿ¤¢ßæ:ƒ3×ìlIEND®B`‚‰PNG


IHDRëåÖcsClÁ0`M‚IDATx^“1
€@÷	6W§–+l-„ý¯¯ðv>ÂOÄ+Œ r$‘i¶™…(¨	
P·QcQڢ(ˆÒÄèð…xÏUwã\n`ݺc2Zþ
ýnˆ#¼»c1è‚áÎ
M¡
í
Ɠ%1´³¸ïÊEÿŽï˜3ç~ Üd©Ü{@ IEND®B`‚‰PNG


IHDRëåÖcsClÁ0`M´IDATx^•Ó1
„0…áWi£`cíR¸EʅœAko¢±ÏU¼Lxp”QþÆæp˜5̋jÀlgNJ3Ã6$Ö%˞až–%s¥2¿ƒ)ùœÐjˆTƖã5pëÂ(­Ü-ٌh%Æp=γŸ‡Š_Tÿo÷$âä§U 1*k½](´µ5×ÀӲ`¦T§Ø%Ò*Yv0rޞ£’—ó~ù€~´{„5wcIEND®B`‚‰PNG


IHDRëåÖcsClÁ0`MIDATx^“±
„0Eÿ\FHta/@}òH4¬BÃè”=2@¸–ãÓkܼ¯DþP€ sl¹sÔò6!ùlSˏ€ԇ%0ä{‚\G-Êu@LA³kjÔbF6;Â;»O,ûË3K§ðSDæ
ŠÎà'Åy+Sþ¬F¼|ß9RïðÝæɶê½ñIEND®B`‚‰PNG


IHDRy$æÉ&IDAT•cüoÎÀÀøßDX‰㓁C.ø$Þƒ$ÃEáî¹%ªIEND®B`‚‰PNG


IHDR
jó¦=yIDAT•cüïâÿ-Þ×ê—Ä9†PÀø_ïÿd#³Ûì—>¹ܜÞÚ99H=à¹ÏôŠá'ÃF†ÿÚ•í~Iê;)¨ýçùVɒ0g]ý¥]è&÷7v˜ ˆÖdÐþÊñ—f&ÌJ¶o2ÿù~2£
">?(ác”áIEND®B`‚‰PNG


IHDR
jó¦=~IDATxcøo‡þOš׶ûYýwaøo…®ßJöόO=nû_á¿ÕëÿN#ÞUí›Uß`oû?ð?7ÃñÉ ¸kúÔéAe–îüþkÿg``ÈA®4ƒøYÿCÿ[üg
~Œ…ÃÈÿšÿ@á­1¾1x¥tƒ(†@„	sXV¡[(IEND®B`‚‰PNG


IHDR&D‚‚IDATxcùïÍÀÀÂðD0	ÿ²t“p(ϫ¬IEND®B`‚‰PNG


IHDR
&WUÂ{‹IDATx^’11džêJÃ'x!ÿã
 {)®ˆ·ˆÜE3Ùl’ÔÁýóÒS5I 5I‚š†5IžÔÿbœäÐi4t5rdÍt§û#šzRrç,Úè3=\M4ÉËInÖ,j7Èt÷zï듌öÝí}šF½ýÄ1ö4Ìë~1à›\ÿuŽ~·nÄ"‹]éõ´^£IEND®B`‚‰PNG


IHDR
&WUÂ{ˆIDATx^’11gÓÕHü‰†¾ÎSèÐڔ§qiy4Y)»œ¹_ÇÓïsF6Eí±€m,…mÄmÁ?n4/åPš$JvÞôŒ۝ìe•qQ‹"¥²ˀ祽zQGQÄóR‹"IÔd"niõI(ۙÿ§g;òŒm<âշO]~b4~HWEQIEND®B`‚‰PNG


IHDRy$æÉIDATxcüÏÀÀÀȠ$þ}ÿ[A„Ãq	ÚX!¯IEND®B`‚‰PNG


IHDR
jó¦=pIDAT•cùπ	X@L‚¿þq00˜сí°ܾ £H.&v°à†ÌGïÖÉþ»ļŠá-Ã?J¦(ámþrÿ§1ÉÀôNÈØïÿU„Hù7—4ó1Ûÿ3ÿ†,+hbp…IEND®B`‚‰PNG


IHDR
jó¦=nIDATxcø20股6“2‡pTðßwüûáӅýeLªöìÿ‚ÿ[°ûÿ¢7þ}¿¿ŒEc?HÐ
}ÿ/ýûuw…¤ø&  Bø亮GÙ5ÿ³€på÷Œ¦ÿÙQgýzÆ`öŸãÇZæ®âçeIEND®B`‚‰PNG


IHDRy$æÉIDATxcda``dE%<€ÄÿÁ%3ù-˥
IEND®B`‚‰PNG


IHDR
jó¦=UIDATxcø¯§äƠÎ ƒÿ+591Ø0ȢÀÿì?<4<QþË>Ñõ`°"AÅ߱sÍ<¸< ð?rü·üù?ë0!VAó#4Ù9}>ïIEND®B`‚‰PNG


IHDR
jó¦=YIDAT•c`AêJnÿõdQ M“ÓeTACuÏÿÙa‚òêVÚÏCþËþg``ðA.39¿cÿ+üg
þÏÃôÿáÿÍÿs€„@‚X VA[Œ4ÐY¦kIEND®B`‚‰PNG


IHDR&D‚‚IDATxcag``a`@%!,Â4P‡#LM޵NBٶIEND®B`‚‰PNG


IHDR
&WUÂ{HIDATxcú/ÃÌ Ž
™0ÿÇÄ ÚQ!Ví8-b ڢÿØ,b Ê"úª¤•;)×N¹;éo&ִDa(1ÿG+ñB±ì#õOIEND®B`‚‰PNG


IHDR
&WUÂ{DIDATxcag@6ÿO²0`FLÁÿXT‚)ÐΈEh‹þ¯®*éc;…Ú)t'Íd *Þ)dbþËð«óÌ¥+IEND®B`‚‰PNG


IHDRy$æÉIDATxcü/ÅÀÀÈP"ÄñC¦&~ÈdoIEND®B`‚‰PNG


IHDR
jó¦=^IDATxcøLÿùþ‹þ—ü/‚!ާR†ŽœÉL¥U â\¬̙ÄΠË Í ‚@Ϥ¹bì!\˜ Ÿµƒ„ƒãóeÐ@”feB”aAÁ!’»%gIEND®B`‚‰PNG


IHDR
jó¦=^IDATxcø/†’ÿEÿóþgúςU ÈTʙlèøTê?DP¥tÂ9“+ÿç„" =Wì3éÿLAôµ¶øχ.¨Áçû_]PŠ9ô¿4LCþËJÜ!’ú<jIEND®B`‚‰PNG


IHDR@ÙaP$csClÁ0`MIDAT(‘cüÏ0°€qÔ£p`³£Eòd¯¦IEND®B`‚‰PNG


IHDRJÅ'ÃcsClÁ0`M(IDATxcpùÿ_ë?‚8rÈN‡Áe¦ç¿ËL(L@ƒ¹#•Q·eIEND®B`‚‰PNG


IHDRJÅ'ÃcsClÁ0`M"IDATxcø‡.ÿ±s\X93ÿ3.ÿ—ÿ “!$¾/²*IEND®B`‚‰PNG


IHDRWÀ{csClÁ0`MIDATxcðüÿ_ë?-Ênîñ¯IEND®B`‚‰PNG


IHDRWÀ{csClÁ0`M
IDATxcø‡.ÿ)l?O¢JÌIEND®B`‚‰PNG


IHDR@ÙaP$csClÁ0`MIDAT(ÏcŒüÏ0 €ñ¿Õ@;€aÔ#Ü0,”b áIEND®B`‚‰PNG


IHDRJÅ'ÃcsClÁ0`M=IDATxcø†qÿ#Ìh?þ#æ¿Ã+ §ùè¯ÿŠÿYþ30þÿd‚3xþÿo…s´þCl((Ì,‡÷šIEND®B`‚‰PNG


IHDRJÅ'ÃcsClÁ0`M3IDATxcˆüù?øÿdøoõßê“iô
—ÿ ²ügõžâ@ ³‹‚C4öÃ%ÏÏÂÛýIEND®B`‚‰PNG


IHDRlêA«…;IDATxca‚@”ƒˆ{ âœ`€³^@X˜ÄÂÜÿ.	L1
ü\t1F÷?B… þ£ˆ^¡3°ÒÞ:öIEND®B`‚‰PNG


IHDRll%oŸFqIDATx^ÜÙÍjQàš	HVA¢}	ñ'þſ¨o)¾‚KCð%nÜ	"Cб(Šfðž¾ΙË%›ênz’éÿL€÷tõyZÝî̫çüçÉ3_}sïðÏ~"ŒÇ™O’Ö0²øl[ÆCÖÿ›pÔƣ°±¥Ëlƽ‚ù.ãiSd¥
拑¤æ0eåÌä¾ßF”Ò¦=ÖF‡a€E¨¹5…‘SóÿÁAÁR!ׯT–Ù'_ŒÍaºT‘¦wkï°{ä>;;XÞ>֬A0AE˜ü8>ö†!
|7>ZÁòîAZÜó
†٥
fàšðÚÁ|^ G‰vÛㆰ4Íø m(LQ–»Œ¼'Í`yàçW˜ñ°<ðaƇt™Æ0Í
äąøi_Âö!4òšD•»ÌÓÎÆì´Ÿõ€ùÓe/1ÃaùO¹™iÏ÷
RµbäýbŒ3]†Šq(,¢\vvãÙæxyÁêó]¦“Ñï!¯šÀB—I¿ÅMäb0Ly•S$™½nË]–3k
Sœ ó y3æLJgy S{‹÷Ø
	%c~ýä¹À|
SžÕ–¬;ø‚OØ5„)«´óßÀ>â~àr_°4>HO\ŒõœãŸñ?‡À\—É2,c$oãô��0å•3;lyÞâ{€ÿ}¿񬫈X*F&£™ÅÕX`†‹#‰Öa1³<J¸jâXá€GÂ3­`©ïÖÊ®á&fùÖᣠ�™íœ5íǦ³GZ\"¬^Œ܁é:‹4"ô «gf4ù¤88žÞe˜¹IѴê4ŸÈK,L`š™Ҕêhz‡¤$·,gV.I¥!÷•@·–b=3aZ$ifˆ##Ã|1æ̔¥´óG µR¬gV ɸ0YÅñ¾!±œ™›R©ë,GS‡SMm†…r4…	®42H0°}ÒHÉ#—aH¬
#¡JSL!)yP†åÌ2-§äy¹L	ù-ÛÓjC]À6µ+gV§•6vŸ“âòðșÕiLËcMB)­zb9³L+P̧B!nÕiäaîs•§b 9H‰æqyN¿ڱƒ†A(€‚õþ‡nO óñ‚…n'ïë"XÑŒãèv>$6ýQj´ÇÜÌ4ü’=ßÓ{ÌÍh> <zûj+Á:M…ÐIiX§Mqg¸]Á:mÚ°
’07ó®C)°ôœ}¿X çÀ‹4ɘÜó¯0ÑÀd¡y{0	û?Í']g-À8×ëÉ0/hòÀ
°D›ãÔhެЌ\…L5Ìw3Î$7K0Ó®“a¦\zI h—@†uZ¯iL†ÐyôS1ÐÌ0&2
ë8ód%XÇõ"fvXÇuD/Öy…`f…u\šÛaؑÀ¬Ô{Øá†]|fæý°N6ì¶ë…Ýt½°”™©°œˆMÏIEND®B`‚‰PNG


IHDRll%oŸF~IDATx^íױŠlEEá_Q013007|sŸÖÀ022¹"‰0½MNp˜5§½¡©¸3Üî¸̜½믪¯æ™_¿Îïs›ÌíøÎéßmr|>Þï|ÏùõôÓ¯“¼<6§Ç8bBÿŸr÷÷ÉWëq„ô¾Ö?äþ°(š?Gr\sDšLwƒå”D’MaΔ"~è5çL6OŒ[ª@Pá³ÆU@6¯"NËöUìóXsZ«ù®ƒ92íÐXŸ!‘¼¼´ټŠÄkãĸNxmìA؂Ñ!ëì#$Ž0}ÌdÌi9CÈzpüg‡Ĉˆ±œ·Fkùæ5r·ƒ¡„¦ސ³FY=b-Œ“0¬è¡*ëadÇ*l}ƒY‹nãáA‡‰OÓÍ`(â)òXó‰Èâ+õ\
#","V˜ŸI²áEӊXr²ô¢É¥zŽÏÚÄΣƒEd2.BZyѼ:æÊ
Ûwc^„Þ-Y6…ñìqF	¹oã֌ÁÁ\ýò™=ϊ¤¦ôëC^z6ÙûýOü–ÝNö¯5°o畀ƒàÅó~Ö>œçÓy]aôã
@V‚YÂoæ»ùy~;8ÇK^q‚Ã~xìëù~~š—ù4A—yÕ)å}Ø/O€½Î?óçümkïމ@ûãÝðÃS.ú\/ç÷ÿ×Á|f^±lvC¬á?",9í#/ú1Øp‘4w0úͿÈ4fsUBaxb'€H ˜¹ÍËÜfHº1õ*2¯ØjãŠy“ÖËüwfÉ%yÙÐwØ_þ«ÏlfÇwRù™=Ðõä×&ÆB\’†(da¬Hò"ÝËDhHP……!Híð`¼’Ãë%3Å.A}ñõ6`±‚A6VÁ\æŠytt 8!kLF±#‹´rd¤JÌÇ?QDr;fÎ å"UbLŽ€Þ%C3áÊî§"µ1BªgGWV*„'æu”A¢L/µŒ1l:Ȓ#ò1V7
6VH!Izƒ¿ß\[••!ÍFpÍz’‡`ì-™^IR….™)3mÉ"ÉK9HMX`
ūèeôR:ÓY©9„Ýã^¥‚Îâ{?‰"5Õ.ç,/‰)¦¢$‡êøPAHڟ¡¨"(Z)¨öê5Øa€€åÕôÁR°¢0/€d'	Ö,Çøð ª.¥£¼¾ò&»z]K²{V•˜dTó¡‰JŒSRTQ‚—Ú8ª`µ´æåàX¢zV
˜R‘‚ò¬ú´¢¦ùíXBÕÄ"°æðGU¬æ4'	ªک
˜á|¯+P±RJ=DpÊY=Œ”ŽW€¥„Pð:”³ŠĜÑ?L"«‡õ@'9ÊY=¬Bö©ô,‡	 ÷$Gõ‰9¥Då¬Ö!ȩI=ªOÌ)}¢ŽZ–XuԂΚö¤Ö´å‰u˜u O¬g¬9L’ÜäUÜã°”ažÄzXÒɶ‡íøûûp¸¾ ¶[üÿIEND®B`‚‰PNG


IHDRl‘ñl0IDATxcüπ!ƒH q@& ˆ†ò,&	…ú³h˜†)ótû! ÆIEND®B`‚‰PNG


IHDRl‘ñl-IDATxcd %Hc¸Èð
ÿ£ÿA$
‹Dã€È$2
Æ H¢&†a
?k,|¬ÃIEND®B`‚‰PNG


IHDRlêA«…6IDATxcùÏÀÀÀÂ@ÁȈE!†,Ëå¢耉áäR@0cÂ+D…k$þÏ»oxÅ$±¯†εIEND®B`‚‰PNG


IHDRll%oŸF¡IDATx^íÛAjA„á.Ý@Ù{ËûÉ9t	o’ì§ÌϣÜâµM;+‰æ£j^¿aœëÏøž?×8°;°;°;°;°;0íÐ×NL
Ul ´Ãú1ØÖ 환Ö2úaz*F=0-iÄ€rŠRØz”RlWb
HRbJIÍaK+$å­ƒi%)/užXΪ“Q´¦U')æ0-A©ÀQڕk1+Gi
/ƒåcAØxñTÌY!J\x×3X1JR
·xóàOŽbRXN†1YJiM9³ëÉ,ƊRÉi‹KÈ0JHcŠR˜>ÉàJX„ä°¬JR¹º²¼€…Y1Šÿ
nÃú]1g	iœŸVlÊYe”“Ʃ)JlPA-ƒšóKXrTPÊ`W‘U¸taŠõ‰š?E;×LPC!¢¾©0Œú 2‹Qw T€5¤‹b–*ƒóӲs¬ÂrHé$få÷—ŽY€ý-ΞGÃT©aÆ2DPJCE‰	ð˜ÉùAv9Œ!Ža}ªWRXÀ
X¥ô‚ÕKwÿ°€yf^Lf9ÌQΨî’ÏžˆzW9È.%õíÞå»Ëi—ª£êXLLµ¼èîbÃjÇ@˜X=K@2ëÇx÷qkø%1n´S&ÏRpÖϰ_ã1Þ`L6¾O·	–Ö}¼ªæ >c>¬àd¿ŒßÆj€AœÄûx¤€&L·ò}ÌҸY^ÝU,Þa”ñqôÃYʶŒ	VgbŽó¼äßMÒdu'&àɸ‚ÊθXéÙxù†a›ÀD+¯çåéٟ&˜Ò÷›>6,³ÑË/…xÙSñ0NiÒ /˜‰0ÁnÿÒÑ>UÀa렑ÑËßfÂ(—a7„©0%íԂ´a"ž=F:Z=t¾èš\Ïk#œDÛcCb9.XÝá±E\IËÅұoÚS€~Ïœv
‰H	Þ_Kô&ƾÃ4ÆÛr	æêM Q
Ãc폿’Øô«–ɋ8™»/~ˋ^6íŠ9ï8ê51f0Äؓ!çöØÇi
&bL\Ʋõjë'hžLÓ
a®Ñaì·Áø2T`ÁÎ^cä8gYn͉åµ1û4•Bý%­—tûÄàrEä§¢ˆEÜö̀*æ3¤¦ô¿l_ż®ŽÝ&Fq¾ϧýVGà17‘IEND®B`‚‰PNG


IHDRll%oŸFIDATx^ìÔɎ!ádÖ}QæýŸµ2ç*âA­»OH`ó5˜#‡}Æÿƒ5¬a
kXÃְ†5¬a_l‹*‚Ý\¹v·lK,†-ß&ۂÕS™»ÖÕ"Yó H=졨 @VÁrDΣ
ö8íºó˜±ò¸ö40Çਅåe˜À#‡=—?Œòœ–Â^n1ÀËpd°×ø¿18'ÇÃ
I¸æ°7Ä$§W=1{S^Gà„6ûB¡@\NsØgI/9
›é£öåç_7\BsXÎR6‚( 9ì[@㝄àô܄Â~„ cG(Š*šÃN¶ÔK
Kp-„]„—ö~rœä0âØïUü¹ÚzI2
¢8^t¾ˆ¢AŌ]‡pšªñý~G‡:u®;®Š|pÿ.ÅûVn7ôìÇ9UT#9ǭ§Õa§ë‚Ÿ)[Kó°3"¬«_†[C[;KN½€ÄX£‘]…ËØ~³‘œahÈÌÁÎS¨±d˜&
,h؎)!ˆ®f$hå:æ°	ÉÜ&óOV‡]ÆÐÈó 
 :ì’_
¼læ2ó°˦ˆÅòÕiþWž¶Ž݀|ƐÓä3ó°+¦Ϧ‚|h¦ŽØU Ҝª)Õh ¬„]¨º,e+´v=Û-iàñ4Vý¨`7*¬ŸÓoÑÉbf­»™$U^êÂ$™fêh2s°=iä<«Ӫ™e°ý8úϯøß㇡م²ö?>§b'ný…}-™Ézfۃw;¾)µM¹‘fCXÄnìšR©WRŒ^°“q'DØ\Ií´͇EìÇ]q@K&­žÙØ=q°Hh=a"0¯¤š¶Œ`÷Hy$† J¨ì`AŒ|҈+”qì³"/É,)cØC²ª™™2N‚=Zãb,³JˆsS¶}Øãš0“X½aČJfäô€=§™)£¦kì)I|dù2Ά=[`*áp™ÔÆ"rÎ|û^‹å2c~‚‚3ö"ÆÆÌÆBþê¥ìåÏLY;X‚×öjA§2XÆ|ʄš­pde0ñfÁ^‹%’¿D@ÒL²mÂÞİe~ʀš[å2šõ1öV$$6Ž3ì]Œ„†ìÜúhcy‡`SØ{‘ô\€Õ¶¤%^}ʄiÆÐÌúèû€ÄH
¨É0=%dzX Â>.$æEÚL~0q*SƼšû$ªhy­`bqÚÌõÑv™á[Ì
LÌ90±˜iKvýaŸ•×G²Grá��¿9̮AL~㷁‰eæì˜~ÄHʨE¯ߌU‡Å™?—x©+IEND®B`‚‰PNG


IHDRr>]N‡á7IDATx^¬Ö[‹[UàgeÒ9ìI“L’)T±8hx@¬J¡¥^‹ˆ¿Å¥ETÿ€"Š^
Zi;9ÙNÛ1™å].
˽Ó÷êÛ쫇��|æYæ?š['}ïxÃ3Lòih’8°¡çŽï›3
T.9of)䧿p!?) bøgàžoÍÔO2P¹lß8Àä€YD~J€(ƒ¦¾6©Mª\Ñ7.ÁBê².2Ås‘?pìf-fËЮ«*ã"…Í壸®Íù†þuèè÷U®9ã¨9E\WDÈ$ ¡²»*_vè®r6Œt\—Éà¡㸚ñ#ßo„ŒçJ0Òö…¿Ł¶‘³nX¸xà8À4F¾!CFŒ$a[wÅÜö¹¿Ä9c¤ëCWĹÇÈ1†ˆ#߭LEú–®$a¨ãK·C⾾8B–Í=)rr}äÛá
‰åySO{ÝòtØ24rÝÄd3'1¡|¢ñ
y«îc ˆO°b&{öÝô`ÛÐ9×Ü3‘WDÈLƒÇ²@,ÓÛö$	}ç}å7ìxÎUwL‘e‹§8ÇÈףºO­ÌmëÛ]|ãg@eàWÜ6KS‹¡|ºq]_[…Ä`úÚÎ:ðŸÐÑwà²[þA¶0µŒaÖ_!^-ֵya¡e 
v½â¿ê¹è’ß=c§м¬åº^Œê”µ>½eOɎ‘?ñ¼ûÉX˜8­lj×õå5o×2—–¾M°éî:'¦N)Ñֿ]_Š‘e@™Ž„´b‚1#S攡b¤ƒº+¤7Iz¶ðÄL–ëӚ¬#dmLèÙ<2 
ð1òB½Ò耮
Çæÿõf';
ADiöÍìˆEðÿÈ݉’´êЇ֜ž¢jliÌsýë&B~Ȁgï›Ýù2´— ?r%Âóaóå(ï\²Ò´˜“–|ː™b÷eä+ Át:Ìᢄ|1ÈÅÅ`:-,GyN~'ùޏk~ç’Oi!µXî.F>Yż&Ãùà:XÛns,G¹wH„1ù^öȻâ[@é$Àî[ȭ£@‘¢_Þ 8®7¾0@•Ö5l‹Üd;ÙÒ÷ÃIwòšw2g2´áä;yÈ`,¦š1fä%#™Ñï$pJä Xô뛪E.ÀÌ#™)G9$Èdä+@€X0óÝݦÈ÷ØB	Í%OY4C¾öӗ‘'° Øô¸ò³	äõÔ!sZEWËåM9Îa=­çf%vG?Bæ߮Ôï–²ØÉ¯‰ÿEÉ(†VÕ߈Cच®’-@œٖê‹/(˜ђLR‰dÌtÍÙ#Ö	pˆì	óe)gY-{ž$•ȴ÷D£Ywš_gùb¡{Ò8ÿIEND®B`‚‰PNG


IHDR>r¡RªØIDATx¼ØÝKT]Çñï>gÔ睚tСL-){™èªþëðBLH!º袺Œ.2ÌLM*PköÍÆt;«sV‡µ֞«Ï4Âoï}Â)ý‚¦
€ÔÏ<™¦ºfìš]'\eÃûY¸ºפ\=k-²ï+õœP0®™Àãª(<ƒ~\ݏ˜?ž.ÀûyÍÂEŸ‡«Gè¥pñ	\ÑÂ9x*hTZ•ÇR®žÆU	\0—ÂãjP<@ÿKÈ€«[·‘*^ض"XS¸h͒·•Œû&ܰ­ØqC²;â†dnˆ˜’]¸f!¸Pщm%‰«á*V¨Vš÷„ƒhÊ
Wnׂp•zÉnÅ5ƒùø(Ü!\n׋“=ãî\œ!\ÉnÅՓájÁØÃՐìÂ-c86+n86«ÄÚðöcóY¾@ܐì½ÂՎkþã±Yx9ášÀsîD\´!\­ÉÞa³Wf²:°*ܐoæcó',Ñ>@ĘÂU}’a9o<c‚Où&\!Ù[tXdŠÆÓñó,±ÂÂ5ÖtYå=€pÑöpM'{Î4x
vܞì³ló,ø9¼È>ËwVNۓ}†À½4«¨dó:5b¨\Œ(<٧˜$†Ê`¸>Ùñ6s
•.޶•:]…Š·_ª<Q¨Øpû¶r“/
o|žO¼Mál·•>Êcýì®xœuº,³ˑ;g›‡ñdÅíG‰@ƒL°ÌÇÞøj@‡1–ÙâÄïgžq
xÎ6¿<ñ@ƒÿÉ"ÿ“ìðۏEN“‘¸šf›WìÐó	™Xä´&0ÄyÃ.=?<Paœ< o³Î;v9-cQ
ӤBÆ(3¬±Á§Ü|S¡Iԙd…Ï|õ8Lèø\¥d´¸Ê3öØ÷8FéŒQ‹sœ!V8à›Ç2C¡3g›cÖ8îóR¤N5®&8dÝçҠžÓ †m6½®Kêš1træü.ŠêZTÜr¼"kC'îñr@=†Na¸á…w•Gþ/„ôÙïÿ
ž/¸ÃëOu኷aþÖY4·íØï3
<,m™¨çs&
¹6aûxOقžªP¤#y’‡Y”¤	Œç"˜’žztK¹1֖˜{\OoîPá¯$
aì”ÓÕåCIEND®B`‚‰PNG


IHDR>r¡RªØµIDATx^¼ÙÉnAàßì‹Páö%,ÀäÆSð¼ÇK°#¤p	`;±3¶Áq›ViôJ*•(uϡªŽŸªmÿÓ#÷ð
°’.“•»LvN]`—	`¥
œ,ç	²w€“¬³Ø5½¿¯l\Hçì7Hãä!½þ„5ÀÙ5ΩpE8'+Äu'màRpÆqv)Èôq¢>.˜bIw¶'Sgù¸ŸîÒœ“U(ÝmüƒMû¸¦œSáÕÓ=Ž»ÇK,»‚ܢmœ33ĥÌÝÃÇbWøG¤ú§v¯‚Ký?¾Š¬ûuóñÀ]Ƥ¸E»8Áþ	K0
gaOå2Îÿ¥“×xٌsž¸°ösR9œt4ãâ8¶zÌÿŒT(ã z¯qä‰ûŸzð*åãv¶Ç3NÃ>Îíec†ÝÀ+eËÀWgñmü±¿r{œ‡“ïá	ãsï±Z4ãˆ#ó2?3#¦¥/>Îí]\ø‡ØǼ»Œ#N~³pƑàÂ?À.æþûZ0ãØ5N#Ì¼@ÆéÝ[œü¦ð…3Žeã䇘:È8'n¯Ê͸8Nþ^æ§
.šqÄ
þ''`­Šãäï’¬T'?05Vf(`}œüw4e–°“¿L	àú]
K¶O®é8®ùÓ=Ž“¿Ž¯ĂéÇ_àMüÑB>€?ÅM9öŽñÎcS>ñ&ð\cà=¬cWðE‚¦œôU<Ç5ñ‡Ýâ'Zz 7ú¿»ÃO’žÝâ§2ÝÏôP¶&wuì§AZ#ŒIõjgZz€…€
[¤:~6ÓÏ2=Â_!òքSÝx=‡uô±],„™¨¯ø`¹€ËèËÖÇjk’µ©[:o-À8ã	Äk^&.aM"e„e{à²Òë]£Ö2¾…
ìµ>Q[W½@ÞúÇÜZÁ5¯Î/3½/·&Xý¥á5¾a)Ç8šlÕ×%âÛBŒÑ(¶î‹"q9pÅV~E&.täÿÔx²‹ÿš7wa†ÖË:zUÁïmZ!tæõÙ2¼¼t0‰E–²*Öðírm/þ¼Kp¿Âœ†€
÷ð§ßoò/Âä
Â~~æð»bøiËõ|qAáèœI¹ü„}úí;<Òo¼°«*2„I‡֓x1+Øo¼Œ7Œ†¸÷a?ÈI´zŠJ·ãêÆ^¿yá¨bNÉõü­€?TðW’ˆI¢E¤O“IEND®B`‚‰PNG


IHDRr>]N‡á7IDATx^ìÕijÄ@„і³Nö•Üÿ¢S¹r-Pnð*¹CãÿŸùw΁<2(€B«d9
 {‘œÅÉõHÀê"s$`õ‘)r
<!~$ŠìßL-#]9©Ÿí‘Տ¦È¤îäÄñbpÜLFÝi
³=²¥ÆbŸä•˨ÿ
¡lŒRP€Ï%CžÅë£åÑeKŒkXÂhØIÑ+ä䃸œFáˆN!MóȜ
ªè»yk9ž®º|’w;ÑõwõpŽÜ§*L?gÈ{ƒH@`‰~î“<àÔ"=‘#7ËéGjo]2$Q°ÖàùȐ<SÎàÈ'ô ?óL>óÈç‚9|/µHWFyɐŒƒ°ª¡çÈ×iˆ
uuÌù6½“&•…ÕüN¾gò@‚jv'?öԕ‚®@¦ž®ùéëê9>Y^QO÷uý²Ȱž«xº<òÛ 	'vR€n‘?YN†cp	ó4~[¯Ÿ–ÄÂ8Šãß;E
‚ •¤¡W«)š¡6®Z¸ˆðuô
EDZ´hզ ‚H“R¬ûCõ´i1Öxæþ®žwðáž?>Ðäá3u¶ƒ'¡›Ô<c£QҴWô
(I
ÒdR ­=׎Ü)xëlsLOÌÕL×È%#Òùµžg‹CwþaÎQ䄻ßagE¦Á7r49ÎOÜå_î,%þÐ]ߓiû\M|X$OݵŠ—b‡3:¢³5é^(j’j´ùš»\pŠç,Ȭ@
@àžS¤¨r˿³À-ZAºÒX\HÁ	ˆO³H…££L‡+	HWÈUÃÛÕګÏúèD)sOÓНùíúC"=͑\Ÿ(ü?ÊôiJ€:̍@N
sÌMf˜¥Ê#Áò=žh˜›澎BæE“Š£™<j<<3ìâh(¢¦«&×B]!ºá/ÔyViv˜¦¡{…¬‹¹
ŽlqÀoØóѦ ë¹nȹÚÇêÓãG¸x‰ѴVÏõ—@ZÇ:Å]Ž/ÛĹæÕ:X…Üg’ùÍ1ã§À&Ì;’fCî ç¸iIEND®B`‚‰PNG


IHDRÛiÇ4IDATxca‰HñDü¿@Ä=ñ,%‘éMjm©8IEND®B`‚‰PNG


IHDRüÇFܕIDATx^ÍÎ;JDAÐs{?
‚Ë0rîÁýÿÔd‚1xÂØWhoÐðR«ÒCQrVè®ÝzµH³È?B¹€¡ï£O{(=é{ŸN†Ò+1œ}¸óìR[!RÚ\8Ùtˆº4GWé[Cԥ4™/oîÝZEê6ï“„Xgbñ·C$Äl¬Ž“ …,?OO- ˆ»Ÿ›IEND®B`‚‰PNG


IHDRüÇF܏IDATx^ÍÎA
Â0Fáæ
zӃz÷n,¢RÒ43¡–³•·
|̟_8Q¬ª
 Ó?!ývHî#‡GF4¢öF„û矇„Ìͪˆg‰ËöP*…ʄÆKe Öb͌â/ÍñäJnÄz£ó6¦ՖĹnÐàšú¹‚:¦~È# 0…ˆ^j>Vãwì#IEND®B`‚‰PNG


IHDRÿDGIDATxcø†Œ,œ|‘XQŠ^ùåG«å“IEND®B`‚‰PNG


IHDRÿDGIDATxcdÀ"¶2ü¿ÿÿƒ¸D)FkæIEND®B`‚‰PNG


IHDRÛiÇ4IDATxcø„†H $À¥Êk1­IEND®B`‚‰PNG


IHDRüÇFÜ]IDATx^å̱Â0Á}²‰1ØMÐ;M˜BԂf %àȹxç֗y«?@ù|v7K}º¸ۜºñ»«‡Õ)Oƒ
E4›Nˆf1j
jD´9"2?ùíTô¾c
…Ó›IEND®B`‚‰PNG


IHDRüÇFÜ`IDATx^Ý̱	€0ыùš 8@ÈÖZh¯dÿA	¢Õÿ½\û8N;~Ž(Ÿvf2Oú&$6&Z
U¸’q8
Ab¡±ç@n¦!(txÅúÒQ__:6	ˆâ‹.L¨¥¨ԓ<ØIEND®B`‚‰PNG


IHDR*Qºg
IDATx^ÑA‹Ó@‡ñg‡e±‡e½ìe¯‚Q‘âê§ðË+ÞÌؤݺm:Išøgx™08ö!e ïû#mß2ÝÃvŸÛwT‹<
o¸ƒrÜi²Æ/
GŸ4¨@Í;n‹䭦:´“*ŽnQÐղå#7ÿ$o4±åhIŽï³~¨Ÿªá;ּ€|º³æQSMœ×ÞÜq„L5{õÄg®³äµî<	ÝSçöÓÿÔ~¾òñY¬`Ñ3ìÄúÙÆÌIÑÁ.ð›[Î|á*!¯øÊȖ>NÚVŠž
±ž€§¥qæ¬KÖ8jZ<!bji¸É>(ƘÁ*NV|âԅN+‘'*ږ„Ér°(òîEz‚ç|õ^§š/¶G M“æ Ө"KK%dÃKުW:uü¢5rTXtJأ±¯•H*Ž	9eÑ"{Àب€ç%˨±Ʋ§¢S^'#m‚šaªWlÔ.žÏéʣevըž¡DZdGƒ#ÈX ‹(†Š}È2*Ö2®LÂ_\T¦6‡IEND®B`‚‰PNG


IHDR*ð³[.IDATx^íÔ]KAÇá߸/µ––¦n^H¾°‰¤‘ô¦QA”ßÿƒÔpثƒ;ãM]5sûðŸ™s†Ãw¾–!$¡Êê/á?lúa‰ȲC?L™snh,y¤	.h0´¹§jÖá–
h¨Y—ÐP³3bpAC‰Bp@açゆˆŒ!PÒ:ô|0ĞJ^H™cŒFl“òāD´Èóœx8å•%eßÑ#.¸²ôJñc¶ØáP2¯YòN­ <’YáÈÒK¡¤ë“Xšr&ô™OÚ
*ÚbĔ¾èj(4¿À.
†Bç¬8UPÑ2&–>°*ú¸9¥Æ@¨‚ëiŸ©†š†BëôÔTz•P¥ႂ	¤WõÍfO™ýÍ`ÂÞoÒà#Ä\+eµIEND®B`‚‰PNG


IHDR*ð³[0IDATx^íÔMKBQÆñÿñ¾¤ÞҺŠ/Pf·,¬…ً”™dnZDä÷ÿ 5ÉQ§E´Šgûãæ˜Q¢@ˆƒEù@ÃïÁØøÜcD“ˆœ¡΃P)C¶q8B™;v•ni)5 äÐVj@ˆ¹$#‡³ „ô8Rj@ÑQj@ppÔÐÒV²O`AGW’"«–¹aL<Ñ*rÏD÷®	–X1Sú,2•\ѣ»jt‰žh_ƒ„µÅËTxe"ìBX“
íóŸ‡o<);¥.¬@Là?øï<rMŸ.µyö¶™1RvB•uªÌ?Caçt¨Ì3jÛ![_§̇Â2-„©²pžù°ª×GÿAÂr˜ê?òà&EíÂetð_ÒO€VļÉ
ÆIEND®B`‚‰PNG


IHDR*Qºg
»IDATx^í̻ja„Ñ3?‹łÅ‚Šñ’ØÙIc!ˆSçý$éÑõRúM=ÇÏãÇõD]¨26V9וh,¼yµǠKk°¶¹bn# 6æŠ܃F1ó¡Py7SäV4Š©­èؚ*rÅÄNíoµ‰"ע#{]§êÚ‰\ƒF4NGã` ҍèùÔw®¾O=‘¶hãhèRCGM;4j_¦ÚôâK-ÿPß'¶Ҷթÿ/ˆ˜•š//’IEND®B`‚