1(globalThis.webpackChunkdiscours_io_frontend=globalThis.webpackChunkdiscours_io_frontend||[]).push([[669],{13128(e,t,i){"use strict";function a(e,t,i,a){function n(){d&&i.cancel(d),d=i(function(){e.retrying=!1,d=null},8e3)}var r=a||{},s="number"==typeof r.extraStatus?r.extraStatus:null,l=(0,o.Mo)()||null!==s&&s>=500;if(e.apiOutage=l,!l)return!1;e.$root.isStubPage=!0,e.$root.statusCode=503,e.retrying=!1;var d=null,c=0;e.retryAfterOutage=function(){if(!e.retrying){var i=Date.now();i<c||(c=i+5e3,e.retrying=!0,n(),t.reload())}};var p=(0,o.vt)(function(i){i||e.$evalAsync(function(){e.apiOutage&&!e.retrying&&(e.retrying=!0,n(),t.reload())})});return e.$on("$destroy",function(){d&&(i.cancel(d),d=null),"function"==typeof p&&p()}),!0}i.d(t,{r:()=>a});var o=i(27723)},17175(e){function t(){try{return JSON.parse(localStorage.getItem(n))||{}}catch(e){return{}}}function i(e){try{localStorage.setItem(n,JSON.stringify(e))}catch(e){}}function a(){s||(s=setTimeout(function(){if(s=null,r){var e=function(){if("undefined"==typeof window)return 0;var e=document.documentElement.scrollHeight-window.innerHeight;return e<=0?0:Math.round(window.scrollY/e*100)}();if(!(e<15)){var a=t();a[r]={percent:e,scrollY:window.scrollY,docHeight:document.documentElement.scrollHeight,ts:Date.now()},function(e){var t=Object.keys(e);t.length<=20||t.sort(function(t,i){return(e[t].ts||0)-(e[i].ts||0)}).slice(0,t.length-20).forEach(function(t){delete e[t]})}(a),i(a)}}},3e3))}function o(){r=null,window.removeEventListener("scroll",a),s&&(clearTimeout(s),s=null)}var n="discours_reading_positions",r=null,s=null;e.exports&&(e.exports={startTracking:function(e){"undefined"!=typeof window&&(o(),r=e,window.addEventListener("scroll",a,{passive:!0}))},stopTracking:o,getSavedPosition:function(e){var i=t()[e];if(!i||i.percent<15||i.percent>95)return null;var a=document.documentElement.scrollHeight-window.innerHeight,o=a>0?Math.round(i.percent/100*a):i.scrollY;return{percent:i.percent,scrollY:o}},clearPosition:function(e){var a=t();delete a[e],i(a)}})},18942(){var e=function(e){var t=parseInt(e.offsetHeight/800);if(t>9)return Array.from({length:t},function(t,i){var a=i+1,o=document.createElement("span");return o.className="lit-pager",o.style.top=800*a+"px",o.textContent=String(a),e.parentNode.insertBefore(o,e.nextSibling),o})},t=function(t){return function(e){var t=e.querySelectorAll("h1, h2, h3, h4, h5, h6, .title");if(t.length>2){var i='<div class="content-spoiler tw:mb-section"><details><summary><h3 class="site-nav">Ðглавление <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24"><path d="M13.025 1l-2.847 2.828 6.176 6.176h-16.354v3.992h16.354l-6.176 6.176 2.847 2.828 10.975-11z"/></svg></h3></summary><ul id="book-contents" class="book-contents"></ul></details></div>',a=e.firstElementChild;a&&"IMG"===a.tagName?a.insertAdjacentHTML("afterend",i):e.insertAdjacentHTML("afterbegin",i);var o=document.getElementById("book-contents");Array.from(t).forEach(function(e,t){if(e.setAttribute("id","heading-"+t),o){var i=document.createElement("li"),a=document.createElement("a");a.href="#heading-"+t,a.className="anchor-link",a.textContent=e.textContent,i.appendChild(a),o.appendChild(i)}})}}(t),e(t)};angular.module("discours.directives").directive("book",["$log","$timeout","$interval","$compile","loginService",(i,a,o,n,r)=>({restrict:"A",link(i,a,s){function l(){m.forEach(function(e){e.remove()}),m=[]}function d(t){!g&&"undefined"!=typeof ResizeObserver&&t.querySelector(".pdf-viewer-container[data-pdf-src]")&&(g=new ResizeObserver(function(){!i.$$destroyed&&t.isConnected&&(l(),m=e(t)||[])})).observe(t)}var c=s.disclaimer,p=r.isLoggedIn(),u=null,m=[],g=null;(c||!c&&p)&&i.$watch(s.ngBindHtml||s.ngBind,function(e){u&&(o.cancel(u),u=null);var r=a[0],s=r.querySelectorAll("img");if(s.length>0){var c=[],p=[];Array.from(s).forEach(function(e){e.src&&c.push(e.src)});for(var g=0;g<c.length;g++){var h=new Image;h.onload=function(e){return function(){p.push(e)}}(c[g]),h.src=c[g]}u=o(function(){p.length===c.length&&(o.cancel(u),u=null,l(),m=t(r)||[],d(r),n(a.contents())(i))},1e3)}else l(),m=t(r)||[],d(r),n(a.contents())(i)}),i.$on("$destroy",function(){g&&g.disconnect(),l(),u&&(o.cancel(u),u=null)})}})])},23660(){!function e(t){try{var i=document.querySelector("[ng-app]")||document.body,a=angular.element(i).injector();if(!a)return t<5?void setTimeout(function(){e(t+1)},50*Math.pow(2,t)):void 0;var o=a.get("$templateCache");o.put("/pages/expo/expoMainPart.html",'<ng-include src="\'/pages/other/error.html\'" ng-if="post.status === 404" ng-init="$root.statusCode = post.status" ></ng-include> <request-contribution ng-if="isLoggedIn && !post.editable && post.slug && post.type === \'
1Literature\'" document-name="\'content-item:\' + post.slug" opened="requestContribution.opened" on-close="requestContribution.opened = false" on-sent-change="requestContribution.alreadySent = sent" ></request-contribution> <div class="expo-main-wrapper" ng-if="post.title"> <div class="continue-reading" ng-if="continueReadingPos"> <button type="button" class="continue-reading__btn" ng-click="scrollToContinue()"> {{ \'ÐÑодолжиÑÑ ÑÑение\' | t }} â </button> <button type="button" class="continue-reading__close" ng-click="dismissContinue()" aria-label="{{ \'ÐакÑÑÑÑ\' | t }}" > × </button> </div> <update-meta title="{{ ::((post.seo.title || post.title) | stripTags) }}"></update-meta> <update-meta name="description" content="{{ ::((post.seo.description || post.media[0].literatureBody || post.body || post.media[0].body) | stripTagsAndTruncate: 160) }}" ></update-meta> <update-meta name="keywords" ng-if="!post.seo.keywords" content="{{ ::post.title }}, {{ ::post.category }}, {{ ::tags() }}, {{ \'ÐиÑкÑÑÑ\' | t }}, Discours.io" ></update-meta> <update-meta name="keywords" ng-if="post.seo.keywords" content="{{ ::post.seo.keywords }}" ></update-meta> <update-meta property="og:title" content="{{ ::post.title }}"></update-meta> <update-meta property="og:description" content="{{ ::((post.media[0].literatureBody || post.body || post.media[0].body) | stripTagsAndTruncate: 500) }}" ></update-meta> <update-meta property="article:publisher" content="https://www.facebook.com/discoursio" ></update-meta> <update-meta property="article:author" content="https://www.facebook.com/discoursio" ></update-meta> <update-meta property="og:type" content="article"></update-meta> <update-meta property="og:image" content="{{ ::(post.socialImageId | imageUrl) }}" ng-if="post.socialImageId" ></update-meta> <update-meta property="og:image" content="{{ ::(post.thumborId | imageUrl: 900:512) }}" ng-if="post.thumborId && !post.socialImageId" ></update-meta> <update-meta name="twitter:card" content="summary_large_image" ng-if="post.thumborId" ></update-meta> <div class="social social--aside" ng-if="!post.preview"> <div class="social__wrapper"> <div class="social-buttons-side" ng-controller="SocialSelectionCtrl as $ctrl"> <div class="social-buttons-side__btn-wrapper"> <a class="social-vk" role="button" tabindex="0" ng-click="$ctrl.openVK(null)" aria-label="{{ \'ÐоделиÑÑÑÑ Ð² VK\' | t }}" > <span class="help-text">{{ \'ÐоделиÑÑÑÑ Ð² VK\' | t }}</span> <i class="fab fa-vk fa-fw"></i> </a> </div> <div class="social-buttons-side__btn-wrapper"> <a class="social-fb" role="button" tabindex="0" ng-click="$ctrl.openFB(null)" aria-label="{{ \'ÐоделиÑÑÑÑ Ð² Facebook\' | t }}" > <span class="help-text">{{ \'ÐоделиÑÑÑÑ Ð² Facebook\' | t }}</span> <i class="fab fa-facebook-f fa-fw"></i> </a> </div> <div class="social-buttons-side__btn-wrapper"> <a class="social-twitter" role="button" tabindex="0" ng-click="$ctrl.openTwitter(null)" aria-label="{{ \'ÐоделиÑÑÑÑ Ð² X (Twitter)\' | t }}" > <span class="help-text">{{ \'ÐоделиÑÑÑÑ Ð² X (Twitter)\' | t }}</span> <i class="fab fa-twitter fa-fw"></i> </a> </div> <div class="social-buttons-side__btn-wrapper"> <a class="social-telegram" role="button" tabindex="0" ng-click="$ctrl.openTelegram(null)" aria-label="{{ \'ÐоделиÑÑÑÑ Ð² Telegram\' | t }}" > <span class="help-text">{{ \'ÐоделиÑÑÑÑ Ð² Telegram\' | t }}</span> <i class="fab fa-telegram-plane"></i> </a> </div> </div> </div> </div> <div class="ds-container content" ng-show="post"> <table class="print-table" role="presentation"> <thead class="print-colophon" aria-hidden="true"> <tr> <th> <div class="print-colophon__left"> <span class="print-colophon__title">{{ ::post.title }}</span> <span class="print-colophon__url">discours.io{{ ::post.link }}</span> </div> <div class="print-colophon__right"> <span class="print-colophon__author" ng-if="post.author">{{ ::post.author }}</span> discours.io </div> </th> </tr> </thead> <tbody> <tr> <td> <div class="expo-item progress"> <img class="print-logo" src="/images/logo.svg" alt="Discours" width="120" height="30" /> <div class="tw:row-flex"> <div class="ds-content-col">
1 <div class="post-main-spacer tw:mt-section tw:max-md:hidden"></div> <div class="author-category" ng-class="{\'no-author\': !post.author && !post.application.name }" > <span class="category" ><a href="{{ ::post.categoryLink }}" ng-attr-target="{{ post.preview ? \'_blank\' : undefined }}" >{{ ::post.category | t }}</a ><span ng-if="!post.createdBy && !post.category && !post.preview && isLoggedIn" > <em>({{ \'заÑвка\' | t }})</em></span ></span ><span class="author" ng-if="post.author || post.application.name" ><a href="{{ ::post.authorLink }}" ng-if="post.authorLink" >{{ ::post.author }}</a ><span ng-if="!post.authorLink">{{ ::post.author }}</span ><span ng-if="post.application.name && !post.author" >{{ ::post.application.name }}</span ></span > </div> <h1 class="title"> {{ ::post.title }} <span class="title-icons" ><a class="icon-link title-icon" ng-href="/edit{{ ::post.link }}" ng-if="post.editable && !post.preview" aria-label="{{ \'РедакÑиÑоваÑÑ\' | t }}" editor-prefetch-on-hover ><i class="fas fa-pencil-alt" aria-hidden="true"></i ><span class="custom-tooltip" aria-hidden="true" >{{ \'РедакÑиÑоваÑÑ\' | t }}</span ></a ><button class="icon-link title-icon" type="button" ng-if="!post.preview && isLoggedIn && !post.editable && post.slug && post.type === \'Literature\'" ng-disabled="requestContribution.alreadySent" ng-click="requestContribution.opened = true" ng-attr-aria-label="{{ requestContribution.alreadySent ? (\'ÐоÑÑÑп Ñже запÑоÑен\' | t) : (\'ÐапÑоÑиÑÑ Ð´Ð¾ÑÑÑп к ÑедакÑиÑованиÑ\' | t) }}" > <i class="fas fa-handshake" aria-hidden="true"></i> <span class="custom-tooltip" aria-hidden="true" >{{ requestContribution.alreadySent ? (\'ÐоÑÑÑп Ñже запÑоÑен\' | t) : (\'ÐапÑоÑиÑÑ Ð´Ð¾ÑÑÑп к ÑедакÑиÑованиÑ\' | t) }}</span ></button ><a class="icon-link title-icon" ng-href="https://api.discours.io/admin/resources/publications/records/{{ ::post._id }}/edit" ng-if="isAdmin" aria-label="{{ \'ÐÑкÑÑÑÑ Ð² админке\' | t }}" ><i class="fas fa-wrench" aria-hidden="true"></i ><span class="custom-tooltip" aria-hidden="true" >{{ \'ÐÑкÑÑÑÑ Ð² админке\' | t }}</span ></a ></span > </h1> </div> </div> <div class="image-gallery-section tw:overflow-x-hidden" ng-if="post.type === \'Image\'"> <div class="carousel-hover-zone"> <div class="carousel-container tw:relative tw:md:w-9/12 tw:md:ml-offset-1" expo-gallery-viewer onselectstart="return false" ondragstart="return false;" > <ul rn-carousel="rn-carousel" rn-carousel-controls="rn-carousel-controls" rn-carousel-indicator="rn-carousel-indicator" rn-carousel-transition="none" rn-carousel-index="$ctrl.activeIndex" rn-carousel-controls-allow-loop="true" > <li ng-repeat="mediaItem in post.media track by $index"> <preload-image ng-if="mediaItem.thumborId && $index === 0" href="{{ ::(mediaItem.thumborId | imageUrl: 1024) }}" imagesrcset="{{ ::(mediaItem.thumborId | imageUrl: 720) }} 720w, {{ ::(mediaItem.thumborId | imageUrl: 1024) }} 1024w, {{ ::(mediaItem.thumborId | imageUrl: 1500) }} 1500w, {{ ::(mediaItem.thumborId | imageUrl: 2048) }} 2048w, {{ ::(mediaItem.thumborId | imageUrl: 2250) }} 2250w" imagesizes="(min-width: 992px) 1024px, (min-width: 768px) 90vw, 100vw" fetchpriority="high" ></preload-image> <img ng-if="mediaItem.thumborId && $index === 0" class="expo-gallery-img" ng-src="{{ ::(mediaItem.thumborId | imageUrl: 1024) }}" ng-srcset="{{ ::(mediaItem.thumborId | imageUrl: 720) }} 720w, {{ ::(mediaItem.thumborId | imageUrl: 1024) }} 1024w, {{ ::(mediaItem.thumborId | imageUrl: 1500) }} 1500w, {{ ::(mediaItem.thumborId | imageUrl: 2048) }} 2048w, {{ ::(mediaItem.thumborId | imageUrl: 2250) }} 2250w" fetchpriority="high" loading="eager" decoding="async" ng-image-onload sizes="(min-width: 992px) 1024px, (min-width: 768px) 90vw, 100vw" alt="{{ ::(mediaItem.title ? mediaItem.title + \' / \' : \'\') }}{{ ::post.title }} â discours.io" title="{{ ::(mediaItem.title ? mediaItem.title + \' / \' : \'\') }}{{ ::post.title }} â discours.io" data-work-title="{{ ::mediaItem.title }}" /> <img ng-if="mediaItem.thumborId && $index > 0" class="expo-gallery-img" ng-src="{{ ::(mediaItem.thumborId | imageUrl: 1024) }}" ng-srcset="{{ ::(mediaItem.thumborId | imageUrl: 720) }} 720w, {{ ::(mediaItem.thumborId | imageUrl: 1024) }} 1024w, {{ ::(mediaItem.thumborId | imageUrl: 1500) }} 1500w, {{ ::(mediaItem.thumborId | imageUrl: 2048) }} 2048w, {{ ::(mediaItem.thumborId | imageUrl: 2250) }} 2250w" fetchpriority="auto" loading="lazy" decoding="async" ng-image-onload sizes="(min-width: 992px) 1024px, (min-width: 768px) 90vw, 100vw" alt="{{ ::(mediaItem.title ? mediaItem.title + \' / \' : \'\') }}{{ ::post.title }} â discours.io" title="{{ ::(mediaItem.title ? mediaItem.title + \' / \' : \'\') }}{{ ::post.title }} â discours.io" data-work-title="{{ ::mediaItem.title }}" /> </li> </ul> </div> </div> <div class="expo-counter" ng-show="post.media.length >
1 1" aria-live="polite" aria-atomic="true" > {{ ($ctrl.activeIndex || 0) + 1 }} / {{ post.media.length }} </div> <div class="ds-content-col tw:relative tw:text-center" onselectstart="return false" ondragstart="return false;" > <slick class="carousel-thumbs" ng-show="post.media.length > 1" slides-to-show="8" slides-to-scroll="2" infinite="false" init-onload="init-onload" data="post.media" > <div ng-repeat="mediaItem in post.media track by $index" ng-if="mediaItem.thumborId" ng-class="{\'carousel-active\': $ctrl.activeIndex == $index }" ng-click="$ctrl.activeIndex = $index" ng-keydown="$ctrl.onThumbKeydown($event, $index)" ng-style="{ \'background-image\': \'url(\' + (mediaItem.thumborId | imageUrl: 150) + \')\' }" role="button" tabindex="0" ng-attr-aria-label="{{ ::(mediaItem.title || ((\'РабоÑа\' | t) + \' \' + ($index + 1))) }}" ng-attr-aria-selected="{{ $ctrl.activeIndex == $index }}" > <img ng-src="{{ ::(mediaItem.thumborId | imageUrl: 150) }}" decoding="async" ng-attr-loading="{{ $index < 5 ? \'eager\' : \'lazy\' }}" width="150" height="84" alt="{{ ::(mediaItem.title ? mediaItem.title + \' / \' : \'\') }}{{ ::post.title }} {{ \'â миниаÑÑÑа\' | t }}" title="{{ ::(mediaItem.title ? mediaItem.title + \' / \' : \'\') }}{{ ::post.title }} {{ \'â миниаÑÑÑа\' | t }}" /> </div> </slick> </div> </div> <div class="tw:row-flex" ng-if="post.type === \'Video\'" post-images="post-images"> <div class="ds-content-col tw:relative expo-video-carousel-frame"> <ul rn-carousel="rn-carousel" rn-carousel-controls="rn-carousel-controls" rn-carousel-indicator="rn-carousel-indicator" rn-carousel-buffered="rn-carousel-buffered" rn-carousel-index="$ctrl.activeIndex" > <li ng-repeat="mediaItem in post.media track by $index"> <div class="video-wrapper direct-video-wrapper" ng-if=" mediaItem.videoUrl && post.preview && !mediaItem.youtubeId && !mediaItem.vimeoId " > <video class="expo-video-player" controls playsinline preload="metadata" ng-src="{{ mediaItem.videoUrl }}" ></video> </div> <div class="video-wrapper youtube-lazy" ng-if="mediaItem.youtubeId" ng-class="{\'youtube-playing\': mediaItem.ytPlaying}" > <div class="youtube-thumbnail" ng-if="!mediaItem.ytPlaying" ng-click="playYouTube(mediaItem, $event)" ng-keydown="$ctrl.onVideoThumbnailKeydown($event, mediaItem, \'youtube\')" role="button" tabindex="0" aria-label="{{ \'ÐоÑпÑоизвеÑÑи видео\' | t }}" > <img ng-src="https://img.youtube.com/vi/{{ mediaItem.youtubeId }}/maxresdefault.jpg" alt="{{ post.title }}" aria-hidden="true" loading="lazy" decoding="async" ng-image-onload ng-attr-img-fallback="https://img.youtube.com/vi/{{ mediaItem.youtubeId }}/hqdefault.jpg" img-fallback-max-width="120" /> <span class="youtube-play-btn" aria-hidden="true"> <svg viewBox="0 0 68 48" width="68" height="48"> <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#f00" /> <path d="M 45,24 27,14 27,34" fill="#fff" /> </svg> </span> </div> </div> <div class="video-wrapper vimeo-wrapper vimeo-lazy" ng-if="mediaItem.vimeoId" ng-class="{\'vimeo-playing\': mediaItem.vimeoPlaying}" > <div class="vimeo-thumbnail" ng-if="!mediaItem.vimeoPlaying" ng-click="playVimeo(mediaItem, $event)" ng-keydown="$ctrl.onVideoThumbnailKeydown($event, mediaItem, \'vimeo\')" role="button" tabindex="0" aria-label="{{ \'ÐоÑпÑоизвеÑÑи видео\' | t }}" > <img ng-src="{{ getVimeoThumbnailUrl(mediaItem) }}" alt="{{ post.title }}" aria-hidden="true" loading="lazy" decoding="async" ng-image-onload img-fallback="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22/>" style="background: #1a1a2e" /> <span class="vimeo-play-btn" aria-hidden="true"> <svg viewBox="0 0 68 48" width="68" height="48"> <path d="M66.52,7.74c-0.78-2.93-2.49-5.41-5.42-6.19C55.79,.13,34,0,34,0S12.21,.13,6.9,1.55 C3.97,2.33,2.27,4.81,1.48,7.74C0.06,13.05,0,24,0,24s0.06,10.95,1.48,16.26c0.78,2.93,2.49,5.41,5.42,6.19 C12.21,47.87,34,48,34,48s21.79-0.13,27.1-1.55c2.93-0.78,4.64-3.26,5.42-6.19C67.94,34.95,68,24,68,24S67.94,13.05,66.52,7.74z" fill="#1ab7ea" /> <path d="M 45,24 27,14 27,34" fill="#fff" /> </svg> </span> </div> </div> </li> </ul> </div> </div> <div class="tw:row-flex" ng-if="post.type == \'Music\'" post-images="post-images"> <div class="ds-content-col tw:relative"> <div class="audio-wrapper"> <div class="audio-container"> <div class="audio-img" ng-if="post.thumborId"> <preload-image href="{{ ::(post.thumborId | imageUrl: 320:320) }}" imagesrcset="{{ ::(post.thumborId | imageUrl: 320:320) }} 320w, {{ ::(post.thumborId | imageUrl: 640:640) }} 640w, {{ ::(post.thumborId | imageUrl: 960:960) }} 960w, {{ ::(post.thumborId | imageUrl: 1280:1280) }} 1280w" imagesizes="(max-width: 669px) 100vw, 320px" fetchpriority="high" ></preload-image> <img class="ligthbox-img" ng-src="{{ ::(post.thumborId | imageUrl: 320:320) }}" ng-srcset="{{ ::(post.thumborId | imageUrl: 320:320) }} 320w, {{ ::(post.thumborId | imageUrl: 640:640) }} 640w, {{ ::(post.thumborId | imageUrl: 960:960) }} 960w, {{ ::(post.thumborId | imageUrl: 1280:1280) }} 1280w" width="320" height="320" fetchpriority="high" loading="eager" decoding="async" ng-image-onload sizes="(max-width: 669px) 100vw, 320px" alt="{{ ::post.title }}" title="{{ ::post.title }}" /> </div> <div class="audio-player-list"> <div class="player" ng-if="post.media.length === 1"> <div class="player-title" ng-if="post.media"> {{ (post._id === $root.currentMusicPostId && currentSong.title) || post.media[0].title }} </div>
1 <div class="player-controls"> <button type="button" class="player-btn" ng-click="playPauseMain()" ng-if="currentPlayer.playing" aria-label="{{ \'ÐаÑза\' | t }}" > <i class="fas fa-pause fa-2x fa-fw" aria-hidden="true"></i> </button> <button type="button" class="player-btn" ng-click="playPauseMain()" ng-if="!currentPlayer.playing" aria-label="{{ \'ÐоÑпÑоизвеÑÑи\' | t }}" > <i class="fas fa-play fa-2x fa-fw" aria-hidden="true"></i> </button> <div class="player-progress" ng-if="currentPlayer"> <rzslider rz-slider-model="currentPlayer.currentTime" rz-slider-options="sliderOptions" ></rzslider> </div> <div class="player-progress player-progress--idle" ng-if="!currentPlayer" > <button type="button" class="player-idle-track" idle-player-track="startAtFraction($fraction)" aria-label="{{ \'ÐоÑпÑоизвеÑÑи Ñ Ð²ÑбÑанного меÑÑа\' | t }}" > <span class="player-idle-track__rail" aria-hidden="true"></span> <span class="player-idle-track__head" aria-hidden="true"></span> </button> </div> <span class="position" ng-if="currentPlayer" >{{ currentPlayer.currentTime | secondsToString }}<span ng-if="currentPlayer.duration" >/{{ currentPlayer.duration | secondsToString }}</span ></span > <span class="position" ng-if="!currentPlayer">00:00</span> </div> </div> <ul class="other-songs" ng-if="post.type === \'Music\' && post.media.length > 1" > <li ng-repeat="mediaItem in post.media track by $index" ng-class="{\'is-current\': musicPlayerService.currentPlayer(mediaItem)}" > <button type="button" class="track-control" ng-click="playPlaylist(post.media, $index)" aria-label="{{ musicPlayerService.currentPlayer(mediaItem).playing ? (\'ÐаÑза\' | t) : (\'ÐоÑпÑоизвеÑÑи\' | t) }}: {{ ::mediaItem.title }}" > <i class="fas fa-fw" ng-class="{\'fa-pause\': musicPlayerService.currentPlayer(mediaItem).playing, \'fa-play\': !musicPlayerService.currentPlayer(mediaItem).playing}" aria-hidden="true" ></i> </button> <div class="track-body"> <span class="track-title">{{ ::mediaItem.title }}</span> <div class="track-playback" ng-if="currentPlayer && musicPlayerService.currentPlayer(mediaItem)" > <div class="player-progress player-progress--track"> <rzslider rz-slider-model="currentPlayer.currentTime" rz-slider-options="sliderOptions" ></rzslider> </div> <span class="position" >{{ currentPlayer.currentTime | secondsToString }}<span ng-if="currentPlayer.duration" >/{{ currentPlayer.duration | secondsToString }}</span ></span > </div> </div> </li> </ul> </div> </div> </div> </div> </div> <div class="item-info"> <div class="tw:row-flex"> <div class="ds-content-col" ng-if="post.type !== \'Music\' && post.media[$ctrl.activeIndex] && post.media[$ctrl.activeIndex].title" > <p class="h3 tw:font-bold" id="expo-modal-label"> {{ post.media[$ctrl.activeIndex].title }} </p> </div> </div> </div> <div class="tw:row-flex" ng-if="post.type === \'Literature\'"> <div class="post-content-col lit-wrapper ds-content-col" post-images="post-images" social-text="social-text" > <div class="expo-item-title-image-wrapper" ng-if="post.thumborId" ng-class="{\'is-image-loaded\': exp
1oTitleImageLoaded}" > <img class="expo-item-title-image fancybox-img" fancybox-img ng-src="{{ ::(post.thumborId | imageUrl: (post.coverImageWidth | heroBaseWidth)) }}" ng-srcset="{{ ::(post.thumborId | imageSrcset:\'hero\':null:post.coverImageWidth) }}" fetchpriority="high" loading="eager" decoding="async" sizes="(min-width: 768px) 66vw, 100vw" alt="{{ ::(post.imageCaption ? post.imageCaption : post.title + \' â \' + (\'лиÑеÑаÑÑÑа discours.io\' | t)) }}" title="{{ ::(post.imageCaption ? post.imageCaption : post.title + \' â \' + (\'лиÑеÑаÑÑÑа discours.io\' | t)) }}" ng-image-onload="expoTitleImageLoaded = true" /> </div> <p class="image-description" ng-if="post.thumborId && post.imageCaption" ng-bind-html="post.imageCaption | trustedHtml" ></p> <div class="lit" ng-bind-html="post.media[0].literatureBody | trustedHtml" pdf-viewer-hydrate footnote-text="footnote-text" post-images="post-images" book="book" disclaimer="{{ ::post.publishedAt }}" ></div> <side-banners types="[ \'discoursBest\', \'mailingList\', \'socialInPosts\', \'becomeAuthor\', \'ideaShare\', \'supportDiscours\', ]" post-type="\'literature\'" show-popular="true" ng-if="!post.preview" ></side-banners> </div> </div> <div class="tw:row-flex" ng-if=" post.type !== \'Literature\' && (post.media[$ctrl.activeIndex].body || post.body).length > 0 && (post.media[$ctrl.activeIndex].body || post.body) !== \'<p>undefined</p>\' " > <div class="ds-content-col"> <div class="expo-body open-post"> <div class="post-body" ng-bind-html="(post.media[$ctrl.activeIndex].body || post.body) | trustedHtml" post-images="post-images" disclaimer="{{ ::post.publishedAt }}" footnote-text="footnote-text" social-text="social-text" embed-resize ></div> </div> </div> </div> <div class="tw:row-flex" ng-if="!post.createdBy && isLoggedIn && !post.preview"> <div class="application tw:gutter-half tw:w-full tw:mb-2.5 tw:mt-2.5 tw:md:w-7/12 tw:md:ml-offset-2" > <p> <strong ng-if="post.createdAt">{{ \'ÐаÑа заÑвки:\' | t }}</strong> <span ng-if="post.createdAt" >{{ ::(post.createdAt | amDateFormat: \'D MMMM YYYY\') }}</span > </p> <p ng-if="isAdmin && !post.preview"> <strong ng-if="post.application.email">Email:</strong> {{ ::post.application.email }} </p> <p ng-if="!post.preview"> <strong ng-if="post.application.bio">{{ \'ÐвÑÐ¾Ñ Ð¾ Ñебе:\' | t }}</strong> {{ ::post.application.bio }} </p> </div> </div> <div class="footer-post tw:row-flex"> <div class="ds-content-col"> <hr class="tw:mt-2.5 tw:mb-5" /> <div class="post-meta-footer"> <div class="post-meta-footer__author"> <div class="author-title" ng-if="post.author || post.application.name"> <a href="{{ ::(post.authorLink || \'/\' + post.createdBy.path) }}" ng-if="(post.authorLink || post.createdBy.path) && post.author" >{{ ::post.author }}</a ><span ng-if="!post.authorLink && !post.createdBy.path && post.author" >{{ ::post.author }}</span ><span ng-if="!post.author">{{ ::post.application.name }}</span ><button type="button" class="message-author-icon" ng-if="isAuthor && post.createdBy && post.createdBy._id" message-author-btn author-id="post.createdBy._id" aria-label="{{ \'ÐапиÑаÑÑ ÑообÑение\' | t }}" > <i class="fas fa-envelope"></i ><span class="custom-tooltip" aria-hidden="true" >{{ \'ÐапиÑаÑÑ ÑообÑение\' | t }}</span ></button ><span ng-if="post.application && !post.publishedAt && post.postedAt && !post.preview && isLoggedIn" style="font-weight: normal" > <em>({{ \'заÑвка\' | t }})</em></span ><span class="tw:max-sm:hidden"> </span> </div> <div class="date-time"> <span class="time" ng-if="post.publishedAt" >{{ ::(post.publishedAt | amDateFormat: \'D MMMM YYYY\') }}</span ><span class="time" ng-if="!post.publishedAt && post.postedAt" >{{ ::(post.postedAt | amDateFormat: \'D MMMM YYYY\') }}</span ><span class="time" ng-if="!post.publishedAt && !post.postedAt && post.createdAt" >{{ ::(post.createdAt | amDateFormat: \'D MMMM YYYY\') }}</span > </div> </div> <div class="post-meta-footer__stats" ng-if="(!post.preview && canViewMetrics) || (isLoggedIn && !post.preview)" > <div class="counters" ng-if="::!post.preview && canViewMetrics"> <i class="df-views"></i>{{ ::post.views }} </div>
1 <rating-buttons ng-if="isLoggedIn && !post.preview" type="ContentItem" item="post" popover-placement="auto bottom-right" popover-class="rating-popover--open-material" id="voting" root-class="post-rating" ></rating-buttons> </div> </div> <div class="tw:mt-2.5 tw:mb-5" ng-if="post.tags.length"> <div class="tags-container"> <ul class="tags"> <li ng-repeat="tag in post.tags track by tag.slug"> <a href="/tags/{{ ::tag.slug }}" ng-attr-target="{{ post.preview ? \'_blank\' : undefined }}" >#{{ ::tag.title }}</a > </li> </ul> </div> </div> <div class="tw:mt-6" ng-if="!post.preview"> <donate-form is-on-item-page="true"></donate-form> </div> </div> </div> </div> </td> </tr> </tbody> </table> </div> </div>'),o.put("/pages/expo/index.html",'<ng-include src="\'/pages/other/error.html\'" ng-if="expoGenres && expoGenres.error && expoGenres.error.value" ng-init="$root.statusCode = expoGenres.error.value" ></ng-include> <div ng-hide="expoGenres && expoGenres.error && expoGenres.error.value"> <update-meta title="{{ ::title() }}"></update-meta> <update-meta name="description" content="{{ ::seoDescription() }}"></update-meta> <update-meta name="keywords" content="{{ \'Discours.io, ÑкÑпозиÑиÑ, иÑкÑÑÑÑво\' | t }}, {{ ::title() }}" ></update-meta> <update-meta property="og:title" content="{{ ::title() }}"></update-meta> <update-meta property="og:description" content="{{ ::seoDescription() }}"></update-meta> <div class="ds-container expo-container"> <div class="tw:row-flex"> <div class="tw:gutter-half tw:sm:w-3/12 tw:md:w-2/12 expo-column-menu-wrapper"> <div class="expo-column-menu"> <ul class="columns-menu filter no-graph"> <li ng-class="{ active: !routeParams.sort && !routeParams.filter }"> <a ng-click="updateParams(\'sort\', null)">{{ \'новое\' | t }}</a> </li> <li ng-class="{ active: routeParams.sort ==\'rating\' && !routeParams.filter }"> <a ng-click="updateParams(\'sort\', \'rating\')">{{ \'попÑлÑÑное\' | t }}</a> </li> </ul> <div class="genre-title">{{ \'ÐанÑÑ\' | t }}</div> <ul class="columns-menu no-graph"> <li ng-class="{ active: !routeParams.categorySlug }"> <a href="/expo/{{ routeParams.slug + routeQuery }}">{{ \'ÐÑе\' | t }}</a> </li> <li ng-repeat="expoGenre in expoGenres track by expoGenre.slug" ng-class="{ active: routeParams.categorySlug === expoGenre.slug }" > <a href="/expo/{{ routeParams.slug }}/{{ expoGenre.slug + routeQuery }}" >{{ ::(expoGenre.title | t) }}</a > </li> </ul> </div> </div> <div class="tw:gutter-half tw:sm:w-9/12 tw:md:w-10/12 tw:w-full"> <div> <div> <ul class="expo-menu"> <li ng-class="{ active: routeParams.slug === \'literature\' }"> <a href="/expo/literature{{ routeQuery }}">{{ \'ÐиÑеÑаÑÑÑа\' | t }}</a> </li> <li ng-class="{ active: routeParams.slug === \'image\' }"> <a href="/expo/image{{ routeQuery }}">{{ \'ÐалеÑеÑ\' | t }}</a> </li> <li ng-class="{ active: routeParams.slug === \'video\' }"> <a href="/expo/video{{ routeQuery }}">{{ \'Ðидео\' | t }}</a> </li> <li ng-class="{ active: routeParams.slug === \'music\' }"> <a href="/expo/music{{ routeQuery }}">{{ \'ÐÑзÑка\' | t }}</a> </li> </ul> </div> <div class="tw:mt-2.5"> <div class="expo-column" ng-class="{\'audio-column\': routeParams.slug === \'music\' }"> <div class="expo-item" ng-repeat="expoItem in expoItems track by expoItem._id" ng-class="{\'book-item\': expoItem.type == \'Literature\', \'video-item\': expoItem.type == \'Video\', \'audio-item\': expoItem.type == \'Music\', \'tw:sm:w-6/12 tw:md:w-4/12\': expoItem.type !== \'Music\' }" > <div class="expo-img-block" ng-if="expoItem.type == \'Video\' || expoItem.type == \'Music\'" > <a class="expo-img" href="{{ ::(expoItem.censoredLink || expoItem.link) }}"> <img ng-if="expoItem.thumborId" class="tw:block tw:max-w-full tw:h-auto" ng-attr-loading="lazy" ng-attr-decoding="async" ng-image-onload ng-attr-img-fallback="{{ ::expoItem.stubImg }}" sizes="(min-width: 1300px) 320px, (min-width: 1200px) 300px, (min-width: 768px) 240px, (min-width: 480px) 400px, 100vw" ng-src="{{ ::(expoItem.thumborId | imageUrl: 400) }}" ng-srcset="{{ ::(expoItem.thumborId | imageUrl: 240) }} 240w, {{ ::(expoItem.thumborId | imageUrl: 480) }} 480w, {{ ::(expoItem.thumborId | imageUrl: 720) }} 720w, {{ ::(expoItem.thumborId | imageUrl: 300) }} 300w, {{ ::(expoItem.thumborId | imageUrl: 600) }} 600w, {{ ::(expoItem.thumborId | imageUrl: 900) }} 900w, {{ ::(expoItem.thumborId | imageUrl: 320) }} 320w, {{ ::(expoItem.thumborId | imageUrl: 640) }} 640w, {{ ::(expoItem.thumborId | imageUrl: 960) }} 960w, {{ ::(expoItem.thumborId | imageUrl: 400) }} 400w, {{ ::(expoItem.thumborId | imageUrl: 800) }} 800w, {{ ::(expoItem.thumborId | imageUrl: 1200) }} 1200w" width="400" height="224" alt="{{ ::expoItem.title }}" title="{{ ::expoItem.title }}" /> <div ng-if="!expoItem.thumborId" class="tw:block tw:max-w-full tw:h-auto"> <img ng-src="{{ ::expoItem.stubImg }}" alt="{{ ::expoItem.title }}" class="article__stub-img" ng-image-onload decoding="async" loading="lazy" /> </div> </a> </div> <a class="expo-img" href="{{ ::(expoItem.censoredLink || expoItem.link) }}" ng-if="expoItem.type == \'Image\' || expoItem.type == \'Literature\'" > <img ng-if="expoItem.thumborId" class="tw:block tw:max-w-full tw:h-auto" ng-attr-loading="lazy" ng-attr-decoding="async" ng-image-onload ng-attr-img-fallback="{{ ::expoItem.stubImg }}" sizes="(min-width: 768px) 350px, (min-width: 480px) 400px, 100vw" ng-src="{{ ::(expoItem.thumborId | imageUrl: 400) }}" ng-srcset="{{ ::(expoItem.thumborId | imageUrl: 350) }} 350w, {{ ::(expoItem.thumborId | imageUrl: 700) }} 700w, {{ ::(expoItem.thumborId | imageUrl: 1050) }} 1050w, {{ ::(expoItem.thumborId | imageUrl: 400) }} 400w, {{ ::(expoItem.thumborId | imageUrl: 800) }} 800w, {{ ::(expoItem.thumborId | imageUrl: 1200) }} 1200w" width="400" height="224" alt="{{ ::expoItem.title }}" title="{{ ::expoItem.title }}" /> <div ng-if="!expoItem.thumborId" class="tw:block tw:max-w-full tw:h-auto"> <img ng-src="{{ ::expoItem.stubImg }}" alt="{{ ::expoItem.title }}" class="article__stub-img" ng-image-onload decoding="async" loading="lazy" /> </div> </a> <a href="{{ ::expoItem.categoryLink }}"> <div class="expo-genre-title">{{ ::(expoItem.category | t) }}</div></a > <div class="expo-title"> <a href="{{ ::expoItem.link }}">{{ ::expoItem.title }}</a> </div> <div class="expo-author-title white-bg"> <a href="{{ ::expoItem.authorLink }}">{{ ::expoItem.author }}</a> </div> </div> </div> </div> <div class="main-loadmore" ng-if="totalItems > expoItems.length">
1 <button class="loadmore" type="button" ng-click="loadMoreExpoItems()" ng-disabled="expoItemsLoading" ng-class="{\'is-loading\': expoItemsLoading }" aria-live="polite" aria-busy="{{ expoItemsLoading ? \'true\' : \'false\' }}" > <span class="loadmore__label">{{ \'ÐоказаÑÑ ÐµÑÑ\' | t }}</span> <span class="loadmore__loading"> <span class="loading-dots"></span> </span> </button> </div> </div> </div> </div> </div> </div>'),o.put("/pages/expo/item.html",'<div class="auth-required-screen" ng-cloak ng-if="apiOutage" role="status" aria-live="polite"> <update-meta title="{{ \'ÐлаÑÑоÑма обновлÑеÑÑÑ\' | t }}"></update-meta> <update-meta name="robots" content="noindex, nofollow"></update-meta> <div class="ds-container"> <div class="tw:w-full tw:md:w-6/12 tw:md:ml-offset-3 tw:text-center"> <div class="auth-required-content"> <i class="fas fa-sync auth-required-icon" aria-hidden="true"></i> <h2>{{ \'ÐлаÑÑоÑма обновлÑеÑÑÑ\' | t }}</h2> <p class="auth-required-description"> {{ \'ÐÑ ÑлÑÑÑаем ÐиÑкÑÑÑ â ÑкоÑо вÑÑ Ð·Ð°ÑабоÑÐ°ÐµÑ ÐµÑÑ Ð»ÑÑÑе.\' | t }}<br /> {{ \'ÐаглÑниÑе ÑÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ\' | t }} </p> <div class="auth-required-actions"> <button type="button" class="ds-btn ds-btn-primary" ng-click="retryAfterOutage()" ng-disabled="retrying" ng-attr-aria-busy="{{ retrying ? \'true\' : \'false\' }}" > <span ng-if="!retrying">{{ \'ÐопÑобоваÑÑ Ñнова\' | t }}</span> <span ng-if="retrying"> <i class="fas fa-spinner fa-spin" aria-hidden="true"></i> {{ \'ÐÑовеÑÑемâ¦\' | t }} </span> </button> <a href="/" class="auth-required-btn-secondary">{{ \'Ðа главнÑÑ\' | t }}</a> </div> <p class="auth-required-status"> {{ \'Ðогда вÑÑ Ð·Ð°ÑабоÑаеÑ, ÑÑÑаниÑа обновиÑÑÑ Ñама\' | t }} </p> </div> </div> </div> </div> <div class="auth-required-screen" ng-cloak ng-if="accessDenied"> <update-meta title="{{ \'Ðе ÑдаеÑÑÑ Ð¾ÑкÑÑÑÑ ÑÑÑаниÑÑ\' | t }}"></update-meta> <update-meta name="robots" content="noindex, nofollow"></update-meta> <div class="ds-container"> <div class="tw:w-full tw:md:w-6/12 tw:md:ml-offset-3 tw:text-center"> <div class="auth-required-content"> <i class="fas fa-lock auth-required-icon"></i> <h2>{{ \'Ðе ÑдаеÑÑÑ Ð¾ÑкÑÑÑÑ ÑÑÑаниÑÑ\' | t }}</h2> <p class="auth-required-description"> {{ \'Ðозможно, ÑÑÑаниÑÑ Ð½Ðµ ÑÑÑеÑÑвÑеÑ\' | t }}<br />{{ \'или к ней Ð½ÐµÑ Ð´Ð¾ÑÑÑпа\' | t }} </p> <div class="auth-required-actions"> <a href="/" class="ds-btn ds-btn-primary">{{ \'Ðа главнÑÑ\' | t }}</a> <button type="button" class="auth-required-btn-secondary" ng-if="!isLoggedIn" ng-click="openLoginModal()" > {{ \'ÐойÑи\' | t }} </button> <button type="button" class="auth-required-btn-secondary" ng-if="isLoggedIn && accessDeniedSlug" ng-disabled="requestContribution.alreadySent" ng-click="requestContribution.opened = true" ng-attr-aria-label="{{ requestContribution.alreadySent ? (\'ÐоÑÑÑп Ñже запÑоÑен\' | t) : (\'ÐапÑоÑиÑÑ Ð´Ð¾ÑÑÑп\' | t) }}" > <i class="fas fa-handshake" aria-hidden="true"></i> {{ requestContribution.alreadySent ? (\'ÐоÑÑÑп Ñже запÑоÑен\' | t) : (\'ÐапÑоÑиÑÑ Ð´Ð¾ÑÑÑп\' | t) }} </button> </div> </div> </div> </div> </div> <request-contribution ng-if="isLoggedIn && accessDenied && accessDeniedSlug" document-name="\'content-item:\' + accessDeniedSlug" opened="requestContribution.opened" on-close="requestContribution.opened = false" on-sent-change="requestContribution.alreadySent = sent" ></request-contribution> <div ng-if="post && !accessDenied"> <update-meta title="{{ ::(post.title | stripTags) }}"></update-meta> <update-meta name="description" content="{{ ::((post.description || post.media[0].literatureBody || post.body || post.media[0].body) | stripTagsAndTruncate: 160) }}" ></update-meta> <update-meta name="keywords" content="{{ ::post.title }}, {{ ::post.category }}, {{ \'ÑкÑпозиÑиÑ, иÑкÑÑÑÑво\' | t }}, {{ ::tags() }}, {{ \'ÐиÑкÑÑÑ\' | t }}, Discours.io" ></update-meta> <update-meta property="og:title" content="{{ ::post.title }}"></update-meta> <update-meta property="og:description" content="{{ ::(getOgDescription() | stripTagsAndTruncate: 400) }}" ></update-meta> <update-meta property="article:publisher" content="https://www.facebook.com/discoursio" ></update-meta> <update-meta property="article:author" content="https://www.facebook.com/discoursio" ></update-meta> <update-meta property="og:image" content="{{ ::(post.thumborId | imageUrl: 1024:512) }}" ng-if="post.thumborId" ></update-meta> <update-meta property="og:image:width" content="1024" ng-if="post.thumborId"></update-meta> <update-meta property="og:image:height" content="512" ng-if="post.thumborId"></update-meta> <update-meta name="twitter:card" content="summary_large_image" ng-if="post.thumborId" ></update-meta> <json-ld ng-if="post.link" type="CreativeWork" headline="{{ ::(post.title | stripTags) }}" description="{{ ::((post.description || post.body) | stripTagsAndTruncate: 160) }}" image="{{ ::(post.thumborId | imageUrl: 1024:512) }}" image-width="1024" image-height="512" url="https://discours.io{{ ::post.link }}" date-published="{{ ::(post.publishedAt | date:\'yyyy-MM-ddTHH:mm:ssZ\') }}" creator-name="{{ ::post.createdBy.name }}" creator-url="{{ ::(post.createdBy.path ? \'https://discours.io/\' + post.createdBy.path : \'\') }}" ></json-ld> <div class="tw:hidden" id="item-id">{{ ::post.slug }}</div> <div ng-include="\'/pages/expo/expoMainPart.html\'"></div> <div lazy-render root-margin="600px" reserve-height="clamp(300px, 50vh, 700px)"> <after-post ng-if="mainPartReady" item="post" relevant-items="relevantItems" relevant-stale="relevantStale" ></after-post> </div> </div>')}catch(e){}}(0)},26683(e,t,i){"use strict";i.r(t),i.d(t,{default:()=>u}),i(23660),i(49248),i(34752),i(65106);var a=i(38253),o=i(27323),n=i(72118),r=i(2271),s=i(13128),l=i(28618),d=i(41669),c=i(55381),p=i(17175);angular.module("discours.controllers").controller("ExpoItemCtrl",["$scope","$filter","$log","$location","$timeout","contentItemsService","musicPlayerService","loginService","permissionsService","prerenderService","pageInformationService","expoService","$window","$route","postData","eventBus",function(e,t,i,u,m,g,h,f,v,y,b,w,I,x,k,S){function P(t){e.post&&e.post.media&&c.cleanupVideoIframes(e.post.media,t)}const _=this;e.isLoggedIn=f.isLoggedIn(),e.isAdmin=f.isAdmin(),e.isAuthor=v.isAuthor(),e.isReader=v.isReader(),e.openLoginModal=function(){f.openAuthModal({scope:e,title:"ÐойдиÑе Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к маÑеÑиалÑ"})},e.canViewMetrics=v.canViewEditorialMetrics(),e.location=u,S.onScope(e,S.EVENTS.USER_LOGGED_IN,function(){x.reload()}),S.onScope(e,S.EVENTS.USER_LOGGED_OUT,function(){e.isLoggedIn=!1,e.isAdmin=!1,e.isAuthor=!1,e.isReader=!1,e.canViewMetrics=!1}),e.tags=()=>e.post&&Array.isArray(e.post.tags)?e.post.tags.map(e=>e.title).join(", "):"",e.updateHash=function(e){isNaN(e)||(window.location.hash||"").replace(/^#/,"").endsWith("-view")||u.update_hash(e)};const C=({keyCode:t})=>{if(document.querySelector(".viewer-container.viewer-in"))return;if(!e.post||!e.post.media||!e.post.media.length)return;const i=e.post.media.length-1;39===t&&(this.activeIndex=this.activeIndex>=i?0:this.activeIndex+1),37===t&&(this.activeIndex=this.activeIndex<=0?i:this.activeIndex-1),e.$evalAsync()};document.addEventListener("keyup",C),_.onThumbKeydown=function(e,t){e&&(13!==e.keyCode&&32!==e.keyCode||(e.preventDefault(),_.activeIndex=t))},_.onVideoThumbnailKeydown=function(t,i,a){t&&i&&("Enter"!==t.key&&" "!==t.key||(t.preventDefault(),"youtube"===a&&"function"==typeof e.playYouTube?e.playYouTube(i,t):"vimeo"===a&&"function"==typeof e.playVimeo&&e.playVimeo(i,t)))};let A=null;e.$on("$destroy",function(){document.removeEventListener("keyup",C),A&&A(),P(-1),p.stopTracking()}),e.carousels={},e.getOgDescription=()=>{let t="";switch(e.post.type){case"Image":t="ÐкÑпозиÑÐ¸Ñ ÐиÑкÑÑÑа";break;case"Video":t="Ðидео на ÐиÑкÑÑÑе";break;case"Music":t="ÐÑзÑка на ÐиÑкÑÑÑе";break;case"Literature":t="ÐиÑеÑаÑÑÑа на ÐиÑкÑÑÑе"}e.post.createdBy&&e.post.createdBy.firstName&&(t+=`, ${[e.post.createdBy.firstName,e.post.createdBy.lastName].filter(
1Boolean).join(" ")}`);const i=e.post.media&&e.post.media[0];return e.post.description||i&&i.literatureBody||e.post.body||i&&i.body||t},e.playYouTube=function(t,i){c.playYouTube(t,i),e.$applyAsync()},e.playVimeo=function(t,i){c.playVimeo(t,i,c.getVimeoEmbedUrl),e.$applyAsync()},e.getVimeoEmbedUrl=c.getVimeoEmbedUrl,e.getVimeoThumbnailUrl=c.getVimeoThumbnailUrl,e.stopAllVideogulars=function(){for(var e=document.querySelectorAll(".expo-video-player"),t=0;t<e.length;t++)e[t].paused||e[t].pause()};const L=(u.hash()||"").match(/^(\d+)(-view)?$/),T=L?parseInt(L[1],10):NaN,U=L&&"-view"===L[2],M=(0,r.tm)(k,T);this.activeIndex=M,e.openViewerOnLoad=U,e.viewerInitialIndex=M,e.expoViewerOpened=!1,e.$watch(()=>this.activeIndex,(t,a)=>{if(void 0!==t&&(e.post&&"Video"===e.post.type&&t!==a&&P(a),e.post&&"Image"===e.post.type&&e.post.media&&e.post.media.length>1)){e.stopAllVideogulars(),i.debug("setting new carousel index",t),e.updateHash(t+1);try{const e=document.querySelector("slick");if(e&&e.classList.contains("slick-initialized")&&void 0!==d)return d("slick").slick("slideHandler",t-2)}catch(e){return m(function(){const e=document.querySelector("slick");if(e&&e.classList.contains("slick-initialized")&&void 0!==d)return d("slick").slick("slideHandler",t-2)},400)}}}),e.audioPlayer=h.player(),e.musicPlayerService=h;const E=u.path(),q=E.match(/[^/]+$/);if(!q)return void(e.accessDenied=!0);const V=q[0],R=k;if(!R||R instanceof Error||R.status&&!R.title){i.warn("[ExpoItemCtrl] postData is empty or error for slug:",V,R);var z=(0,s.r)(e,x,m,{extraStatus:R&&"number"==typeof R.status?R.status:null});e.accessDenied=!z,z||(e.$root.isStubPage=!0,e.$root.statusCode=R&&R.status||404),e.accessDeniedSlug=V,e.requestContribution={opened:!1},window.__removeSSR&&window.__removeSSR(),y.ready()}else if(R.censored)window.__removeSSR&&window.__removeSSR(),"string"==typeof R.link&&R.link.startsWith("/")&&!R.link.startsWith("//")&&localStorage.setItem("currentContentLocation",R.link),I.location.href="string"==typeof R.censoredLink&&R.censoredLink.startsWith("/")&&!R.censoredLink.startsWith("//")?R.censoredLink:"/censored-in-russia";else if(null!=R.redirect){window.__removeSSR&&window.__removeSSR();const e=navigator.userAgent.match(/Prerender/);let t=E.replace(V,R.redirect);if("string"==typeof t&&t.startsWith("/")&&!t.startsWith("//")||(t="/"),null!=(null!=e?e[0]:void 0)){const e=document.createElement("meta");e.setAttribute("name","prerender-status-code"),e.setAttribute("content","302"),document.head.appendChild(e);const i=document.createElement("meta");i.setAttribute("name","prerender-header"),i.setAttribute("content","Location: "+window.location.origin+t),document.head.appendChild(i),y.ready()}else window.location.href=t}else if(404===R.status)i.debug("404!"),e.accessDenied=!0,e.$root.isStubPage=!0,e.$root.statusCode=404,e.accessDeniedSlug=V,e.requestContribution={opened:!1},window.__removeSSR&&window.__removeSSR(),y.ready();else{e.post=R,e.requestContribution={opened:!1};var D=p.getSavedPosition(V);D&&(e.continueReadingPos=D,m(function(){e.continueReadingPos&&(e.continueReadingPos=null)},8e3)),m(function(){p.startTracking(V)},1e3),e.scrollToContinue=function(){e.continueReadingPos&&(window.scrollTo({top:e.continueReadingPos.scrollY,behavior:"smooth"}),e.continueReadingPos=null,p.clearPosition(V))},e.dismissContinue=function(){e.continueReadingPos=null},e.relevantStale=!1;let i=(0,l.BR)(R.tags);const r=()=>{g.query((0,l.o_)(i,R._id)).then(t=>{const o=!(!t||!t.stale);if(i){const a=(0,l.Qw)(t,R.tags,l.Pr);return 0===a.length?(i=null,void r()):(e.relevantStale=o,void(e.relevantItems=a))}e.relevantStale=o,e.relevantItems=(0,a.k)(t)}).catch(function(){e.relevantItems=[],e.relevantStale=!1})};if(m(r,0),T&&R.media&&R.media.length>1&&m(function(){try{const e=document.querySelector("slick");e&&e.classList.contains("slick-initialized")&&void 0!==d&&d("slick").slick("slideHandler",_.activeIndex-2)}catch(e){m(function(){const e=document.querySelector("slick");e&&e.classList.contains("slick-initialized")&&void 0!==d&&d("slick").slick("slideHandler",_.activeIndex-2)},400)}},0),e.$on("$includeContentLoaded",function(t,i){i&&-1!==i.indexOf("expoM
1ainPart.html")&&(e.mainPartReady=!0)}),(0,n.d)(e,m,y),"Music"===e.post.type){const i=t("t");h.musicCtrlScope()&&(A=h.musicCtrlScope().$watch("currentSong",t=>e.currentSong=t)),e.currentPlayer=h.currentPlayerForPath(e.post.link),e.sliderOptions={floor:0,ceil:0,step:1,precision:1,hideLimitLabels:!0,hidePointerLabels:!0,ariaLabel:i("ÐозиÑÐ¸Ñ Ð²Ð¾ÑпÑоизведениÑ"),onStart:function(){var t=e.currentPlayer;t&&"function"==typeof t.pause&&t.pause()},onChange:function(t,i){var a=e.currentPlayer;a&&"function"==typeof a.seek&&a.seek(i)},onEnd:function(t,i){var a=e.currentPlayer;a&&"function"==typeof a.seek&&a.seek(i),a&&"function"==typeof a.play&&a.play()}},e.$watch("currentPlayer.duration",function(t){t&&t!==e.sliderOptions.ceil&&(e.sliderOptions.ceil=t,e.$broadcast("rzSliderForceRender"))});const a=function(t){e.$$destroyed||t&&e.$applyAsync(function(){e.currentPlayer=t,t.duration&&t.duration!==e.sliderOptions.ceil&&(e.sliderOptions.ceil=t.duration,e.$broadcast("rzSliderForceRender"))})},n=1e4,r=function(t,i){if(!t||"function"!=typeof t.seek)return;if((0,o.Qy)(i)<=0)return;const a=(0,o.Ze)(t.duration,i);if(null!==a)return void t.seek(a);let r=e.$watch(function(){return t.duration},function(a){const n=(0,o.Ze)(a,i);null!==n&&(r(),r=null,(0,o.W)(t,e.currentPlayer)&&t.seek(n))});m(function(){r&&(r(),r=null)},n,!1)};let s;e.startAtFraction=async t=>{s=await w.playPauseMain(e.post),e.$$destroyed||(a(s),r(s,t))},e.playPlaylist=async(t,i)=>{s=await w.playPlaylist(e.post,t,i),e.$$destroyed||a(s)},e.playPauseMain=async()=>{s=await w.playPauseMain(e.post),e.$$destroyed||a(s)}}g.contentItemViewed(V).catch(function(){}),b.setTitle(e.post.title)}return _}]),i(18942),i(11559);const u={modules:["discours.controllers","discours.directives","discours.components","discours.templates","angular-carousel","rzSlider"]}},28618(e,t,i){"use strict";function a(e,t){var i="number"==typeof t?t:s,a=[];if((e||[]).forEach(function(e){e&&"string"==typeof e.slug&&e.slug&&a.push({slug:e.slug,itemsCount:Number(e.itemsCount)||0})}),!a.length)return null;var o=a.filter(function(e){return e.itemsCount>=i}).sort(function(e,t){return e.itemsCount-t.itemsCount});if(o.length)return o[0];var n=a.filter(function(e){return e.itemsCount>=2}).sort(function(e,t){return t.itemsCount-e.itemsCount});return n.length?n[0]:null}function o(e,t){return e&&e.slug?{tagSlug:e.slug,relevantTo:t,perPage:20,noBody:1}:{relevantTo:t,perPage:r,noBody:1}}function n(e,t,i){var a="number"==typeof i?i:r,o=Array.isArray(e)?e.slice():[];if(!o.length)return[];var n={};(t||[]).forEach(function(e){e&&"string"==typeof e.slug&&e.slug&&(n[e.slug]=!0)});var s=o.map(function(e,t){for(var i=0,a=e&&e.tags||[],o=0;o<a.length;o+=1)a[o]&&n[a[o].slug]&&(i+=1);return{item:e,shared:i,index:t}});return s.sort(function(e,t){return t.shared!==e.shared?t.shared-e.shared:e.index-t.index}),s.slice(0,a).map(function(e){return e.item})}i.d(t,{BR:()=>a,Pr:()=>r,Qw:()=>n,o_:()=>o});var r=6,s=r+1},55381(e,t,i){function a(e,t,i){var a=document.createElement("div");a.className=i;var o=document.createElement("iframe");return o.src=t,o.setAttribute("frameborder","0"),o.setAttribute("allow","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"),o.setAttribute("allowfullscreen",""),o.setAttribute("title","Ðидео"),a.appendChild(o),e.appendChild(a),e.classList.add("iframe-loaded"),a}function o(e){var t=n(e);if(!t)return null;var i=new URL(t),a=i.pathname.match(/^\/embed\/([\w-]{6,128})$/),o=i.hostname.toLowerCase();if(!a||"www.youtube.com"!==o&&"www.youtube-nocookie.com"!==o)return null;var r={autoplay:1,rel:0,modestbranding:1,iv_load_policy:3};return i.searchParams.forEach(function(e,t){r[t]=e}),{embedUrl:t,videoId:a[1],host:"www.youtube-nocookie.com"===o?"https://www.youtube-nocookie.com":null,playerVars:r}}var n=i(37009).buildPlayerLoc,r=!1,s=[],l=!1;e.exports&&(e.exports={createVideoIframe:a,getYouTubePlayerOptions:o,playYouTube:function(e,t){if(t.stopPropagation(),e.ytPlaying)return null;var i=t.currentTarget.closest(".youtube-lazy");if(!i)return null;var a=o(e);if(!a)return null;var n=document.createElement("div");n.className="youtube-iframe-wrapper";var d=document.createElement("div");return n.appendChild(d),i.appendChild(n),e.ytPlaying=!0,e._iframeWrapper=n,function(e){if(r&&"undefined"!=typeof YT&&YT.Player)e();else{var t=!1,i=function(){t||(t=!0,clearTimeout(a),e())};s.push(i);var a=setTimeout(function(){if(!r){var e=s.indexOf(i);-1!==e&&s.splice(e,1),i()}},12e3);if(!document.querySelector('script[src*="youtube.com/iframe_api"]')){var o=document.createElement("script");
1if(o.src="https://www.youtube.com/iframe_api",document.head.appendChild(o),!l){l=!0;var n=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){r=!0,n&&n();var e=s.slice();s=[],e.forEach(function(e){e()})}}}}}(function(){if(d.parentElement){if("undefined"==typeof YT||!YT.Player){var t=document.createElement("iframe");return t.src=((o=new URL(a.embedUrl)).searchParams.set("autoplay","1"),o.searchParams.has("rel")||o.searchParams.set("rel","0"),o.toString()),t.setAttribute("frameborder","0"),t.setAttribute("allow","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"),t.setAttribute("allowfullscreen",""),t.setAttribute("title","YouTube видео"),t.style.width="100%",t.style.height="100%",d.replaceWith(t),void(i&&i.classList.add("iframe-loaded"))}var o,n={videoId:a.videoId,playerVars:a.playerVars,events:{onReady:function(e){i&&i.classList.add("iframe-loaded");try{e.target&&e.target.playVideo&&e.target.playVideo()}catch(e){}}}};a.host&&(n.host=a.host),e._ytPlayer=new YT.Player(d,n)}}),n},playVimeo:function(e,t,i){if(t.stopPropagation(),e.vimeoPlaying)return null;var o=t.currentTarget.closest(".vimeo-lazy");if(!o)return null;var n=i(e);if(!n)return null;var r=n.includes("?")?"&":"?",s=a(o,n+r+"autoplay=1","vimeo-iframe-wrapper");return e.vimeoPlaying=!0,e._iframeWrapper=s,s},getVimeoEmbedUrl:function(e){var t=n(e);return t&&"player.vimeo.com"===new URL(t).hostname.toLowerCase()?t:""},getVimeoThumbnailUrl:function(e){return e&&e.vimeoId?"https://vumbnail.com/"+String(e.vimeoId).split("/")[0]+".jpg":""},cleanupVideoIframes:function(e,t){Array.isArray(e)&&e.forEach(function(e,i){if(i!==t){if(e._ytPlayer){try{e._ytPlayer.destroy()}catch(e){}e._ytPlayer=null}if((e.ytPlaying||e.vimeoPlaying)&&e._iframeWrapper){try{e._iframeWrapper.remove()}catch(e){}e._iframeWrapper=null}e.ytPlaying=!1,e.vimeoPlaying=!1}})}})},65106(){angular.module("discours.controllers").controller("ExpoCtrl",["$scope","$log","$location","$route","expoItemsData","expoGenresData","contentItemsService","$routeParams","loginService","permissionsService","prerenderService",function(e,t,i,a,o,n,r,s,l,d,c){e.expoItems=[],e.expoGenres=n;const p="music"===a.current.params.slug?16:15;e.totalItems=o&&o.pager&&(o.pager.totalCount||o.pager.total)||0;let u=o.pager&&o.pager.currentPage||1;e.isLoggedIn=l.isLoggedIn(),e.isReader=d.isReader(),e.canViewMetrics=d.canViewEditorialMetrics();const m=new Set((e.expoItems||[]).map(function(e){return e._id}));e.expoItems=(e.expoItems||[]).concat((Array.isArray(o)?o:[]).filter(function(e){return!m.has(e._id)}));try{c.ready()}catch(e){}e.loadMoreExpoItems=function(){return e.expoItemsLoading=!0,r.query({perPage:p,page:u,type:a.current.params.slug,categorySlug:a.current.params.categorySlug,unpublished:"0",noBody:1}).then(function(i){t.debug("loadMoreExpoItems data",i);
1const a=new Set(e.expoItems.map(function(e){return e._id}));return e.expoItems=e.expoItems.concat((Array.isArray(i)?i:[]).filter(function(e){return!a.has(e._id)})),u+=1,e.expoItemsLoading=!1}).catch(function(i){t.error("loadMoreExpoItems error",i),e.expoItemsLoading=!1})},e.updateParams=function(e,t){return i.search("sort",null),i.search("filter",null),i.search(e,t)},e.title=function(){let e;switch(a.current.params.slug){case"image":e="ÐалеÑеÑ";break;case"literature":e="ÐиÑеÑаÑÑÑа";break;case"video":e="Ðидео";break;case"music":e="ÐÑзÑка"}let t=e;switch(s.sort){case"rating":t+=" / ÐопÑлÑÑное";break;case"commentedAt":t+=" / ÐбÑÑждаемое"}switch(s.filter){case"needRating":t+=" / ÐолоÑÑем";break;case"archive":t+=" / ЧÑлан"}if(s.sort||s.filter||(t+=" / Ðовое"),s.categorySlug){const e=n.find(function(e){return e.slug===s.categorySlug});e?t+=` / ${e.title}`:"anything"===s.categorySlug||s.expoSlug||(window.location.href=`${window.location.origin}/expo/${s.slug}/anything/${s.categorySlug}`)}return t},e.seoDescription=function(){let e;switch(a.current.params.slug){case"image":e="ÐÑкÑÑÑÐ°Ñ Ð³Ð°Ð»ÐµÑÐµÑ Ð¸ÑкÑÑÑÑва. ÐеÑÑÑки Ñ
Ñдожников вÑкладÑваÑÑ Ð·Ð´ÐµÑÑ Ñвои лÑÑÑие ÑабоÑÑ Ð² ÑамÑÑ
ÑазнÑÑ
жанÑаÑ
. ÐзобÑазиÑелÑное иÑкÑÑÑÑво: ÑоÑогÑаÑии, каÑÑинÑ, ÑкÑлÑпÑÑÑÑ, лиÑогÑаÑии, ÑÑÑиÑ-аÑÑ, инÑÑаллÑÑии и многое дÑÑгое. ÐÑе маÑеÑÐ¸Ð°Ð»Ñ Ð² оÑкÑÑÑой ÑкÑпозиÑии ÐиÑкÑÑÑа можно ÑмоÑÑеÑÑ, ÑиÑаÑÑ Ð¸ ÑлÑÑаÑÑ Ð±ÐµÑплаÑно и без огÑаниÑений.";break;case"literature":e="ÐиблиоÑека ÐиÑкÑÑÑа. ÐиÑеÑаÑÑÑа ÑовÑеменнÑÑ
поÑÑов, пиÑаÑелей и дÑамаÑÑÑгов. ÐÑоза и поÑзиÑ, веÑлибÑÑ Ð¸ оÑеÑки, дÑÐ°Ð¼Ñ Ð¸ ÑелÑеÑонÑ. ÐдеÑÑ Ð¶Ðµ можно пÑоÑиÑаÑÑ Ð³Ð»Ð°Ð²Ñ Ð¸Ð· Ñ
оÑоÑиÑ
новÑÑ
книг. Со вÑеми маÑеÑиалами в оÑкÑÑÑой ÑкÑпозиÑии иÑкÑÑÑÑва ÐиÑкÑÑÑа можно ознакомиÑÑÑÑ Ð°Ð±ÑолÑÑно беÑплаÑно и без огÑаниÑений.";break;case"video":e="ÐиÑÑÑалÑнÑй мÑзей кино. Ðидео авÑоÑов ÐиÑкÑÑÑа: незавиÑимое кино, мÑзÑкалÑнÑе ÐºÐ»Ð¸Ð¿Ñ Ð¸ запиÑи конÑеÑÑов, анимаÑионнÑе ÑилÑмÑ, ÑеÑиалÑ, лекÑии, ÑпекÑакли и Ñак далее. ÐÑе маÑеÑÐ¸Ð°Ð»Ñ Ð² оÑкÑÑÑой ÑкÑпозиÑии ÐиÑкÑÑÑа можно ÑмоÑÑеÑÑ, ÑиÑаÑÑ Ð¸ ÑлÑÑаÑÑ Ð±ÐµÑплаÑно и без огÑаниÑений.";break;case"music":e="ÐÑзей мÑзÑки. СлÑÑайÑе лÑÑÑÑÑ ÑоÑÑийÑкÑÑ Ð¼ÑзÑÐºÑ Ð¾Ð½Ð»Ð°Ð¹Ð½, оÑкÑÑвайÑе Ð´Ð»Ñ ÑÐµÐ±Ñ Ð½Ð¾Ð²Ñе имена, новÑÑ Ð¼ÑзÑÐºÑ Ð¾Ñ Ð°Ð²ÑоÑÑкой пеÑни до поÑÑ-дабÑÑепа. Со вÑеми маÑеÑиалами в оÑкÑÑÑой ÑкÑпозиÑии иÑкÑÑÑÑва ÐиÑкÑÑÑа можно ознакомиÑÑÑÑ Ð°Ð±ÑолÑÑно беÑплаÑно и без огÑаниÑений."}return e},e.menuClassRegex=function(e){const t=i.path();return new RegExp(e).test(t)?"active":""},e.menuClassUrl=function(e){return e===i.url()?"active":""},e.menuClass=function(e){return e===i.path()?"active":""},e.currentPath=i.path(),e.routeParams=s,"rating"===s.sort&&(e.routeQuery="?sort=rating")}])},72118(e,t,i){"use strict";function a(e,t,i,a){var o=a||"mainPartReady";const n=t(function(){if(!e[o]){r(),window.__removeSSR&&window.__removeSSR();try{i.ready()}catch(e){}}},3e3),r=e.$watch(o,function(e){if(e){r(),t.cancel(n),window.__removeSSR&&window.__removeSSR();try{i.ready()}catch(e){}}});e.$on("$destroy",function(){r(),t.cancel(n)})}i.d(t,{d:()=>a})}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.