UNPKG

mars3d-cesium

Version:

CesiumJS是一个JavaScript库,用于在web浏览器中无需插件创建3D地球仪和2D地图,mars3d-cesium是mars3d团队修改版本的CesiumJS。

26 lines (25 loc) 5.93 MB
/** * @license * Cesium - https://github.com/CesiumGS/cesium * Version 1.143.0 * * Copyright 2011-2022 Cesium Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Columbus View (Pat. Pend.) * * Portions licensed separately. * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. */ "use strict";var Cesium=(()=>{var Bve=Object.create;var CR=Object.defineProperty;var zve=Object.getOwnPropertyDescriptor;var Hve=Object.getOwnPropertyNames;var Kve=Object.getPrototypeOf,Jve=Object.prototype.hasOwnProperty;var jve=(e,t,n)=>t in e?CR(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var dU=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var em=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Qve=(e,t)=>{for(var n in t)CR(e,n,{get:t[n],enumerable:!0})},mre=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Hve(t))!Jve.call(e,o)&&o!==n&&CR(e,o,{get:()=>t[o],enumerable:!(i=zve(t,o))||i.enumerable});return e};var x=(e,t,n)=>(n=e!=null?Bve(Kve(e)):{},mre(t||!e||!e.__esModule?CR(n,"default",{value:e,enumerable:!0}):n,e)),qve=e=>mre(CR({},"__esModule",{value:!0}),e);var ct=(e,t,n)=>jve(e,typeof t!="symbol"?t+"":t,n);var T=em(()=>{"use strict";globalThis.CESIUM_WORKERS=atob("dmFyIENlc2l1bVdvcmtlcnM9KCgpPT57dmFyIG9NPU9iamVjdC5jcmVhdGU7dmFyIExmPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgYU09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgck09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIGlNPU9iamVjdC5nZXRQcm90b3R5cGVPZixjTT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBzTT0obixlLHQpPT5lIGluIG4/TGYobixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTp0fSk6bltlXT10O3ZhciBnYT0obj0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkobix7Z2V0OihlLHQpPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbdF19KTpuKShmdW5jdGlvbihuKXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrbisnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxBQT1uPT5lPT57dmFyIHQ9bltlXTtpZih0KXJldHVybiB0KCk7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIitlKX07dmFyIFg9KG4sZSk9PigpPT4obiYmKGU9bihuPTApKSxlKTt2YXIgZ2k9KG4sZSk9PigpPT4oZXx8bigoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKSwkZT0obixlKT0+e2Zvcih2YXIgdCBpbiBlKUxmKG4sdCx7Z2V0OmVbdF0sZW51bWVyYWJsZTohMH0pfSx3QT0obixlLHQsbyk9PntpZihlJiZ0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKWZvcihsZXQgYSBvZiByTShlKSkhY00uY2FsbChuLGEpJiZhIT09dCYmTGYobixhLHtnZXQ6KCk9PmVbYV0sZW51bWVyYWJsZTohKG89YU0oZSxhKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiBufTt2YXIgeWE9KG4sZSx0KT0+KHQ9biE9bnVsbD9vTShpTShuKSk6e30sd0EoZXx8IW58fCFuLl9fZXNNb2R1bGU/TGYodCwiZGVmYXVsdCIse3ZhbHVlOm4sZW51bWVyYWJsZTohMH0pOnQsbikpLGZNPW49PndBKExmKHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuKTt2YXIgTGw9KG4sZSx0KT0+c00obix0eXBlb2YgZSE9InN5bWJvbCI/ZSsiIjplLHQpO2Z1bmN0aW9uIGRNKG4pe3JldHVybiBuIT1udWxsfXZhciBfLHNlPVgoKCk9PntfPWRNfSk7ZnVuY3Rpb24gc2Mobil7dGhpcy5uYW1lPSJEZXZlbG9wZXJFcnJvciIsdGhpcy5tZXNzYWdlPW47bGV0IGU7dHJ5e3Rocm93IG5ldyBFcnJvcn1jYXRjaCh0KXtlPXQuc3RhY2t9dGhpcy5zdGFjaz1lfXZhciBIdCxmYz1YKCgpPT57c2UoKTtfKE9iamVjdC5jcmVhdGUpJiYoc2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxzYy5wcm90b3R5cGUuY29uc3RydWN0b3I9c2MpO3NjLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCBuPWAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7cmV0dXJuIF8odGhpcy5zdGFjaykmJihuKz1gCiR7dGhpcy5zdGFjay50b1N0cmluZygpfWApLG59O3NjLnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IHNjKCJUaGlzIGZ1bmN0aW9uIGRlZmluZXMgYW4gaW50ZXJmYWNlIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4iKX07SHQ9c2N9KTtmdW5jdGlvbiB1TShuKXtyZXR1cm5gJHtufSBpcyByZXF1aXJlZCwgYWN0dWFsIHZhbHVlIHdhcyB1bmRlZmluZWRgfWZ1bmN0aW9uIGRzKG4sZSx0KXtyZXR1cm5gRXhwZWN0ZWQgJHt0fSB0byBiZSB0eXBlb2YgJHtlfSwgYWN0dWFsIHR5cGVvZiB3YXMgJHtufWB9dmFyIFpuLE9uLFBiPVgoKCk9PntzZSgpO2ZjKCk7Wm49e307Wm4udHlwZU9mPXt9O1puLmRlZmluZWQ9ZnVuY3Rpb24obixlKXtpZighXyhlKSl0aHJvdyBuZXcgSHQodU0obikpfTtabi50eXBlT2YuZnVuYz1mdW5jdGlvbihuLGUpe2lmKHR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBIdChkcyh0eXBlb2YgZSwiZnVuY3Rpb24iLG4pKX07Wm4udHlwZU9mLnN0cmluZz1mdW5jdGlvbihuLGUpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBuZXcgSHQoZHModHlwZW9mIGUsInN0cmluZyIsbikpfTtabi50eXBlT2YubnVtYmVyPWZ1bmN0aW9uKG4sZSl7aWYodHlwZW9mIGUhPSJudW1iZXIiKXRocm93IG5ldyBIdChkcyh0eXBlb2YgZSwibnVtYmVyIixuKSl9O1puLnR5cGVPZi5udW1iZXIubGVzc1RoYW49ZnVuY3Rpb24obixlLHQpe2lmKFpuLnR5cGVPZi5udW1iZXIobixlKSxlPj10KXRocm93IG5ldyBIdChgRXhwZWN0ZWQgJHtufSB0byBiZSBsZXNzIHRoYW4gJHt0fSwgYWN0dWFsIHZhbHVlIHdhcyAke2V9YCl9O1puLnR5cGVPZi5udW1iZXIubGVzc1RoYW5PckVxdWFscz1mdW5jdGlvbihuLGUsdCl7aWYoWm4udHlwZU9mLm51bWJlcihuLGUpLGU+dCl0aHJvdyBuZXcgSHQoYEV4cGVjdGVkICR7bn0gdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICR7dH0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtabi50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKG4sZSx0KXtpZihabi50eXBlT2YubnVtYmVyKG4sZSksZTw9dCl0aHJvdyBuZXcgSHQoYEV4cGVjdGVkICR7bn0gdG8gYmUgZ3JlYXRlciB0aGFuICR7dH0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtabi50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24obixlLHQpe2lmKFpuLnR5cGVPZi5udW1iZXIobixlKSxlPHQpdGhyb3cgbmV3IEh0KGBFeHBlY3RlZCAke259IHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke3R9LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07Wm4udHlwZU9mLm9iamVjdD1mdW5jdGlvbihuLGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Iil0aHJvdyBuZXcgSHQoZHModHlwZW9mIGUsIm9iamVjdCIsbikpfTtabi50eXBlT2YuYm9vbD1mdW5jdGlvbihuLGUpe2lmKHR5cGVvZiBlIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEh0KGRzKHR5cGVvZiBlLCJib29sZWFuIixuKSl9O1puLnR5cGVPZi5iaWdpbnQ9ZnVuY3Rpb24obixlKXtpZih0eXBlb2YgZSE9ImJpZ2ludCIpdGhyb3cgbmV3IEh0KGRzKHR5cGVvZiBlLCJiaWdpbnQiLG4pKX07Wm4udHlwZU9mLm51bWJlci5lcXVhbHM9ZnVuY3Rpb24obixlLHQsbyl7aWYoWm4udHlwZU9mLm51bWJlcihuLHQpLFpuLnR5cGVPZi5udW1iZXIoZSxvKSx0IT09byl0aHJvdyBuZXcgSHQoYCR7bn0gbXVzdCBiZSBlcXVhbCB0byAke2V9LCB0aGUgYWN0dWFsIHZhbHVlcyBhcmUgJHt0fSBhbmQgJHtvfWApfTtPbj1abn0pO3ZhciBUQT1naSgoWDUsRUEpPT57dmFyIGpyPWZ1bmN0aW9uKG4pe249PW51bGwmJihuPW5ldyBEYXRlKCkuZ2V0VGltZSgpKSx0aGlzLk49NjI0LHRoaXMuTT0zOTcsdGhpcy5NQVRSSVhfQT0yNTY3NDgzNjE1LHRoaXMuVVBQRVJfTUFTSz0yMTQ3NDgzNjQ4LHRoaXMuTE9XRVJfTUFTSz0yMTQ3NDgzNjQ3LHRoaXMubXQ9bmV3IEFycmF5KHRoaXMuTiksdGhpcy5tdGk9dGhpcy5OKzEsbi5jb25zdHJ1Y3Rvcj09QXJyYXk/dGhpcy5pbml0X2J5X2FycmF5KG4sbi5sZW5ndGgpOnRoaXMuaW5pdF9zZWVkKG4pfTtqci5wcm90b3R5cGUuaW5pdF9zZWVkPWZ1bmN0aW9uKG4pe2Zvcih0aGlzLm10WzBdPW4+Pj4wLHRoaXMubXRpPTE7dGhpcy5tdGk8dGhpcy5OO3RoaXMubXRpKyspe3ZhciBuPXRoaXMubXRbdGhpcy5tdGktMV1edGhpcy5tdFt0aGlzLm10aS0xXT4+PjMwO3RoaXMubXRbdGhpcy5tdGldPSgoKG4mNDI5NDkwMTc2MCk+Pj4xNikqMTgxMjQzMzI1Mzw8MTYpKyhuJjY1NTM1KSoxODEyNDMzMjUzK3RoaXMubXRpLHRoaXMubXRbdGhpcy5tdGldPj4+PTB9fTtqci5wcm90b3R5cGUuaW5pdF9ieV9hcnJheT1mdW5jdGlvbihuLGUpe3ZhciB0LG8sYTtmb3IodGhpcy5pbml0X3NlZWQoMTk2NTAyMTgpLHQ9MSxvPTAsYT10aGlzLk4+ZT90aGlzLk46ZTthO2EtLSl7dmFyIHI9dGhpcy5tdFt0LTFdXnRoaXMubXRbdC0xXT4+PjMwO3RoaXMubXRbdF09KHRoaXMubXRbdF1eKCgociY0Mjk0OTAxNzYwKT4+PjE2KSoxNjY0NTI1PDwxNikrKHImNjU1MzUpKjE2NjQ1MjUpK25bb10rbyx0aGlzLm10W3RdPj4+PTAsdCsrLG8rKyx0Pj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLHQ9MSksbz49ZSYmKG89MCl9Zm9yKGE9dGhpcy5OLTE7YTthLS0pe3ZhciByPXRoaXMubXRbdC0xXV50aGlzLm10W3QtMV0+Pj4zMDt0aGlzLm10W3RdPSh0aGlzLm10W3RdXigoKHImNDI5NDkwMTc2MCk+Pj4xNikqMTU2NjA4Mzk0MTw8MTYpKyhyJjY1NTM1KSoxNTY2MDgzOTQxKS10LHRoaXMubXRbdF0+Pj49MCx0KyssdD49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSx0PTEpfXRoaXMubXRbMF09MjE0NzQ4MzY0OH07anIucHJvdG90eXBlLnJhbmRvbV9pbnQ9ZnVuY3Rpb24oKXt2YXIgbixlPW5ldyBBcnJheSgwLHRoaXMuTUFUUklYX0EpO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciB0O2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9zZWVkKDU0ODkpLHQ9MDt0PHRoaXMuTi10aGlzLk07dCsrKW49dGhpcy5tdFt0XSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFt0KzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RdPXRoaXMubXRbdCt0aGlzLk1dXm4+Pj4xXmVbbiYxXTtmb3IoO3Q8dGhpcy5OLTE7dCsrKW49dGhpcy5tdFt0XSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFt0KzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RdPXRoaXMubXRbdCsodGhpcy5NLXRoaXMuTildXm4+Pj4xXmVbbiYxXTtuPXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV5uPj4+MV5lW24mMV0sdGhpcy5tdGk9MH1yZXR1cm4gbj10aGlzLm10W3RoaXMubXRpKytdLG5ePW4+Pj4xMSxuXj1uPDw3JjI2MzY5Mjg2NDAsbl49bjw8MTUmNDAyMjczMDc1MixuXj1uPj4+MTgsbj4+PjB9O2pyLnByb3RvdHlwZS5yYW5kb21faW50MzE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCk+Pj4xfTtqci5wcm90b3R5cGUucmFuZG9tX2luY2w9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5NSl9O2pyLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5Nil9O2pyLnByb3RvdHlwZS5yYW5kb21fZXhjbD1mdW5jdGlvbigpe3JldHVybih0aGlzLnJhbmRvbV9pbnQoKSsuNSkqKDEvNDI5NDk2NzI5Nil9O2pyLnByb3RvdHlwZS5yYW5kb21fbG9uZz1mdW5jdGlvbigpe3ZhciBuPXRoaXMucmFuZG9tX2ludCgpPj4+NSxlPXRoaXMucmFuZG9tX2ludCgpPj4+NjtyZXR1cm4obio2NzEwODg2NCtlKSooMS85MDA3MTk5MjU0NzQwOTkyKX07RUEuZXhwb3J0cz1qcn0pO3ZhciB2YixSZSxqbCxSQSxQLExlPVgoKCk9Pnt2Yj15YShUQSgpLDEpLFJlPXt9O1JlLkVQU0lMT04xPS4xO1JlLkVQU0lMT04yPS4wMTtSZS5FUFNJTE9OMz0uMDAxO1JlLkVQU0lMT040PTFlLTQ7UmUuRVBTSUxPTjU9MWUtNTtSZS5FUFNJTE9ONj0xZS02O1JlLkVQU0lMT043PTFlLTc7UmUuRVBTSUxPTjg9MWUtODtSZS5FUFNJTE9OOT0xZS05O1JlLkVQU0lMT04xMD0xZS0xMDtSZS5FUFNJTE9OMTE9MWUtMTE7UmUuRVBTSUxPTjEyPTFlLTEyO1JlLkVQU0lMT04xMz0xZS0xMztSZS5FUFNJTE9OMTQ9MWUtMTQ7UmUuRVBTSUxPTjE1PTFlLTE1O1JlLkVQU0lMT04xNj0xZS0xNjtSZS5FUFNJTE9OMTc9MWUtMTc7UmUuRVBTSUxPTjE4PTFlLTE4O1JlLkVQU0lMT04xOT0xZS0xOTtSZS5FUFNJTE9OMjA9MWUtMjA7UmUuRVBTSUxPTjIxPTFlLTIxO1JlLkdSQVZJVEFUSU9OQUxQQVJBTUVURVI9Mzk4NjAwNDQxOGU1O1JlLlNPTEFSX1JBRElVUz02OTU1ZTU7UmUuTFVOQVJfUkFESVVTPTE3Mzc0MDA7UmUuU0lYVFlfRk9VUl9LSUxPQllURVM9NjQqMTAyNDtSZS5GT1VSX0dJR0FCWVRFUz00KjEwMjQqMTAyNCoxMDI0O1JlLnNpZ249TWF0aC5zaWduPz9mdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxlPT09MHx8ZSE9PWU/ZTplPjA/MTotMX07UmUuc2lnbk5vdFplcm89ZnVuY3Rpb24obil7cmV0dXJuIG48MD8tMToxfTtSZS50b1NOb3JtPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIGU9ZT8/MjU1LE1hdGgucm91bmQoKFJlLmNsYW1wKG4sLTEsMSkqLjUrLjUpKmUpfTtSZS5mcm9tU05vcm09ZnVuY3Rpb24obixlKXtyZXR1cm4gZT1lPz8yNTUsUmUuY2xhbXAobiwwLGUpL2UqMi0xfTtSZS5ub3JtYWxpemU9ZnVuY3Rpb24obixlLHQpe3JldHVybiB0PU1hdGgubWF4KHQtZSwwKSx0PT09MD8wOlJlLmNsYW1wKChuLWUpL3QsMCwxKX07UmUuc2luaD1NYXRoLnNpbmg/P2Z1bmN0aW9uKGUpe3JldHVybihNYXRoLmV4cChlKS1NYXRoLmV4cCgtZSkpLzJ9O1JlLmNvc2g9TWF0aC5jb3NoPz9mdW5jdGlvbihlKXtyZXR1cm4oTWF0aC5leHAoZSkrTWF0aC5leHAoLWUpKS8yfTtSZS5sZXJwPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4oMS10KSpuK3QqZX07UmUuUEk9TWF0aC5QSTtSZS5PTkVfT1ZFUl9QST0xL01hdGguUEk7UmUuUElfT1ZFUl9UV089TWF0aC5QSS8yO1JlLlBJX09WRVJfVEhSRUU9TWF0aC5QSS8zO1JlLlBJX09WRVJfRk9VUj1NYXRoLlBJLzQ7UmUuUElfT1ZFUl9TSVg9TWF0aC5QSS82O1JlLlRIUkVFX1BJX09WRVJfVFdPPTMqTWF0aC5QSS8yO1JlLlRXT19QST0yKk1hdGguUEk7UmUuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSk7UmUuUkFESUFOU19QRVJfREVHUkVFPU1hdGguUEkvMTgwO1JlLkRFR1JFRVNfUEVSX1JBRElBTj0xODAvTWF0aC5QSTtSZS5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9UmUuUkFESUFOU19QRVJfREVHUkVFLzM2MDA7UmUudG9SYWRpYW5zPWZ1bmN0aW9uKG4pe3JldHVybiBuKlJlLlJBRElBTlNfUEVSX0RFR1JFRX07UmUudG9EZWdyZWVzPWZ1bmN0aW9uKG4pe3JldHVybiBuKlJlLkRFR1JFRVNfUEVSX1JBRElBTn07UmUuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKG4pe2xldCBlPVJlLlRXT19QSSx0PW4tTWF0aC5mbG9vcihuL2UpKmU7cmV0dXJuIHQ8LU1hdGguUEk/dCtlOnQ+PU1hdGguUEk/dC1lOnR9O1JlLmNsYW1wVG9MYXRpdHVkZVJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBSZS5jbGFtcChuLC0xKlJlLlBJX09WRVJfVFdPLFJlLlBJX09WRVJfVFdPKX07UmUubmVnYXRpdmVQaVRvUGk9ZnVuY3Rpb24obil7cmV0dXJuIG4+PS1SZS5QSSYmbjw9UmUuUEk/bjpSZS56ZXJvVG9Ud29QaShuK1JlLlBJKS1SZS5QSX07UmUuemVyb1RvVHdvUGk9ZnVuY3Rpb24obil7aWYobj49MCYmbjw9UmUuVFdPX1BJKXJldHVybiBuO2xldCBlPVJlLm1vZChuLFJlLlRXT19QSSk7cmV0dXJuIE1hdGguYWJzKGUpPFJlLkVQU0lMT04xNCYmTWF0aC5hYnMobik+UmUuRVBTSUxPTjE0P1JlLlRXT19QSTplfTtSZS5tb2Q9ZnVuY3Rpb24obixlKXtyZXR1cm4gUmUuc2lnbihuKT09PVJlLnNpZ24oZSkmJk1hdGguYWJzKG4pPE1hdGguYWJzKGUpP246KG4lZStlKSVlfTtSZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKG4sZSx0LG8pe3Q9dD8/MCxvPW8/P3Q7bGV0IGE9TWF0aC5hYnMobi1lKTtyZXR1cm4gYTw9b3x8YTw9dCpNYXRoLm1heChNYXRoLmFicyhuKSxNYXRoLmFicyhlKSl9O1JlLmxlc3NUaGFuPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gbi1lPC10fTtSZS5sZXNzVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gbi1lPHR9O1JlLmdyZWF0ZXJUaGFuPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gbi1lPnR9O1JlLmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24obixlLHQpe3JldHVybiBuLWU+LXR9O2psPVsxXTtSZS5mYWN0b3JpYWw9ZnVuY3Rpb24obil7bGV0IGU9amwubGVuZ3RoO2lmKG4+PWUpe2xldCB0PWpsW2UtMV07Zm9yKGxldCBvPWU7bzw9bjtvKyspe2xldCBhPXQqbztqbC5wdXNoKGEpLHQ9YX19cmV0dXJuIGpsW25dfTtSZS5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gdD10Pz8wLCsrbixuPmUmJihuPXQpLG59O1JlLmlzUG93ZXJPZlR3bz1mdW5jdGlvbihuKXtyZXR1cm4gbiE9PTAmJihuJm4tMSk9PT0wfTtSZS5uZXh0UG93ZXJPZlR3bz1mdW5jdGlvbihuKXtyZXR1cm4tLW4sbnw9bj4+MSxufD1uPj4yLG58PW4+PjQsbnw9bj4+OCxufD1uPj4xNiwrK24sbn07UmUucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKG4pe3JldHVybiBufD1uPj4xLG58PW4+PjIsbnw9bj4+NCxufD1uPj44LG58PW4+PjE2LG58PW4+PjMyLG49KG4+Pj4wKS0obj4+PjEpLG59O1JlLmNsYW1wPWZ1bmN0aW9uKG4sZSx0KXtyZXR1cm4gbjxlP2U6bj50P3Q6bn07UkE9bmV3IHZiLmRlZmF1bHQ7UmUuc2V0UmFuZG9tTnVtYmVyU2VlZD1mdW5jdGlvbihuKXtSQT1uZXcgdmIuZGVmYXVsdChuKX07UmUubmV4dFJhbmRvbU51bWJlcj1mdW5jdGlvbigpe3JldHVybiBSQS5yYW5kb20oKX07UmUucmFuZG9tQmV0d2Vlbj1mdW5jdGlvbihuLGUpe3JldHVybiBSZS5uZXh0UmFuZG9tTnVtYmVyKCkqKGUtbikrbn07UmUuYWNvc0NsYW1wZWQ9ZnVuY3Rpb24obil7cmV0dXJuIE1hdGguYWNvcyhSZS5jbGFtcChuLC0xLDEpKX07UmUuYXNpbkNsYW1wZWQ9ZnVuY3Rpb24obil7cmV0dXJuIE1hdGguYXNpbihSZS5jbGFtcChuLC0xLDEpKX07UmUuY2hvcmRMZW5ndGg9ZnVuY3Rpb24obixlKXtyZXR1cm4gMiplKk1hdGguc2luKG4qLjUpfTtSZS5sb2dCYXNlPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIE1hdGgubG9nKG4pL01hdGgubG9nKGUpfTtSZS5jYnJ0PU1hdGguY2JydD8/ZnVuY3Rpb24oZSl7bGV0IHQ9TWF0aC5wb3coTWF0aC5hYnMoZSksLjMzMzMzMzMzMzMzMzMzMzMpO3JldHVybiBlPDA/LXQ6dH07UmUubG9nMj1NYXRoLmxvZzI/P2Z1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKSpNYXRoLkxPRzJFfTtSZS5mb2c9ZnVuY3Rpb24obixlKXtsZXQgdD1uKmU7cmV0dXJuIDEtTWF0aC5leHAoLSh0KnQpKX07UmUuZmFzdEFwcHJveGltYXRlQXRhbj1mdW5jdGlvbihuKXtyZXR1cm4gbiooLS4xNzg0Kk1hdGguYWJzKG4pLS4wNjYzKm4qbisxLjAzMDEpfTtSZS5mYXN0QXBwcm94aW1hdGVBdGFuMj1mdW5jdGlvbihuLGUpe2xldCB0LG89TWF0aC5hYnMobik7dD1NYXRoLmFicyhlKTtsZXQgYT1NYXRoLm1heChvLHQpO3Q9TWF0aC5taW4obyx0KTtsZXQgcj10L2E7cmV0dXJuIG89UmUuZmFzdEFwcHJveGltYXRlQXRhbihyKSxvPU1hdGguYWJzKGUpPk1hdGguYWJzKG4pP1JlLlBJX09WRVJfVFdPLW86byxvPW48MD9SZS5QSS1vOm8sbz1lPDA/LW86byxvfTtQPVJlfSk7dmFyIHVuLHpsLHhBLEdsLEZiLGxNLEFhLHVzLGYsTWU9WCgoKT0+e3NlKCk7TGUoKTt1bj1jbGFzcyBue2NvbnN0cnVjdG9yKGUsdCxvKXt0aGlzLng9ZT8/MCx0aGlzLnk9dD8/MCx0aGlzLno9bz8/MH1zdGF0aWMgZnJvbVNwaGVyaWNhbChlLHQpe18odCl8fCh0PW5ldyBuKTtsZXQgbz1lLmNsb2NrLGE9ZS5jb25lLHI9ZS5tYWduaXR1ZGU/PzEsaT1yKk1hdGguc2luKGEpO3JldHVybiB0Lng9aSpNYXRoLmNvcyhvKSx0Lnk9aSpNYXRoLnNpbihvKSx0Lno9cipNYXRoLmNvcyhhKSx0fXN0YXRpYyBmcm9tRWxlbWVudHMoZSx0LG8sYSl7cmV0dXJuIF8oYSk/KGEueD1lLGEueT10LGEuej1vLGEpOm5ldyBuKGUsdCxvKX1zdGF0aWMgY2xvbmUoZSx0KXtpZihfKGUpKXJldHVybiBfKHQpPyh0Lng9ZS54LHQueT1lLnksdC56PWUueix0KTpuZXcgbihlLngsZS55LGUueil9c3RhdGljIHBhY2soZSx0LG8pe3JldHVybiBvPW8/PzAsdFtvKytdPWUueCx0W28rK109ZS55LHRbb109ZS56LHR9c3RhdGljIHVucGFjayhlLHQsbyl7cmV0dXJuIHQ9dD8/MCxfKG8pfHwobz1uZXcgbiksby54PWVbdCsrXSxvLnk9ZVt0KytdLG8uej1lW3RdLG99c3RhdGljIHBhY2tBcnJheShlLHQpe2xldCBvPWUubGVuZ3RoLGE9byozO18odCk/IUFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoIT09YXx8dC5sZW5ndGghPT1hJiYodC5sZW5ndGg9YSk6dD1uZXcgQXJyYXkoYSk7Zm9yKGxldCByPTA7cjxvOysrciluLnBhY2soZVtyXSx0LHIqMyk7cmV0dXJuIHR9c3RhdGljIHVucGFja0FycmF5KGUsdCl7bGV0IG89ZS5sZW5ndGg7Xyh0KT90Lmxlbmd0aD1vLzM6dD1uZXcgQXJyYXkoby8zKTtmb3IobGV0IGE9MDthPG87YSs9Myl7bGV0IHI9YS8zO3Rbcl09bi51bnBhY2soZSxhLHRbcl0pfXJldHVybiB0fXN0YXRpYyBtYXhpbXVtQ29tcG9uZW50KGUpe3JldHVybiBNYXRoLm1heChlLngsZS55LGUueil9c3RhdGljIG1pbmltdW1Db21wb25lbnQoZSl7cmV0dXJuIE1hdGgubWluKGUueCxlLnksZS56KX1zdGF0aWMgbWluaW11bUJ5Q29tcG9uZW50KGUsdCxvKXtyZXR1cm4gby54PU1hdGgubWluKGUueCx0LngpLG8ueT1NYXRoLm1pbihlLnksdC55KSxvLno9TWF0aC5taW4oZS56LHQueiksb31zdGF0aWMgbWF4aW11bUJ5Q29tcG9uZW50KGUsdCxvKXtyZXR1cm4gby54PU1hdGgubWF4KGUueCx0LngpLG8ueT1NYXRoLm1heChlLnksdC55KSxvLno9TWF0aC5tYXgoZS56LHQueiksb31zdGF0aWMgY2xhbXAoZSx0LG8sYSl7bGV0IHI9UC5jbGFtcChlLngsdC54LG8ueCksaT1QLmNsYW1wKGUueSx0Lnksby55KSxzPVAuY2xhbXAoZS56LHQueixvLnopO3JldHVybiBhLng9cixhLnk9aSxhLno9cyxhfXN0YXRpYyBtYWduaXR1ZGVTcXVhcmVkKGUpe3JldHVybiBlLngqZS54K2UueSplLnkrZS56KmUuen1zdGF0aWMgbWFnbml0dWRlKGUpe3JldHVybiBNYXRoLnNxcnQobi5tYWduaXR1ZGVTcXVhcmVkKGUpKX1zdGF0aWMgZGlzdGFuY2UoZSx0KXtyZXR1cm4gbi5zdWJ0cmFjdChlLHQsemwpLG4ubWFnbml0dWRlKHpsKX1zdGF0aWMgZGlzdGFuY2VTcXVhcmVkKGUsdCl7cmV0dXJuIG4uc3VidHJhY3QoZSx0LHpsKSxuLm1hZ25pdHVkZVNxdWFyZWQoemwpfXN0YXRpYyBub3JtYWxpemUoZSx0KXtsZXQgbz1uLm1hZ25pdHVkZShlKTtyZXR1cm4gdC54PWUueC9vLHQueT1lLnkvbyx0Lno9ZS56L28sdH1zdGF0aWMgZG90KGUsdCl7cmV0dXJuIGUueCp0LngrZS55KnQueStlLnoqdC56fXN0YXRpYyBtdWx0aXBseUNvbXBvbmVudHMoZSx0LG8pe3JldHVybiBvLng9ZS54KnQueCxvLnk9ZS55KnQueSxvLno9ZS56KnQueixvfXN0YXRpYyBkaXZpZGVDb21wb25lbnRzKGUsdCxvKXtyZXR1cm4gby54PWUueC90Lngsby55PWUueS90Lnksby56PWUuei90Lnosb31zdGF0aWMgYWRkKGUsdCxvKXtyZXR1cm4gby54PWUueCt0Lngsby55PWUueSt0Lnksby56PWUueit0Lnosb31zdGF0aWMgc3VidHJhY3QoZSx0LG8pe3JldHVybiBvLng9ZS54LXQueCxvLnk9ZS55LXQueSxvLno9ZS56LXQueixvfXN0YXRpYyBtdWx0aXBseUJ5U2NhbGFyKGUsdCxvKXtyZXR1cm4gby54PWUueCp0LG8ueT1lLnkqdCxvLno9ZS56KnQsb31zdGF0aWMgZGl2aWRlQnlTY2FsYXIoZSx0LG8pe3JldHVybiBvLng9ZS54L3Qsby55PWUueS90LG8uej1lLnovdCxvfXN0YXRpYyBuZWdhdGUoZSx0KXtyZXR1cm4gdC54PS1lLngsdC55PS1lLnksdC56PS1lLnosdH1zdGF0aWMgYWJzKGUsdCl7cmV0dXJuIHQueD1NYXRoLmFicyhlLngpLHQueT1NYXRoLmFicyhlLnkpLHQuej1NYXRoLmFicyhlLnopLHR9c3RhdGljIGxlcnAoZSx0LG8sYSl7cmV0dXJuIG4ubXVsdGlwbHlCeVNjYWxhcih0LG8seEEpLGE9bi5tdWx0aXBseUJ5U2NhbGFyKGUsMS1vLGEpLG4uYWRkKHhBLGEsYSl9c3RhdGljIGFuZ2xlQmV0d2VlbihlLHQpe24ubm9ybWFsaXplKGUsR2wpLG4ubm9ybWFsaXplKHQsRmIpO2xldCBvPW4uZG90KEdsLEZiKSxhPW4ubWFnbml0dWRlKG4uY3Jvc3MoR2wsRmIsR2wpKTtyZXR1cm4gTWF0aC5hdGFuMihhLG8pfXN0YXRpYyBtb3N0T3J0aG9nb25hbEF4aXMoZSx0KXtsZXQgbz1uLm5vcm1hbGl6ZShlLGxNKTtyZXR1cm4gbi5hYnMobyxvKSxvLng8PW8ueT9vLng8PW8uej90PW4uY2xvbmUobi5VTklUX1gsdCk6dD1uLmNsb25lKG4uVU5JVF9aLHQpOm8ueTw9by56P3Q9bi5jbG9uZShuLlVOSVRfWSx0KTp0PW4uY2xvbmUobi5VTklUX1osdCksdH1zdGF0aWMgcHJvamVjdFZlY3RvcihlLHQsbyl7bGV0IGE9bi5kb3QoZSx0KS9uLmRvdCh0LHQpO3JldHVybiBuLm11bHRpcGx5QnlTY2FsYXIodCxhLG8pfXN0YXRpYyBlcXVhbHMoZSx0KXtyZXR1cm4gZT09PXR8fF8oZSkmJl8odCkmJmUueD09PXQueCYmZS55PT09dC55JiZlLno9PT10Lnp9c3RhdGljIGVxdWFsc0FycmF5KGUsdCxvKXtyZXR1cm4gZS54PT09dFtvXSYmZS55PT09dFtvKzFdJiZlLno9PT10W28rMl19c3RhdGljIGVxdWFsc0Vwc2lsb24oZSx0LG8sYSl7cmV0dXJuIGU9PT10fHxfKGUpJiZfKHQpJiZQLmVxdWFsc0Vwc2lsb24oZS54LHQueCxvLGEpJiZQLmVxdWFsc0Vwc2lsb24oZS55LHQueSxvLGEpJiZQLmVxdWFsc0Vwc2lsb24oZS56LHQueixvLGEpfXN0YXRpYyBjcm9zcyhlLHQsbyl7bGV0IGE9ZS54LHI9ZS55LGk9ZS56LHM9dC54LGQ9dC55LGM9dC56LHU9cipjLWkqZCxsPWkqcy1hKmMsaD1hKmQtcipzO3JldHVybiBvLng9dSxvLnk9bCxvLno9aCxvfXN0YXRpYyBtaWRwb2ludChlLHQsbyl7cmV0dXJuIG8ueD0oZS54K3QueCkqLjUsby55PShlLnkrdC55KSouNSxvLno9KGUueit0LnopKi41LG99c3RhdGljIGZyb21EZWdyZWVzKGUsdCxvLGEscil7cmV0dXJuIGU9UC50b1JhZGlhbnMoZSksdD1QLnRvUmFkaWFucyh0KSxuLmZyb21SYWRpYW5zKGUsdCxvLGEscil9c3RhdGljIGZyb21SYWRpYW5zKGUsdCxvLGEscil7bz1vPz8wO2xldCBpPV8oYSk/YS5yYWRpaVNxdWFyZWQ6bi5fZWxsaXBzb2lkUmFkaWlTcXVhcmVkLHM9TWF0aC5jb3ModCk7QWEueD1zKk1hdGguY29zKGUpLEFhLnk9cypNYXRoLnNpbihlKSxBYS56PU1hdGguc2luKHQpLEFhPW4ubm9ybWFsaXplKEFhLEFhKSxuLm11bHRpcGx5Q29tcG9uZW50cyhpLEFhLHVzKTtsZXQgZD1NYXRoLnNxcnQobi5kb3QoQWEsdXMpKTtyZXR1cm4gdXM9bi5kaXZpZGVCeVNjYWxhcih1cyxkLHVzKSxBYT1uLm11bHRpcGx5QnlTY2FsYXIoQWEsbyxBYSksXyhyKXx8KHI9bmV3IG4pLG4uYWRkKHVzLEFhLHIpfXN0YXRpYyBmcm9tRGVncmVlc0FycmF5KGUsdCxvKXtsZXQgYT1lLmxlbmd0aDtfKG8pP28ubGVuZ3RoPWEvMjpvPW5ldyBBcnJheShhLzIpO2ZvcihsZXQgcj0wO3I8YTtyKz0yKXtsZXQgaT1lW3JdLHM9ZVtyKzFdLGQ9ci8yO29bZF09bi5mcm9tRGVncmVlcyhpLHMsMCx0LG9bZF0pfXJldHVybiBvfXN0YXRpYyBmcm9tUmFkaWFuc0FycmF5KGUsdCxvKXtsZXQgYT1lLmxlbmd0aDtfKG8pP28ubGVuZ3RoPWEvMjpvPW5ldyBBcnJheShhLzIpO2ZvcihsZXQgcj0wO3I8YTtyKz0yKXtsZXQgaT1lW3JdLHM9ZVtyKzFdLGQ9ci8yO29bZF09bi5mcm9tUmFkaWFucyhpLHMsMCx0LG9bZF0pfXJldHVybiBvfXN0YXRpYyBmcm9tRGVncmVlc0FycmF5SGVpZ2h0cyhlLHQsbyl7bGV0IGE9ZS5sZW5ndGg7XyhvKT9vLmxlbmd0aD1hLzM6bz1uZXcgQXJyYXkoYS8zKTtmb3IobGV0IHI9MDtyPGE7cis9Myl7bGV0IGk9ZVtyXSxzPWVbcisxXSxkPWVbcisyXSxjPXIvMztvW2NdPW4uZnJvbURlZ3JlZXMoaSxzLGQsdCxvW2NdKX1yZXR1cm4gb31zdGF0aWMgZnJvbVJhZGlhbnNBcnJheUhlaWdodHMoZSx0LG8pe2xldCBhPWUubGVuZ3RoO18obyk/by5sZW5ndGg9YS8zOm89bmV3IEFycmF5KGEvMyk7Zm9yKGxldCByPTA7cjxhO3IrPTMpe2xldCBpPWVbcl0scz1lW3IrMV0sZD1lW3IrMl0sYz1yLzM7b1tjXT1uLmZyb21SYWRpYW5zKGkscyxkLHQsb1tjXSl9cmV0dXJuIG99Y2xvbmUoZSl7cmV0dXJuIG4uY2xvbmUodGhpcyxlKX1lcXVhbHMoZSl7cmV0dXJuIG4uZXF1YWxzKHRoaXMsZSl9ZXF1YWxzRXBzaWxvbihlLHQsbyl7cmV0dXJuIG4uZXF1YWxzRXBzaWxvbih0aGlzLGUsdCxvKX10b1N0cmluZygpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSlgfX07dW4uZnJvbUNhcnRlc2lhbjQ9dW4uY2xvbmU7dW4ucGFja2VkTGVuZ3RoPTM7dW4uZnJvbUFycmF5PXVuLnVucGFjazt6bD1uZXcgdW4seEE9bmV3IHVuLEdsPW5ldyB1bixGYj1uZXcgdW4sbE09bmV3IHVuLEFhPW5ldyB1bix1cz1uZXcgdW47dW4uX2VsbGlwc29pZFJhZGlpU3F1YXJlZD1uZXcgdW4oNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO3VuLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgdW4oMCwwLDApKTt1bi5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgdW4oMSwxLDEpKTt1bi5VTklUX1g9T2JqZWN0LmZyZWV6ZShuZXcgdW4oMSwwLDApKTt1bi5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgdW4oMCwxLDApKTt1bi5VTklUX1o9T2JqZWN0LmZyZWV6ZShuZXcgdW4oMCwwLDEpKTtmPXVufSk7ZnVuY3Rpb24gYk0obixlLHQsbyxhKXtsZXQgcj1uLngsaT1uLnkscz1uLnosZD1lLngsYz1lLnksdT1lLnosbD1yKnIqZCpkLGg9aSppKmMqYyxtPXMqcyp1KnUsYj1sK2grbSxwPU1hdGguc3FydCgxL2IpLHk9Zi5tdWx0aXBseUJ5U2NhbGFyKG4scCxoTSk7aWYoYjxvKXJldHVybiBpc0Zpbml0ZShwKT9mLmNsb25lKHksYSk6dm9pZCAwO2xldCBFPXQueCxnPXQueSxUPXQueix3PW1NO3cueD15LngqRSoyLHcueT15LnkqZyoyLHcuej15LnoqVCoyO2xldCBSPSgxLXApKmYubWFnbml0dWRlKG4pLyguNSpmLm1hZ25pdHVkZSh3KSksUz0wLE0sSSxOLGssdixBLHgsQyxGLFUsejtkb3tSLT1TLE49MS8oMStSKkUpLGs9MS8oMStSKmcpLHY9MS8oMStSKlQpLEE9TipOLHg9ayprLEM9dip2LEY9QSpOLFU9eCprLHo9Qyp2LE09bCpBK2gqeCttKkMtMSxJPWwqRipFK2gqVSpnK20qeipUO2xldCBEPS0yKkk7Uz1NL0R9d2hpbGUoTWF0aC5hYnMoTSk+UC5FUFNJTE9OMTIpO3JldHVybiBfKGEpPyhhLng9cipOLGEueT1pKmssYS56PXMqdixhKTpuZXcgZihyKk4saSprLHMqdil9dmFyIGhNLG1NLFZsLERiPVgoKCk9PntNZSgpO3NlKCk7TGUoKTtoTT1uZXcgZixtTT1uZXcgZjtWbD1iTX0pO3ZhciBCbyxqZixwTSxfTSxnTSxyZSxfdD1YKCgpPT57TWUoKTtzZSgpO0xlKCk7RGIoKTtCbz1jbGFzcyBCb3tjb25zdHJ1Y3RvcihlLHQsbyl7dGhpcy5sb25naXR1ZGU9ZT8/MCx0aGlzLmxhdGl0dWRlPXQ/PzAsdGhpcy5oZWlnaHQ9bz8/MH1zdGF0aWMgZnJvbVJhZGlhbnMoZSx0LG8sYSl7cmV0dXJuIG89bz8/MCxfKGEpPyhhLmxvbmdpdHVkZT1lLGEubGF0aXR1ZGU9dCxhLmhlaWdodD1vLGEpOm5ldyBCbyhlLHQsbyl9c3RhdGljIGZyb21EZWdyZWVzKGUsdCxvLGEpe3JldHVybiBlPVAudG9SYWRpYW5zKGUpLHQ9UC50b1JhZGlhbnModCksQm8uZnJvbVJhZGlhbnMoZSx0LG8sYSl9c3RhdGljIGZyb21DYXJ0ZXNpYW4oZSx0LG8pe2xldCBhPV8odCk/dC5vbmVPdmVyUmFkaWk6Qm8uX2VsbGlwc29pZE9uZU92ZXJSYWRpaSxyPV8odCk/dC5vbmVPdmVyUmFkaWlTcXVhcmVkOkJvLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWlTcXVhcmVkLGk9Xyh0KT90Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkOkJvLl9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkLHM9VmwoZSxhLHIsaSxfTSk7aWYoIV8ocykpcmV0dXJuO2xldCBkPWYubXVsdGlwbHlDb21wb25lbnRzKHMscixwTSk7ZD1mLm5vcm1hbGl6ZShkLGQpO2xldCBjPWYuc3VidHJhY3QoZSxzLGdNKSx1PU1hdGguYXRhbjIoZC55LGQueCksbD1NYXRoLmFzaW4oZC56KSxoPVAuc2lnbihmLmRvdChjLGUpKSpmLm1hZ25pdHVkZShjKTtyZXR1cm4gXyhvKT8oby5sb25naXR1ZGU9dSxvLmxhdGl0dWRlPWwsby5oZWlnaHQ9aCxvKTpuZXcgQm8odSxsLGgpfXN0YXRpYyB0b0NhcnRlc2lhbihlLHQsbyl7cmV0dXJuIGYuZnJvbVJhZGlhbnMoZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxlLmhlaWdodCx0LG8pfXN0YXRpYyBjbG9uZShlLHQpe2lmKF8oZSkpcmV0dXJuIF8odCk/KHQubG9uZ2l0dWRlPWUubG9uZ2l0dWRlLHQubGF0aXR1ZGU9ZS5sYXRpdHVkZSx0LmhlaWdodD1lLmhlaWdodCx0KTpuZXcgQm8oZS5sb25naXR1ZGUsZS5sYXRpdHVkZSxlLmhlaWdodCl9c3RhdGljIGVxdWFscyhlLHQpe3JldHVybiBlPT09dHx8XyhlKSYmXyh0KSYmZS5sb25naXR1ZGU9PT10LmxvbmdpdHVkZSYmZS5sYXRpdHVkZT09PXQubGF0aXR1ZGUmJmUuaGVpZ2h0PT09dC5oZWlnaHR9c3RhdGljIGVxdWFsc0Vwc2lsb24oZSx0LG8pe3JldHVybiBvPW8/PzAsZT09PXR8fF8oZSkmJl8odCkmJk1hdGguYWJzKGUubG9uZ2l0dWRlLXQubG9uZ2l0dWRlKTw9byYmTWF0aC5hYnMoZS5sYXRpdHVkZS10LmxhdGl0dWRlKTw9byYmTWF0aC5hYnMoZS5oZWlnaHQtdC5oZWlnaHQpPD1vfWNsb25lKGUpe3JldHVybiBCby5jbG9uZSh0aGlzLGUpfWVxdWFscyhlKXtyZXR1cm4gQm8uZXF1YWxzKHRoaXMsZSl9ZXF1YWxzRXBzaWxvbihlLHQpe3JldHVybiBCby5lcXVhbHNFcHNpbG9uKHRoaXMsZSx0KX10b1N0cmluZygpe3JldHVybmAoJHt0aGlzLmxvbmdpdHVkZX0sICR7dGhpcy5sYXRpdHVkZX0sICR7dGhpcy5oZWlnaHR9KWB9fTtMbChCbywiX2VsbGlwc29pZE9uZU92ZXJSYWRpaSIsbmV3IGYoMS82Mzc4MTM3LDEvNjM3ODEzNywxLzYzNTY3NTIzMTQyNDUxNzllLTkpKSxMbChCbywiX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQiLG5ldyBmKDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpKSksTGwoQm8sIl9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkIixQLkVQU0lMT04xKTtqZj1CbztqZi5aRVJPPU9iamVjdC5mcmVlemUobmV3IGpmKDAsMCwwKSk7cE09bmV3IGYsX009bmV3IGYsZ009bmV3IGYscmU9amZ9KTt2YXIga24sSGwsT0EsU0EsQ0EseU0sWSx2dD1YKCgpPT57c2UoKTtMZSgpO2tuPWNsYXNzIG57Y29uc3RydWN0b3IoZSx0KXt0aGlzLng9ZT8/MCx0aGlzLnk9dD8/MH1zdGF0aWMgZnJvbUVsZW1lbnRzKGUsdCxvKXtyZXR1cm4gXyhvKT8oby54PWUsby55PXQsbyk6bmV3IG4oZSx0KX1zdGF0aWMgY2xvbmUoZSx0KXtpZihfKGUpKXJldHVybiBfKHQpPyh0Lng9ZS54LHQueT1lLnksdCk6bmV3IG4oZS54LGUueSl9c3RhdGljIHBhY2soZSx0LG8pe3JldHVybiBvPW8/PzAsdFtvKytdPWUueCx0W29dPWUueSx0fXN0YXRpYyB1bnBhY2soZSx0LG8pe3JldHVybiB0PXQ/PzAsXyhvKXx8KG89bmV3IG4pLG8ueD1lW3QrK10sby55PWVbdF0sb31zdGF0aWMgcGFja0FycmF5KGUsdCl7bGV0IG89ZS5sZW5ndGgsYT1vKjI7Xyh0KT8hQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGghPT1hfHx0Lmxlbmd0aCE9PWEmJih0Lmxlbmd0aD1hKTp0PW5ldyBBcnJheShhKTtmb3IobGV0IHI9MDtyPG87KytyKW4ucGFjayhlW3JdLHQscioyKTtyZXR1cm4gdH1zdGF0aWMgdW5wYWNrQXJyYXkoZSx0KXtsZXQgbz1lLmxlbmd0aDtfKHQpP3QubGVuZ3RoPW8vMjp0PW5ldyBBcnJheShvLzIpO2ZvcihsZXQgYT0wO2E8bzthKz0yKXtsZXQgcj1hLzI7dFtyXT1uLnVucGFjayhlLGEsdFtyXSl9cmV0dXJuIHR9c3RhdGljIG1heGltdW1Db21wb25lbnQoZSl7cmV0dXJuIE1hdGgubWF4KGUueCxlLnkpfXN0YXRpYyBtaW5pbXVtQ29tcG9uZW50KGUpe3JldHVybiBNYXRoLm1pbihlLngsZS55KX1zdGF0aWMgbWluaW11bUJ5Q29tcG9uZW50KGUsdCxvKXtyZXR1cm4gby54PU1hdGgubWluKGUueCx0LngpLG8ueT1NYXRoLm1pbihlLnksdC55KSxvfXN0YXRpYyBtYXhpbXVtQnlDb21wb25lbnQoZSx0LG8pe3JldHVybiBvLng9TWF0aC5tYXgoZS54LHQueCksby55PU1hdGgubWF4KGUueSx0LnkpLG99c3RhdGljIGNsYW1wKGUsdCxvLGEpe2xldCByPVAuY2xhbXAoZS54LHQueCxvLngpLGk9UC5jbGFtcChlLnksdC55LG8ueSk7cmV0dXJuIGEueD1yLGEueT1pLGF9c3RhdGljIG1hZ25pdHVkZVNxdWFyZWQoZSl7cmV0dXJuIGUueCplLngrZS55KmUueX1zdGF0aWMgbWFnbml0dWRlKGUpe3JldHVybiBNYXRoLnNxcnQobi5tYWduaXR1ZGVTcXVhcmVkKGUpKX1zdGF0aWMgZGlzdGFuY2UoZSx0KXtyZXR1cm4gbi5zdWJ0cmFjdChlLHQsSGwpLG4ubWFnbml0dWRlKEhsKX1zdGF0aWMgZGlzdGFuY2VTcXVhcmVkKGUsdCl7cmV0dXJuIG4uc3VidHJhY3QoZSx0LEhsKSxuLm1hZ25pdHVkZVNxdWFyZWQoSGwpfXN0YXRpYyBub3JtYWxpemUoZSx0KXtsZXQgbz1uLm1hZ25pdHVkZShlKTtyZXR1cm4gdC54PWUueC9vLHQueT1lLnkvbyx0fXN0YXRpYyBkb3QoZSx0KXtyZXR1cm4gZS54KnQueCtlLnkqdC55fXN0YXRpYyBjcm9zcyhlLHQpe3JldHVybiBlLngqdC55LWUueSp0Lnh9c3RhdGljIG11bHRpcGx5Q29tcG9uZW50cyhlLHQsbyl7cmV0dXJuIG8ueD1lLngqdC54LG8ueT1lLnkqdC55LG99c3RhdGljIGRpdmlkZUNvbXBvbmVudHMoZSx0LG8pe3JldHVybiBvLng9ZS54L3QueCxvLnk9ZS55L3QueSxvfXN0YXRpYyBhZGQoZSx0LG8pe3JldHVybiBvLng9ZS54K3QueCxvLnk9ZS55K3QueSxvfXN0YXRpYyBzdWJ0cmFjdChlLHQsbyl7cmV0dXJuIG8ueD1lLngtdC54LG8ueT1lLnktdC55LG99c3RhdGljIG11bHRpcGx5QnlTY2FsYXIoZSx0LG8pe3JldHVybiBvLng9ZS54KnQsby55PWUueSp0LG99c3RhdGljIGRpdmlkZUJ5U2NhbGFyKGUsdCxvKXtyZXR1cm4gby54PWUueC90LG8ueT1lLnkvdCxvfXN0YXRpYyBuZWdhdGUoZSx0KXtyZXR1cm4gdC54PS1lLngsdC55PS1lLnksdH1zdGF0aWMgYWJzKGUsdCl7cmV0dXJuIHQueD1NYXRoLmFicyhlLngpLHQueT1NYXRoLmFicyhlLnkpLHR9c3RhdGljIGxlcnAoZSx0LG8sYSl7cmV0dXJuIG4ubXVsdGlwbHlCeVNjYWxhcih0LG8sT0EpLGE9bi5tdWx0aXBseUJ5U2NhbGFyKGUsMS1vLGEpLG4uYWRkKE9BLGEsYSl9c3RhdGljIGFuZ2xlQmV0d2VlbihlLHQpe3JldHVybiBuLm5vcm1hbGl6ZShlLFNBKSxuLm5vcm1hbGl6ZSh0LENBKSxQLmFjb3NDbGFtcGVkKG4uZG90KFNBLENBKSl9c3RhdGljIG1vc3RPcnRob2dvbmFsQXhpcyhlLHQpe2xldCBvPW4ubm9ybWFsaXplKGUseU0pO3JldHVybiBuLmFicyhvLG8pLG8ueDw9by55P3Q9bi5jbG9uZShuLlVOSVRfWCx0KTp0PW4uY2xvbmUobi5VTklUX1ksdCksdH1zdGF0aWMgZXF1YWxzKGUsdCl7cmV0dXJuIGU9PT10fHxfKGUpJiZfKHQpJiZlLng9PT10LngmJmUueT09PXQueX1zdGF0aWMgZXF1YWxzQXJyYXkoZSx0LG8pe3JldHVybiBlLng9PT10W29dJiZlLnk9PT10W28rMV19c3RhdGljIGVxdWFsc0Vwc2lsb24oZSx0LG8sYSl7cmV0dXJuIGU9PT10fHxfKGUpJiZfKHQpJiZQLmVxdWFsc0Vwc2lsb24oZS54LHQueCxvLGEpJiZQLmVxdWFsc0Vwc2lsb24oZS55LHQueSxvLGEpfWNsb25lKGUpe3JldHVybiBuLmNsb25lKHRoaXMsZSl9ZXF1YWxzKGUpe3JldHVybiBuLmVxdWFscyh0aGlzLGUpfWVxdWFsc0Vwc2lsb24oZSx0LG8pe3JldHVybiBuLmVxdWFsc0Vwc2lsb24odGhpcyxlLHQsbyl9dG9TdHJpbmcoKXtyZXR1cm5gKCR7dGhpcy54fSwgJHt0aGlzLnl9KWB9fTtrbi5mcm9tQ2FydGVzaWFuMz1rbi5jbG9uZTtrbi5mcm9tQ2FydGVzaWFuND1rbi5jbG9uZTtrbi5wYWNrZWRMZW5ndGg9Mjtrbi5mcm9tQXJyYXk9a24udW5wYWNrO0hsPW5ldyBrbixPQT1uZXcga24sU0E9bmV3IGtuLENBPW5ldyBrbix5TT1uZXcga247a24uWkVSTz1PYmplY3QuZnJlZXplKG5ldyBrbigwLDApKTtrbi5PTkU9T2JqZWN0LmZyZWV6ZShuZXcga24oMSwxKSk7a24uVU5JVF9YPU9iamVjdC5mcmVlemUobmV3IGtuKDEsMCkpO2tuLlVOSVRfWT1PYmplY3QuZnJlZXplKG5ldyBrbigwLDEpKTtZPWtufSk7ZnVuY3Rpb24gTUEobixlLHQsbyl7ZT1lPz8wLHQ9dD8/MCxvPW8/PzAsbi5fcmFkaWk9bmV3IGYoZSx0LG8pLG4uX3JhZGlpU3F1YXJlZD1uZXcgZihlKmUsdCp0LG8qbyksbi5fcmFkaWlUb1RoZUZvdXJ0aD1uZXcgZihlKmUqZSplLHQqdCp0KnQsbypvKm8qbyksbi5fb25lT3ZlclJhZGlpPW5ldyBmKGU9PT0wPzA6MS9lLHQ9PT0wPzA6MS90LG89PT0wPzA6MS9vKSxuLl9vbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBmKGU9PT0wPzA6MS8oZSplKSx0PT09MD8wOjEvKHQqdCksbz09PTA/MDoxLyhvKm8pKSxuLl9taW5pbXVtUmFkaXVzPU1hdGgubWluKGUsdCxvKSxuLl9tYXhpbXVtUmFkaXVzPU1hdGgubWF4KGUsdCxvKSxuLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPVAuRVBTSUxPTjEsbi5fcmFkaWlTcXVhcmVkLnohPT0wJiYobi5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9bi5fcmFkaWlTcXVhcmVkLngvbi5fcmFkaWlTcXVhcmVkLnopfWZ1bmN0aW9uIE5BKG4sZSx0KXtsZXQgbz0uNSooZStuKSxhPS41KihlLW4pLHI9MDtmb3IobGV0IGk9MDtpPDU7aSsrKXtsZXQgcz1hKk9NW2ldO3IrPVNNW2ldKih0KG8rcykrdChvLXMpKX1yZXR1cm4gcio9YSxyfXZhciBVbyxBTSx3TSxFTSxUTSxSTSx4TSxPTSxTTSxLLFZlPVgoKCk9Pnt2dCgpO01lKCk7X3QoKTtzZSgpO0xlKCk7RGIoKTtVbz1jbGFzcyBue2NvbnN0cnVjdG9yKGUsdCxvKXt0aGlzLl9yYWRpaT12b2lkIDAsdGhpcy5fcmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9yYWRpaVRvVGhlRm91cnRoPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWk9dm9pZCAwLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQ9dm9pZCAwLHRoaXMuX21pbmltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX21heGltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dm9pZCAwLHRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaPXZvaWQgMCxNQSh0aGlzLGUsdCxvKX1nZXQgcmFkaWkoKXtyZXR1cm4gdGhpcy5fcmFkaWl9Z2V0IHJhZGlpU3F1YXJlZCgpe3JldHVybiB0aGlzLl9yYWRpaVNxdWFyZWR9Z2V0IHJhZGlpVG9UaGVGb3VydGgoKXtyZXR1cm4gdGhpcy5fcmFkaWlUb1RoZUZvdXJ0aH1nZXQgb25lT3ZlclJhZGlpKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaX1nZXQgb25lT3ZlclJhZGlpU3F1YXJlZCgpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkfWdldCBtaW5pbXVtUmFkaXVzKCl7cmV0dXJuIHRoaXMuX21pbmltdW1SYWRpdXN9Z2V0IG1heGltdW1SYWRpdXMoKXtyZXR1cm4gdGhpcy5fbWF4aW11bVJhZGl1c31zdGF0aWMgY2xvbmUoZSx0KXtpZighXyhlKSlyZXR1cm47bGV0IG89ZS5fcmFkaWk7cmV0dXJuIF8odCk/KGYuY2xvbmUobyx0Ll9yYWRpaSksZi5jbG9uZShlLl9yYWRpaVNxdWFyZWQsdC5fcmFkaWlTcXVhcmVkKSxmLmNsb25lKGUuX3JhZGlpVG9UaGVGb3VydGgsdC5fcmFkaWlUb1RoZUZvdXJ0aCksZi5jbG9uZShlLl9vbmVPdmVyUmFkaWksdC5fb25lT3ZlclJhZGlpKSxmLmNsb25lKGUuX29uZU92ZXJSYWRpaVNxdWFyZWQsdC5fb25lT3ZlclJhZGlpU3F1YXJlZCksdC5fbWluaW11bVJhZGl1cz1lLl9taW5pbXVtUmFkaXVzLHQuX21heGltdW1SYWRpdXM9ZS5fbWF4aW11bVJhZGl1cyx0Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPWUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQsdCk6bmV3IG4oby54LG8ueSxvLnopfXN0YXRpYyBmcm9tQ2FydGVzaWFuMyhlLHQpe3JldHVybiBfKHQpfHwodD1uZXcgbiksXyhlKSYmTUEodCxlLngsZS55LGUueiksdH1zdGF0aWMgZ2V0IGRlZmF1bHQoKXtyZXR1cm4gbi5fZGVmYXVsdH1zdGF0aWMgc2V0IGRlZmF1bHQoZSl7bi5fZGVmYXVsdD1lLGYuX2VsbGlwc29pZFJhZGlpU3F1YXJlZD1lLnJhZGlpU3F1YXJlZCxyZS5fZWxsaXBzb2lkT25lT3ZlclJhZGlpPWUub25lT3ZlclJhZGlpLHJlLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWlTcXVhcmVkPWUub25lT3ZlclJhZGlpU3F1YXJlZCxyZS5fZWxsaXBzb2lkQ2VudGVyVG9sZXJhbmNlU3F1YXJlZD1lLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkfWNsb25lKGUpe3JldHVybiBuLmNsb25lKHRoaXMsZSl9c3RhdGljIHBhY2soZSx0LG8pe3JldHVybiBvPW8/PzAsZi5wYWNrKGUuX3JhZGlpLHQsbyksdH1zdGF0aWMgdW5wYWNrKGUsdCxvKXt0PXQ/PzA7bGV0IGE9Zi51bnBhY2soZSx0KTtyZXR1cm4gbi5mcm9tQ2FydGVzaWFuMyhhLG8pfWdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYyhlLHQpe2xldCBvPWUubG9uZ2l0dWRlLGE9ZS5sYXRpdHVkZSxyPU1hdGguY29zKGEpLGk9cipNYXRoLmNvcyhvKSxzPXIqTWF0aC5zaW4obyksZD1NYXRoLnNpbihhKTtyZXR1cm4gXyh0KXx8KHQ9bmV3IGYpLHQueD1pLHQueT1zLHQuej1kLGYubm9ybWFsaXplKHQsdCl9Z2VvZGV0aWNTdXJmYWNlTm9ybWFsKGUsdCl7aWYoIWYuZXF1YWxzRXBzaWxvbihlLGYuWkVSTyxQLkVQU0lMT04xNCkpcmV0dXJuIF8odCl8fCh0PW5ldyBmKSx0PWYubXVsdGlwbHlDb21wb25lbnRzKGUsdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCx0KSxmLm5vcm1hbGl6ZSh0LHQpfWNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGUsdCl7bGV0IG89QU0sYT13TTt0aGlzLmdlb2RldGljU3VyZmFjZU5vcm1hbENhcnRvZ3JhcGhpYyhlLG8pLGYubXVsdGlwbHlDb21wb25lbnRzKHRoaXMuX3JhZGlpU3F1YXJlZCxvLGEpO2xldCByPU1hdGguc3FydChmLmRvdChvLGEpKTtyZXR1cm4gZi5kaXZpZGVCeVNjYWxhcihhLHIsYSksZi5tdWx0aXBseUJ5U2NhbGFyKG8sZS5oZWlnaHQsbyksXyh0KXx8KHQ9bmV3IGYpLGYuYWRkKGEsbyx0KX1jYXJ0b2dyYXBoaWNBcnJheVRvQ2FydGVzaWFuQXJyYXkoZSx0KXtsZXQgbz1lLmxlbmd0aDtfKHQpP3QubGVuZ3RoPW86dD1uZXcgQXJyYXkobyk7Zm9yKGxldCBhPTA7YTxvO2ErKyl0W2FdPXRoaXMuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW4oZVthXSx0W2FdKTtyZXR1cm4gdH1jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlLHQpe2xldCBvPXRoaXMuc2NhbGVUb0dlb2RldGljU3VyZmFjZShlLFRNKTtpZighXyhvKSlyZXR1cm47bGV0IGE9dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWwobyxFTSkscj1mLnN1YnRyYWN0KGUsbyxSTSksaT1NYXRoLmF0YW4yKGEueSxhLngpLHM9TWF0aC5hc2luKGEueiksZD1QLnNpZ24oZi5kb3QocixlKSkqZi5tYWduaXR1ZGUocik7cmV0dXJuIF8odCk/KHQubG9uZ2l0dWRlPWksdC5sYXRpdHVkZT1zLHQuaGVpZ2h0PWQsdCk6bmV3IHJlKGkscyxkKX1jYXJ0ZXNpYW5BcnJheVRvQ2FydG9ncmFwaGljQXJyYXkoZSx0KXtsZXQgbz1lLmxlbmd0aDtfKHQpP3QubGVuZ3RoPW86dD1uZXcgQXJyYXkobyk7Zm9yKGxldCBhPTA7YTxvOysrYSl0W2FdPXRoaXMuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWMoZVthXSx0W2FdKTtyZXR1cm4gdH1zY2FsZVRvR2VvZGV0aWNTdXJmYWNlKGUsdCl7cmV0dXJuIFZsKGUsdGhpcy5fb25lT3ZlclJhZGlpLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQsdGhpcy5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCx0KX1zY2FsZVRvR2VvY2VudHJpY1N1cmZhY2UoZSx0KXtfKHQpfHwodD1uZXcgZik7bGV0IG89ZS54LGE9ZS55LHI9ZS56LGk9dGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCxzPTEvTWF0aC5zcXJ0KG8qbyppLngrYSphKmkueStyKnIqaS56KTtyZXR1cm4gZi5tdWx0aXBseUJ5U2NhbGFyKGUscyx0KX10cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2UoZSx0KXtyZXR1cm4gXyh0KXx8KHQ9bmV3IGYpLGYubXVsdGlwbHlDb21wb25lbnRzKGUsdGhpcy5fb25lT3ZlclJhZGlpLHQpfXRyYW5zZm9ybVBvc2l0aW9uRnJvbVNjYWxlZFNwYWNlKGUsdCl7cmV0dXJuIF8odCl8fCh0PW5ldyBmKSxmLm11bHRpcGx5Q29tcG9uZW50cyhlLHRoaXMuX3JhZGlpLHQpfWVxdWFscyhlKXtyZXR1cm4gdGhpcz09PWV8fF8oZSkmJmYuZXF1YWxzKHRoaXMuX3JhZGlpLGUuX3JhZGlpKX10b1N0cmluZygpe3JldHVybiB0aGlzLl9yYWRpaS50b1N0cmluZygpfWdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXMoZSx0LG8pe3Q9dD8/MDtsZXQgYT10aGlzLl9zcXVhcmVkWE92ZXJTcXVhcmVkWjtpZihfKG8pfHwobz1uZXcgZiksby54PTAsby55PTAsby56PWUueiooMS1hKSwhKE1hdGguYWJzKG8ueik+PXRoaXMuX3JhZGlpLnotdCkpcmV0dXJuIG99Z2V0TG9jYWxDdXJ2YXR1cmUoZSx0KXtfKHQpfHwodD1uZXcgWSk7bGV0IG89dGhpcy5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzKGUsMCx4TSksYT1mLmRpc3RhbmNlKGUsbykscj10aGlzLm1pbmltdW1SYWRpdXMqYS90aGlzLm1heGltdW1SYWRpdXMqKjIsaT1hKnIqKjI7cmV0dXJuIFkuZnJvbUVsZW1lbnRzKDEvYSwxL2ksdCl9c3VyZmFjZUFyZWEoZSl7bGV0IHQ9ZS53ZXN0LG89ZS5lYXN0LGE9ZS5zb3V0aCxyPWUubm9ydGg7Zm9yKDtvPHQ7KW8rPVAuVFdPX1BJO2xldCBpPXRoaXMuX3JhZGlpU3F1YXJlZCxzPWkueCxkPWkueSxjPWkueix1PXMqZDtyZXR1cm4gTkEoYSxyLGZ1bmN0aW9uKGwpe2xldCBoPU1hdGguY29zKGwpLG09TWF0aC5zaW4obCk7cmV0dXJuIE1hdGguY29zKGwpKk5BKHQsbyxmdW5jdGlvbihiKXtsZXQgcD1NYXRoLmNvcyhiKSx5PU1hdGguc2luKGIpO3JldHVybiBNYXRoLnNxcnQodSptKm0rYyooZCpwKnArcyp5KnkpKmgqaCl9KX0pfX07VW8uV0dTODQ9T2JqZWN0LmZyZWV6ZShuZXcgVW8oNjM3ODEzNyw2Mzc4MTM3LDYzNTY3NTIzMTQyNDUxNzllLTkpKTtVby5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyBVbygxLDEsMSkpO1VvLk1PT049T2JqZWN0LmZyZWV6ZShuZXcgVW8oUC5MVU5BUl9SQURJVVMsUC5MVU5BUl9SQURJVVMsUC5MVU5BUl9SQURJVVMpKTtVby5NQVJTPU9iamVjdC5mcmVlemUobmV3IFVvKDMzOTYxOTAsMzM5NjE5MCwzMzc2MjAwKSk7VW8uX2RlZmF1bHQ9VW8uV0dTODQ7VW8ucGFja2VkTGVuZ3RoPWYucGFja2VkTGVuZ3RoO1VvLnByb3RvdHlwZS5nZW9jZW50cmljU3VyZmFjZU5vcm1hbD1mLm5vcm1hbGl6ZTtBTT1uZXcgZix3TT1uZXcgZixFTT1uZXcgZixUTT1uZXcgZixSTT1uZXcgZix4TT1uZXcgZixPTT1bLjE0ODg3NDMzODk4MTYzLC40MzMzOTUzOTQxMjkyNSwuNjc5NDA5NTY4Mjk5MDIsLjg2NTA2MzM2NjY4ODk4LC45NzM5MDY1Mjg1MTcxNywwXSxTTT1bLjI5NTUyNDIyNDcxNDc1LC4yNjkyNjY3MTkzMDk5OSwuMjE5MDg2MzYyNTE1OTgsLjE0OTQ1MTM0OTE1MDU4LC4wNjY2NzEzNDQzMDg2ODQsMF07Sz1Vb30pO3ZhciBCYixvbyx6cj1YKCgpPT57TWUoKTtfdCgpO3NlKCk7VmUoKTtCYj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9lbGxpcHNvaWQ9ZT8/Sy5kZWZhdWx0LHRoaXMuX3NlbWltYWpvckF4aXM9dGhpcy5fZWxsaXBzb2lkLm1heGltdW1SYWRpdXMsdGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXM9MS90aGlzLl9zZW1pbWFqb3JBeGlzfWdldCBlbGxpcHNvaWQoKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfXByb2plY3QoZSx0KXtsZXQgbz10aGlzLl9zZW1pbWFqb3JBeGlzLGE9ZS5sb25naXR1ZGUqbyxyPWUubGF0aXR1ZGUqbyxpPWUuaGVpZ2h0O3JldHVybiBfKHQpPyh0Lng9YSx0Lnk9cix0Lno9aSx0KTpuZXcgZihhLHIsaSl9dW5wcm9qZWN0KGUsdCl7bGV0IG89dGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXMsYT1lLngqbyxyPWUueSpvLGk9ZS56O3JldHVybiBfKHQpPyh0LmxvbmdpdHVkZT1hLHQubGF0aXR1ZGU9cix0LmhlaWdodD1pLHQpOm5ldyByZShhLHIsaSl9fSxvbz1CYn0pO3ZhciBJQSxSbixkYz1YKCgpPT57SUE9e09VVFNJREU6LTEsSU5URVJTRUNUSU5HOjAsSU5TSURFOjF9O09iamVjdC5mcmVlemUoSUEpO1JuPUlBfSk7ZnVuY3Rpb24gQ00obixlKXt0aGlzLnN0YXJ0PW4/PzAsdGhpcy5zdG9wPWU/PzB9dmFyIEFvLHpmPVgoKCk9PntBbz1DTX0pO2Z1bmN0aW9uIHZNKG4pe2xldCBlPTA7Zm9yKGxldCB0PTA7dDw5OysrdCl7bGV0IG89blt0XTtlKz1vKm99cmV0dXJuIE1hdGguc3FydChlKX1mdW5jdGlvbiBGTShuKXtsZXQgZT0wO2ZvcihsZXQgdD0wO3Q8MzsrK3Qpe2xldCBvPW5bVXQuZ2V0RWxlbWVudEluZGV4KGpiW3RdLExiW3RdKV07ZSs9MipvKm99cmV0dXJuIE1hdGguc3FydChlKX1mdW5jdGlvbiBETShuLGUpe2xldCB0PVAuRVBTSUxPTjE1LG89MCxhPTE7Zm9yKGxldCBjPTA7YzwzOysrYyl7bGV0IHU9TWF0aC5hYnMobltVdC5nZXRFbGVtZW50SW5kZXgoamJbY10sTGJbY10pXSk7dT5vJiYoYT1jLG89dSl9bGV0IHI9MSxpPTAscz1MYlthXSxkPWpiW2FdO2lmKE1hdGguYWJzKG5bVXQuZ2V0RWxlbWVudEluZGV4KGQscyldKT50KXtsZXQgYz1uW1V0LmdldEVsZW1lbnRJbmRleChkLGQpXSx1PW5bVXQuZ2V0RWxlbWVudEluZGV4KHMscyldLGw9bltVdC5nZXRFbGVtZW50SW5kZXgoZCxzKV0saD0oYy11KS8yL2wsbTtoPDA/bT0tMS8oLWgrTWF0aC5zcXJ0KDEraCpoKSk6bT0xLyhoK01hdGguc3FydCgxK2gqaCkpLHI9MS9NYXRoLnNxcnQoMSttKm0pLGk9bSpyfXJldHVybiBlPVV0LmNsb25lKFV0LklERU5USVRZLGUpLGVbVXQuZ2V0RWxlbWVudEluZGV4KHMscyldPWVbVXQuZ2V0RWxlbWVudEluZGV4KGQsZCldPXIsZVtVdC5nZXRFbGVtZW50SW5kZXgoZCxzKV09aSxlW1V0LmdldEVsZW1lbnRJbmRleChzLGQpXT0taSxlfXZhciBVdCxNTSxOTSxVYixrQSxJTSxrTSxLbCxQQSxQTSxMYixqYixKLFBuPVgoKCk9PntNZSgpO3NlKCk7TGUoKTtVdD1jbGFzcyBue2NvbnN0cnVjdG9yKGUsdCxvLGEscixpLHMsZCxjKXt0aGlzWzBdPWU/PzAsdGhpc1sxXT1hPz8wLHRoaXNbMl09cz8/MCx0aGlzWzNdPXQ/PzAsdGhpc1s0XT1yPz8wLHRoaXNbNV09ZD8/MCx0aGlzWzZdPW8/PzAsdGhpc1s3XT1pPz8wLHRoaXNbOF09Yz8/MH1zdGF0aWMgcGFjayhlLHQsbyl7cmV0dXJuIG89bz8/MCx0W28rK109ZVswXSx0W28rK109ZVsxXSx0W28rK109ZVsyXSx0W28rK109ZVszXSx0W28rK109ZVs0XSx0W28rK109ZVs1XSx0W28rK109ZVs2XSx0W28rK109ZVs3XSx0W28rK109ZVs4XSx0fXN0YXRpYyB1bnBhY2soZSx0LG8pe3JldHVybiB0PXQ/PzAsXyhvKXx8KG89bmV3IG4pLG9bMF09ZVt0KytdLG9bMV09ZVt0KytdLG9bMl09ZVt0KytdLG9bM109ZVt0KytdLG9bNF09ZVt0KytdLG9bNV09ZVt0KytdLG9bNl09ZVt0KytdLG9bN109ZVt0KytdLG9bOF09ZVt0KytdLG99c3RhdGljIHBhY2tBcnJheShlLHQpe2xldCBvPWUubGVuZ3RoLGE9byo5O18odCk/IUFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoIT09YXx8dC5sZW5ndGghPT1hJiYodC5sZW5ndGg9YSk6dD1uZXcgQXJyYXkoYSk7Zm9yKGxldCByPTA7cjxvOysrciluLnBhY2soZVtyXSx0LHIqOSk7cmV0dXJuIHR9c3RhdGljIHVucGFja0FycmF5KGUsdCl7bGV0IG89ZS5sZW5ndGg7Xyh0KT90Lmxlbmd0aD1vLzk6dD1uZXcgQXJyYXkoby85KTtmb3IobGV0IGE9MDthPG87YSs9OSl7bGV0IHI9YS85O3Rbcl09bi51bnBhY2soZSxhLHRbcl0pfXJldHVybiB0fXN0YXRpYyBjbG9uZShlLHQpe2lmKF8oZSkpcmV0dXJuIF8odCk/KHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0sdFs1XT1lWzVdLHRbNl09ZVs2XSx0WzddPWVbN10sdFs4XT1lWzhdLHQpOm5ldyBuKGVbMF0sZVszXSxlWzZdLGVbMV0sZVs0XSxlWzddLGVbMl0sZVs1XSxlWzhdKX1zdGF0aWMgZnJvbUNvbHVtbk1ham9yQXJyYXkoZSx0KXtyZXR1cm4gbi5jbG9uZShlLHQpfXN0YXRpYyBmcm9tUm93TWFqb3JBcnJheShlLHQpe3JldHVybiBfKHQpPyh0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0KTpuZXcgbihlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdLGVbN10sZVs4XSl9c3RhdGljIGZyb21RdWF0ZXJuaW9uKGUsdCl7bGV0IG89ZS54KmUueCxhPWUueCplLnkscj1lLngqZS56LGk9ZS54KmUudyxzPWUueSplLnksZD1lLnkqZS56LGM9ZS55KmUudyx1PWUueiplLnosbD1lLnoqZS53LGg9ZS53KmUudyxtPW8tcy11K2gsYj0yKihhLWwpLHA9MioocitjKSx5PTIqKGErbCksRT0tbytzLXUraCxnPTIqKGQtaSksVD0yKihyLWMpLHc9MiooZCtpKSxSPS1vLXMrdStoO3JldHVybiBfKHQpPyh0WzBdPW0sdFsxXT15LHRbMl09VCx0WzNdPWIsdFs0XT1FLHRbNV09dyx0WzZdPXAsdFs3XT1nLHRbOF09Uix0KTpuZXcgbihtLGIscCx5LEUsZyxULHcsUil9c3RhdGljIGZyb21IZWFkaW5nUGl0Y2hSb2xsKGUsdCl7bGV0IG89TWF0aC5jb3MoLWUucGl0Y2gpLGE9TWF0aC5jb3MoLWUuaGVhZGluZykscj1NYXRoLmNvcyhlLnJvbGwpLGk9TWF0aC5zaW4oLWUucGl0Y2gpLHM9TWF0aC5zaW4oLWUuaGVhZGluZyksZD1NYXRoLnNpbihlLnJvbGwpLGM9byphLHU9LXIqcytkKmkqYSxsPWQqcytyKmkqYSxoPW8qcyxtPXIqYStkKmkqcyxiPS1kKmErcippKnMscD0taSx5PWQqbyxFPXIqbztyZXR1cm4gXyh0KT8odFswXT1jLHRbMV09aCx0WzJdPXAsdFszXT11LHRbNF09bSx0WzVdPXksdFs2XT1sLHRbN109Yix0WzhdPUUsdCk6bmV3IG4oYyx1LGwsaCxtLGIscCx5LEUpfXN0YXRpYyBmcm9tU2NhbGUoZSx0KXtyZXR1cm4gXyh0KT8odFswXT1lLngsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1lLnksdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT1lLnosdCk6bmV3IG4oZS54LDAsMCwwLGUueSwwLDAsMCxlLnopfXN0YXRpYyBmcm9tVW5pZm9ybVNjYWxlKGUsdCl7cmV0dXJuIF8odCk/KHRbMF09ZSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPWUsdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT1lLHQpOm5ldyBuKGUsMCwwLDAsZSwwLDAsMCxlKX1zdGF0aWMgZnJvbUNyb3NzUHJvZHVjdChlLHQpe3JldHVybiBfKHQpPyh0WzBdPTAsdFsxXT1lLnosdFsyXT0tZS55LHRbM109LWUueix0WzRdPTAsdFs1XT1lLngsdFs2XT1lLnksdFs3XT0tZS54LHRbOF09MCx0KTpuZXcgbigwLC1lLnosZS55LGUueiwwLC1lLngsLWUueSxlLngsMCl9c3RhdGljIGZyb21Sb3RhdGlvblgoZSx0KXtsZXQgbz1NYXRoLmNvcyhlKSxhPU1hdGguc2luKGUpO3JldHVybiBfKHQpPyh0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1vLHRbNV09YSx0WzZdPTAsdFs3XT0tYSx0WzhdPW8sdCk6bmV3IG4oMSwwLDAsMCxvLC1hLDAsYSxvKX1zdGF0aWMgZnJvbVJvdGF0aW9uWShlLHQpe2xldCBvPU1hdGguY29zKGUpLGE9TWF0aC5zaW4oZSk7cmV0dXJuIF8odCk/KHRbMF09byx0WzFdPTAsdFsyXT0tYSx0WzNdPTAsdFs0XT0xLHRbNV09MCx0WzZdPWEsdFs3XT0wLHRbOF09byx0KTpuZXcgbihvLDAsYSwwLDEsMCwtYSwwLG8pfXN0YXRpYyBmcm9tUm90YXRpb25aKGUsdCl7bGV0IG89TWF0aC5jb3MoZSksYT1NYXRoLnNpbihlKTtyZXR1cm4gXyh0KT8odFswXT1vLHRbMV09YSx0WzJdPTAsdFszXT0tYSx0WzRdPW8sdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT0xLHQpOm5ldyBuKG8sLWEsMCxhLG8sMCwwLDAsMSl9c3RhdGljIHRvQXJyYXkoZSx0KXtyZXR1cm4gXyh0KT8odFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzhdPWVbOF0sdCk6W2VbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxlWzhdXX1zdGF0aWMgZ2V0RWxlbWVudEluZGV4KGUsdCl7cmV0dXJuIGUqMyt0fXN0YXRpYyBnZXRDb2x1bW4oZSx0LG8pe2xldCBhPXQqMyxyPWVbYV0saT1lW2ErMV0scz1lW2ErMl07cmV0dXJuIG8ueD1yLG8ueT1pLG8uej1zLG99c3RhdGljIHNldENvbHVtbihlLHQsbyxhKXthPW4uY2xvbmUoZSxhKTtsZXQgcj10KjM7cmV0dXJuIGFbcl09by54LGFbcisxXT1vLnksYVtyKzJdPW8ueixhfXN0YXRpYyBnZXRSb3coZSx0LG8pe2xldCBhPWVbdF0scj1lW3QrM10saT1lW3QrNl07cmV0dXJuIG8ueD1hLG8ueT1yLG8uej1pLG99c3RhdGljIHNldFJvdyhlLHQsbyxhKXtyZXR1cm4gYT1uLmNsb25lKGUsYSksYVt0XT1vLngsYVt0KzNdPW8ueSxhW3QrNl09by56LGF9c3RhdGljIHNldFNjYWxlKGUsdCxvKXtsZXQgYT1uLmdldFNjYWxlKGUsTU0pLHI9dC54L2EueCxpPXQueS9hLnkscz10LnovYS56O3JldHVybiBvWzBdPWVbMF0qcixvWzFdPWVbMV0qcixvWzJdPWVbMl0qcixvWzNdPWVbM10qaSxvWzRdPWVbNF0qaSxvWzVdPWVbNV0qaSxvWzZdPWVbNl0qcyxvWzddPWVbN10qcyxvWzhdPWVbOF0qcyxvfXN0YXRpYyBzZXRVbmlmb3JtU2NhbGUoZSx0LG8pe2xldCBhPW4uZ2V0U2NhbGUoZSxOTSkscj10L2EueCxpPXQvYS55LHM9dC9hLno7cmV0dXJuIG9bMF09ZVswXSpyLG9bMV09ZVsxXSpyLG9bMl09ZVsyXSpyLG9bM109ZVszXSppLG9bNF09ZVs0XSppLG9bNV09ZVs1XSppLG9bNl09ZVs2XSpzLG9bN109ZVs3XSpzLG9bOF09ZVs4XSpzLG99c3RhdGljIGdldFNjYWxlKGUsdCl7cmV0dXJuIHQueD1mLm1hZ25pdHVkZShmLmZyb21FbGVtZW50cyhlWzBdLGVbMV0sZVsyXSxVYikpLHQueT1mLm1hZ25pdHVkZShmLmZyb21FbGVtZW50cyhlWzNdLGVbNF0sZVs1XSxVYikpLHQuej1mLm1hZ25pdHVkZShmLmZyb21FbGVtZW50cyhlWzZdLGVbN10sZVs4XSxVYikpLHR9c3RhdGljIGdldE1heGltdW1TY2FsZShlKXtyZXR1cm4gbi5nZXRTY2FsZShlLGtBKSxmLm1heGltdW1Db21wb25lbnQoa0EpfXN0YXRpYyBzZXRSb3RhdGlvbihlLHQsbyl7bGV0IGE9bi5nZXRTY2FsZShlLElNKTtyZXR1cm4gb1swXT10WzBdKmEueCxvWzFdPXRbMV0qYS54LG9bMl09dFsyXSphLngsb1szXT10WzNdKmEueSxvWzRdPXRbNF0qYS55LG9bNV09dFs1XSphLnksb1s2XT10WzZdKmEueixvWzddPXRbN10qYS56LG9bOF09dFs4XSphLnosb31zdGF0aWMgZ2V0Um90YXRpb24oZSx0KXtsZXQgbz1uLmdldFNjYWxlKGUsa00pO3JldHVybiB0WzBdPWVbMF0vby54LHRbMV09ZVsxXS9vLngsdFsyXT1lWzJdL28ueCx0WzNdPWVbM10vby55LHRbNF09ZVs0XS9vLnksdFs1XT1lWzVdL28ueSx0WzZdPWVbNl0vby56LHRbN109ZVs3XS9vLnosdFs4XT1lWzhdL28ueix0fXN0YXRpYyBtdWx0aXBseShlLHQsbyl7bGV0IGE9ZVswXSp0WzBdK2VbM10qdFsxXStlWzZdKnRbMl0scj1lWzFdKnRbMF0rZVs0XSp0WzFdK2VbN10qdFsyXSxpPWVbMl0qdFswXStlWzVdKnRbMV0rZVs4XSp0WzJdLHM9ZVswXSp0WzNdK2VbM10qdFs0XStlWzZdKnRbNV0sZD1lWzFdKnRbM10rZVs0XSp0WzRdK2VbN10qdFs1XSxjPWVbMl0qdFszXStlWzVdKnRbNF0rZVs4XSp0WzVdLHU9ZVswXSp0WzZdK2VbM10qdFs3XStlWzZdKnRbOF0sbD1lWzFdKnRbNl0rZVs0XSp0WzddK2VbN10qdFs4XSxoPWVbMl0qdFs2XStlWzVdKnRbN10rZVs4XSp0WzhdO3JldHVybiBvWzBdPWEsb1sxXT1yLG9bMl09aSxvWzNdPXMsb1s0XT1kLG9bNV09YyxvWzZdPXUsb1s3XT1sLG9bOF09aCxvfXN0YXRpYyBhZGQoZSx0LG8pe3JldHVybiBvWzBdPWVbMF0rdFswXSxvWzFdPWVbMV0rdFsxXSxvWzJdPWVbMl0rdFsyXSxvWzNdPWVbM10rdFszXSxvWzRdPWVbNF0rdFs0XSxvWzVdPWVbNV0rdFs1XSxvWzZdPWVbNl0rdFs2XSxvWzddPWVbN10rdFs3XSxvWzhdPWVbOF0rdFs4XSxvfXN0YXRpYyBzdWJ0cmFjdChlLHQsbyl7cmV0dXJuIG9bMF09ZVswXS10WzBdLG9bMV09ZVsxXS10WzFdLG9bMl09ZVsyXS10WzJdLG9bM109ZVszXS10WzNdLG9bNF09ZVs0XS10WzRdLG9bNV09ZVs1XS10WzVdLG9bNl09ZVs2XS10WzZdLG9bN109ZVs3XS10WzddLG9bOF09ZVs4XS10WzhdLG99c3RhdGljIG11bHRpcGx5QnlWZWN0b3IoZSx0LG8pe2xldCBhPXQueCxyPXQueSxpPXQueixzPWVbMF0qYStlWzNdKnIrZVs2XSppLGQ9ZVsxXSphK2VbNF0qcitlWzddKmksYz1lWzJdKmErZVs1XSpyK2VbOF0qaTtyZXR1cm4gby54PXMsby55PWQsby56PWMsb31zdGF0aWMgbXVsdGlwbHlCeVNjYWxhcihlLHQsbyl7cmV0dXJuIG9bMF09ZVswXSp0LG9bMV09ZVsxXSp0LG9bMl09ZVsyXSp0LG9bM109ZVszXSp0LG9bNF09ZVs0XSp0LG9bNV09ZVs1XSp0LG9bNl09ZVs2XSp0LG9bN109ZVs3XSp0LG9bOF09ZVs4XSp0LG99c3RhdGljIG11bHRpcGx5QnlTY2FsZShlLHQsbyl7cmV0dXJuIG9bMF09ZVswXSp0Lngsb1sxXT1lWzFdKnQueCxvWzJdPWVbMl0qdC54LG9bM109ZVszXSp0Lnksb1s0XT1lWzRdKnQueSxvWzVdPWVbNV0qdC55LG9bNl09ZVs2XSp0Lnosb1s3XT1lWzddKnQueixvWzhdPWVbOF0qdC56LG99c3RhdGljIG11bHRpcGx5QnlVbmlmb3JtU2NhbGUoZSx0LG8pe3JldHVybiBvWzBdPWVbMF0qdCxvWzFdPWVbMV0qdCxvWzJdPWVbMl0qdCxvWzNdPWVbM10qdCxvWzRdPWVbNF0qdCxvWzVdPWVbNV0qdCxvWzZdPWVbNl0qdCxvWzddPWVbN10qdCxvWzhdPWVbOF0qdCxvfXN0YXRpYyBuZWdhdGUoZSx0KXtyZXR1cm4gdFswXT0tZVswXSx0WzFdPS1lWzFdLHRbMl09LWVbMl0sdFszXT0tZVszXSx0WzRdPS1lWzRdLHRbNV09LWVbNV0sdFs2XT0tZVs2XSx0WzddPS1lWzddLHRbOF09LWVbOF0sdH1zdGF0aWMgdHJhbnNwb3NlKGUsdCl7bGV0IG89ZVswXSxhPWVbM10scj1lWzZdLGk9ZVsxXSxzPWVbNF0sZD1lWzddLGM9ZVsyXSx1PWVbNV0sbD1lWzhdO3JldHVybiB0WzBdPW8sdFsxXT1hLHRbMl09cix0WzNdPWksdFs0XT1zLHRbNV09ZCx0WzZdPWMsdFs3XT11LHRbOF09bCx0fXN0YXRpYyBjb21wdXRlRWlnZW5EZWNvbXBvc2l0aW9uKGUsdCl7bGV0IG89UC5FUFNJTE9OMjAsYT0xMCxyPTAsaT0wO18odCl8fCh0PXt9KTtsZXQgcz10LnVuaXRhcnk9bi5jbG9uZShuLklERU5USVRZLHQudW5pdGFyeSksZD10LmRpYWdvbmFsPW4uY2xvbmUoZSx0LmRpYWdvbmFsKSxjPW8qdk0oZCk7Zm9yKDtpPGEmJkZNKGQpPmM7KURNKGQsS2wpLG4udHJhbnNwb3NlKEtsLFBBKSxuLm11bHRpcGx5KGQsS2wsZCksbi5tdWx0aXBseShQQSxkLGQpLG4ubXVsdGlwbHkocyxLbCxzKSwrK3I+MiYmKCsraSxyPTApO3JldHVybiB0fXN0YXRpYyBhYnMoZSx0KXtyZXR1cm4gdFswXT1NYXRoLmFicyhlWzBdKSx0WzFdPU1hdGguYWJzKGVbMV0pLHRbMl09TWF0aC5hYnMoZVsyXSksdFszXT1NYXRoLmFicyhlWzNdKSx0WzRdPU1hdGguYWJzKGVbNF0pLHRbNV09TWF0aC5hYnMoZVs1XSksdFs2XT1NYXRoLmFicyhlWzZdKSx0WzddPU1hdGguYWJzKGVbN10pLHRbOF09TWF0aC5hYnMoZVs4XSksdH1zdGF0aWMgZGV0ZXJtaW5hbnQoZSl7bGV0IHQ9ZVswXSxvPWVbM10sYT1lWzZdLHI9ZVsxXSxpPWVbNF0scz1lWzddLGQ9ZVsyXSxjPWVbNV0sdT1lWzhdO3JldHVybiB0KihpKnUtYypzKStyKihjKmEtbyp1KStkKihvKnMtaSphKX1zdGF0aWMgaW52ZXJzZShlLHQpe2xldCBvPWVbMF0sYT1lWzFdLHI9ZVsyXSxpPWVbM10scz1lWzRdLGQ9ZVs1XSxjPWVbNl0sdT1lWzddLGw9ZVs4XSxoPW4uZGV0ZXJtaW5hbnQoZSk7dFswXT1zKmwtdSpkLHRbMV09dSpyLWEqbCx0WzJdPWEqZC1zKnIsdFszXT1jKmQtaSpsLHRbNF09bypsLWMqcix0WzVdPWkqci1vKmQsdFs2XT1pKnUtYypzLHRbN109YyphLW8qdSx0WzhdPW8qcy1pKmE7bGV0IG09MS9oO3JldHVybiBuLm11bHRpcGx5QnlTY2FsYXIodCxtLHQpfXN0YXRpYyBpbnZlcnNlVHJhbnNwb3NlKGUsdCl7cmV0dXJuIG4uaW52ZXJzZShuLnRyYW5zcG9zZShlLFBNKSx0KX1zdGF0aWMgZXF1YWxzKGUsdCl7cmV0dXJuIGU9PT10fHxfKGUpJiZfKHQpJiZlWzBdPT09dFswXSYmZVsxXT09PXRbMV0mJmVbMl09PT10WzJdJiZlWzNdPT09dFszXSYmZVs0XT09PXRbNF0mJmVbNV09PT10WzVdJiZlWzZdPT09dFs2XSYmZVs3XT09PXRbN10mJmVbOF09PT10WzhdfXN0YXRpYyBlcXVhbHNFcHNpbG9uKGUsdCxvKXtyZXR1cm4gbz1vPz8wLGU9PT10fHxfKGUpJiZfKHQpJiZNYXRoLmFicyhlWzBdLXRbMF0pPD1vJiZNYXRoLmFicyhlWzFdLXRbMV0pPD1vJiZNYXRoLmFicyhlWzJdLXRbMl0pPD1vJiZNYXRoLmFicyhlWzNdLXRbM10pPD1vJiZNYXRoLmFicyhlWzRdLXRbNF0pPD1vJiZNYXRoLmFicyhlWzVdLXRbNV0pPD1vJiZNYXRoLmFicyhlWzZdLXRbNl0pPD1vJiZNYXRoLmFicyhlWzddLXRbN10pPD1vJiZNYXRoLmFicyhlWzhdLXRbOF0pPD1vfWdldCBsZW5ndGgoKXtyZXR1cm4gbi5wYWNrZWRMZW5ndGh9Y2xvbmUoZSl7cmV0dXJuIG4uY2xvbmUodGhpcyxlKX1lcXVhbHMoZSl7cmV0dXJuIG4uZXF1YWxzKHRoaXMsZSl9c3RhdGljIGVxdWFsc0FycmF5KGUsdCxvKXtyZXR1cm4gZVswXT09PXRbb10mJmVbMV09PT10W28rMV0mJmVbMl09PT10W28rMl0mJmVbM109PT10W28rM10mJmVbNF09PT10W28rNF0mJmVbNV09PT10W28rNV0mJmVbNl09PT10W28rNl0mJmVbN109PT10W28rN10mJmVbOF09PT10W28rOF19ZXF1YWxzRXBzaWxvbihlLHQpe3JldHVybiBuLmVxdWFsc0Vwc2lsb24odGhpcyxlLHQpfXRvU3RyaW5nKCl7cmV0dXJuYCgke3RoaXNbMF19LCAke3RoaXNbM119LCAke3RoaXNbNl19KQooJHt0aGlzWzFdfSwgJHt0aGlzWzRdfSwgJHt0aGlzWzddfSkKKCR7dGhpc1syXX0sICR7dGhpc1s1XX0sICR7dGhpc1s4XX0pYH19O1V0LnBhY2tlZExlbmd0aD05O1V0LmZyb21BcnJheT1VdC51bnBhY2s7VXQuSURFTlRJVFk9T2JqZWN0LmZyZWV6ZShuZXcgVXQoMSwwLDAsMCwxLDAsMCwwLDEpKTtVdC5aRVJPPU9iamVjdC5mcmVlemUobmV3IFV0KDAsMCwwLDAsMCwwLDAsMCwwKSk7VXQuQ09MVU1OMFJPVzA9MDtVdC5DT0xVTU4wUk9XMT0xO1V0LkNPTFVNTjBST1cyPTI7VXQuQ09MVU1OMVJPVzA9MztVdC5DT0xVTU4xUk9XMT00O1V0LkNPTFVNTjFST1cyPTU7VXQuQ09MVU1OMlJPVzA9NjtVdC5DT0xVTU4yUk9XMT03O1V0LkNPTFVNTjJST1cyPTg7TU09bmV3IGYsTk09bmV3IGYsVWI9bmV3IGYsa0E9bmV3IGYsSU09bmV3IGYsa009bmV3IGYsS2w9bmV3IFV0LFBBPW5ldyBVdCxQTT1uZXcgVXQ7TGI9WzEsMCwwXSxqYj1bMiwyLDFdO0o9VXR9KTt2YXIgcW4scWwsdkEsQk0semIsQ28sVU0sTE0sRkEscnQsd2E9WCgoKT0+e3NlKCk7TGUoKTtxbj1jbGFzcyBue2NvbnN0cnVjdG9yKGUsdCxvLGEpe3RoaXMueD1lPz8wLHRoaXMueT10Pz8wLHRoaXMuej1vPz8wLHRoaXMudz1hPz8wfXN0YXRpYyBmcm9tRWxlbWVudHMoZSx0LG8sYSxyKXtyZXR1cm4gXyhyKT8oci54PWUsci55PXQsci56PW8sci53PWEscik6bmV3IG4oZSx0LG8sYSl9c3RhdGljIGZyb21Db2xvcihlLHQpe3JldHVybiBfKHQpPyh0Lng9ZS5yZWQsdC55PWUuZ3JlZW4sdC56PWUuYmx1ZSx0Lnc9ZS5hbHBoYSx0KTpuZXcgbihlLnJlZCxlLmdyZWVuLGUuYmx1ZSxlLmFscGhhKX1zdGF0aWMgY2xvbmUoZSx0KXtpZihfKGUpKXJldHVybiBfKHQpPyh0Lng9ZS54LHQueT1lLnksdC56PWUueix0Lnc9ZS53LHQpOm5ldyBuKGUueCxlLnksZS56LGUudyl9c3RhdGljIHBhY2soZSx0LG8pe3JldHVybiBvPW8/PzAsdFtvKytdPWUueCx0W28rK109ZS55LHRbbysrXT1lLnosdFtvXT1lLncsdH1zdGF0aWMgdW5wYWNrKGUsdCxvKXtyZXR1cm4gdD10Pz8wLF8obyl8fChvPW5ldyBuKSxvLng9ZVt0KytdLG8ueT1lW3QrK10sby56PWVbdCsrXSxvLnc9ZVt0XSxvfXN0YXRpYyBwYWNrQXJyYXkoZSx0KXtsZXQgbz1lLmxlbmd0aCxhPW8qNDtfKHQpPyFBcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aCE9PWF8fHQubGVuZ3RoIT09YSYmKHQubGVuZ3RoPWEpOnQ9bmV3IEFycmF5KGEpO2ZvcihsZXQgcj0wO3I8bzsrK3Ipbi5wYWNrKGVbcl0sdCxyKjQpO3JldHVybiB0fXN0YXRpYyB1bnBhY2tBcnJheShlLHQpe2xldCBvPWUubGVuZ3RoO18odCk/dC5sZW5ndGg9by80OnQ9bmV3IEFycmF5KG8vNCk7Zm9yKGxldCBhPTA7YTxvO2ErPTQpe2xldCByPWEvNDt0W3JdPW4udW5wYWNrKGUsYSx0W3JdKX1yZXR1cm4gdH1zdGF0aWMgbWF4aW11bUNvbXBvbmVudChlKXtyZXR1cm4gTWF0aC5tYXgoZS54LGUueSxlLnosZS53KX1zdGF0aWMgbWluaW11bUNvbXBvbmVudChlKXtyZXR1cm4gTWF0aC5taW4oZS54LGUueSxlLnosZS53KX1zdGF0aWMgbWluaW11bUJ5Q29tcG9uZW50KGUsdCxvKXtyZXR1cm4gby54PU1hdGgubWluKGUueCx0LngpLG8ueT1NYXRoLm1pbihlLnksdC55KSxvLno9TWF0aC5taW4oZS56LHQueiksby53PU1hd