text:
CGFloat X_BUFFER = 30.0; //%%% the number of pixels on either side of the segment
CGFloat Y_BUFFER = 14.0; //%%% number of pixels on top of the segment
CGFloat HEIGHT = 30.0; //%%% height of the segment

//%%% customizeable selector bar attributes (the black bar under the buttons)
CGFloat BOUNCE_BUFFER = 10.0; //%%% adds bounce to the selection bar when you scroll
CGFloat ANIMATION_SPEED = 0.2; //%%% the number of seconds it takes to complete the animation
CGFloat SELECTOR_HEIGHT = 4.0; //%%% thickness of the selector bar

CGFloat X_OFFSET = 8.0; //%%% for some reason there's a little bit of a glitchy offset.  I'm going to look for a better workaround in the future

@interface RKSwipableViewController ()

@property (nonatomic) UIScrollView *pageScrollView;
@property (nonatomic) long currentPageIndex;

@property (nonatomic) BOOL hasAppearedFlag;         //%%% prevents reloading (maintains state)
@end

@implementation RKSwipableViewController
@synthesize selectionBar;
@synthesize pageController = _pageController;
@synthesize segmentContainerScrollView;
@synthesize currentPageIndex = _currentPageIndex;
@synthesize swipableViewControllers = _swipableViewControllers;

BOOL doStopSegmentScrolling = NO;
BOOL isPageScrollingFlag = NO;              //%%% prevents scrolling / segment tap crash
bool isSegmentScrolledOverBoundary = NO;    // flag that indicates "over boundary," determines whether scrolling end-to-end or not)

#pragma mark Properties
- (NSMutableArray *)swipableViewControllers {
    if(_swipableViewControllers == nil)
        _swipableViewControllers = [[NSMutableArray alloc] init];
    long numberofVC = [self.dataSource numberOfViewControllers:self];
    while(_swipableViewControllers.count < numberofVC) {
        [_swipableViewControllers addObject:[NSNull null]];
    }
    return _swipableViewControllers;
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self) {
        [self initialize];
    }
    return self;
}

// for revived from storyboard
- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if(self) {
        [self initialize];
    }
    return self;
}

- (void)initialize {
    self.enablesScrollingOverEdge = NO;
    self.isScrolledWhenTapSegment = NO;
    self.isSegmentSizeFixed = NO;
    self.shouldSelectedButtonCentered = NO;
    self.segmentButtonHeight = 44.0f;
    self.segmentButtonMarginWidth = 10.0f;
    self.segmentButtonEdgeMarginWidth = 5.0f;
    self.doUpdateNavigationTitleWithSwipedViewController = NO;
    UIPageViewController *pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
                                                                           navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
                                                                                options:nil];
    _pageController = pageController;
    [self setViewControllers:@[pageController]];
    isPageScrollingFlag = NO;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
//    self.navigationBar.barTintColor = [UIColor colorWithRed:0.01 green:0.05 blue:0.06 alpha:1]; //%%% bartint
//    self.navigationBar.translucent = NO;
    self.hasAppearedFlag = NO;
}

- (void)viewWillAppear:(BOOL)animated {
    if (!self.hasAppearedFlag) {
        [self setupPageViewController];
        [self setupSegmentButtons];
        [self syncScrollView];
        self.hasAppearedFlag = YES;
        self.currentPageIndex = 0;
        UIViewController *vcToBeShown = [self.dataSource swipableViewController:self viewControllerAt:_currentPageIndex];
        [_pageController setViewControllers:@[vcToBeShown]
                                  direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    [self setupConstraints];

    // workaround: prevent from crashing on iOS 7
    [self.view layoutIfNeeded];
}

#pragma mark Customizables

//%%% color of the status bar
- (UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
//    return UIStatusBarStyleDefault;
}

//%%% sets up the tabs using a loop.  You can take apart the loop to customize individual buttons, but remember to tag the buttons.  (button.tag=0 and the second button.tag=1, etc)
- (void)setupSegmentButtons {
    // set sizes of segment container & swipable area (by UIPageController)
    CGRect segmentBounds = CGRectMake(0,
                                      -self.segmentButtonHeight,
                                      self.view.frame.size.width,
                                      self.segmentButtonHeight);
    segmentContainerScrollView = [[UIScrollView alloc] initWithFrame:segmentBounds];
    NSInteger numControllers = [self.dataSource numberOfViewControllers:self];
    NSAssert([self.dataSource respondsToSelector:@selector(swipableViewController:segmentTextAt:)] ||
             [self.dataSource respondsToSelector:@selector(swipableViewController:segmentButtonAt:)],
             @"RKSwipableViewControllerDataSource should return texts of segments or buttons");
    CGRect baseFrame = CGRectMake(self.segmentButtonEdgeMarginWidth,0,0,0);
    for (int i=0; i<numControllers; i++) {
        if([self.dataSource respondsToSelector:@selector(swipableViewController:segmentTextAt:)]) {
            NSString *segmentTitle = [self.dataSource swipableViewController:self segmentTextAt:i];
            UIButton *button = [[UIButton alloc] init];
            button.tag = [self tagByButtonIndex:i]; //%%% IMPORTANT: if you make your own custom buttons, you have to tag them appropriately
            button.backgroundColor = self.segmentButtonBackgroundColor;
            [button setTitleColor:self.segmentButtonTextColor forState:UIControlStateNormal];
            [button setTitleColor:self.selectionBarColor forState:UIControlStateSelected];
            [button addTarget:self action:@selector(tapSegmentButton:) forControlEvents:UIControlEventTouchUpInside];
            [button setTitle:segmentTitle forState:UIControlStateNormal]; //%%%buttontitle
            button.titleLabel.font = [UIFont systemFontOfSize:15];
            CGSize fitSize = [button sizeThatFits:segmentBounds.size];
            if(self.isSegmentSizeFixed) {
                fitSize.width = self.segmentButtonWidth;
            } else {
                if(fitSize.width < self.segmentButtonMinimumWidth)
                    fitSize.width = self.segmentButtonMinimumWidth;
            }
            baseFrame.size = fitSize;
            baseFrame.origin.y = (segmentContainerScrollView.frame.size.height - fitSize.height - SELECTOR_HEIGHT) / 2;
            [button setFrame:baseFrame];
            baseFrame.origin.x += fitSize.width + self.segmentButtonMarginWidth;
            [segmentContainerScrollView addSubview:button];
        } if([self.dataSource respondsToSelector:@selector(swipableViewController:segmentButtonAt:)]) {
            for(int i=0; i<numControllers; i++) {
                UIButton *button = [self.dataSource swipableViewController:self segmentButtonAt:i];
                button.tag = [self tagByButtonIndex:i];
                [button removeTarget:self action:@selector(tapSegmentButton:) forControlEvents:UIControlEventTouchUpInside];  // if exists, get rid of it
                [button addTarget:self action:@selector(tapSegmentButton:) forControlEvents:UIControlEventTouchUpInside];
                baseFrame.size = button.frame.size;
                [segmentContainerScrollView addSubview:button];
                baseFrame.origin.x += button.frame.size.width + self.segmentButtonMarginWidth;
            }
        }
    }
    // end position of width of content should be affected by segmentButtonEdgeMarginWidth
    float contentWidth = baseFrame.origin.x - self.segmentButtonMarginWidth + self.segmentButtonEdgeMarginWidth;
    segmentContainerScrollView.contentSize = CGSizeMake(contentWidth, self.segmentButtonHeight);
    segmentContainerScrollView.scrollEnabled = YES;
    segmentContainerScrollView.scrollsToTop = NO;
    segmentContainerScrollView.showsHorizontalScrollIndicator = NO;
    segmentContainerScrollView.showsVerticalScrollIndicator = NO;
    segmentContainerScrollView.alwaysBounceVertical = NO;
    segmentContainerScrollView.minimumZoomScale = 1;
    segmentContainerScrollView.maximumZoomScale = 1;
    segmentContainerScrollView.clipsToBounds = YES;
    segmentContainerScrollView.backgroundColor = self.segmentContainerScrollViewBackgroundColor;

    [self.pageController.view addSubview:segmentContainerScrollView];
    self.pageController.view.clipsToBounds = NO;
    self.pageController.view.tag = RK_PAGE_CONTROLLER_VIEW_TAG;

    /////////////////
    // setup selector
    UIView *firstButton = [self.segmentContainerScrollView viewWithTag:[self tagByButtonIndex:0]];
    float selectionBarY = segmentContainerScrollView.frame.size.height - SELECTOR_HEIGHT - 1;
    selectionBar = [[UIView alloc] initWithFrame:CGRectMake(firstButton.frame.origin.x,selectionBarY,firstButton.frame.size.width,SELECTOR_HEIGHT)];
    selectionBar.backgroundColor = self.selectionBarColor;
    selectionBar.alpha = 0.8; //%%% sbalpha
    [segmentContainerScrollView addSubview:selectionBar];

    /////////////////
    // setup border
    UIView *border = [[UIView alloc] initWithFrame:CGRectMake(-segmentContainerScrollView.frame.size.width, self.segmentButtonHeight-1, segmentContainerScrollView.contentSize.width + segmentContainerScrollView.frame.size.width * 2, 1)];
    border.backgroundColor = [UIColor colorWithWhite:0.66f alpha:1];
    [segmentContainerScrollView addSubview:border];
}

- (long)tagByButtonIndex:(long)buttonIndex {
    if(buttonIndex < 0)
        return TAG_BUTTON_INDEX + buttonIndex + [self.dataSource numberOfViewControllers:self];
    else
        return TAG_BUTTON_INDEX + buttonIndex;
}

- (long)buttonIndexByTag:(long)tag {
    return tag - TAG_BUTTON_INDEX;
}

- (void)setupConstraints {
    if(_pageController == self.visibleViewController) {
        segmentContainerScrollView.translatesAutoresizingMaskIntoConstraints = NO;
        _pageController.view.translatesAutoresizingMaskIntoConstraints = NO;

        NSLayoutConstraint *c;
//        c = [NSLayoutConstraint constraintWithItem:segmentContainerScrollView
//                                         attribute:NSLayoutAttributeBottom
//                                         relatedBy:NSLayoutRelationEqual
//                                            toItem:_pageController.view
//                                         attribute:NSLayoutAttributeTop
//                                        multiplier:1
//                                          constant:0];
//        [_pageController.view addConstraint:c];
//        c = [NSLayoutConstraint constraintWithItem:segmentContainerScrollView
//                                         attribute:NSLayoutAttributeLeft
//                                         relatedBy:NSLayoutRelationEqual
//                                            toItem:_pageController.view
//                                         attribute:NSLayoutAttributeLeft
//                                        multiplier:1
//                                          constant:0];
//        [self.view addConstraint:c];
//        c = [NSLayoutConstraint constraintWithItem:segmentContainerScrollView
//                                         attribute:NSLayoutAttributeRight
//                                         relatedBy:NSLayoutRelationEqual
//                                            toItem:_pageController.view
//                                         attribute:NSLayoutAttributeRight
//                                        multiplier:1
//                                          constant:0];
//        [self.view addConstraint:c];
//        c = [NSLayoutConstraint constraintWithItem:segmentContainerScrollView
//                                         attribute:NSLayoutAttributeHeight
//                                         relatedBy:NSLayoutRelationEqual
//                                            toItem:nil
//                                         attribute:NSLayoutAttributeNotAnAttribute
//                                        multiplier:1
//                                          constant:self.segmentButtonHeight];
//        [self.view addConstraint:c];
        c = [NSLayoutConstraint constraintWithItem:_pageController.view
                                         attribute:NSLayoutAttributeTop
                                         relatedBy:NSLayoutRelationEqual
                                            toItem:self.navigationBar
                                         attribute:NSLayoutAttributeBottom
                                        multiplier:1
                                          constant:self.segmentButtonHeight];
        [self.view addConstraint:c];
        c = [NSLayoutConstraint constraintWithItem:_pageController.view
                                         attribute:NSLayoutAttributeLeft
                                         relatedBy:NSLayoutRelationEqual
                                            toItem:self.view
                                         attribute:NSLayoutAttributeLeft
                                        multiplier:1
                                          constant:0];
        [self.view addConstraint:c];
        c = [NSLayoutConstraint constraintWithItem:_pageController.view
                                         attribute:NSLayoutAttributeRight
                                         relatedBy:NSLayoutRelationEqual
                                            toItem:self.view
                                         attribute:NSLayoutAttributeRight
                                        multiplier:1
                                          constant:0];
        [self.view addConstraint:c];
        c = [NSLayoutConstraint constraintWithItem:_pageController.view
                                         attribute:NSLayoutAttributeBottom
                                         relatedBy:NSLayoutRelationEqual
                                            toItem:self.view
                                         attribute:NSLayoutAttributeBottom
                                        multiplier:1
                                          constant:0];
        [self.view addConstraint:c];
    }
}

//generally, this shouldn't be changed unless you know what you're changing
#pragma mark Setup

//%%% generic setup stuff for a pageview controller.  Sets up the scrolling style and delegate for the controller
- (void)setupPageViewController {
    _pageController.delegate = self;
    _pageController.dataSource = self;
//    UIViewController *vcToBeShown = [self.dataSource swipableViewController:self viewControllerAt:0];
//    [_pageController setViewControllers:@[vcToBeShown] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
}

//%%% this allows us to get information back from the scrollview, namely the coordinate information that we can link to the selection bar.
- (void)syncScrollView {
    for (UIView* view in _pageController.view.subviews) {
        if([view isKindOfClass:[UIScrollView class]] && view != self.segmentContainerScrollView) {
            self.pageScrollView = (UIScrollView *)view;
            self.pageScrollView.delegate = self;
        }
    }
}

//%%% methods called when you tap a button or scroll through the pages
// generally shouldn't touch this unless you know what you're doing or
// have a particular performance thing in mind

#pragma mark Movement
- (void)tapSegmentButtonIndex:(long)index animated:(BOOL)animated {
    for(UIView *v in self.segmentContainerScrollView.subviews) {
        if([self buttonIndexByTag:v.tag] == index) {
            UIButton *button = (UIButton *)v;
            [self tapSegmentButton:button animated:animated];
        }
    }
}

//%%% when you tap one of the buttons, it shows that page,
//but it also has to animate the other pages to make it feel like you're crossing a 2d expansion,
//so there's a loop that shows every view controller in the array up to the one you selected
//eg: if you're on page 1 and you click tab 3, then it shows you page 2 and then page 3
- (void)tapSegmentButton:(UIButton *)button {
    [self tapSegmentButton:button animated:self.isScrolledWhenTapSegment];
}

- (void)tapSegmentButton:(UIButton *)button animated:(BOOL)animated {
    NSInteger currentButtonTag = [self tagByButtonIndex:_currentPageIndex];
    __weak typeof(self) weakSelf = self;
    if (!isPageScrollingFlag) {
        //%%% check to see if you're going left -> right or right -> left
        if (button.tag > currentButtonTag) {
            if(animated) {
                doStopSegmentScrolling = YES;
                //%%% scroll through all the objects between the two points
                for (int tag = (int)currentButtonTag+1; tag<=button.tag; tag++) {
                    long buttonIndex = [self buttonIndexByTag:tag];
                    UIViewController *vcToBeShown = [self.dataSource swipableViewController:self viewControllerAt:buttonIndex];
                    [_pageController setViewControllers:@[vcToBeShown]
                                              direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished)
                    {
                        //%%% if the action finishes scrolling (i.e. the user doesn't stop it in the middle),
                        //then it updates the page that it's currently on
                        if (finished) {
                            [weakSelf setCurrentPageIndex:buttonIndex];
                            if(tag == button.tag) {
                                doStopSegmentScrolling = NO;
                            }
                        }
                    }];
                }
            } else {
                doStopSegmentScrolling = NO;
                long buttonIndex = [self buttonIndexByTag:button.tag];
                UIViewController *vcToBeShown = [self.dataSource swipableViewController:self viewControllerAt:buttonIndex];
                [_pageController setViewControllers:@[vcToBeShown]
                                          direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:^(BOOL finished) {
                                              if (finished) {
                                                  [weakSelf setCurrentPageIndex:buttonIndex];
                                                  [weakSelf scrollViewDidScroll:weakSelf.pageScrollView];
                                              }
                                          }];
            }
        }
        //%%% this is the same thing but for going right -> left
        else if (button.tag < currentButtonTag) {
            if(animated) {
                doStopSegmentScrolling = YES;
                for (int tag = (int)currentButtonTag-1; tag >= button.tag; tag--) {
                    long buttonIndex = [self buttonIndexByTag:tag];
                    UIViewController *vcToBeShown = [self.dataSource swipableViewController:self viewControllerAt:buttonIndex];
                    [_pageController setViewControllers:@[vcToBeShown] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:^(BOOL complete){
                        if (complete) {
                            [weakSelf setCurrentPageIndex:buttonIndex];
                            if(tag == button.tag) {
                                doStopSegmentScrolling = NO;
                            }
                        }
                    }];
                }
            } else {
                doStopSegmentScrolling = NO;
                long buttonIndex = [self buttonIndexByTag:button.tag];
                UIViewController *vcToBeShown = [self.dataSource swipableViewController:self viewControllerAt:buttonIndex];
                [_pageController setViewControllers:@[vcToBeShown] direction:UIPageViewControllerNavigationDirectionReverse animated:NO completion:^(BOOL complete){
                    if (complete) {
                        [weakSelf setCurrentPageIndex:buttonIndex];
                        [weakSelf scrollViewDidScroll:weakSelf.pageScrollView];
                    }
                }];
            }
        }
    }
}

//%%% makes sure the nav bar is always aware of what page you're on
//in reference to the array of view controllers you gave
- (void)setCurrentPageIndex:(long)newCurrentPageIndex {
    _currentPageIndex = newCurrentPageIndex;
    for(UIButton *btn in self.segmentContainerScrollView.subviews) {
        if([btn isMemberOfClass:[UIButton class]]) {
            long buttonIndex = [self buttonIndexByTag:btn.tag];
            btn.selected = buttonIndex == newCurrentPageIndex;
        }
    }
    if(self.doUpdateNavigationTitleWithSwipedViewController) {
        [self setNavigationBarTitle:[self.dataSource swipableViewController:self viewControllerAt:newCurrentPageIndex].title];
    }
}

//%%% method is called when any of the pages moves.
//It extracts the xcoordinate from the center point and instructs the selection bar to move accordingly
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat xFromCenter = self.view.frame.size.width - scrollView.contentOffset.x; //%%% positive for right swipe, negative for left
    CGFloat ratio = -1 * xFromCenter / self.view.frame.size.width;
    CGFloat absRatio = fabs(xFromCenter / self.view.frame.size.width);
    UIView *selectedButton = [self.segmentContainerScrollView viewWithTag:[self tagByButtonIndex:_currentPageIndex]];
    UIView *maybeSelectedButton = selectedButton;
    long vcCount = [self.dataSource numberOfViewControllers:self];
    NSAssert(0 <= _currentPageIndex && _currentPageIndex < vcCount, @"currentPageIndex over boundary: %ld", _currentPageIndex);
    CGRect buttonFrame = selectedButton.frame;
    CGRect selectionBarFrame = selectionBar.frame;
    selectionBarFrame.origin.x = buttonFrame.origin.x;
    if(ratio < 0 && _currentPageIndex == 0) {
        // over to left
        if(isSegmentScrolledOverBoundary) {
            maybeSelectedButton = [self.segmentContainerScrollView viewWithTag:[self tagByButtonIndex:(vcCount-1)]];
            selectionBarFrame.origin.x = selectedButton.frame.origin.x + pow(absRatio,2) * (maybeSelectedButton.frame.origin.x);
        } else {
            selectionBarFrame.origin.x += absRatio * (-buttonFrame.size.width);
        }
    } else if(ratio > 0 && _currentPageIndex == vcCount-1) {
        // over to right
        if(isSegmentScrolledOverBoundary) {
            maybeSelectedButton = [self.segmentContainerScrollView viewWithTag:[self tagByButtonIndex:0]];
            selectionBarFrame.origin.x = selectedButton.frame.origin.x - (pow(absRatio,2) * selectedButton.frame.origin.x);
        } else {
            selectionBarFrame.origin.x += absRatio * (buttonFrame.size.width);
        }
    } else {
        if(ratio > 0)
            maybeSelectedButton = [self.segmentContainerScrollView viewWithTag:[self tagByButtonIndex:_currentPageIndex + 1]];
        if(ratio < 0)
            maybeSelectedButton = [self.segmentContainerScrollView viewWithTag:[self tagByButtonIndex:_currentPageIndex - 1]];
        selectionBarFrame.origin.x += absRatio * (maybeSelectedButton.frame.origin.x - buttonFrame.origin.x);
    }
    selectionBarFrame.size.width = (1-absRatio) * buttonFrame.size.width + absRatio * maybeSelectedButton.frame.size.width;
    selectionBar.frame = selectionBarFrame;
//    //%%% checks to see what page you are on and adjusts the xCoor accordingly.
//    //i.e. if you're on the second page, it makes sure that the bar starts from the frame.origin.x of the
//    //second tab instead of the beginning
//    NSInteger xCoor = X_BUFFER+selectionBar.frame.size.width*self.currentPageIndex-X_OFFSET;
//
//    selectionBar.frame = CGRectMake(xCoor-xFromCenter/[viewControllerArray count], selectionBar.frame.origin.y, selectionBar.frame.size.width, selectionBar.frame.size.height);

    // Forcely scrolls segment container(=menu bar) according to selectionBar's frame.
    CGPoint contentOffset = self.segmentContainerScrollView.contentOffset;
    CGRect scrollViewFrame = self.segmentContainerScrollView.frame;
    float leftX = selectionBarFrame.origin.x;
    float rightX = selectionBarFrame.origin.x + selectionBarFrame.size.width;
    if(self.shouldSelectedButtonCentered) {
        float centerXInContentView = self.selectionBar.frame.origin.x + (self.selectionBar.frame.size.width / 2);
        CGPoint contentOffset = self.segmentContainerScrollView.contentOffset;
        contentOffset.x = centerXInContentView - (self.segmentContainerScrollView.frame.size.width / 2);
        float maxContentOffsetX = self.segmentContainerScrollView.contentSize.width - self.segmentContainerScrollView.frame.size.width;
        if(contentOffset.x < 0)
            contentOffset.x = 0;
        else if(contentOffset.x > maxContentOffsetX)
            contentOffset.x = maxContentOffsetX;
        self.segmentContainerScrollView.contentOffset = contentOffset;
    } else {
        if(!doStopSegmentScrolling) {
            // scroll to left
            if(leftX < contentOffset.x) {
                if(leftX < 0)
                    contentOffset.x = 0;
                else
                    contentOffset.x = leftX;
                contentOffset.x -= self.segmentButtonMarginWidth;
                self.segmentContainerScrollView.contentOffset = contentOffset;
            }
            // scroll to right
            float segmentContainerWidth = self.segmentContainerScrollView.frame.origin.x + segmentContainerScrollView.contentSize.width;
            if(rightX > contentOffset.x + scrollViewFrame.size.width) {
                if(rightX > segmentContainerWidth) {
                    contentOffset.x = segmentContainerWidth - scrollViewFrame.size.width;
                }
                else {
                    contentOffset.x = selectionBarFrame.origin.x + selectionBarFrame.size.width - scrollViewFrame.size.width;
                }
                self.segmentContainerScrollView.contentOffset = contentOffset;
            }
        }
    }
}

#pragma mark - ETC
- (void)setNavigationBarTitle:(NSString *)title {
    _pageController.title = title;
}

//%%% the delegate functions for UIPageViewController.
//Pretty standard, but generally, don't touch this.
#pragma mark - UIPageViewController Delegate
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed {
    if (completed) {
        UIViewController *shownVC = [pageViewController.viewControllers lastObject];
        [self setCurrentPageIndex:[self.dataSource swipableViewController:self indexOfViewController:shownVC]];
    }
}

#pragma mark - UIPageViewController Data Source
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
    long vcCount = [self.dataSource numberOfViewControllers:self];
    long index = [self.dataSource swipableViewController:self indexOfViewController:viewController];
    if (index == 0) {
        if (self.enablesScrollingOverEdge)
            return [self.dataSource swipableViewController:self viewControllerAt:vcCount - 1];
        else
            return nil;
    }
    return [self.dataSource swipableViewController:self viewControllerAt:index - 1];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
    long vcCount = [self.dataSource numberOfViewControllers:self];
    long index = [self.dataSource swipableViewController:self indexOfViewController:viewController];
    if (index == vcCount - 1) {
        if (self.enablesScrollingOverEdge)
            return [self.dataSource swipableViewController:self viewControllerAt:0];
        else
            return nil;
    }
    return [self.dataSource swipableViewController:self viewControllerAt:index + 1];
}

#pragma mark - Scroll View Delegate

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    isPageScrollingFlag = YES;
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0) {
    long vcCount = [self.dataSource numberOfViewControllers:self];
    UIView *scrollTargetButton = nil;
    UIView *scrollSourceButton = nil;
    // to left at first page
    if(targetContentOffset->x == 0 && _currentPageIndex == 0) {
        scrollSourceButton = [segmentContainerScrollView viewWithTag:[self tagByButtonIndex:0]];
        scrollTargetButton = [segmentContainerScrollView viewWithTag:[self tagByButtonIndex:(vcCount-1)]];
    }
    // to right at last page
    if(targetContentOffset->x >= scrollView.frame.size.width*1.5 && _currentPageIndex == (vcCount-1)) {
        scrollSourceButton = [segmentContainerScrollView viewWithTag:[self tagByButtonIndex:(vcCount-1)]];
        scrollTargetButton = [segmentContainerScrollView viewWithTag:[self tagByButtonIndex:0]];
    }
    if(scrollSourceButton && scrollTargetButton) {
        isSegmentScrolledOverBoundary = YES;
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    isPageScrollingFlag = NO;
    isSegmentScrolledOverBoundary = NO;
    doStopSegmentScrolling = NO;
}

@end

@implementation UIView (RKSwipableViewController_FakePointInside)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Method pointInside = class_getInstanceMethod([UIView class], @selector(pointInside:withEvent:));
        Method originalPointInside = class_getInstanceMethod([UIView class], @selector(odk_originalPointInside:withEvent:));
        Method fakePointInside = class_getInstanceMethod([UIView class], @selector(odk_fakePointInside:withEvent:));
        method_setImplementation(originalPointInside, method_getImplementation(pointInside));
        method_setImplementation(pointInside, method_getImplementation(fakePointInside));
    });
}

- (BOOL)odk_originalPointInside:(CGPoint)point withEvent:(UIEvent *)event {
    return [self odk_originalPointInside:point withEvent:event];
}

- (BOOL)odk_fakePointInside:(CGPoint)point withEvent:(UIEvent *)event {
    if([self odk_originalPointInside:point withEvent:event])
        return YES;
    // if Page Controller view
    if(self.tag == RK_PAGE_CONTROLLER_VIEW_TAG) {
        for(UIView *v in self.subviews) {
            CGPoint converted = [v convertPoint:point fromView:self];
            if([v odk_originalPointInside:converted withEvent:event])
                return YES;
        }
    }
    return NO;
}

@end


text:
from direct.controls.ControlManager import CollisionHandlerRayStart
from direct.directnotify import DirectNotifyGlobal
from pandac.PandaModules import *
from direct.task.Task import Task
from direct.showbase.DirectObject import DirectObject
from direct.showbase.ShadowPlacer import ShadowPlacer

class CogdoFlyingShadowPlacer(ShadowPlacer):

    def __init__(self, cTrav, shadowNodePath, wallCollideMask, floorCollideMask, name):
        ShadowPlacer.__init__(self, cTrav, shadowNodePath, wallCollideMask, floorCollideMask)
        self.name = name

    def setup(self, cTrav, shadowNodePath, wallCollideMask, floorCollideMask):
        if not cTrav:
            base.initShadowTrav()
            cTrav = base.shadowTrav
        self.cTrav = cTrav
        self.shadowNodePath = shadowNodePath
        floorOffset = 0.025
        self.cRay = CollisionRay(0.0, 0.0, 1.0, 0.0, 0.0, -1.0)
        cRayNode = CollisionNode('shadowPlacer')
        cRayNode.addSolid(self.cRay)
        self.cRayNodePath = NodePath(cRayNode)
        self.cRayBitMask = floorCollideMask
        cRayNode.setFromCollideMask(self.cRayBitMask)
        cRayNode.setIntoCollideMask(BitMask32.allOff())
        self.queue = CollisionHandlerQueue()

    def update(self):
        self.cTrav.traverse(render)
        self.queue.sortEntries()
        if self.queue.getNumEntries() > 0:
            entry = self.queue.getEntry(0)
            pos = entry.getSurfacePoint(render)
            self.shadowNodePath.setPos(render, pos)
        return Task.cont

    def delete(self):
        self.off()
        del self.cTrav
        del self.shadowNodePath
        del self.cRay
        self.cRayNodePath.removeNode()
        del self.cRayNodePath
        del self.queue

    def on(self):
        if self.isActive:
            return
        self.cRayNodePath.reparentTo(self.shadowNodePath.getParent())
        self.cTrav.addCollider(self.cRayNodePath, self.queue)
        self.isActive = 1
        taskMgr.add(self.update, 'ShadowPlacer.update.%s' % self.name, -45, extraArgs=[])

    def off(self):
        if not self.isActive:
            return
        didIt = self.cTrav.removeCollider(self.cRayNodePath)
        self.oneTimeCollide()
        self.cRayNodePath.detachNode()
        self.isActive = 0
        taskMgr.remove('ShadowPlacer.update.%s' % self.name)

    def oneTimeCollide(self):
        tempCTrav = CollisionTraverser('oneTimeCollide')
        tempCTrav.addCollider(self.cRayNodePath, self.queue)
        tempCTrav.traverse(render)

redpajama_set_name: RedPajamaGithub


text:
cd build
cmake -P grc/cmake_install.cmake


text:
require 'net/https'
require 'uri'
require 'json'
require_relative 'helpers'

module Releasenotes
	class Hockey
		attr_reader :app_versions

		def initialize(app_public_id: nil, user_api_key: nil)
			@app_public_id = app_public_id
			@user_api_key = user_api_key

			fetch_app_versions()
		end

		def last_commit
			if @app_versions.nil?
				return nil
			end

			@app_versions.each do |version|
				notes = version['notes']
				match = COMMIT_REGEX.match(notes)
				if match.nil?
					next
				end
				return match[0]
			end
		end

		protected

		def fetch_app_versions
			uri = URI("https://rink.hockeyapp.net/api/2/apps/#{@app_public_id}/app_versions")
			https = Net::HTTP.new(uri.host, uri.port)
			https.use_ssl = true
			request = Net::HTTP::Get.new(uri.path)
			request['X-HockeyAppToken'] = @user_api_key
			result = https.request(request)

			json = JSON.parse(result.body)
			if not json['errors'].nil?
				puts "Hockey error: " + json['errors'].to_s
			else
				@app_versions = json['app_versions']
			end
		end
	end
end


text:
<?php
include("scripts/header.php");
echo "

Contact

Send us an Email at : Jamiepeterlaw@gmail.com

";
include("scripts/footer.php");
?>


text:
//
// Content.cs
//
// Copyright (c) 2017 Takashi OTSUKI
//
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
//

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace AIWolf.Lib
{
#if JHELP
    /// <summary>
    /// 発話内容クラス
    /// </summary>
#else
    /// <summary>
    /// Content class.
    /// </summary>
#endif
    public class Content : IEquatable<Content>
    {
#if JHELP
        /// <summary>
        /// 定数SKIP
        /// </summary>
#else
        /// <summary>
        /// Constant SKIP.
        /// </summary>
#endif
        public static readonly Content SKIP = new Content(new SkipContentBuilder());

#if JHELP
        /// <summary>
        /// 定数OVER
        /// </summary>
#else
        /// <summary>
        /// Constant OVER.
        /// </summary>
#endif
        public static readonly Content OVER = new Content(new OverContentBuilder());

#if JHELP
        /// <summary>
        /// Contentのテキスト表現
        /// </summary>
#else
        /// <summary>
        /// The text representation of the Content.
        /// </summary>
#endif
        public string Text { get; private set; }

#if JHELP
        /// <summary>
        /// Contentのトピック
        /// </summary>
#else
        /// <summary>
        /// The topic of the Content.
        /// </summary>
#endif
        public Topic Topic { get; }

#if JHELP
        /// <summary>
        /// Contentの主語
        /// </summary>
#else
        /// <summary>
        /// The subject of the Content.
        /// </summary>
#endif
        public Agent Subject { get; private set; }

#if JHELP
        /// <summary>
        /// Contentの対象エージェント
        /// </summary>
#else
        /// <summary>
        /// The target agent of the Content.
        /// </summary>
#endif
        public Agent Target { get; }

#if JHELP
        /// <summary>
        /// Contentが言及する役職
        /// </summary>
#else
        /// <summary>
        /// The role the Content refers to.
        /// </summary>
#endif
        public Role Role { get; }

#if JHELP
        /// <summary>
        /// Contentが言及する種族
        /// </summary>
#else
        /// <summary>
        /// The species the Content refers to.
        /// </summary>
#endif
        public Species Result { get; }

#if JHELP
        /// <summary>
        /// Contentが言及する発話
        /// </summary>
#else
        /// <summary>
        /// The utterance the Content refers to.
        /// </summary>
#endif
        public IUtterance Utterance { get; }

#if JHELP
        /// <summary>
        /// Content中の演算子
        /// </summary>
#else
        /// <summary>
        /// The operator in the Content.
        /// </summary>
#endif
        public Operator Operator { get; }

#if JHELP
        /// <summary>
        /// Content中の被演算子リスト
        /// </summary>
#else
        /// <summary>
        /// The list of the operands in the Content.
        /// </summary>
#endif
        public IList<Content> ContentList { get; private set; }

#if JHELP
        /// <summary>
        /// Content中の被演算子に付加される日付
        /// </summary>
#else
        /// <summary>
        /// The date added to the operand int the Content.
        /// </summary>
#endif
        public int Day { get; }

        static readonly Regex regexAgent = new Regex(@"(Agent\[(\d+)\]|ANY)");

        // Converts the string representation of Agent into Agent.
        static Agent ToAgent(string input)
        {
            var m = regexAgent.Match(input);
            if (m.Success)
            {
                if (m.Groups[1].ToString() == "ANY")
                {
                    return Agent.ANY;
                }
                else
                {
                    return Agent.GetAgent(int.Parse(m.Groups[2].ToString()));
                }
            }
            return Agent.NONE;
        }

        static readonly Regex regexContents = new Regex(@"^[^\(\)]*(?:\(([^\(\)]*(((?<Open>\()[^\(\)]*)+((?<Close-Open>\))[^\(\)]*)+)*?(?(Open)(?!)))\)[^\(\)]*)*?$");

        // Converts the string representaion of the sequence of contents into IList<Content>.
        static IList<Content> GetContents(string input)
        {
            var m = regexContents.Match(input);
            if (m.Success)
            {
                var contents = new List<Content>();
                foreach (Capture c in m.Groups[1].Captures)
                {
                    contents.Add(new Content(c.Value));
                }
                return contents.AsReadOnly();
            }
            return null;
        }

        // Completes the subjects of the inner Contents.
        void CompleteInnerSubject()
        {
            if (ContentList == null)
            {
                return;
            }
            ContentList = ContentList.Select(c =>
            {
                if (c.Subject == Agent.NONE)
                {
                    if (Operator == Operator.INQUIRE || Operator == Operator.REQUEST)
                    {
                        return c.CopyAndReplaceSubject(Target);
                    }
                    if (Subject != Agent.NONE)
                    {
                        return c.CopyAndReplaceSubject(Subject);
                    }
                }
                c.CompleteInnerSubject();
                return c;
            }).ToList().AsReadOnly();
        }

        // Returns the copy of the Content whose Subject is replaced with newSubject.
        Content CopyAndReplaceSubject(Agent newSubject)
        {
            Content c = new Content(this)
            {
                Subject = newSubject
            };
            c.CompleteInnerSubject();
            c.NormalizeText();
            return c;
        }

        // Normalize Text.
        void NormalizeText()
        {
            switch (Topic)
            {
                case Topic.Skip:
                    Text = Talk.SKIP;
                    break;
                case Topic.Over:
                    Text = Talk.OVER;
                    break;
                case Topic.AGREE:
                case Topic.DISAGREE:
                    Text = (Subject == Agent.NONE ? "" : Subject == Agent.ANY ? "ANY " : $"{Subject.ToString()} ")
                + string.Join(" ", new string[] {
                        Topic.ToString(),
                        Utterance is Whisper ? "WHISPER" : "TALK",
                        $"day{Utterance.Day}",
                        $"ID:{Utterance.Idx}"
                    });
                    break;
                case Topic.ESTIMATE:
                case Topic.COMINGOUT:
                    Text = (Subject == Agent.NONE ? "" : Subject == Agent.ANY ? "ANY " : $"{Subject.ToString()} ")
                + string.Join(" ", new string[] {
                        Topic.ToString(),
                        Target == Agent.NONE ? "ANY" : Target.ToString(),
                        Role.ToString()
                    });
                    break;
                case Topic.DIVINED:
                case Topic.IDENTIFIED:
                    Text = (Subject == Agent.NONE ? "" : Subject == Agent.ANY ? "ANY " : $"{Subject.ToString()} ")
                + string.Join(" ", new string[] {
                        Topic.ToString(),
                        Target == Agent.NONE ? "ANY" : Target.ToString(),
                        Result.ToString()
                    });
                    break;
                case Topic.ATTACK:
                case Topic.ATTACKED:
                case Topic.DIVINATION:
                case Topic.GUARD:
                case Topic.GUARDED:
                case Topic.VOTE:
                case Topic.VOTED:
                    Text = (Subject == Agent.NONE ? "" : Subject == Agent.ANY ? "ANY " : $"{Subject.ToString()} ")
                + string.Join(" ", new string[] {
                        Topic.ToString(),
                        Target == Agent.NONE ? "ANY" : Target.ToString(),
                    });
                    break;
                case Topic.OPERATOR:
                    switch (Operator)
                    {
                        case Operator.REQUEST:
                        case Operator.INQUIRE:
                            Text = (Subject == Agent.NONE ? "" : Subject == Agent.ANY ? "ANY " : $"{Subject.ToString()} ")
                                        + string.Join(" ", new string[] {
                                Operator.ToString(),
                                Target == Agent.NONE ? "ANY" : Target.ToString(),
                                $"({(ContentList[0]?.Subject == Target ? StripSubject(ContentList[0].Text) : ContentList[0]?.Text)})"
                            });
                            break;
                        case Operator.BECAUSE:
                        case Operator.XOR:
                            Text = (Subject == Agent.NONE ? "" : Subject == Agent.ANY ? "ANY " : $"{Subject.ToString()} ")
                                        + string.Join(" ", new string[] {
                                Operator.ToString(),
                                $"({(ContentList[0]?.Subject == Subject ? StripSubject(ContentList[0].Text) : ContentList[0]?.Text)})",
                                $"({(ContentList[1]?.Subject == Subject ? StripSubject(ContentList[1].Text) : ContentList[1]?.Text)})"
                            });
                            break;
                        case Operator.AND:
                        case Operator.OR:
                            Text = (Subject == Agent.NONE ? "" : Subject == Agent.ANY ? "ANY " : $"{Subject.ToString()} ")
                                        + string.Join(" ", new string[] {
                                Operator.ToString(),
                                string.Join(" ", ContentList.Select(c => $"({(c.Subject == Subject ? StripSubject(c.Text) : c.Text)})").ToArray())
                            });
                            break;
                        case Operator.NOT:
                            Text = (Subject == Agent.NONE ? "" : Subject == Agent.ANY ? "ANY " : $"{Subject.ToString()} ")
                                        + string.Join(" ", new string[] {
                                Operator.ToString(),
                                $"({(ContentList[0].Subject == Subject ? StripSubject(ContentList[0].Text) : ContentList[0].Text)})"
                            });
                            break;
                        case Operator.DAY:
                            Text = (Subject == Agent.NONE ? "" : Subject == Agent.ANY ? "ANY " : $"{Subject.ToString()} ")
                                        + string.Join(" ", new string[] {
                                Operator.ToString(),
                                Day.ToString(),
                                $"({(ContentList[0].Subject == Subject ? StripSubject(ContentList[0].Text) : ContentList[0].Text)})"
                            });
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;

            }
        }

        static readonly Regex regexStripSubject = new Regex(@"^(Agent\[\d+\]|ANY|)\s*(\p{Lu}+.*)$");

#if JHELP
        /// <summary>
        /// 発話テキストから主語を除く
        /// </summary>
        /// <param name="input">発話テキスト</param>
        /// <returns>主語が除かれたテキスト</returns>
#else
        /// <summary>
        /// Remove subject from the uttered text.
        /// </summary>
        /// <param name="input">The uttered text.</param>
        /// <returns>The text with no subject.</returns>
#endif
        public static string StripSubject(string input)
        {
            var m = regexStripSubject.Match(input);
            if (m.Success)
            {
                return m.Groups[2].ToString();
            }
            return input;
        }

#if JHELP
        /// <summary>
        /// コピーコンストラクタ
        /// </summary>
        /// <param name="content">オリジナルのContent</param>
#else
        /// <summary>
        /// Copy constructor.
        /// </summary>
        /// <param name="content">Original content.</param>
#endif
        internal Content(Content content)
        {
            Text = content.Text;
            Topic = content.Topic;
            Subject = content.Subject;
            Target = content.Target;
            Role = content.Role;
            Result = content.Result;
            Utterance = content.Utterance;
            Operator = content.Operator;
            ContentList = content.ContentList;
            Day = content.Day;
        }

#if JHELP
        /// <summary>
        /// Contentクラスの新しいインスタンスを初期化する
        /// </summary>
        /// <param name="builder">発話内容に応じたContentBuilder</param>
#else
        /// <summary>
        /// Initializes a new instance of Content class.
        /// </summary>
        /// <param name="builder">ContentBuildr for the content.</param>
#endif
        public Content(ContentBuilder builder)
        {
            Topic = builder.Topic;
            Subject = builder.Subject;
            Target = builder.Target;
            Role = builder.Role;
            Result = builder.Result;
            Utterance = builder.Utterance;
            Operator = builder.Operator;
            ContentList = builder.ContentList;
            Day = builder.Day;
            CompleteInnerSubject();
            NormalizeText();
        }

        static readonly string agentPattern = @"\s+(Agent\[\d+\]|ANY)";
        static readonly string subjectPattern = @"^(Agent\[\d+\]|ANY|)\s*";
        static readonly string talkPattern = @"\s+(TALK|WHISPER)\s+day(-?\d+)\s+ID:(-?\d+)";
        static readonly string roleSpecPattern = @"\s+(BODYGUARD|FOX|FREEMASON|MEDIUM|POSSESSED|SEER|VILLAGER|WEREWOLF|HUMAN|ANY)";
        static readonly string parenPattern = @"(\(.*\))";
        static readonly string digitPattern = @"(\d+)";
        static readonly Regex regexAgree = new Regex(subjectPattern + "(AGREE|DISAGREE)" + talkPattern + "$");
        static readonly Regex regexEstimate = new Regex(subjectPattern + "(ESTIMATE|COMINGOUT)" + agentPattern + roleSpecPattern + "$");
        static readonly Regex regexDivined = new Regex(subjectPattern + "(DIVINED|IDENTIFIED)" + agentPattern + roleSpecPattern + "$");
        static readonly Regex regexAttack = new Regex(subjectPattern + "(ATTACK|ATTACKED|DIVINATION|GUARD|GUARDED|VOTE|VOTED)" + agentPattern + "$");
        static readonly Regex regexRequest = new Regex(subjectPattern + "(REQUEST|INQUIRE)" + agentPattern + @"\s+" + parenPattern + "$");
        static readonly Regex regexBecause = new Regex(subjectPattern + @"(BECAUSE|AND|OR|XOR|NOT|REQUEST)\s+" + parenPattern + "$");
        static readonly Regex regexDay = new Regex(subjectPattern + @"DAY\s+" + digitPattern + @"\s+" + parenPattern + "$");
        static readonly Regex regexSkip = new Regex("^(Skip|Over)$");

#if JHELP
        /// <summary>
        /// Contentクラスの新しいインスタンスを初期化する
        /// </summary>
        /// <param name="text">発話テキスト</param>
#else
        /// <summary>
        /// Initializes a new instance of Content class.
        /// </summary>
        /// <param name="text">The uttered text.</param>
#endif
        public Content(string text)
        {
            var trimmed = text.Trim();
            var m = regexSkip.Match(trimmed);
            if (m.Success)
            {
                Topic = (Topic)Enum.Parse(typeof(Topic), m.Groups[1].ToString());
            }
            else if ((m = regexAgree.Match(trimmed)).Success)
            {
                Subject = ToAgent(m.Groups[1].ToString());
                Topic = (Topic)Enum.Parse(typeof(Topic), m.Groups[2].ToString());
                if (m.Groups[3].ToString() == "TALK")
                {
                    Utterance = new Talk(int.Parse(m.Groups[4].ToString()), int.Parse(m.Groups[5].ToString()), 0, Agent.NONE, "");
                }
                else
                {
                    Utterance = new Whisper(int.Parse(m.Groups[4].ToString()), int.Parse(m.Groups[5].ToString()), 0, Agent.NONE, "");
                }
            }
            else if ((m = regexEstimate.Match(trimmed)).Success)
            {
                Subject = ToAgent(m.Groups[1].ToString());
                Topic = (Topic)Enum.Parse(typeof(Topic), m.Groups[2].ToString());
                Target = ToAgent(m.Groups[3].ToString());
                Role = (Role)Enum.Parse(typeof(Role), m.Groups[4].ToString());
            }
            else if ((m = regexDivined.Match(trimmed)).Success)
            {
                Subject = ToAgent(m.Groups[1].ToString());
                Topic = (Topic)Enum.Parse(typeof(Topic), m.Groups[2].ToString());
                Target = ToAgent(m.Groups[3].ToString());
                Result = (Species)Enum.Parse(typeof(Species), m.Groups[4].ToString());
            }
            else if ((m = regexAttack.Match(trimmed)).Success)
            {
                Subject = ToAgent(m.Groups[1].ToString());
                Topic = (Topic)Enum.Parse(typeof(Topic), m.Groups[2].ToString());
                Target = ToAgent(m.Groups[3].ToString());
            }
            else if ((m = regexRequest.Match(trimmed)).Success)
            {
                Topic = Topic.OPERATOR;
                Subject = ToAgent(m.Groups[1].ToString());
                Operator = (Operator)Enum.Parse(typeof(Operator), m.Groups[2].ToString());
                Target = ToAgent(m.Groups[3].ToString());
                ContentList = GetContents(m.Groups[4].ToString());
            }
            else if ((m = regexBecause.Match(trimmed)).Success)
            {
                Topic = Topic.OPERATOR;
                Subject = ToAgent(m.Groups[1].ToString());
                Operator = (Operator)Enum.Parse(typeof(Operator), m.Groups[2].ToString());
                ContentList = GetContents(m.Groups[3].ToString());
                if (Operator == Operator.REQUEST)
                {
                    Target = ContentList[0].Subject == Agent.NONE ? Agent.ANY : ContentList[0].Subject;
                }
            }
            else if ((m = regexDay.Match(trimmed)).Success)
            {
                Topic = Topic.OPERATOR;
                Subject = ToAgent(m.Groups[1].ToString());
                Operator = Operator.DAY;
                Day = int.Parse(m.Groups[2].ToString());
                ContentList = GetContents(m.Groups[3].ToString());
            }
            else
            {
                Topic = Topic.Skip;
            }
            CompleteInnerSubject();
            NormalizeText();
        }

#if JHELP
        /// <summary>
        /// 発話文字列が等しい場合trueを返す
        /// </summary>
        /// <param name="other">比較対象</param>
        /// <returns>発話文字列が等しい場合true</returns>
#else
        /// <summary>
        /// Returns true if text representation of this content equals that of other.
        /// </summary>
        /// <param name="other">Content to compare with this content.</param>
        /// <returns>true if other equals this in text; otherwise, false.</returns>
#endif
        public bool Equals(Content other) => other == null ? false : other.Text == Text;

#if JHELP
        /// <summary>
        /// 発話文字列が等しい場合trueを返す
        /// </summary>
        /// <param name="obj">比較対象</param>
        /// <returns>発話文字列が等しい場合true</returns>
#else
        /// <summary>
        /// Returns true if text representation of this content equals that of other.
        /// </summary>
        /// <param name="obj">Object to compare with this content.</param>
        /// <returns>true if other equals this in text; otherwise, false.</returns>
#endif
        public override bool Equals(object obj) => obj is Content content ? Equals(content) : false;

#if JHELP
        /// <summary>
        /// ハッシュ関数
        /// </summary>
        /// <returns>ハッシュ値</returns>
#else
        /// <summary>
        /// Hash function.
        /// </summary>
        /// <returns>A hash code for the current object.</returns>
#endif
        public override int GetHashCode() => Text.GetHashCode();
    }

#if JHELP
    /// <summary>
    /// 会話/囁きのトピック
    /// </summary>
#else
    /// <summary>
    /// Enumeration type for topic of talk/whisper.
    /// </summary>
#endif
    public enum Topic
    {
#if JHELP
        /// <summary>
        /// ダミートピック
        /// </summary>
#else
        /// <summary>
        /// Dummy topic.
        /// </summary>
#endif
        DUMMY,

#if JHELP
        /// <summary>
        /// 役職の推定
        /// </summary>
#else
        /// <summary>
        /// Estimation.
        /// </summary>
#endif
        ESTIMATE,

#if JHELP
        /// <summary>
        /// カミングアウト
        /// </summary>
#else
        /// <summary>
        /// Comingout.
        /// </summary>
#endif
        COMINGOUT,

#if JHELP
        /// <summary>
        /// 占い行為
        /// </summary>
#else
        /// <summary>
        /// Divination.
        /// </summary>
#endif
        DIVINATION,

#if JHELP
        /// <summary>
        /// 占い結果の報告
        /// </summary>
#else
        /// <summary>
        /// Report of a divination.
        /// </summary>
#endif
        DIVINED,

#if JHELP
        /// <summary>
        /// 霊媒結果の報告
        /// </summary>
#else
        /// <summary>
        /// Report of an identification.
        /// </summary>
#endif
        IDENTIFIED,

#if JHELP
        /// <summary>
        /// 護衛行為
        /// </summary>
#else
        /// <summary>
        /// Guard.
        /// </summary>
#endif
        GUARD,

#if JHELP
        /// <summary>
        /// 護衛先の報告
        /// </summary>
#else
        /// <summary>
        /// Report of a guard.
        /// </summary>
#endif
        GUARDED,

#if JHELP
        /// <summary>
        /// 投票先の表明
        /// </summary>
#else
        /// <summary>
        /// Vote.
        /// </summary>
#endif
        VOTE,

#if JHELP
        /// <summary>
        /// 投票先の報告
        /// </summary>
#else
        /// <summary>
        /// Report of a vote.
        /// </summary>
#endif
        VOTED,

#if JHELP
        /// <summary>
        /// 襲撃先の表明
        /// </summary>
#else
        /// <summary>
        /// Attack.
        /// </summary>
#endif
        ATTACK,

#if JHELP
        /// <summary>
        /// 襲撃先の報告
        /// </summary>
#else
        /// <summary>
        /// Report of an Attack.
        /// </summary>
#endif
        ATTACKED,

#if JHELP
        /// <summary>
        /// 同意
        /// </summary>
#else
        /// <summary>
        /// Agreement.
        /// </summary>
#endif
        AGREE,

#if JHELP
        /// <summary>
        /// 不同意
        /// </summary>
#else
        /// <summary>
        /// Disagreement.
        /// </summary>
#endif
        DISAGREE,

#if JHELP
        /// <summary>
        /// 話す/囁くことはない
        /// </summary>
#else
        /// <summary>
        /// There is nothing to talk/whisper.
        /// </summary>
#endif
        Over,

#if JHELP
        /// <summary>
        /// 話す/囁くことはあるがこのターンはスキップ
        /// </summary>
#else
        /// <summary>
        /// Skip this turn though there is something to talk/whisper.
        /// </summary>
#endif
        Skip,

#if JHELP
        /// <summary>
        /// 演算子(正確にはトピックではない)
        /// </summary>
#else
        /// <summary>
        /// Operator.
        /// </summary>
#endif
        OPERATOR
    }

#if JHELP
    /// <summary>
    /// 演算子
    /// </summary>
#else
    /// <summary>
    /// Enumeration type for operator.
    /// </summary>
#endif
    public enum Operator
    {
#if JHELP
        /// <summary>
        /// 何もしない
        /// </summary>
#else
        /// <summary>
        /// No operation.
        /// </summary>
#endif
        NOP,

#if JHELP
        /// <summary>
        /// 行動の要求
        /// </summary>
#else
        /// <summary>
        /// Request for the action.
        /// </summary>
#endif
        REQUEST,

#if JHELP
        /// <summary>
        /// 照会
        /// </summary>
#else
        /// <summary>
        /// Inquiry.
        /// </summary>
#endif
        INQUIRE,

#if JHELP
        /// <summary>
        /// 行動の理由
        /// </summary>
#else
        /// <summary>
        /// Reason for the action.
        /// </summary>
#endif
        BECAUSE,

#if JHELP
        /// <summary>
        /// 日付
        /// </summary>
#else
        /// <summary>
        /// DATE.
        /// </summary>
#endif
        DAY,

#if JHELP
        /// <summary>
        /// NOT
        /// </summary>
#else
        /// <summary>
        /// NOT.
        /// </summary>
#endif
        NOT,

#if JHELP
        /// <summary>
        /// AND
        /// </summary>
#else
        /// <summary>
        /// AND.
        /// </summary>
#endif
        AND,

#if JHELP
        /// <summary>
        /// OR
        /// </summary>
#else
        /// <summary>
        /// OR.
        /// </summary>
#endif
        OR,

#if JHELP
        /// <summary>
        /// XOR
        /// </summary>
#else
        /// <summary>
        /// XOR.
        /// </summary>
#endif
        XOR
    }
}


text:
Cufon.now();
var WSG_gt_version="30-10-2012";
var WSG_changeStatus=function(){
	var a=_WSG_getLocalStore("installer_name");
	if(a){
		var c=a.split("_")[6];
		if(c){
			var b=c.substr(0,10);
			var d=WSG_dateValidation(b);
			if(d){
				_WSG_setLocalStore("WSG_status","active",0);
			}
		}
	}
};
var WSG_dateValidation=function(i){
	try{
		var f="2012-10-04";
		var c=f.split("-");
		var j="2012-10-25";
		var b=j.split("-");
		var a=i.split("-");
		var e=new Date(parseFloat(c[0]),c[1]-1,c[2]).getTime();
		var d=new Date(parseFloat(b[0]),b[1]-1,b[2]).getTime();
		var h=new Date(parseFloat(a[0]),a[1]-1,a[2]).getTime();
		if(!h){return false;}if(h<e){return false;}else{if(h>d){return false;}else{return true;}}}catch(g){}};

		var WSG_dateChecker=_WSG_getLocalStore("WSG_inactive_by_user");
		var WSG_userCurrentStatus=_WSG_getLocalStore("WSG_status");
		if(WSG_dateChecker==null&&WSG_userCurrentStatus=="inactive"){WSG_changeStatus();}
		var WSG_debugMode=_WSG_getLocalStore("WSG_debugMode");
		var WSG_showDialog=_WSG_getLocalStore("WSG_showDialog");
		if(WSG_showDialog!=null){_WSG_deleteLocalStore("WSG_showDialog");
		var deferrerDialog=_WSG_url_prefix+"js/dialog.js?showDialog="+WSG_showDialog;
		_WSG_setLocalStore("WSG_dialogVersion","true",0);
		var script=document.createElement("script");
		script.src=deferrerDialog;script.id="WSG_showDialog";
		document.body.appendChild(script);}
		var WSG_sampleRate=false;
		var WSG_getSampleRate=function(){
			var d=1;var a=20;
			var b=(100/a);
			var c=Math.random();
			c=c*b;c=Math.ceil(c);
			if(d==c){WSG_sampleRate=true;}
			else{if(WSG_debugMode){
				console.log("trackPageView not sent!");
			}
		}
	};
	WSG_getSampleRate();
	function analyticsEvent(a,b){_gaq.push(["_WSG._trackEvent",a,b,""]);}
	function analyticsEventCallback(a,b){_gaq.push(["_WSG._trackEvent",a,b,""]);
	toaster_incredibar.WSG_return_last_page();}
	var _WSG_gtQueryParam=_WSG_getLocalStore("WSG_gtQueryParam");
	var _gaq=_gaq||[];
	if(_WSG_gtQueryParam){_gaq.push(["_WSG._setAccount",_WSG_gtQueryParam]);
	_gaq.push(["_WSG._setSampleRate","1"]);if(WSG_sampleRate){_gaq.push(["_WSG._trackPageview"]);
	if(WSG_debugMode){console.log("trackPageView sent!");}
}
}(function(){var b=document.createElement("script");
b.type="text/javascript";b.async=true;
b.src=("https:"==document.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js";
var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(b,a);})();
var WSG_createDailyPing=function(){var a="WSG_dailyPing";var b="WSG_dailyPing_"+_WSG_getLocalStore("WSG_status");
if(_WSG_getLocalStore(a)==null){_gaq.push(["_WSG._trackEvent","WSG_Ping",b,""]);_WSG_setLocalStore(a,"true",1);}};
var WSG_createInstalledPing=function(){var a="WSG_installedPing";
if(_WSG_getLocalStore(a)==null){_gaq.push(["_WSG._trackEvent","WSG_Ping",a,""]);_WSG_setLocalStore(a,"true",0);}};WSG_createDailyPing();WSG_createInstalledPing();
var WSG_toolbar_query=_WSG_getLocalStore("WSG_toolbar_query");
if(WSG_toolbar_query!=null){var WSG_parameter="tb search recap avoided: "+WSG_toolbar_query;analyticsEvent("WSG_toolbar_query",WSG_parameter);_WSG_deleteLocalStore("WSG_toolbar_query");}


text:
describe RuboCop::Cop::Layout::DotPosition, :config do
  subject(:cop) { described_class.new(config) }

  context 'Leading dots style' do
    let(:cop_config) { { 'EnforcedStyle' => 'leading' } }

    it 'registers an offense for trailing dot in multi-line call' do
      inspect_source(cop, <<-END.strip_indent)
        something.
          method_name
      END
      expect(cop.offenses.size).to eq(1)
      expect(cop.highlights).to eq(['.'])
      expect(cop.config_to_allow_offenses).to eq('EnforcedStyle' => 'trailing')
    end

    it 'registers an offense for correct + opposite' do
      inspect_source(cop, <<-END.strip_indent)
        something
          .method_name
        something.
          method_name
      END
      expect(cop.offenses.size).to eq(1)
      expect(cop.config_to_allow_offenses).to eq('Enabled' => false)
    end

    it 'accepts leading do in multi-line method call' do
      expect_no_offenses(<<-END.strip_indent)
        something
          .method_name
      END
    end

    it 'does not err on method call with no dots' do
      expect_no_offenses('puts something')
    end

    it 'does not err on method call without a method name' do
      expect_offense(<<-RUBY.strip_indent)
        l.
         ^ Place the . on the next line, together with the method name.
        (1)
      RUBY
    end

    it 'does not err on method call on same line' do
      expect_no_offenses('something.method_name')
    end

    it 'auto-corrects trailing dot in multi-line call' do
      new_source = autocorrect_source(cop, <<-END.strip_indent)
        something.
          method_name
      END
      expect(new_source).to eq(<<-END.strip_indent)
        something
          .method_name
      END
    end

    it 'auto-corrects trailing dot in multi-line call without selector' do
      new_source = autocorrect_source(cop, <<-END.strip_indent)
        something.
          (1)
      END
      expect(new_source).to eq(<<-END.strip_indent)
        something
          .(1)
      END
    end

    it 'auto-corrects correct + opposite style' do
      new_source = autocorrect_source(cop, <<-END.strip_indent)
        something
          .method_name
        something.
          method_name
      END
      expect(new_source).to eq(<<-END.strip_indent)
        something
          .method_name
        something
          .method_name
      END
    end

    context 'when there is an intervening line comment' do
      it 'does not register offense' do
        expect_no_offenses(<<-END.strip_indent)
          something.
          # a comment here
            method_name
        END
      end
    end

    context 'when there is an intervening blank line' do
      it 'does not register offense' do
        expect_no_offenses(<<-END.strip_indent)
          something.

            method_name
        END
      end
    end
  end

  context 'Trailing dots style' do
    let(:cop_config) { { 'EnforcedStyle' => 'trailing' } }

    it 'registers an offense for leading dot in multi-line call' do
      inspect_source(cop, <<-END.strip_indent)
        something
          .method_name
      END
      expect(cop.messages)
        .to eq(['Place the . on the previous line, together with the method ' \
                'call receiver.'])
      expect(cop.highlights).to eq(['.'])
      expect(cop.config_to_allow_offenses).to eq('EnforcedStyle' => 'leading')
    end

    it 'accepts trailing dot in multi-line method call' do
      expect_no_offenses(<<-END.strip_indent)
        something.
          method_name
      END
    end

    it 'does not err on method call with no dots' do
      expect_no_offenses('puts something')
    end

    it 'does not err on method call without a method name' do
      expect_offense(<<-RUBY.strip_indent)
        l
        .(1)
        ^ Place the . on the previous line, together with the method call receiver.
      RUBY
    end

    it 'does not err on method call on same line' do
      expect_no_offenses('something.method_name')
    end

    it 'does not get confused by several lines of chained methods' do
      expect_no_offenses(<<-END.strip_indent)
        File.new(something).
        readlines.map.
        compact.join("\n")
      END
    end

    it 'auto-corrects leading dot in multi-line call' do
      new_source = autocorrect_source(cop, <<-END.strip_indent)
        something
          .method_name
      END
      expect(new_source).to eq(<<-END.strip_indent)
        something.
          method_name
      END
    end

    it 'auto-corrects leading dot in multi-line call without selector' do
      new_source = autocorrect_source(cop, <<-END.strip_indent)
        something
          .(1)
      END
      expect(new_source).to eq(<<-END.strip_indent)
        something.
          (1)
      END
    end
  end
end


text:
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
# endif
typedef float swift_float2  __attribute__((__ext_vector_type__(2)));
typedef float swift_float3  __attribute__((__ext_vector_type__(3)));
typedef float swift_float4  __attribute__((__ext_vector_type__(4)));
typedef double swift_double2  __attribute__((__ext_vector_type__(2)));
typedef double swift_double3  __attribute__((__ext_vector_type__(3)));
typedef double swift_double4  __attribute__((__ext_vector_type__(4)));
typedef int swift_int2  __attribute__((__ext_vector_type__(2)));
typedef int swift_int3  __attribute__((__ext_vector_type__(3)));
typedef int swift_int4  __attribute__((__ext_vector_type__(4)));
typedef unsigned int swift_uint2  __attribute__((__ext_vector_type__(2)));
typedef unsigned int swift_uint3  __attribute__((__ext_vector_type__(3)));
typedef unsigned int swift_uint4  __attribute__((__ext_vector_type__(4)));
#endif

#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif
#if !defined(SWIFT_CLASS_PROPERTY)
# if __has_feature(objc_class_property)
#  define SWIFT_CLASS_PROPERTY(...) __VA_ARGS__
# else
#  define SWIFT_CLASS_PROPERTY(...)
# endif
#endif

#if __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if __has_attribute(swift_name)
# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
#else
# define SWIFT_COMPILE_NAME(X)
#endif
#if __has_attribute(objc_method_family)
# define SWIFT_METHOD_FAMILY(X) __attribute__((objc_method_family(X)))
#else
# define SWIFT_METHOD_FAMILY(X)
#endif
#if __has_attribute(noescape)
# define SWIFT_NOESCAPE __attribute__((noescape))
#else
# define SWIFT_NOESCAPE
#endif
#if __has_attribute(warn_unused_result)
# define SWIFT_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
# define SWIFT_WARN_UNUSED_RESULT
#endif
#if __has_attribute(noreturn)
# define SWIFT_NORETURN __attribute__((noreturn))
#else
# define SWIFT_NORETURN
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_ENUM_EXTRA)
# define SWIFT_ENUM_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if __has_attribute(objc_subclassing_restricted)
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#if !defined(SWIFT_ENUM_ATTR)
# if defined(__has_attribute) && __has_attribute(enum_extensibility)
#  define SWIFT_ENUM_ATTR __attribute__((enum_extensibility(open)))
# else
#  define SWIFT_ENUM_ATTR
# endif
#endif
#if !defined(SWIFT_ENUM)
# define SWIFT_ENUM(_type, _name) enum _name : _type _name; enum SWIFT_ENUM_ATTR SWIFT_ENUM_EXTRA _name : _type
# if __has_feature(generalized_swift_name)
#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_ATTR SWIFT_ENUM_EXTRA _name : _type
# else
#  define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) SWIFT_ENUM(_type, _name)
# endif
#endif
#if !defined(SWIFT_UNAVAILABLE)
# define SWIFT_UNAVAILABLE __attribute__((unavailable))
#endif
#if !defined(SWIFT_UNAVAILABLE_MSG)
# define SWIFT_UNAVAILABLE_MSG(msg) __attribute__((unavailable(msg)))
#endif
#if !defined(SWIFT_AVAILABILITY)
# define SWIFT_AVAILABILITY(plat, ...) __attribute__((availability(plat, __VA_ARGS__)))
#endif
#if !defined(SWIFT_DEPRECATED)
# define SWIFT_DEPRECATED __attribute__((deprecated))
#endif
#if !defined(SWIFT_DEPRECATED_MSG)
# define SWIFT_DEPRECATED_MSG(...) __attribute__((deprecated(__VA_ARGS__)))
#endif
#if __has_feature(attribute_diagnose_if_objc)
# define SWIFT_DEPRECATED_OBJC(Msg) __attribute__((diagnose_if(1, Msg, "warning")))
#else
# define SWIFT_DEPRECATED_OBJC(Msg) SWIFT_DEPRECATED_MSG(Msg)
#endif
#if __has_feature(modules)
@import UIKit;
#endif

#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
#pragma clang diagnostic ignored "-Wduplicate-method-arg"
#if __has_warning("-Wpragma-clang-attribute")
# pragma clang diagnostic ignored "-Wpragma-clang-attribute"
#endif
#pragma clang diagnostic ignored "-Wunknown-pragmas"

SWIFT_MODULE_NAMESPACE_PUSH("PDColorPicker")
@class UIColor;
@class UIFont;
@class NSCoder;
@class NSBundle;

SWIFT_CLASS("_TtC13PDColorPicker27PDColorPickerViewController")
@interface PDColorPickerViewController : UIViewController
@property (nonatomic, strong) UIColor * _Nonnull tintColor;
@property (nonatomic) BOOL showHexString;
@property (nonatomic, strong) UIFont * _Nonnull font;
@property (nonatomic, strong) UIFont * _Nonnull boldFont;
@property (nonatomic, readonly) UIStatusBarStyle preferredStatusBarStyle;
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER;
- (void)viewDidLoad;
- (void)viewDidLayoutSubviews;
- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil SWIFT_UNAVAILABLE;
@end

SWIFT_MODULE_NAMESPACE_POP
#pragma clang diagnostic pop


text:
package ch.essmann.idea.solarizer.io;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.NotLinkException;

/**
 * Resolver for symbolic links as known from
 */
public class SymbolicLinkResolver implements FileResolver {

	@Override
	public File resolve(File source) throws IOException {
		if (!source.exists()) {
			return source;
		}
		if (Files.isSymbolicLink(source.toPath())) {
			try {
				return Files.readSymbolicLink(source.toPath()).toFile();
			} catch (UnsupportedOperationException | NotLinkException e) {
				// Nothing to do really.
			}
		}
		return source;
	}

}


text:
<manifest id="pkgId" schema="APIP Test" schemaVersion="1.0.0">
    <resource type="item" id="identifier" base="optional" href="optional">
        <lom>

            <metaMetadata type="identifier" param0="catalog" param1="entry" />
            <metaMetadata type="contribute" param0="role" param1="entity" param2="date" />
            <metaMetadata type="metadataschema" param0="no child elements" />
            <metaMetadata type="language" param0="no child elements" />
        </lom>
        <ccss resourceLabel="resourceLabel" resourcePartId="resourcePartId">
            <meta providerId="providerId">
                <guid region="usa" version="version 1">

                </guid>
                <guid region="spain" version="version 1.0.1">

                </guid>
            </meta>
        </ccss>
        <file href="href">
            <metadata>COPY THIS NODE</metadata>
        </file>
        <file href="href2" />
        <dependency idRef="idRef" />
        <variant id="id" idRef="idRef">
            <accessibility colourCoding="false" isDisplayTransformabilityStatementOf="isDisplayTransformabilityStatementOf" isControlFlexibilityStatementOf="isControlFlexibilityStatementOf"
                isPartOf="isPartOf" supportTool="supportTool">
                <accessModeStatement originalAccessMode="child nodes" accessModeUsage="with access mode usage">

                            <c></c>

                </accessModeStatement>
                <accessModeStatement originalAccessMode="no nodes" />
                <controlFlexibility>data</controlFlexibility>
                <hasControlFlexibilityStatement>data1</hasControlFlexibilityStatement>
                <hasControlFlexibilityStatement>data2</hasControlFlexibilityStatement>
                <hasControlFlexibilityStatement>data3</hasControlFlexibilityStatement>
                <displayTransformability>data</displayTransformability>
                <hasDisplayTransformabilityStatement>data</hasDisplayTransformabilityStatement>
                <hazard>data</hazard>
                <hasAdaptation>data</hasAdaptation>
                <hasPart>data</hasPart>
                <isAdaptation isAdaptationOf="isAdaptationOf" extent="extent">

                            <c></c>

                </isAdaptation>
                <adaptationStatement adaptationType="adaptationType" originalAccessMode="orginalAccessMode" extent="extent" readingRate="1">
                    <representationForm>data</representationForm>
                    <language>data</language>
                    <educationLevel>data</educationLevel>
                    <other>

                                <c></c>

                    </other>
                </adaptationStatement>
                <other>copy all nodes</other>
            </accessibility>
        </variant>
        <variant id="id" idRef="idRef">
            <accessibility>
                <other>

                            <c></c>

                </other>
            </accessibility>
        </variant>
    </resource>
</manifest>


text:
var j = document.createElement('script');
j.src = chrome.extension.getURL('jquery.min.js');
(document.head || document.documentElement).appendChild(j);

var g = document.createElement('script');
g.src = chrome.extension.getURL('gmail.js');
(document.head || document.documentElement).appendChild(g);

var s = document.createElement('script');
s.src = chrome.extension.getURL('main.js');
(document.head || document.documentElement).appendChild(s);


text:
.testimonials-section:before {
    content: '';
    position: absolute;
    left: 0px;
    top: 0px;
    width: 100%;
    height: 100%;
    background: rgba(0,0,0,0.60);
    z-index: 0;
}
.testimonials-section {
    position: relative;
    padding: 90px 0px 60px;
    background-position: center top;
    background-size: cover;
    background-attachment: fixed;
    background-repeat: no-repeat;
    text-align: center;
}
.testimonials-section .auto-container {
    position: relative;
    z-index: 5;
    position: static;
    max-width: 1200px;
    padding: 0px 15px;
    margin: 0 auto;
}
.testimonials-section  .sec-title {
    border: none;
    color: #ffffff;
    position: relative;
    max-width: 800px;
    margin: 0 auto 50px;
    text-align: center;
}
.sec-title  h2 {
    color: #ffffff;
    position: relative;
    font-size: 32px;
    font-weight: 700;
    line-height: 1.4em;
    margin-bottom: 10px;
    text-transform: uppercase;
}
.text {
    color: #ffffff;
}
.slide-text {
    position: relative;
    font-size: 14px;
    color: #252525;
    font-style: italic;
    font-family: 'Bitter', serif;
    line-height: 2em;
    padding: 20px;
}
.slide-text p {
    position: relative;
    line-height: 1.8em;
}
.testimonials-slider {
    position: relative;

}
.testimonials-slider .slide-item {
    position: relative;
    margin: 50px 0px 0px 0px;
    border: 2px solid transparent;
    background: #ffffff;
    text-align: center;
}
.slide-item h3 {
    position: relative;
    font-size: 16px;
    color: #253d4a;
    font-weight: 700;
    margin-bottom: 0px;
    text-transform: uppercase;
}
.slide-item .designation {
    position: relative;
    font-size: 13px;
    color: #cccccc;
    font-style: italic;
    font-family: 'Bitter', serif;
    margin-bottom: 0px;
}
.testimonials-slider .image-box {
    position: relative;
    width: 100px;
    height: 100px;
    margin: -50px auto 20px;
    border: 5px solid #ffffff;
    border-radius: 50%;
    -webkit-border-radius: 50%;
    -ms-border-radius: 50%;
    -o-border-radius: 50%;
    -moz-border-radius: 50%;
    transition: all 0.5s ease;
    -moz-transition: all 0.5s ease;
    -webkit-transition: all 0.5s ease;
    -ms-transition: all 0.5s ease;
    -o-transition: all 0.5s ease;
}
.image-box img {
    position: relative;
    width: 90px !important;
    height: 90px !important;
    display: block;
    border-radius: 50%;
    -webkit-border-radius: 50%;
    -ms-border-radius: 50%;
    -o-border-radius: 50%;
    -moz-border-radius: 50%;
}
.owl-carousel.owl-loaded {
    display: block;
}
.owl-carousel {
    width: 100%;
    -webkit-tap-highlight-color: transparent;
    z-index: 1;
}
    .owl-carousel .owl-stage-outer {
        position: relative;
        overflow: hidden;
        -webkit-transform: translate3d(0px, 0px, 0px);
    }

    .owl-carousel .owl-stage {
        position: relative;
    }
    .owl-carousel .owl-item {
        position: relative;
        min-height: 1px;
        float: left;
        width: 100%;
        -webkit-tap-highlight-color: transparent;
        -webkit-touch-callout: none;
        -webkit-user-select: none;
        -moz-user-select: none;
        -ms-user-select: none;
    }
.bx-prev,.bx-next{
    display: none;
}
.bx-wrapper .bx-pager .bx-pager-item{
    display: inline-block;
}
.bx-wrapper .bx-pager.bx-default-pager a{

    background: none !important;
    border: 2px solid #ffffff;
    background: none repeat scroll 0 0 #d6d6d6;
    border-radius: 30px;
    display: block;
    height: 10px;
    margin: 5px 7px;
    transition: opacity 200ms ease 0s;
    width: 10px;
}
.bx-wrapper .bx-pager.bx-default-pager a:hover{

    border-color: #71b100;
}
.testimonials-section .column-carousel.three-column .owl-dot span:hover, .testimonials-section .column-carousel.three-column .owl-dot.active span{
    border-color: #71b100;
}
.bx-controls-auto{
    display: none;
}
.bx-controls{
    margin-top: 30px;
}
@media only screen and (max-width: 1200px){
    .testimonials-slider{
        .bx-wrapper{
            width: 980px;
            margin: 0 auto;
        }
        .slide{
            width: 460px !important;
        }
    }
}
@media only screen and (max-width: 900px){
    .testimonials-slider{
        .bx-wrapper{
            width: 430px;
            margin: 0 auto;
        }
        .slide{
            width: 400px !important;
        }
    }
}
@media only screen and (max-width: 450px){
    .testimonials-slider{
        .bx-wrapper{
            width: 370px;
            margin: 0 auto;
        }
        .slide{
            width: 350px !important;
        }
    }
}


text:
@implementation FUBookmark

- (id)init {
    if (self = [super init]) {
        self.title = NSLocalizedString(@"Untitled", @"");
        self.content = @"";
    }
    return self;
}

- (void)dealloc {
    self.title = nil;
    self.content = nil;
    [super dealloc];
}

#pragma mark -
#pragma mark NSCoding

- (id)initWithCoder:(NSCoder *)coder {
    [super init];
    self.title = [coder decodeObjectForKey:@"title"];
    self.content = [coder decodeObjectForKey:@"content"];
    return self;
}

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:title forKey:@"title"];
    [coder encodeObject:content forKey:@"content"];
}

- (NSString *)description {
    return [NSString stringWithFormat:@"<FUBookmark: %@>", title];
}

@synthesize title;
@synthesize content;
@end


text:
$: << File.dirname(__FILE__)
require 'test_helper'

class GeoIPNetSpeedTest < Minitest::Test
  DOMAIN = {
    :netspeed => "Corporate"
  }

  DOMAIN_IP = '67.43.156.0'

  def assert_look_up(db, expected = DOMAIN, lookup = DOMAIN_IP)
    hash = db.look_up(lookup)
    assert_kind_of(Hash, hash)
    assert_equal(expected, hash)
  end

  def test_construction_default
    db = GeoIP::NetSpeed.new(NETSPEED_DB)
    assert_raises_type_error(db)
    assert_look_up(db)
  end

  def test_construction_index
    db = GeoIP::NetSpeed.new(NETSPEED_DB, :index)
    assert_raises_type_error(db)
    assert_look_up(db)
  end

  def test_construction_filesystem
    db = GeoIP::NetSpeed.new(NETSPEED_DB, :filesystem)
    assert_raises_type_error(db)
    assert_look_up(db)
  end

  def test_construction_memory
    db = GeoIP::NetSpeed.new(NETSPEED_DB, :memory)
    assert_raises_type_error(db)
    assert_look_up(db)
  end

  def test_construction_filesystem_check
    db = GeoIP::NetSpeed.new(NETSPEED_DB, :filesystem, true)
    assert_raises_type_error(db)
    assert_look_up(db)
  end

  def test_bad_db_file
    assert_raises(Errno::ENOENT) do
      GeoIP::Domain.new('/supposed-to-fail')
    end
  end
end


text:
class ApiController < ApplicationController
  layout false

  def products
    cache_key = "products/#{Product.maximum(:updated_at)}"
    products = Rails.cache.fetch(cache_key) do
      Rails.logger.info 'querying for products and building json'
      Product.for_sale.to_json
    end

    render json: products
  end

  def products_and_posts_by_date
    render json: products_and_posts
  end

  def products_and_posts_conditional
    etag = DisplayOnMainPage.current_cache_key
    if stale?(etag)
      Rails.logger.info 'Rendering products and posts'
      render json: products_and_posts
    end
  end

  protected

  def products_and_posts
    Rails.cache.fetch(DisplayOnMainPage.current_cache_key) do
      Rails.logger.info 'querying for new products and posts'
      posts = Post.visible.includes(:user)
      products = Product.for_sale
      (products + posts).sort_by(&:created_at).reverse.to_json
    end
  end
end


text:
module TVML
  module Template
    class Parade < Base
      element :list
    end
  end
end


text:
// 1. draw a smooth, multi-point loop in the center of the screen.
// 2. iterate a set number of times.
// 3. on each iteration, randomly move each point using an x and y velocity
// 4. when iterations are done, create a new loop with a larger radius and repeat 1-3.
// 5. for each new loop, increase the number of iterations, the amount of randomity and the growth factor for the next loop

var context = bitlib.context(0, 0),
    width = context.width,
    height = context.height;

context.lineWidth = 0.01;

var c,
    r = 5,
    rand = 0.005,
    iter = 50,
    iterMult = 1.05,
    randMult = 1.06,
    radiusMult = 1.1,
    damp = 0.99;

panel
    .addRange("initial radius", 1, 100, r, 1)
    .addRange("radius multiplier", 1.03, 2, radiusMult, 0.01)
    .addRange("initial rand", 0, 0.1, rand, 0.001)
    .addRange("random multiplier", 1, 1.5, randMult, 0.01)
    .addRange("initial iterations", 1, 200, iter, 1)
    .addRange("iteration multiplier", 1, 1.2, iterMult, 0.01)
    .addRange("dampening", 0.7, 1, damp, 0.01)
    .addRange("line width", 0.01, 0.1, context.lineWidth, 0.01)
    .addBoolean("invert colors", false)
    .setGlobalChangeHandler(function() {
        context.lineWidth = panel.getValue("line width");
        rand = panel.getValue("initial rand");
        r = panel.getValue("initial radius");
        iter = panel.getValue("initial iterations");
        damp = panel.getValue("dampening")
        iterMult = panel.getValue("iteration multiplier")
        randMult = panel.getValue("random multiplier")
        radiusMult = panel.getValue("radius multiplier")
        if(panel.getValue("invert colors")) {
            context.clear("black");
            context.strokeStyle = "white";
        }
        else {
            context.clear("white");
            context.strokeStyle = "black";
        }
        makeCircle(r);
        anim.start();
    })

function makeCircle(r) {
    c = [];
    for(var i = 0; i < 20; i++) {
        var a = i / 20 * Math.PI * 2;
        c.push({
            x: Math.cos(a) * r,
            y: Math.sin(a) * r,
            vx: 0,
            vy: 0
        });
    }
}

context.translate(width / 2, height / 2);

var anim = bitlib.anim(update);

anim.start();
function update() {
    makeCircle(r);
    for(var j = 0; j < iter; j++) {
        context.strokeMultiLoop(c);
        for(var i = 0; i < c.length; i++) {
            var p = c[i];
            p.vx += bitlib.random.float(-rand, rand);
            p.vy += bitlib.random.float(-rand, rand);
            p.x += p.vx;
            p.y += p.vy;
            p.vx *= damp;
            p.vy *= damp;
        }
    }
    iter *= iterMult;
    iter = Math.min(iter, 1500);
    rand *= randMult;
    r *= radiusMult;

    if(r > width) {
        anim.stop();
    }
}


text:
module ShopifyAPI
  module Errors
    class ContextNotSetupError < StandardError
    end
  end
end


text:
"use strict";
/**
 * Utilities for parsing WebDriver commands from HTTP Requests.
 */
const events = require("events");
var CommandName;
(function (CommandName) {
    CommandName[CommandName["NewSession"] = 0] = "NewSession";
    CommandName[CommandName["DeleteSession"] = 1] = "DeleteSession";
    CommandName[CommandName["Status"] = 2] = "Status";
    CommandName[CommandName["GetTimeouts"] = 3] = "GetTimeouts";
    CommandName[CommandName["SetTimeouts"] = 4] = "SetTimeouts";
    CommandName[CommandName["Go"] = 5] = "Go";
    CommandName[CommandName["GetCurrentURL"] = 6] = "GetCurrentURL";
    CommandName[CommandName["Back"] = 7] = "Back";
    CommandName[CommandName["Forward"] = 8] = "Forward";
    CommandName[CommandName["Refresh"] = 9] = "Refresh";
    CommandName[CommandName["GetTitle"] = 10] = "GetTitle";
    CommandName[CommandName["FindElement"] = 11] = "FindElement";
    CommandName[CommandName["FindElements"] = 12] = "FindElements";
    CommandName[CommandName["FindElementFromElement"] = 13] = "FindElementFromElement";
    CommandName[CommandName["FindElementsFromElement"] = 14] = "FindElementsFromElement";
    CommandName[CommandName["IsElementSelected"] = 15] = "IsElementSelected";
    CommandName[CommandName["GetElementAttribute"] = 16] = "GetElementAttribute";
    CommandName[CommandName["GetElementProperty"] = 17] = "GetElementProperty";
    CommandName[CommandName["GetElementCSSValue"] = 18] = "GetElementCSSValue";
    CommandName[CommandName["GetElementText"] = 19] = "GetElementText";
    CommandName[CommandName["GetElementTagName"] = 20] = "GetElementTagName";
    CommandName[CommandName["GetElementRect"] = 21] = "GetElementRect";
    CommandName[CommandName["IsElementEnabled"] = 22] = "IsElementEnabled";
    CommandName[CommandName["ElementClick"] = 23] = "ElementClick";
    CommandName[CommandName["ElementClear"] = 24] = "ElementClear";
    CommandName[CommandName["ElementSendKeys"] = 25] = "ElementSendKeys";
    CommandName[CommandName["WireMoveTo"] = 26] = "WireMoveTo";
    CommandName[CommandName["WireButtonDown"] = 27] = "WireButtonDown";
    CommandName[CommandName["WireButtonUp"] = 28] = "WireButtonUp";
    CommandName[CommandName["GetAlertText"] = 29] = "GetAlertText";
    CommandName[CommandName["AcceptAlert"] = 30] = "AcceptAlert";
    CommandName[CommandName["DismissAlert"] = 31] = "DismissAlert";
    CommandName[CommandName["UNKNOWN"] = 32] = "UNKNOWN";
})(CommandName = exports.CommandName || (exports.CommandName = {}));
/**
 * Represents an endpoint in the WebDriver spec. Endpoints are defined by
 * the CommandName enum and the url pattern that they match.
 *
 * For example, the pattern
 *     /session/:sessionId/element/:elementId/click
 * will match urls such as
 *     /session/d9e52b96-9b6a-4cb3-b017-76e8b4236646/element/1c2855ba-213d-4466-ba16-b14a7e6c3699/click
 *
 * @param pattern The url pattern
 * @param method The HTTP method, ie GET, POST, DELETE
 * @param name The CommandName of this endpoint.
 */
class Endpoint {
    constructor(pattern, method, name) {
        this.pattern = pattern;
        this.method = method;
        this.name = name;
    }
    /**
     * Tests whether a given url from a request matches this endpoint.
     *
     * @param url A url from a request to test against the endpoint.
     * @param method The HTTP method.
     * @returns {boolean} Whether the endpoint matches.
     */
    matches(url, method) {
        let urlParts = url.split('/');
        let patternParts = this.pattern.split('/');
        if (method != this.method || urlParts.length != patternParts.length) {
            return false;
        }
        // TODO: Replace this naive search with better parsing.
        for (let idx in patternParts) {
            if (!patternParts[idx].startsWith(':') && patternParts[idx] != urlParts[idx]) {
                return false;
            }
        }
        return true;
    }
    /**
     * Given a url from a http request, create an object containing parameters from the URL.
     *
     * Parameters are the parts of the endpoint's pattern that start with ':'. The ':' is dropped
     * from the parameter key.
     *
     * @param url The url from the request.
     * @returns An object mapping parameter keys to values from the url.
     */
    getParams(url) {
        let urlParts = url.split('/');
        let patternParts = this.pattern.split('/');
        let params = {};
        for (let idx in patternParts) {
            if (patternParts[idx].startsWith(':')) {
                let paramName = patternParts[idx].slice(1);
                params[paramName] = urlParts[idx];
            }
        }
        return params;
    }
}
/**
 * An instance of a WebDriver command, containing the params and data for that request.
 *
 * @param commandName The enum identifying the command.
 * @param params Parameters for the command taken from the request's url.
 * @param data Optional data included with the command, taken from the body of the request.
 */
class WebDriverCommand extends events.EventEmitter {
    constructor(commandName, url, method, params) {
        super();
        this.commandName = commandName;
        this.url = url;
        this.method = method;
        this.params = params;
    }
    // All WebDriver commands have a session Id, except for two.
    // NewSession will have a session Id in the data
    // Status just doesn't
    get sessionId() {
        if (!this.getParam('sessionId') && this.url.startsWith('/session')) {
            return this.url.split('/')[2];
        }
        return this.getParam('sessionId');
    }
    getParam(key) {
        return this.params[key];
    }
    handleData(data) {
        try {
            this.data = JSON.parse(data);
        }
        catch (err) {
            this.data = data;
        }
        this.emit('data');
    }
    handleResponse(statusCode, data) {
        this.responseStatus = statusCode;
        try {
            this.responseData = JSON.parse(data);
        }
        catch (err) {
            this.responseData = data;
        }
        this.emit('response');
    }
}
exports.WebDriverCommand = WebDriverCommand;
/**
 * The set of known endpoints.
 */
let endpoints = [];
function addWebDriverCommand(command, method, pattern) {
    endpoints.push(new Endpoint(pattern, method, command));
}
/**
 * Returns a new WebdriverCommand object for the resource at the given URL.
 */
function parseWebDriverCommand(url, method) {
    for (let endpoint of endpoints) {
        if (endpoint.matches(url, method)) {
            let params = endpoint.getParams(url);
            return new WebDriverCommand(endpoint.name, url, method, params);
        }
    }
    return new WebDriverCommand(CommandName.UNKNOWN, url, method, {});
}
exports.parseWebDriverCommand = parseWebDriverCommand;
let sessionPrefix = '/session/:sessionId';
addWebDriverCommand(CommandName.NewSession, 'POST', '/session');
addWebDriverCommand(CommandName.DeleteSession, 'DELETE', '/session/:sessionId');
addWebDriverCommand(CommandName.Status, 'GET', '/status');
addWebDriverCommand(CommandName.GetTimeouts, 'GET', sessionPrefix + '/timeouts');
addWebDriverCommand(CommandName.SetTimeouts, 'POST', sessionPrefix + '/timeouts');
addWebDriverCommand(CommandName.Go, 'POST', sessionPrefix + '/url');
addWebDriverCommand(CommandName.GetCurrentURL, 'GET', sessionPrefix + '/url');
addWebDriverCommand(CommandName.Back, 'POST', sessionPrefix + '/back');
addWebDriverCommand(CommandName.Forward, 'POST', sessionPrefix + '/forward');
addWebDriverCommand(CommandName.Refresh, 'POST', sessionPrefix + '/refresh');
addWebDriverCommand(CommandName.GetTitle, 'GET', sessionPrefix + '/title');
addWebDriverCommand(CommandName.FindElement, 'POST', sessionPrefix + '/element');
addWebDriverCommand(CommandName.FindElements, 'POST', sessionPrefix + '/elements');
addWebDriverCommand(CommandName.FindElementFromElement, 'POST', sessionPrefix + '/element/:elementId/element');
addWebDriverCommand(CommandName.FindElementsFromElement, 'POST', sessionPrefix + '/element/:elementId/elements');
addWebDriverCommand(CommandName.IsElementSelected, 'POST', sessionPrefix + '/element/:elementId/selected');
addWebDriverCommand(CommandName.GetElementAttribute, 'GET', sessionPrefix + '/element/:elementId/attribute/:attributeName');
addWebDriverCommand(CommandName.GetElementProperty, 'GET', sessionPrefix + '/element/:elementId/property/:propertyName');
addWebDriverCommand(CommandName.GetElementCSSValue, 'GET', sessionPrefix + '/element/:elementId/css/:cssPropertyName');
addWebDriverCommand(CommandName.GetElementText, 'GET', sessionPrefix + '/element/:elementId/text');
addWebDriverCommand(CommandName.GetElementTagName, 'GET', sessionPrefix + '/element/:elementId/name');
addWebDriverCommand(CommandName.GetElementRect, 'GET', sessionPrefix + '/element/:elementId/rect');
addWebDriverCommand(CommandName.GetElementRect, 'GET', sessionPrefix + '/element/:elementId/size');
addWebDriverCommand(CommandName.IsElementEnabled, 'GET', sessionPrefix + '/element/:elementId/enabled');
addWebDriverCommand(CommandName.ElementClick, 'POST', sessionPrefix + '/element/:elementId/click');
addWebDriverCommand(CommandName.ElementClear, 'POST', sessionPrefix + '/element/:elementId/clear');
addWebDriverCommand(CommandName.ElementSendKeys, 'POST', sessionPrefix + '/element/:elementId/value');
addWebDriverCommand(CommandName.GetAlertText, 'GET', sessionPrefix + '/alert_text');
addWebDriverCommand(CommandName.GetAlertText, 'GET', sessionPrefix + '/alert/text');
addWebDriverCommand(CommandName.AcceptAlert, 'POST', sessionPrefix + '/alert/accept');
addWebDriverCommand(CommandName.AcceptAlert, 'POST', sessionPrefix + '/accept_alert');
addWebDriverCommand(CommandName.DismissAlert, 'POST', sessionPrefix + '/alert/dismiss');
addWebDriverCommand(CommandName.DismissAlert, 'POST', sessionPrefix + '/dismiss_alert');
// These commands are part of the JSON protocol, and were replaced by Perform Actions in the W3C
// spec
addWebDriverCommand(CommandName.WireMoveTo, 'POST', sessionPrefix + '/moveto');
addWebDriverCommand(CommandName.WireButtonDown, 'POST', sessionPrefix + '/buttondown');
addWebDriverCommand(CommandName.WireButtonUp, 'POST', sessionPrefix + '/buttonup');
//# sourceMappingURL=webdriver_commands.js.map


text:
var Board = (function(){"use strict";var PRS$0 = (function(o,t){o["__proto__"]={"a":t};return o["a"]===t})({},{});var DP$0 = Object.defineProperty;var GOPD$0 = Object.getOwnPropertyDescriptor;var MIXIN$0 = function(t,s){for(var p in s){if(s.hasOwnProperty(p)){DP$0(t,p,GOPD$0(s,p));}}return t};
	function Board(el) {
		this.element = document.getElementById(el);
	}DP$0(Board,"prototype",{"configurable":false,"enumerable":false,"writable":false});
;return Board;})();