@taiga-ui/cdk
Version:
Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance
64 lines • 14.4 kB
JavaScript
import { inject, InjectionToken } from '@angular/core';
import { toSignal } from '@angular/core/rxjs-interop';
import { WA_NAVIGATOR, WA_USER_AGENT, WA_WINDOW } from '@ng-web-apis/common';
import { isIos } from '@ng-web-apis/platform';
import { TUI_FALSE_HANDLER } from '@taiga-ui/cdk/constants';
import { fromEvent, map } from 'rxjs';
// https://stackoverflow.com/a/11381730/2706426 http://detectmobilebrowsers.com/
const firstRegex = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series([46])0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/;
const secondRegex = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br([ev])w|bumb|bw-([nu])|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do([cp])o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly([-_])|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-([mpt])|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c([- _agpst])|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac([ \-/])|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja([tv])a|jbro|jemu|jigs|kddi|keji|kgt([ /])|klon|kpt |kwc-|kyo([ck])|le(no|xi)|lg( g|\/([klu])|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t([- ov])|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30([02])|n50([025])|n7(0([01])|10)|ne(([cm])-|on|tf|wf|wg|wt)|nok([6i])|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan([adt])|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c([-01])|47|mc|nd|ri)|sgh-|shar|sie([-m])|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel([im])|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c([- ])|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/;
export const TUI_IS_MOBILE = new InjectionToken(ngDevMode ? 'TUI_IS_MOBILE' : '', {
factory: () => firstRegex.test(inject(WA_USER_AGENT).toLowerCase()) ||
secondRegex.test(inject(WA_USER_AGENT).slice(0, 4).toLowerCase()),
});
export const TUI_IS_IOS = new InjectionToken(ngDevMode ? 'TUI_IS_IOS' : '', {
factory: () => isIos(inject(WA_NAVIGATOR)),
});
export const TUI_IS_ANDROID = new InjectionToken(ngDevMode ? 'TUI_IS_ANDROID' : '', {
factory: () => inject(TUI_IS_MOBILE) && !inject(TUI_IS_IOS),
});
export const TUI_IS_WEBKIT = new InjectionToken(ngDevMode ? 'TUI_IS_WEBKIT' : '', {
factory: () => !!inject(WA_WINDOW)?.webkitConvertPointFromNodeToPage,
});
export const TUI_PLATFORM = new InjectionToken(ngDevMode ? 'TUI_PLATFORM' : '', {
factory: () => {
if (inject(TUI_IS_IOS)) {
return 'ios';
}
return inject(TUI_IS_ANDROID) ? 'android' : 'web';
},
});
export const TUI_IS_TOUCH = new InjectionToken(ngDevMode ? 'TUI_IS_TOUCH' : '', {
factory: () => {
const media = inject(WA_WINDOW).matchMedia('(pointer: coarse)');
return toSignal(fromEvent(media, 'change').pipe(map(() => media.matches)), {
initialValue: media.matches,
});
},
});
/**
* @deprecated: use only {@link TUI_IS_E2E}
* Detect if app is running under Cypress
* {@link https://docs.cypress.io/faq/questions/using-cypress-faq#Is-there-any-way-to-detect-if-my-app-is-running-under-Cypress Cypress docs}
* TODO: remove in v5
*/
export const TUI_IS_CYPRESS = new InjectionToken(ngDevMode ? 'TUI_IS_CYPRESS' : '', {
factory: () => !!inject(WA_WINDOW).Cypress,
});
/**
* @deprecated: use only {@link TUI_IS_E2E}
* Manually provide `true` when running tests in Playwright
* TODO: remove in v5
*/
export const TUI_IS_PLAYWRIGHT = new InjectionToken(ngDevMode ? 'TUI_IS_PLAYWRIGHT' : '', {
factory: TUI_FALSE_HANDLER,
});
/**
* Detect if app is running under any of test frameworks
*/
export const TUI_IS_E2E = new InjectionToken(ngDevMode ? 'TUI_IS_E2E' : '', {
factory: () => inject(TUI_IS_CYPRESS) ||
inject(TUI_IS_PLAYWRIGHT) ||
inject(WA_NAVIGATOR).webdriver,
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvdG9rZW5zL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFcEMsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSxHQUNaLDBUQUEwVCxDQUFDO0FBQy9ULE1BQU0sV0FBVyxHQUNiLGlpREFBaWlELENBQUM7QUFFdGlELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzlFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDVixVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRCxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0NBQ3hFLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0NBQzdDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDaEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7Q0FDOUQsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7SUFDOUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQU0sU0FBUyxDQUFDLEVBQUUsZ0NBQWdDO0NBQzVFLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FDMUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFDL0I7SUFDSSxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ1YsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEQsQ0FBQztDQUNKLENBQ0osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQzVFLE9BQU8sRUFBRSxHQUFHLEVBQUU7UUFDVixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFaEUsT0FBTyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFO1lBQ3ZFLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTztTQUM5QixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0osQ0FBQyxDQUFDO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ2hGLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFNLFNBQVMsQ0FBQyxDQUFDLE9BQU87Q0FDbEQsQ0FBQyxDQUFDO0FBRUg7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksY0FBYyxDQUMvQyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3BDO0lBQ0ksT0FBTyxFQUFFLGlCQUFpQjtDQUM3QixDQUNKLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0lBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDVixNQUFNLENBQUMsY0FBYyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztRQUN6QixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUztDQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdCwgSW5qZWN0aW9uVG9rZW59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0b1NpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtXQV9OQVZJR0FUT1IsIFdBX1VTRVJfQUdFTlQsIFdBX1dJTkRPV30gZnJvbSAnQG5nLXdlYi1hcGlzL2NvbW1vbic7XG5pbXBvcnQge2lzSW9zfSBmcm9tICdAbmctd2ViLWFwaXMvcGxhdGZvcm0nO1xuaW1wb3J0IHtUVUlfRkFMU0VfSEFORExFUn0gZnJvbSAnQHRhaWdhLXVpL2Nkay9jb25zdGFudHMnO1xuaW1wb3J0IHtmcm9tRXZlbnQsIG1hcH0gZnJvbSAncnhqcyc7XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMTM4MTczMC8yNzA2NDI2IGh0dHA6Ly9kZXRlY3Rtb2JpbGVicm93c2Vycy5jb20vXG5jb25zdCBmaXJzdFJlZ2V4ID1cbiAgICAvKGFuZHJvaWR8YmJcXGQrfG1lZWdvKS4rbW9iaWxlfGF2YW50Z298YmFkYVxcL3xibGFja2JlcnJ5fGJsYXplcnxjb21wYWx8ZWxhaW5lfGZlbm5lY3xoaXB0b3B8aWVtb2JpbGV8aXAoaG9uZXxvZCl8aXJpc3xraW5kbGV8bGdlIHxtYWVtb3xtaWRwfG1tcHxtb2JpbGUuK2ZpcmVmb3h8bmV0ZnJvbnR8b3BlcmEgbShvYnxpbilpfHBhbG0oIG9zKT98cGhvbmV8cChpeGl8cmUpXFwvfHBsdWNrZXJ8cG9ja2V0fHBzcHxzZXJpZXMoWzQ2XSkwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby87XG5jb25zdCBzZWNvbmRSZWdleCA9XG4gICAgLzEyMDd8NjMxMHw2NTkwfDNnc298NHRocHw1MFsxLTZdaXw3NzBzfDgwMnN8YSB3YXxhYmFjfGFjKGVyfG9vfHMtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKFtldl0pd3xidW1ifGJ3LShbbnVdKXxjNTVcXC98Y2FwaXxjY3dhfGNkbS18Y2VsbHxjaHRtfGNsZGN8Y21kLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkYy1zfGRldml8ZGljYXxkbW9ifGRvKFtjcF0pb3xkcygxMnwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFstX10pfGcxIHV8ZzU2MHxnZW5lfGdmLTV8Zy1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkLShbbXB0XSl8aGVpLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzLWN8aHQoYyhbLSBfYWdwc3RdKXx0cCl8aHUoYXd8dGMpfGktKDIwfGdvfG1hKXxpMjMwfGlhYyhbIFxcLS9dKXxpYnJvfGlkZWF8aWcwMXxpa29tfGltMWt8aW5ub3xpcGFxfGlyaXN8amEoW3R2XSlhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoWyAvXSl8a2xvbnxrcHQgfGt3Yy18a3lvKFtja10pfGxlKG5vfHhpKXxsZyggZ3xcXC8oW2tsdV0pfDUwfDU0fC1bYS13XSl8bGlid3xseW54fG0xLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFstIG92XSl8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKFswMl0pfG41MChbMDI1XSl8bjcoMChbMDFdKXwxMCl8bmUoKFtjbV0pLXxvbnx0Znx3Znx3Z3x3dCl8bm9rKFs2aV0pfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKFthZHRdKXxwZHhnfHBnKDEzfC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG4tMnxwbyhja3xydHxzZSl8cHJveHxwc2lvfHB0LWd8cWEtYXxxYygwN3wxMnwyMXwzMnw2MHwtWzItN118aS0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoLXxvb3xwLSl8c2RrXFwvfHNlKGMoWy0wMV0pfDQ3fG1jfG5kfHJpKXxzZ2gtfHNoYXJ8c2llKFstbV0pfHNrLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aC18di18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2wtfHRkZy18dGVsKFtpbV0pfHRpbS18dC1tb3x0byhwbHxzaCl8dHMoNzB8bS18bTN8bTUpfHR4LTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfC12KXx2bTQwfHZvZGF8dnVsY3x2eCg1Mnw1M3w2MHw2MXw3MHw4MHw4MXw4M3w4NXw5OCl8dzNjKFstIF0pfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzLXx5b3VyfHpldG98enRlLS87XG5cbmV4cG9ydCBjb25zdCBUVUlfSVNfTU9CSUxFID0gbmV3IEluamVjdGlvblRva2VuKG5nRGV2TW9kZSA/ICdUVUlfSVNfTU9CSUxFJyA6ICcnLCB7XG4gICAgZmFjdG9yeTogKCkgPT5cbiAgICAgICAgZmlyc3RSZWdleC50ZXN0KGluamVjdChXQV9VU0VSX0FHRU5UKS50b0xvd2VyQ2FzZSgpKSB8fFxuICAgICAgICBzZWNvbmRSZWdleC50ZXN0KGluamVjdChXQV9VU0VSX0FHRU5UKS5zbGljZSgwLCA0KS50b0xvd2VyQ2FzZSgpKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgVFVJX0lTX0lPUyA9IG5ldyBJbmplY3Rpb25Ub2tlbihuZ0Rldk1vZGUgPyAnVFVJX0lTX0lPUycgOiAnJywge1xuICAgIGZhY3Rvcnk6ICgpID0+IGlzSW9zKGluamVjdChXQV9OQVZJR0FUT1IpKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgVFVJX0lTX0FORFJPSUQgPSBuZXcgSW5qZWN0aW9uVG9rZW4obmdEZXZNb2RlID8gJ1RVSV9JU19BTkRST0lEJyA6ICcnLCB7XG4gICAgZmFjdG9yeTogKCkgPT4gaW5qZWN0KFRVSV9JU19NT0JJTEUpICYmICFpbmplY3QoVFVJX0lTX0lPUyksXG59KTtcblxuZXhwb3J0IGNvbnN0IFRVSV9JU19XRUJLSVQgPSBuZXcgSW5qZWN0aW9uVG9rZW4obmdEZXZNb2RlID8gJ1RVSV9JU19XRUJLSVQnIDogJycsIHtcbiAgICBmYWN0b3J5OiAoKSA9PiAhIWluamVjdDxhbnk+KFdBX1dJTkRPVyk/LndlYmtpdENvbnZlcnRQb2ludEZyb21Ob2RlVG9QYWdlLFxufSk7XG5cbmV4cG9ydCBjb25zdCBUVUlfUExBVEZPUk0gPSBuZXcgSW5qZWN0aW9uVG9rZW48J2FuZHJvaWQnIHwgJ2lvcycgfCAnd2ViJz4oXG4gICAgbmdEZXZNb2RlID8gJ1RVSV9QTEFURk9STScgOiAnJyxcbiAgICB7XG4gICAgICAgIGZhY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmplY3QoVFVJX0lTX0lPUykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2lvcyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBpbmplY3QoVFVJX0lTX0FORFJPSUQpID8gJ2FuZHJvaWQnIDogJ3dlYic7XG4gICAgICAgIH0sXG4gICAgfSxcbik7XG5cbmV4cG9ydCBjb25zdCBUVUlfSVNfVE9VQ0ggPSBuZXcgSW5qZWN0aW9uVG9rZW4obmdEZXZNb2RlID8gJ1RVSV9JU19UT1VDSCcgOiAnJywge1xuICAgIGZhY3Rvcnk6ICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVkaWEgPSBpbmplY3QoV0FfV0lORE9XKS5tYXRjaE1lZGlhKCcocG9pbnRlcjogY29hcnNlKScpO1xuXG4gICAgICAgIHJldHVybiB0b1NpZ25hbChmcm9tRXZlbnQobWVkaWEsICdjaGFuZ2UnKS5waXBlKG1hcCgoKSA9PiBtZWRpYS5tYXRjaGVzKSksIHtcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZTogbWVkaWEubWF0Y2hlcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkOiB1c2Ugb25seSB7QGxpbmsgVFVJX0lTX0UyRX1cbiAqIERldGVjdCBpZiBhcHAgaXMgcnVubmluZyB1bmRlciBDeXByZXNzXG4gKiB7QGxpbmsgaHR0cHM6Ly9kb2NzLmN5cHJlc3MuaW8vZmFxL3F1ZXN0aW9ucy91c2luZy1jeXByZXNzLWZhcSNJcy10aGVyZS1hbnktd2F5LXRvLWRldGVjdC1pZi1teS1hcHAtaXMtcnVubmluZy11bmRlci1DeXByZXNzIEN5cHJlc3MgZG9jc31cbiAqIFRPRE86IHJlbW92ZSBpbiB2NVxuICovXG5leHBvcnQgY29uc3QgVFVJX0lTX0NZUFJFU1MgPSBuZXcgSW5qZWN0aW9uVG9rZW4obmdEZXZNb2RlID8gJ1RVSV9JU19DWVBSRVNTJyA6ICcnLCB7XG4gICAgZmFjdG9yeTogKCkgPT4gISFpbmplY3Q8YW55PihXQV9XSU5ET1cpLkN5cHJlc3MsXG59KTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZDogdXNlIG9ubHkge0BsaW5rIFRVSV9JU19FMkV9XG4gKiBNYW51YWxseSBwcm92aWRlIGB0cnVlYCB3aGVuIHJ1bm5pbmcgdGVzdHMgaW4gUGxheXdyaWdodFxuICogVE9ETzogcmVtb3ZlIGluIHY1XG4gKi9cbmV4cG9ydCBjb25zdCBUVUlfSVNfUExBWVdSSUdIVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPihcbiAgICBuZ0Rldk1vZGUgPyAnVFVJX0lTX1BMQVlXUklHSFQnIDogJycsXG4gICAge1xuICAgICAgICBmYWN0b3J5OiBUVUlfRkFMU0VfSEFORExFUixcbiAgICB9LFxuKTtcblxuLyoqXG4gKiBEZXRlY3QgaWYgYXBwIGlzIHJ1bm5pbmcgdW5kZXIgYW55IG9mIHRlc3QgZnJhbWV3b3Jrc1xuICovXG5leHBvcnQgY29uc3QgVFVJX0lTX0UyRSA9IG5ldyBJbmplY3Rpb25Ub2tlbihuZ0Rldk1vZGUgPyAnVFVJX0lTX0UyRScgOiAnJywge1xuICAgIGZhY3Rvcnk6ICgpID0+XG4gICAgICAgIGluamVjdChUVUlfSVNfQ1lQUkVTUykgfHxcbiAgICAgICAgaW5qZWN0KFRVSV9JU19QTEFZV1JJR0hUKSB8fFxuICAgICAgICBpbmplY3QoV0FfTkFWSUdBVE9SKS53ZWJkcml2ZXIsXG59KTtcbiJdfQ==