<?php
SUBWAY => 'едешь на метро' ,
FOOT => 'идешь пешком' ,
BUS => 'едешь на автобусе'
) ;
$startPoint = 'pet' ; // Петроградская
$endPoint = 'nov' ; // Новая Голландия
'pet' => 'ст. м. Петроградская' ,
'chk' => 'ст. м. Чкаловская' ,
'gor' => 'ст. м. Горьковская' ,
'spo' => 'ст. м. Спортивная' ,
'vas' => 'ст. м. Василеостровская' ,
'kre' => 'Петропавловская крепость' ,
'let' => 'Летний сад' ,
'dvo' => 'Дворцовая площадь' ,
'isa' => 'Исакиевский собор' ,
'nov' => 'Новая Голландия' ,
'ras' => 'Дом Раскольникова' ,
'gos' => 'Гостиный Двор' ,
'sen' => 'Сенная Площадь' ,
'vla' => 'ст. м. Владимирская' ,
'vit' => 'Витебский вокзал' ,
'teh' => 'Технолоческий Институт'
) ;
'chk' => canGet( 10 , BUS) ,
'gor' => canGet( 3 , SUBWAY)
) ,
'pet' => canGet( 10 , BUS) ,
'spo' => canGet( 3 , SUBWAY)
) ,
'pet' => canGet( 3 , BUS) ,
'kre' => canGet( 5 , FOOT) ,
'gos' => canGet( 6 , SUBWAY)
) ,
'chk' => canGet( 3 , SUBWAY) ,
'vas' => canGet( 10 , BUS) ,
'sen' => canGet( 7 , SUBWAY)
) ,
'spo' => canGet( 10 , BUS) ,
'gos' => canGet( 7 , SUBWAY) ,
'nov' => canGet( 11 , FOOT)
) ,
'gor' => canGet( 5 , FOOT)
) ,
'dvo' => canGet( 6 , FOOT) ,
'gos' => canGet( 7 , FOOT)
) ,
'isa' => canGet( 6 , FOOT) ,
'gos' => canGet( 6 , FOOT) ,
'let' => canGet( 6 , FOOT)
) ,
'dvo' => canGet( 6 , FOOT) ,
'nov' => canGet( 5 , FOOT)
) ,
'vas' => canGet( 11 , FOOT) ,
'isa' => canGet( 5 , FOOT) ,
'ras' => canGet( 7 , BUS)
) ,
'nov' => canGet( 7 , BUS) ,
'sen' => canGet( 3 , FOOT)
) ,
'vas' => canGet( 7 , SUBWAY) ,
'sen' => canGet( 3 , SUBWAY) ,
'dvo' => canGet( 6 , FOOT) ,
'gor' => canGet( 6 , SUBWAY) ,
'let' => canGet( 7 , FOOT) ,
'vla' => canGet( 7 , FOOT)
) ,
'ras' => canGet( 3 , FOOT) ,
'spo' => canGet( 7 , SUBWAY) ,
'gos' => canGet( 3 , SUBWAY) ,
'vla' => canGet( 4 , SUBWAY) ,
'vit' => canGet( 2 , SUBWAY) ,
'teh' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 4 , SUBWAY) ,
'gos' => canGet( 7 , FOOT) ,
'vit' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 2 , SUBWAY) ,
'teh' => canGet( 2 , SUBWAY) ,
'vla' => canGet( 3 , SUBWAY)
) ,
'sen' => canGet( 3 , SUBWAY) ,
'vit' => canGet( 2 , SUBWAY)
)
) ;
/* Чтобы не писать много раз array('time' => ..., 'by' => ...), используем функцию.
«canGet» переводится как «можно попасть» */
function canGet( $time , $byWhat )
{
return array ( 'time' => $time , 'by' => $byWhat ) ; }
# Возвращает ближайший узел
function lowestWeightNode( $weightOfActiveNodes )
{
$lowestWeight = INF;
$lowestNode = null ;
foreach ( $weightOfActiveNodes as $node => $weightNode ) {
if ( $lowestWeight > $weightNode ) {
$lowestWeight = $weightNode ;
$lowestNode = $node ;
}
}
return $lowestNode ;
}
function searchForAWay( $startPoint , $endPoint , $paths , $transportName , $pointNames )
{
$weightOfActiveNodes = array_fill_keys ( $point , INF
) ; // Массив с весами узлов $parentsNode = array_fill_keys ( $point , '' ) ;; // Массив с родительскикими узлами $weightOfProcessedKnots = [ ] ; // Массив для обработаннхы узлов
$weightOfActiveNodes [ $startPoint ] = 0 ; // Стартовой точке присваивается 0, для того, алгоритм поиска пути начался с неё
$node = lowestWeightNode( $weightOfActiveNodes ) ; // Находит узел с наименьшим весом
while ( $node != $endPoint ) {
foreach ( $paths [ $node ] as $neighbor => $timeAndBy ) {
$weightNeighbor = $weightOfActiveNodes [ $node ] + $timeAndBy [ 'time' ] ; // весСоседа = рассматриваемый узел + путь до соседа
if ( $weightOfActiveNodes [ $neighbor ] > $weightNeighbor ) { // Если текущий вес узла (рассматриваемого соседа) больше чем , новый найденный
$parentsNode [ $neighbor ] = $node ;
$weightOfActiveNodes [ $neighbor ] = $weightNeighbor ;
}
}
}
$weightOfProcessedKnots [ $node ] = $weightOfActiveNodes [ $node ] ;
unset ( $weightOfActiveNodes [ $node ] ) ; $node = lowestWeightNode( $weightOfActiveNodes ) ;
}
$commonPath = [ ] ; // Кратчайший, требуемый путь
$finishPoint = $endPoint ;
while ( $finishPoint != $startPoint ) {
$commonPath [ $finishPoint ] = $parentsNode [ $finishPoint ] ;
$finishPoint = $parentsNode [ $finishPoint ] ;
}
#Вывод пути
$totalTime = 0 ;
foreach ( $commonPath as $startPoint => $FinishPoint ) {
$wayOfMovement = $transportName [ $paths [ $startPoint ] [ $FinishPoint ] [ 'by' ] ] ;
echo "Из неё {$wayOfMovement} до точки {$pointNames [$startPoint ]} {$paths [$startPoint ][$FinishPoint ]['time']} мин." . PHP_EOL;
$totalTime += $paths [ $startPoint ] [ $FinishPoint ] [ 'time' ] ;
}
echo "В итоге ты попадешь в точку {$pointNames [$endPoint ]} за {$totalTime} минут" ;
}
searchForAWay( $startPoint , $endPoint , $paths , $transportName , $pointNames ) ;
PD9waHAKCmVycm9yX3JlcG9ydGluZygtMSk7CgpkZWZpbmUoJ1NVQldBWScsICdzdWInKTsKZGVmaW5lKCdGT09UJywgJ2Zvb3QnKTsKZGVmaW5lKCdCVVMnLCAnYnVzJyk7CgokdHJhbnNwb3J0TmFtZSA9IGFycmF5KAogICAgU1VCV0FZID0+ICfQtdC00LXRiNGMINC90LAg0LzQtdGC0YDQvicsCiAgICBGT09UID0+ICfQuNC00LXRiNGMINC/0LXRiNC60L7QvCcsCiAgICBCVVMgPT4gJ9C10LTQtdGI0Ywg0L3QsCDQsNCy0YLQvtCx0YPRgdC1JwopOwoKJHN0YXJ0UG9pbnQgPSAncGV0JzsgLy8g0J/QtdGC0YDQvtCz0YDQsNC00YHQutCw0Y8KJGVuZFBvaW50ID0gJ25vdic7IC8vINCd0L7QstCw0Y8g0JPQvtC70LvQsNC90LTQuNGPCgokcG9pbnROYW1lcyA9IGFycmF5KAogICAgJ3BldCcgPT4gJ9GB0YIuINC8LiDQn9C10YLRgNC+0LPRgNCw0LTRgdC60LDRjycsCiAgICAnY2hrJyA9PiAn0YHRgi4g0LwuINCn0LrQsNC70L7QstGB0LrQsNGPJywKICAgICdnb3InID0+ICfRgdGCLiDQvC4g0JPQvtGA0YzQutC+0LLRgdC60LDRjycsCiAgICAnc3BvJyA9PiAn0YHRgi4g0LwuINCh0L/QvtGA0YLQuNCy0L3QsNGPJywKICAgICd2YXMnID0+ICfRgdGCLiDQvC4g0JLQsNGB0LjQu9C10L7RgdGC0YDQvtCy0YHQutCw0Y8nLAogICAgJ2tyZScgPT4gJ9Cf0LXRgtGA0L7Qv9Cw0LLQu9C+0LLRgdC60LDRjyDQutGA0LXQv9C+0YHRgtGMJywKICAgICdsZXQnID0+ICfQm9C10YLQvdC40Lkg0YHQsNC0JywKICAgICdkdm8nID0+ICfQlNCy0L7RgNGG0L7QstCw0Y8g0L/Qu9C+0YnQsNC00YwnLAogICAgJ2lzYScgPT4gJ9CY0YHQsNC60LjQtdCy0YHQutC40Lkg0YHQvtCx0L7RgCcsCiAgICAnbm92JyA9PiAn0J3QvtCy0LDRjyDQk9C+0LvQu9Cw0L3QtNC40Y8nLAogICAgJ3JhcycgPT4gJ9CU0L7QvCDQoNCw0YHQutC+0LvRjNC90LjQutC+0LLQsCcsCiAgICAnZ29zJyA9PiAn0JPQvtGB0YLQuNC90YvQuSDQlNCy0L7RgCcsCiAgICAnc2VuJyA9PiAn0KHQtdC90L3QsNGPINCf0LvQvtGJ0LDQtNGMJywKICAgICd2bGEnID0+ICfRgdGCLiDQvC4g0JLQu9Cw0LTQuNC80LjRgNGB0LrQsNGPJywKICAgICd2aXQnID0+ICfQktC40YLQtdCx0YHQutC40Lkg0LLQvtC60LfQsNC7JywKICAgICd0ZWgnID0+ICfQotC10YXQvdC+0LvQvtGH0LXRgdC60LjQuSDQmNC90YHRgtC40YLRg9GCJwopOwoKJHBhdGhzID0gYXJyYXkoCiAgICAncGV0JyA9PiBhcnJheSgKICAgICAgICAnY2hrJyA9PiBjYW5HZXQoMTAsIEJVUyksCiAgICAgICAgJ2dvcicgPT4gY2FuR2V0KDMsIFNVQldBWSkKICAgICksCgogICAgJ2NoaycgPT4gYXJyYXkoCiAgICAgICAgJ3BldCcgPT4gY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICdzcG8nID0+IGNhbkdldCgzLCBTVUJXQVkpCiAgICApLAoKICAgICdnb3InID0+IGFycmF5KAogICAgICAgICdwZXQnID0+IGNhbkdldCgzLCBCVVMpLAogICAgICAgICdrcmUnID0+IGNhbkdldCg1LCBGT09UKSwKICAgICAgICAnZ29zJyA9PiBjYW5HZXQoNiwgU1VCV0FZKQogICAgKSwKCiAgICAnc3BvJyA9PiBhcnJheSgKICAgICAgICAnY2hrJyA9PiBjYW5HZXQoMywgU1VCV0FZKSwKICAgICAgICAndmFzJyA9PiBjYW5HZXQoMTAsIEJVUyksCiAgICAgICAgJ3NlbicgPT4gY2FuR2V0KDcsIFNVQldBWSkKICAgICksCgogICAgJ3ZhcycgPT4gYXJyYXkoCiAgICAgICAgJ3NwbycgPT4gY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg3LCBTVUJXQVkpLAogICAgICAgICdub3YnID0+IGNhbkdldCgxMSwgRk9PVCkKICAgICksCgogICAgJ2tyZScgPT4gYXJyYXkoCiAgICAgICAgJ2dvcicgPT4gY2FuR2V0KDUsIEZPT1QpCiAgICApLAoKICAgICdsZXQnID0+IGFycmF5KAogICAgICAgICdkdm8nID0+IGNhbkdldCg2LCBGT09UKSwKICAgICAgICAnZ29zJyA9PiBjYW5HZXQoNywgRk9PVCkKICAgICksCgogICAgJ2R2bycgPT4gYXJyYXkoCiAgICAgICAgJ2lzYScgPT4gY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg2LCBGT09UKSwKICAgICAgICAnbGV0JyA9PiBjYW5HZXQoNiwgRk9PVCkKICAgICksCgogICAgJ2lzYScgPT4gYXJyYXkoCiAgICAgICAgJ2R2bycgPT4gY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdub3YnID0+IGNhbkdldCg1LCBGT09UKQogICAgKSwKCiAgICAnbm92JyA9PiBhcnJheSgKICAgICAgICAndmFzJyA9PiBjYW5HZXQoMTEsIEZPT1QpLAogICAgICAgICdpc2EnID0+IGNhbkdldCg1LCBGT09UKSwKICAgICAgICAncmFzJyA9PiBjYW5HZXQoNywgQlVTKQogICAgKSwKCiAgICAncmFzJyA9PiBhcnJheSgKICAgICAgICAnbm92JyA9PiBjYW5HZXQoNywgQlVTKSwKICAgICAgICAnc2VuJyA9PiBjYW5HZXQoMywgRk9PVCkKICAgICksCgogICAgJ2dvcycgPT4gYXJyYXkoCiAgICAgICAgJ3ZhcycgPT4gY2FuR2V0KDcsIFNVQldBWSksCiAgICAgICAgJ3NlbicgPT4gY2FuR2V0KDMsIFNVQldBWSksCiAgICAgICAgJ2R2bycgPT4gY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdnb3InID0+IGNhbkdldCg2LCBTVUJXQVkpLAogICAgICAgICdsZXQnID0+IGNhbkdldCg3LCBGT09UKSwKICAgICAgICAndmxhJyA9PiBjYW5HZXQoNywgRk9PVCkKICAgICksCgogICAgJ3NlbicgPT4gYXJyYXkoCiAgICAgICAgJ3JhcycgPT4gY2FuR2V0KDMsIEZPT1QpLAogICAgICAgICdzcG8nID0+IGNhbkdldCg3LCBTVUJXQVkpLAogICAgICAgICdnb3MnID0+IGNhbkdldCgzLCBTVUJXQVkpLAogICAgICAgICd2bGEnID0+IGNhbkdldCg0LCBTVUJXQVkpLAogICAgICAgICd2aXQnID0+IGNhbkdldCgyLCBTVUJXQVkpLAogICAgICAgICd0ZWgnID0+IGNhbkdldCgzLCBTVUJXQVkpCiAgICApLAoKICAgICd2bGEnID0+IGFycmF5KAogICAgICAgICdzZW4nID0+IGNhbkdldCg0LCBTVUJXQVkpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg3LCBGT09UKSwKICAgICAgICAndml0JyA9PiBjYW5HZXQoMywgU1VCV0FZKQogICAgKSwKCiAgICAndml0JyA9PiBhcnJheSgKICAgICAgICAnc2VuJyA9PiBjYW5HZXQoMiwgU1VCV0FZKSwKICAgICAgICAndGVoJyA9PiBjYW5HZXQoMiwgU1VCV0FZKSwKICAgICAgICAndmxhJyA9PiBjYW5HZXQoMywgU1VCV0FZKQogICAgKSwKCiAgICAndGVoJyA9PiBhcnJheSgKICAgICAgICAnc2VuJyA9PiBjYW5HZXQoMywgU1VCV0FZKSwKICAgICAgICAndml0JyA9PiBjYW5HZXQoMiwgU1VCV0FZKQogICAgKQopOwoKLyog0KfRgtC+0LHRiyDQvdC1INC/0LjRgdCw0YLRjCDQvNC90L7Qs9C+INGA0LDQtyBhcnJheSgndGltZScgPT4gLi4uLCAnYnknID0+IC4uLiksINC40YHQv9C+0LvRjNC30YPQtdC8INGE0YPQvdC60YbQuNGOLgogICAgwqtjYW5HZXTCuyDQv9C10YDQtdCy0L7QtNC40YLRgdGPINC60LDQuiDCq9C80L7QttC90L4g0L/QvtC/0LDRgdGC0YzCuyAqLwpmdW5jdGlvbiBjYW5HZXQoJHRpbWUsICRieVdoYXQpCnsKICAgIHJldHVybiBhcnJheSgndGltZScgPT4gJHRpbWUsICdieScgPT4gJGJ5V2hhdCk7Cn0KCiMg0JLQvtC30LLRgNCw0YnQsNC10YIg0LHQu9C40LbQsNC50YjQuNC5INGD0LfQtdC7CmZ1bmN0aW9uIGxvd2VzdFdlaWdodE5vZGUoJHdlaWdodE9mQWN0aXZlTm9kZXMpCnsKICAgICRsb3dlc3RXZWlnaHQgPSBJTkY7CiAgICAkbG93ZXN0Tm9kZSA9IG51bGw7CiAgICBmb3JlYWNoICgkd2VpZ2h0T2ZBY3RpdmVOb2RlcyBhcyAkbm9kZSA9PiAkd2VpZ2h0Tm9kZSkgewogICAgICAgIGlmICgkbG93ZXN0V2VpZ2h0ID4gJHdlaWdodE5vZGUpIHsKICAgICAgICAgICAgJGxvd2VzdFdlaWdodCA9ICR3ZWlnaHROb2RlOwogICAgICAgICAgICAkbG93ZXN0Tm9kZSA9ICRub2RlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkbG93ZXN0Tm9kZTsKfQoKZnVuY3Rpb24gc2VhcmNoRm9yQVdheSgkc3RhcnRQb2ludCwgJGVuZFBvaW50LCAkcGF0aHMsICR0cmFuc3BvcnROYW1lLCAkcG9pbnROYW1lcykKewogICAgJHBvaW50ID0gYXJyYXlfa2V5cygkcGF0aHMpOwogICAgJHdlaWdodE9mQWN0aXZlTm9kZXMgPSBhcnJheV9maWxsX2tleXMoJHBvaW50LCBJTkYpOyAvLyDQnNCw0YHRgdC40LIg0YEg0LLQtdGB0LDQvNC4INGD0LfQu9C+0LIKICAgICRwYXJlbnRzTm9kZSA9IGFycmF5X2ZpbGxfa2V5cygkcG9pbnQsICcnKTs7IC8vINCc0LDRgdGB0LjQsiDRgSDRgNC+0LTQuNGC0LXQu9GM0YHQutC40LrQuNC80Lgg0YPQt9C70LDQvNC4CiAgICAkd2VpZ2h0T2ZQcm9jZXNzZWRLbm90cyA9IFtdOyAvLyDQnNCw0YHRgdC40LIg0LTQu9GPINC+0LHRgNCw0LHQvtGC0LDQvdC90YXRiyDRg9C30LvQvtCyCgogICAgJHdlaWdodE9mQWN0aXZlTm9kZXNbJHN0YXJ0UG9pbnRdID0gMDsgLy8g0KHRgtCw0YDRgtC+0LLQvtC5INGC0L7Rh9C60LUg0L/RgNC40YHQstCw0LjQstCw0LXRgtGB0Y8gMCwg0LTQu9GPINGC0L7Qs9C+LCDQsNC70LPQvtGA0LjRgtC8INC/0L7QuNGB0LrQsCDQv9GD0YLQuCDQvdCw0YfQsNC70YHRjyDRgSDQvdC10ZEKICAgICRub2RlID0gbG93ZXN0V2VpZ2h0Tm9kZSgkd2VpZ2h0T2ZBY3RpdmVOb2Rlcyk7IC8vINCd0LDRhdC+0LTQuNGCINGD0LfQtdC7INGBINC90LDQuNC80LXQvdGM0YjQuNC8INCy0LXRgdC+0LwKCiAgICB3aGlsZSAoJG5vZGUgIT0gJGVuZFBvaW50KSB7CiAgICAgICAgZm9yZWFjaCAoJHBhdGhzWyRub2RlXSBhcyAkbmVpZ2hib3IgPT4gJHRpbWVBbmRCeSkgewogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygkbmVpZ2hib3IsICR3ZWlnaHRPZkFjdGl2ZU5vZGVzKSkgeyAvLyAKICAgICAgICAgICAgICAgICR3ZWlnaHROZWlnaGJvciA9ICR3ZWlnaHRPZkFjdGl2ZU5vZGVzWyRub2RlXSArICR0aW1lQW5kQnlbJ3RpbWUnXTsgLy8g0LLQtdGB0KHQvtGB0LXQtNCwID0g0YDQsNGB0YHQvNCw0YLRgNC40LLQsNC10LzRi9C5INGD0LfQtdC7ICsg0L/Rg9GC0Ywg0LTQviDRgdC+0YHQtdC00LAKICAgICAgICAgICAgICAgIGlmICgkd2VpZ2h0T2ZBY3RpdmVOb2Rlc1skbmVpZ2hib3JdID4gJHdlaWdodE5laWdoYm9yKSB7IC8vINCV0YHQu9C4INGC0LXQutGD0YnQuNC5INCy0LXRgSDRg9C30LvQsCAo0YDQsNGB0YHQvNCw0YLRgNC40LLQsNC10LzQvtCz0L4g0YHQvtGB0LXQtNCwKSDQsdC+0LvRjNGI0LUg0YfQtdC8ICwg0L3QvtCy0YvQuSDQvdCw0LnQtNC10L3QvdGL0LkKICAgICAgICAgICAgICAgICAgICAkcGFyZW50c05vZGVbJG5laWdoYm9yXSA9ICRub2RlOwogICAgICAgICAgICAgICAgICAgICR3ZWlnaHRPZkFjdGl2ZU5vZGVzWyRuZWlnaGJvcl0gPSAkd2VpZ2h0TmVpZ2hib3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHdlaWdodE9mUHJvY2Vzc2VkS25vdHNbJG5vZGVdID0gJHdlaWdodE9mQWN0aXZlTm9kZXNbJG5vZGVdOwogICAgICAgIHVuc2V0KCR3ZWlnaHRPZkFjdGl2ZU5vZGVzWyRub2RlXSk7CiAgICAgICAgJG5vZGUgPSBsb3dlc3RXZWlnaHROb2RlKCR3ZWlnaHRPZkFjdGl2ZU5vZGVzKTsKICAgIH0KCiAgICAkY29tbW9uUGF0aCA9IFtdOyAvLyDQmtGA0LDRgtGH0LDQudGI0LjQuSwg0YLRgNC10LHRg9C10LzRi9C5INC/0YPRgtGMCiAgICAkZmluaXNoUG9pbnQgPSAkZW5kUG9pbnQ7CiAgICB3aGlsZSAoJGZpbmlzaFBvaW50ICE9ICRzdGFydFBvaW50KSB7CiAgICAgICAgJGNvbW1vblBhdGhbJGZpbmlzaFBvaW50XSA9ICRwYXJlbnRzTm9kZVskZmluaXNoUG9pbnRdOwogICAgICAgICRmaW5pc2hQb2ludCA9ICRwYXJlbnRzTm9kZVskZmluaXNoUG9pbnRdOwogICAgfQogICAgJGNvbW1vblBhdGggPSBhcnJheV9yZXZlcnNlKCRjb21tb25QYXRoKTsKCiAgICAj0JLRi9Cy0L7QtCDQv9GD0YLQuAogICAgJHRvdGFsVGltZSA9IDA7CiAgICBmb3JlYWNoICgkY29tbW9uUGF0aCBhcyAkc3RhcnRQb2ludCA9PiAkRmluaXNoUG9pbnQpIHsKICAgICAgICAkd2F5T2ZNb3ZlbWVudCA9ICR0cmFuc3BvcnROYW1lWyRwYXRoc1skc3RhcnRQb2ludF1bJEZpbmlzaFBvaW50XVsnYnknXV07CiAgICAgICAgZWNobyAi0JjQtyDQvdC10ZEgeyR3YXlPZk1vdmVtZW50fSDQtNC+INGC0L7Rh9C60LggeyRwb2ludE5hbWVzWyRzdGFydFBvaW50XX0geyRwYXRoc1skc3RhcnRQb2ludF1bJEZpbmlzaFBvaW50XVsndGltZSddfSDQvNC40L0uIiAuIFBIUF9FT0w7CiAgICAgICAgJHRvdGFsVGltZSArPSAkcGF0aHNbJHN0YXJ0UG9pbnRdWyRGaW5pc2hQb2ludF1bJ3RpbWUnXTsKICAgIH0KICAgIGVjaG8gItCSINC40YLQvtCz0LUg0YLRiyDQv9C+0L/QsNC00LXRiNGMINCyINGC0L7Rh9C60YMgeyRwb2ludE5hbWVzWyRlbmRQb2ludF19INC30LAgeyR0b3RhbFRpbWV9INC80LjQvdGD0YIiOwp9CgpzZWFyY2hGb3JBV2F5KCRzdGFydFBvaW50LCAkZW5kUG9pbnQsICRwYXRocywgJHRyYW5zcG9ydE5hbWUsICRwb2ludE5hbWVzKTs=